@genkit-ai/flow
Version:
Genkit AI framework workflow APIs.
1 lines • 6.66 kB
Source Map (JSON)
{"version":3,"sources":["../../src/client/client.ts"],"sourcesContent":["/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst __flowStreamDelimiter = '\\n';\n\n/**\n * Invoke and stream response from a deployed flow.\n *\n * For example:\n *\n * ```js\n * import { streamFlow } from '@genkit-ai/flow/client';\n *\n * const response = streamFlow({\n * url: 'https://my-flow-deployed-url',\n * input: 'foo',\n * });\n * for await (const chunk of response.stream()) {\n * console.log(chunk);\n * }\n * console.log(await response.output());\n * ```\n */\nexport function streamFlow({\n url,\n input,\n headers,\n}: {\n url: string;\n input: any;\n headers?: Record<string, string>;\n}) {\n let chunkStreamController: ReadableStreamDefaultController | undefined =\n undefined;\n const chunkStream = new ReadableStream({\n start(controller) {\n chunkStreamController = controller;\n },\n pull() {},\n cancel() {},\n });\n\n const operationPromise = __flowRunEnvelope({\n url,\n input,\n streamingCallback: (c) => {\n chunkStreamController?.enqueue(c);\n },\n headers,\n });\n operationPromise.then((o) => {\n chunkStreamController?.close();\n return o;\n });\n\n return {\n output() {\n return operationPromise.then((op) => {\n if (!op.done) {\n throw new Error(`flow ${op.name} did not finish execution`);\n }\n if (op.result?.error) {\n throw new Error(\n `${op.name}: ${op.result?.error}\\n${op.result?.stacktrace}`\n );\n }\n return op.result?.response;\n });\n },\n async *stream() {\n const reader = chunkStream.getReader();\n while (true) {\n const chunk = await reader.read();\n if (chunk.value) {\n yield chunk.value;\n }\n if (chunk.done) {\n break;\n }\n }\n return await operationPromise;\n },\n };\n}\n\nasync function __flowRunEnvelope({\n url,\n input,\n streamingCallback,\n headers,\n}: {\n url: string;\n input: any;\n streamingCallback: (chunk: any) => void;\n headers?: Record<string, string>;\n}) {\n let response;\n response = await fetch(url + '?stream=true', {\n method: 'POST',\n body: JSON.stringify({\n data: input,\n }),\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n });\n if (!response.body) {\n throw new Error('Response body is empty');\n }\n var reader = response.body.getReader();\n var decoder = new TextDecoder();\n\n let buffer = '';\n while (true) {\n const result = await reader.read();\n const decodedValue = decoder.decode(result.value);\n if (decodedValue) {\n buffer += decodedValue;\n }\n // If buffer includes the delimiter that means we are still recieving chunks.\n while (buffer.includes(__flowStreamDelimiter)) {\n streamingCallback(\n JSON.parse(buffer.substring(0, buffer.indexOf(__flowStreamDelimiter)))\n );\n buffer = buffer.substring(\n buffer.indexOf(__flowStreamDelimiter) + __flowStreamDelimiter.length\n );\n }\n if (result.done) {\n return JSON.parse(buffer);\n }\n }\n}\n\n/**\n * Invoke a deployed flow over HTTP(s).\n *\n * For example:\n *\n * ```js\n * import { runFlow } from '@genkit-ai/flow/client';\n *\n * const response = await runFlow({\n * url: 'https://my-flow-deployed-url',\n * input: 'foo',\n * });\n * console.log(await response);\n * ```\n */\nexport async function runFlow({\n url,\n payload,\n headers,\n}: {\n url: string;\n payload?: any;\n headers?: Record<string, string>;\n}) {\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n data: payload,\n }),\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n });\n const wrappedDesult = await response.json();\n return wrappedDesult.result;\n}\n"],"mappings":"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","names":["_a"]}