@cogniformai/instructor-stream
Version:
Streaming-first structured data extraction from LLMs with real-time updates
1 lines • 73.1 kB
Source Map (JSON)
{"version":3,"sources":["../src/instructor.ts","../src/lib/index.ts","../src/stream/oai/parser.ts","../src/stream/oai/stream.ts","../src/utils/path.ts","../src/utils/streaming-json-parser.ts","../src/utils/token-type.ts","../src/utils/token-parser.ts","../src/stream/oai/params.ts","../src/index.ts"],"names":["omit","keys","obj","result","key","iterableTee","iterable","n","buffers","resolvers","iterator","done","reader","index","resolve","item","buffer","_","i","OAIResponseFnArgsParser","data","parsedData","OAIResponseToolArgsParser","OAIResponseJSONParser","text","jsonRegex","match","OAIResponseParser","isFnCall","isToolCall","stripControlCharacters","str","OAIStream","res","cancelGenerator","encoder","generateStream","cancel","part","generator","controller","readableStreamToAsyncGenerator","stream","decoder","value","decodedString","setDeep","path","current","nextKey","lastKey","TokenType","token_type_default","TokenParserStateToString","state","defaultOpts","TokenParserError","message","TokenParser","opts","pathParts","selector","emit","popped","token","partial","val","createInstructor"],"mappings":"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","file":"/home/runner/work/instructor-stream-js/instructor-stream-js/packages/instructor-stream/dist/index.cjs","sourcesContent":["import OpenAI from 'openai'\nimport { Stream } from 'openai/streaming'\nimport { z, ZodError } from 'zod'\nimport { fromZodError } from 'zod-validation-error'\nimport {\n MODE_TO_RESPONSE_PARSER,\n NON_OAI_PROVIDER_URLS,\n Provider,\n PROVIDER_PARAMS_TRANSFORMERS,\n PROVIDER_SUPPORTED_MODES,\n PROVIDERS,\n} from './constants/providers.ts'\nimport { iterableTee } from './lib'\nimport { OAIResponseParser, OAIStream, withResponseModel } from './stream'\nimport ZodStream from './stream/structured-stream.client.js'\nimport {\n ChatCompletionCreateParamsWithModel,\n ClientTypeChatCompletionParams,\n ClientTypeChatCompletionRequestOptions,\n CompletionMeta,\n GenericChatCompletion,\n GenericClient,\n InstructorConfig,\n LogLevel,\n Mode,\n OpenAILikeClient,\n ReturnTypeBasedOnParams,\n} from './types'\nimport {\n ValidationError,\n RetryableError,\n NonRetryableError,\n UnsupportedClientError,\n} from './errors'\n\nconst MAX_RETRIES_DEFAULT = 0\n\n/**\n * The Instructor class provides a unified interface for interacting with OpenAI-like clients,\n * supporting both standard and streaming chat completions with schema validation and error handling.\n * It manages provider-specific options, logging, and retry logic for robust API usage.\n */\nclass Instructor<C> {\n readonly client: OpenAILikeClient<C>\n readonly mode: Mode\n readonly provider: Provider\n readonly debug: boolean = false\n readonly retryAllErrors: boolean = false\n readonly logger?: <T extends unknown[]>(level: LogLevel, ...args: T) => void\n\n /**\n * Initializes a new Instructor instance for a given OpenAI-like client and configuration.\n * Validates the client and sets up provider-specific options and logging.\n *\n * Args:\n * client (OpenAILikeClient): The OpenAI-compatible client instance.\n * mode (Mode): The operation mode for completions.\n * debug (boolean, optional): Enables debug logging if true.\n * logger (function, optional): Custom logger function.\n * retryAllErrors (boolean, optional): If true, retries all errors.\n */\n constructor({\n client,\n mode,\n debug = false,\n logger = undefined,\n retryAllErrors = false,\n }: InstructorConfig<C>) {\n if (!isGenericClient(client) && !(client instanceof OpenAI)) {\n throw new UnsupportedClientError('Client does not match the required structure')\n }\n if (client instanceof OpenAI) {\n this.client = client as OpenAI\n } else {\n this.client = client as C & GenericClient\n }\n this.mode = mode\n this.debug = debug\n this.retryAllErrors = retryAllErrors\n this.logger = logger ?? undefined\n this.provider =\n typeof this.client?.baseURL === 'string' ?\n this.client?.baseURL.includes(NON_OAI_PROVIDER_URLS.ANYSCALE) ? PROVIDERS.ANYSCALE\n : this.client?.baseURL.includes(NON_OAI_PROVIDER_URLS.TOGETHER) ? PROVIDERS.TOGETHER\n : this.client?.baseURL.includes(NON_OAI_PROVIDER_URLS.OAI) ? PROVIDERS.OAI\n : this.client?.baseURL.includes(NON_OAI_PROVIDER_URLS.ANTHROPIC) ? PROVIDERS.ANTHROPIC\n : this.client?.baseURL.includes(NON_OAI_PROVIDER_URLS.GROQ) ? PROVIDERS.GROQ\n : PROVIDERS.OTHER\n : PROVIDERS.OTHER\n this.validateOptions()\n }\n\n /**\n * Validates the current provider and mode configuration.\n * Logs warnings if the mode is not supported by the provider.\n */\n private validateOptions() {\n const isModeSupported = PROVIDER_SUPPORTED_MODES[this.provider].includes(this.mode)\n if (this.provider === PROVIDERS.OTHER) {\n this.log('debug', 'Unknown provider - cant validate options.')\n }\n if (!isModeSupported) {\n this.log('warn', `Mode ${this.mode} may not be supported by provider ${this.provider}`)\n }\n }\n\n /**\n * Logs messages at the specified log level using the configured logger or console.\n * Skips debug logs if debug mode is disabled.\n *\n * Args:\n * level (LogLevel): The severity level of the log.\n * ...args: Additional arguments to log.\n */\n private log<T extends unknown[]>(level: LogLevel, ...args: T) {\n if (this.logger) {\n this.logger(level, ...args)\n }\n if (!this.debug && level === 'debug') {\n return\n }\n const timestamp = new Date().toISOString()\n switch (level) {\n case 'debug':\n console.debug(`[Instructor:DEBUG] ${timestamp}:`, ...args)\n break\n case 'info':\n console.info(`[Instructor:INFO] ${timestamp}:`, ...args)\n break\n case 'warn':\n console.warn(`[Instructor:WARN] ${timestamp}:`, ...args)\n break\n case 'error':\n console.error(`[Instructor:ERROR] ${timestamp}:`, ...args)\n break\n }\n }\n\n /**\n * Executes a standard (non-streaming) chat completion with schema validation and retry logic.\n * Returns the validated response data and associated metadata.\n *\n * Args:\n * params (ChatCompletionCreateParamsWithModel): Parameters for the chat completion, including the response model.\n * requestOptions (optional): Additional request options for the client.\n *\n * Returns:\n * Promise<{ data: z.output<T>[]; _meta: CompletionMeta }>: The validated completion data and metadata.\n *\n * Raises:\n * ValidationError: If the response does not match the schema.\n * RetryableError: If a retryable error occurs during completion.\n * NonRetryableError: If a non-retryable error occurs.\n */\n private async chatCompletionStandard<T extends z.ZodType>(\n {\n max_retries = MAX_RETRIES_DEFAULT,\n response_model,\n ...params\n }: ChatCompletionCreateParamsWithModel<T>,\n requestOptions?: ClientTypeChatCompletionRequestOptions<C>\n ): Promise<{ data: z.output<T>[]; _meta: CompletionMeta }> {\n let attempts = 0\n let validationIssues = ''\n let lastMessage: OpenAI.ChatCompletionMessageParam | null = null\n const paramsTransformer = (\n PROVIDER_PARAMS_TRANSFORMERS?.[this.provider] as Record<string, unknown> | undefined\n )?.[this.mode as unknown as string] as ((p: unknown) => unknown) | undefined\n let completionParams = withResponseModel({\n params: {\n ...params,\n stream: params.stream ?? false,\n } as OpenAI.ChatCompletionCreateParams,\n mode: this.mode,\n response_model,\n })\n if (typeof paramsTransformer === 'function') {\n completionParams = paramsTransformer(completionParams as unknown) as typeof completionParams\n }\n\n const makeCompletionCall = async () => {\n let resolvedParams = completionParams\n if (validationIssues?.length > 0) {\n resolvedParams = {\n ...completionParams,\n messages: [\n ...completionParams.messages,\n ...(lastMessage ? [lastMessage] : []),\n {\n role: 'user',\n content: `Please correct the function call; errors encountered:\\n ${validationIssues}`,\n },\n ],\n }\n }\n let completion\n try {\n if (this.client.chat?.completions?.create) {\n const result = await this.client.chat.completions.create(\n {\n ...resolvedParams,\n stream: false,\n },\n requestOptions\n )\n completion = result as GenericChatCompletion<typeof result>\n } else {\n throw new UnsupportedClientError('Unsupported client type -- no completion method found.')\n }\n this.log('debug', 'raw standard completion response: ', completion)\n } catch (error) {\n this.log(\n 'error',\n `Error making completion call - mode: ${this.mode} | Client base URL: ${this.client.baseURL} | with params:`,\n resolvedParams,\n `raw error`,\n error\n )\n throw new RetryableError(\n error instanceof Error ? error.message : 'Error making completion call',\n error\n )\n }\n const responseParser =\n MODE_TO_RESPONSE_PARSER?.[this.mode as unknown as keyof typeof MODE_TO_RESPONSE_PARSER] ??\n OAIResponseParser\n const parsedCompletion = responseParser(completion as OpenAI.Chat.Completions.ChatCompletion)\n\n try {\n const responseJson = parsedCompletion.json ?? parsedCompletion\n const data = JSON.parse(responseJson) as z.infer<T> & {\n _meta?: CompletionMeta\n thinking?: string\n }\n return {\n data: [data],\n _meta: {\n usage: completion?.usage ?? undefined,\n thinking: parsedCompletion?.thinking ?? undefined,\n },\n }\n } catch (error) {\n this.log(\n 'error',\n 'failed to parse completion',\n parsedCompletion,\n this.mode,\n 'attempt: ',\n attempts,\n 'max attempts: ',\n max_retries\n )\n throw new RetryableError('Failed to parse completion', error)\n }\n }\n\n const makeCompletionCallWithRetries = async () => {\n try {\n const data = await makeCompletionCall()\n const validation = await response_model.schema.safeParseAsync(data.data[0] as unknown)\n this.log('debug', response_model.name, 'Completion validation: ', validation)\n if (!validation.success) {\n if ('error' in validation && validation.error instanceof ZodError) {\n lastMessage = {\n role: 'assistant',\n content: JSON.stringify(data),\n }\n try {\n if (\n validation.error &&\n Array.isArray((validation.error as { issues?: unknown[] }).issues) &&\n (validation.error as { issues?: unknown[] }).issues!.length > 0\n ) {\n try {\n const errorForFormatting = validation.error as unknown as Parameters<\n typeof fromZodError\n >[0]\n validationIssues =\n fromZodError(errorForFormatting)?.message ?? 'Validation failed with issues'\n } catch {\n const firstMsg = validation.error.issues?.[0]?.message\n validationIssues = firstMsg ?? 'Validation failed with issues'\n }\n } else {\n validationIssues = 'Validation failed: error structure missing or invalid'\n this.log('debug', 'Validation error structure:', JSON.stringify(validation.error))\n }\n } catch (fromZodErrorException) {\n validationIssues = `Validation failed: ${\n validation.error?.issues?.[0]?.message ?? 'unknown validation error'\n }`\n this.log('debug', 'fromZodError failed:', fromZodErrorException)\n this.log('debug', 'Original validation error:', JSON.stringify(validation.error))\n }\n // Propagate the original ZodError without introducing a new local error.\n throw new ValidationError(validation.error.issues, validation.error)\n } else {\n // Propagate non-Zod validation failure by rethrowing as-is to avoid masking upstream errors.\n // Use the correct caught variable from this catch scope.\n throw new NonRetryableError('Validation failed', validation.error)\n }\n }\n return { data: [validation.data], _meta: data?._meta ?? {} }\n } catch (error) {\n if (!this.retryAllErrors && !(error instanceof ValidationError)) {\n throw error\n }\n if (attempts < max_retries) {\n this.log(\n 'debug',\n `response model: ${response_model.name} - Retrying, attempt: `,\n attempts\n )\n this.log(\n 'warn',\n `response model: ${response_model.name} - Validation issues: `,\n validationIssues,\n ' - Attempt: ',\n attempts,\n ' - Max attempts: ',\n max_retries\n )\n attempts++\n return await makeCompletionCallWithRetries()\n } else {\n this.log(\n 'debug',\n `response model: ${response_model.name} - Max attempts reached: ${attempts}`\n )\n this.log(\n 'error',\n `response model: ${response_model.name} - Validation issues: `,\n validationIssues\n )\n throw error\n }\n }\n }\n return makeCompletionCallWithRetries()\n }\n\n /**\n * Executes a streaming chat completion, yielding partial results as they arrive.\n * Supports schema validation and collects usage metadata during the stream.\n *\n * Args:\n * params (ChatCompletionCreateParamsWithModel): Parameters for the chat completion, including the response model.\n * requestOptions (optional): Additional request options for the client.\n *\n * Returns:\n * AsyncGenerator<{ data: Partial<z.output<T>>[]; _meta: CompletionMeta }, void, unknown>: An async generator yielding partial completion data and metadata.\n */\n private async *chatCompletionStream<T extends z.ZodType>(\n { max_retries, response_model, ...params }: ChatCompletionCreateParamsWithModel<T>,\n requestOptions?: ClientTypeChatCompletionRequestOptions<C>\n ): AsyncGenerator<{ data: Partial<z.output<T>>[]; _meta: CompletionMeta }, void, unknown> {\n if (max_retries) {\n this.log('warn', 'max_retries is not supported for streaming completions')\n }\n const paramsTransformer = (\n PROVIDER_PARAMS_TRANSFORMERS?.[this.provider] as Record<string, unknown> | undefined\n )?.[this.mode as unknown as string] as ((p: unknown) => unknown) | undefined\n\n let completionParams = withResponseModel({\n params: {\n ...params,\n stream: true,\n } as OpenAI.ChatCompletionCreateParams,\n response_model,\n mode: this.mode,\n })\n\n if (typeof paramsTransformer === 'function') {\n completionParams = paramsTransformer(completionParams as unknown) as typeof completionParams\n }\n\n const streamClient = new ZodStream({\n debug: this.debug ?? false,\n })\n\n const checkForUsage = async (\n reader: Stream<OpenAI.ChatCompletionChunk> | AsyncIterable<OpenAI.ChatCompletionChunk>\n ) => {\n for await (const chunk of reader) {\n if ('usage' in chunk) {\n streamUsage = chunk.usage as CompletionMeta['usage']\n }\n }\n }\n let streamUsage: CompletionMeta['usage'] | undefined\n const structuredStream = await streamClient.create({\n completionPromise: async () => {\n if (this.client.chat?.completions?.create) {\n const completion = await this.client.chat.completions.create(\n {\n ...completionParams,\n stream: true,\n },\n requestOptions\n )\n this.log('debug', 'raw stream completion response: ', completion)\n if (\n this.provider === 'OAI' &&\n completionParams?.stream &&\n 'stream_options' in completionParams &&\n completion instanceof Stream\n ) {\n const [completion1, completion2] = completion.tee()\n checkForUsage(completion1)\n return OAIStream({\n res: completion2,\n })\n }\n if (\n this.provider !== 'OAI' &&\n completionParams?.stream &&\n (completion as unknown as { [Symbol.asyncIterator]?: unknown })?.[Symbol.asyncIterator]\n ) {\n const [completion1, completion2] = await iterableTee(\n completion as AsyncIterable<OpenAI.ChatCompletionChunk>,\n 2\n )\n checkForUsage(completion1)\n return OAIStream({\n res: completion2,\n })\n }\n return OAIStream({\n res: completion as unknown as AsyncIterable<OpenAI.ChatCompletionChunk>,\n })\n } else {\n throw new UnsupportedClientError('Unsupported client type')\n }\n },\n response_model: { schema: response_model.schema },\n })\n for await (const chunk of structuredStream) {\n yield {\n data: chunk.data,\n _meta: {\n usage: streamUsage ?? undefined,\n ...(chunk?._meta ?? {}),\n },\n }\n }\n }\n\n /**\n * Determines if the provided parameters include a response model for schema validation.\n * Used to distinguish between typed and untyped completion requests.\n *\n * Args:\n * params (ChatCompletionCreateParamsWithModel): The parameters to check.\n *\n * Returns:\n * boolean: True if the parameters include a response model, false otherwise.\n */\n private isChatCompletionCreateParamsWithModel<T extends z.ZodType>(\n params: ChatCompletionCreateParamsWithModel<T>\n ): params is ChatCompletionCreateParamsWithModel<T> {\n return 'response_model' in params\n }\n\n /**\n * Checks if the given parameters specify a standard streaming completion.\n * Returns true if the 'stream' property is set to true.\n *\n * Args:\n * params (OpenAI.ChatCompletionCreateParams): The parameters to check.\n *\n * Returns:\n * boolean: True if streaming is enabled, false otherwise.\n */\n private isStandardStream(\n params: OpenAI.ChatCompletionCreateParams\n ): params is OpenAI.ChatCompletionCreateParams {\n return 'stream' in params && params.stream === true\n }\n\n /**\n * Provides a unified interface for creating chat completions, supporting both standard and streaming modes.\n * Automatically selects the appropriate completion method based on the provided parameters.\n *\n * Args:\n * params: The parameters for the chat completion, with or without a response model.\n * requestOptions (optional): Additional request options for the client.\n *\n * Returns:\n * Promise or AsyncGenerator: The completion result, type depends on the parameters.\n *\n * Raises:\n * UnsupportedClientError: If the client does not support completions.\n */\n public chat = {\n completions: {\n create: async <\n T extends z.ZodType,\n P extends T extends z.ZodType ? ChatCompletionCreateParamsWithModel<T>\n : ClientTypeChatCompletionParams<OpenAILikeClient<C>> & { response_model: never },\n >(\n params: P,\n requestOptions?: ClientTypeChatCompletionRequestOptions<C>\n ): Promise<ReturnTypeBasedOnParams<typeof this.client, P>> => {\n if (this.isChatCompletionCreateParamsWithModel(params)) {\n if (params.stream) {\n return this.chatCompletionStream(params, requestOptions) as ReturnTypeBasedOnParams<\n typeof this.client,\n P & { stream: true }\n >\n } else {\n return this.chatCompletionStandard(params, requestOptions) as ReturnTypeBasedOnParams<\n typeof this.client,\n P\n >\n }\n } else if (this.client.chat?.completions?.create) {\n const result =\n this.isStandardStream(params) ?\n await this.client.chat.completions.create(params, requestOptions)\n : await this.client.chat.completions.create(params, requestOptions)\n return result as unknown as ReturnTypeBasedOnParams<OpenAILikeClient<C>, P>\n } else {\n throw new UnsupportedClientError('Completion method is undefined')\n }\n },\n },\n }\n}\n\nexport type InstructorClient<C> = Instructor<C> & OpenAILikeClient<C>\n\n/**\n * Creates an instance of the `Instructor` class.\n * @returns {InstructorClient} The extended OpenAI client.\n * @example import createInstructor from \"@instructor-ai/instructor\"\nimport OpenAI from \"openai\"\n\nconst OAI = new OpenAi({})\n\nconst client = createInstructor({\nclient: OAI,\nmode: \"TOOLS\",\n})\n * @param args\n * @returns\n */\nexport default function createInstructor<C>(args: InstructorConfig<C>): InstructorClient<C> {\n const instructor = new Instructor<C>(args)\n const instructorWithProxy = new Proxy(instructor, {\n get: (target, prop, receiver) => {\n if (prop in target) {\n return Reflect.get(target, prop, receiver)\n }\n return Reflect.get(target.client, prop, receiver)\n },\n })\n return instructorWithProxy as InstructorClient<C>\n}\n\nfunction isGenericClient(client: unknown): client is GenericClient {\n return (\n typeof client === 'object' &&\n client !== null &&\n 'chat' in client &&\n typeof client.chat === 'object' &&\n client.chat !== null &&\n 'completions' in client.chat &&\n typeof client.chat.completions === 'object' &&\n client.chat.completions !== null &&\n 'create' in client.chat.completions &&\n typeof client.chat.completions.create === 'function'\n )\n}\n","/**\n * Omits the specified keys from the given object.\n *\n * @template T The type of the object.\n * @template K The type of the keys to omit.\n * @param {K[]} keys The keys to omit.\n * @param {T} obj The object to omit from.\n * @returns {Omit<T, K>} The object with the specified keys omitted.\n */\nexport function omit<T extends object, K extends keyof T>(keys: K[], obj: T): Omit<T, K> {\n const result = {} as Omit<T, K>\n for (const key in obj) {\n if (obj.hasOwnProperty(key) && !keys.includes(key as unknown as K)) {\n result[key as unknown as Exclude<keyof T, K>] = obj[key] as unknown as T[Exclude<keyof T, K>]\n }\n }\n return result\n}\n\n/**\n * Creates `n` async generators that emit the elements of the given iterable in\n * the same order, but allows the consumer to iterate over the elements in\n * parallel. The returned generators are \"hot\", meaning that they will queue up\n * elements from the iterable even if no one is iterating over them.\n *\n * @template T The type of the elements in the iterable.\n * @param {AsyncIterable<T>} iterable The iterable to tee.\n * @param {number} n The number of async generators to create.\n * @returns {Promise<AsyncGenerator<T>[]>} A promise that resolves to an array of\n * `n` async generators.\n */\nexport async function iterableTee<T>(\n iterable: AsyncIterable<T>,\n n: number\n): Promise<AsyncGenerator<T>[]> {\n const buffers: T[][] = Array.from({ length: n }, () => [])\n const resolvers: (() => void)[] = []\n const iterator = iterable[Symbol.asyncIterator]()\n let done = false\n\n const reader = async function* (index: number): AsyncGenerator<T> {\n while (true) {\n if (buffers[index].length > 0) {\n yield buffers[index].shift()!\n } else if (done) {\n break\n } else {\n await new Promise<void>((resolve) => resolvers.push(resolve))\n }\n }\n }\n await (async () => {\n for await (const item of {\n [Symbol.asyncIterator]: () => iterator,\n }) {\n for (const buffer of buffers) {\n buffer.push(item)\n }\n\n while (resolvers.length > 0) {\n resolvers.shift()!()\n }\n }\n done = true\n while (resolvers.length > 0) {\n resolvers.shift()!()\n }\n })()\n\n return Array.from({ length: n }, (_, i) => reader(i))\n}\n","import OpenAI from 'openai'\n\n/**\n * `OAIResponseFnArgsParser` parses a JSON string and extracts the function call arguments.\n *\n * @param {string} data - The JSON string to parse.\n * @returns {string} - The extracted function arguments.\n *\n */\nexport function OAIResponseFnArgsParser(\n data:\n | string\n | OpenAI.Chat.Completions.ChatCompletionChunk\n | OpenAI.Chat.Completions.ChatCompletion\n): string {\n const parsedData = typeof data === 'string' ? JSON.parse(data) : data\n return (\n parsedData.choices?.[0]?.delta?.function_call?.arguments ??\n parsedData.choices?.[0]?.message?.function_call?.arguments ??\n ''\n )\n}\n\n/**\n * `OAIResponseToolArgsParser` parses a JSON string and extracts the tool call arguments.\n *\n * @param {string} data - The JSON string to parse.\n * @returns {Objstringect} - The extracted tool call arguments.\n *\n */\nexport function OAIResponseToolArgsParser(\n data:\n | string\n | OpenAI.Chat.Completions.ChatCompletionChunk\n | OpenAI.Chat.Completions.ChatCompletion\n): string {\n const parsedData = typeof data === 'string' ? JSON.parse(data) : data\n return (\n parsedData.choices?.[0]?.delta?.tool_calls?.[0]?.function?.arguments ??\n parsedData.choices?.[0]?.message?.tool_calls?.[0]?.function?.arguments ??\n ''\n )\n}\n\n/**\n * `OAIResponseJSONParser` parses a JSON string and extracts the JSON content.\n *\n * @param {string} data - The JSON string to parse.\n * @returns {string} - The extracted JSON content.\n *\n *\n */\nexport function OAIResponseJSONParser(\n data:\n | string\n | OpenAI.Chat.Completions.ChatCompletionChunk\n | OpenAI.Chat.Completions.ChatCompletion\n): string {\n const parsedData = typeof data === 'string' ? JSON.parse(data) : data\n const text =\n parsedData.choices?.[0]?.delta?.content ?? parsedData?.choices?.[0]?.message?.content ?? ''\n const jsonRegex = /```json\\n([\\s\\S]*?)\\n```/\n const match = text.match(jsonRegex)\n return match ? match[1] : text\n}\n\n//TODO: We should be able to remove the function call and just use the tool call parser\n// TODO: Check the Stream type\n/**\n * `OAIResponseParser` parses a JSON string or a response object.\n * It checks if the input contains function call arguments. If it does,\n * it uses `OAIResponseFnArgsParser` to parse the input, otherwise, it uses `OAIResponseTextParser`.\n *\n * @param {string | Stream<OpenAI.Chat.Completions.ChatCompletionChunk> | OpenAI.Chat.Completions.ChatCompletion} data - The input to parse.\n * @returns {string} - The result of the appropriate parser.\n */\n\nexport function OAIResponseParser(\n data:\n | string\n | OpenAI.Chat.Completions.ChatCompletionChunk\n | OpenAI.Chat.Completions.ChatCompletion\n): string {\n const parsedData = typeof data === 'string' ? JSON.parse(data) : data\n const isFnCall =\n parsedData.choices?.[0]?.delta?.function_call?.arguments ||\n parsedData.choices?.[0]?.message?.function_call?.arguments ||\n false\n const isToolCall =\n parsedData.choices?.[0]?.delta?.tool_calls?.[0]?.function?.arguments ??\n parsedData.choices?.[0]?.message?.tool_calls?.[0]?.function?.arguments ??\n false\n if (isFnCall) {\n return OAIResponseFnArgsParser(data)\n }\n if (isToolCall) {\n return OAIResponseToolArgsParser(data)\n }\n return OAIResponseJSONParser(data)\n}\n","import OpenAI from 'openai'\nimport { OAIResponseParser } from './parser.ts'\n\ninterface OaiStreamArgs {\n res: AsyncIterable<OpenAI.ChatCompletionChunk>\n}\n\nfunction stripControlCharacters(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/[\\x00-\\x1F\\x7F-\\x9F]/g, '')\n}\n\n/**\n * `OaiStream` creates a ReadableStream that parses the SSE response from OAI\n * and returns a parsed string from the response.\n *\n * @param {OaiStreamArgs} args - The arguments for the function.\n * @returns {ReadableStream<string>} - The created ReadableStream.\n */\nexport function OAIStream({ res }: OaiStreamArgs): ReadableStream<Uint8Array> {\n let cancelGenerator: () => void\n const encoder = new TextEncoder()\n\n async function* generateStream(\n res: AsyncIterable<OpenAI.ChatCompletionChunk>\n ): AsyncGenerator<string> {\n let cancel = false\n cancelGenerator = () => {\n cancel = true\n return\n }\n for await (const part of res) {\n if (cancel) {\n break\n }\n if (!OAIResponseParser(part)) {\n continue\n }\n yield OAIResponseParser(part)\n }\n }\n const generator = generateStream(res)\n return new ReadableStream({\n async start(controller) {\n for await (const parsedData of generator) {\n controller.enqueue(encoder.encode(stripControlCharacters(parsedData)))\n }\n controller.close()\n },\n cancel() {\n if (cancelGenerator) {\n cancelGenerator()\n }\n },\n })\n}\n\n/**\n * `readableStreamToAsyncGenerator` converts a ReadableStream to an AsyncGenerator.\n *\n * @param {ReadableStream<Uint8Array>} stream - The ReadableStream to convert.\n * @returns {AsyncGenerator<unknown>} - The converted AsyncGenerator.\n */\nexport async function* readableStreamToAsyncGenerator(\n stream: ReadableStream<Uint8Array>\n): AsyncGenerator<unknown> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n while (true) {\n const { done, value } = await reader.read()\n if (done) {\n break\n }\n // stripping a second time to be safe.\n const decodedString = stripControlCharacters(decoder.decode(value))\n yield JSON.parse(decodedString)\n }\n return\n}\n","/**\n * Lightweight imperative helpers to replace Ramda's lensPath / set / view.\n * These functions mutate the target object in-place for performance.\n * @todo: These will be replacing Ramda's lensPath / set / view for performance\n */\n\nexport type Path = (string | number)[]\n\n/**\n * Represents an Object/array that can be accessed by either string or numeric keys.\n * Using `unknown` rather than `any` to keep type-safety while still allowing\n * deep indexing. We purposefully avoid `any` so that values returned from these\n * helpers remain typed as `unknown`, forcing callers to narrow the result.\n */\nexport interface Indexable {\n [key: string]: unknown\n [key: number]: unknown\n}\n\n/**\n * Retrieves the value located at the specified path within a nested object or array.\n *\n * This function traverses the provided object or array using the keys in the path array,\n * returning the value found at the end of the path. If any part of the path is invalid\n * (i.e., an undefined or non-object value is encountered before reaching the end), the\n * function returns undefined.\n *\n * @param obj - The root object or array to traverse.\n * @param path - An array of keys representing the path to the desired value.\n * @returns The value located at the specified path, or undefined if the path is invalid.\n */\nexport function getDeep(obj: unknown, path: Path): unknown {\n let current: unknown = obj\n for (const key of path) {\n if (current == null || typeof current !== 'object') {\n return undefined\n }\n /** Safe cast – at this point we know `current` is an object/array. */\n current = (current as Indexable)[key]\n }\n return current\n}\n\n/**\n * Sets a value at a specified path within a nested object or array structure.\n * The function traverses the path, creating intermediate objects or arrays\n * as necessary, and sets the final key to the provided value.\n *\n * @param obj - The target object or array to modify.\n * @param path - An array of keys representing the path to the value.\n * @param value - The value to set at the specified path.\n */\nexport function setDeep(obj: Indexable, path: Path, value: unknown): void {\n let current: Indexable = obj as Indexable\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i]\n const nextKey = path[i + 1]\n if ((current as Indexable)[key] == null) {\n /** Decide container type based on next key */\n ;(current as Indexable)[key] = typeof nextKey === 'number' ? [] : {}\n }\n current = (current as Indexable)[key] as Indexable\n }\n const lastKey = path[path.length - 1]\n ;(current as Indexable)[lastKey] = value\n}\n","import { setDeep, type Indexable } from './path.ts'\nimport { z } from 'zod'\nimport JSONParser from './json-parser.ts'\nimport { ParsedTokenInfo, StackElement, TokenParserMode, TokenParserState } from '@/stream'\n\ntype SchemaType = z.ZodType\ntype TypeDefaults = {\n string?: string | null | undefined\n number?: number | null | undefined\n boolean?: boolean | null | undefined\n}\ntype NestedPrimitive = string | number | boolean | null\ntype NestedValue = NestedPrimitive | NestedObject | NestedValue[]\ntype NestedObject = { [key: string]: NestedValue } & { [key: number]: NestedValue }\ntype OnKeyCompleteCallbackParams = {\n activePath: (string | number | undefined)[]\n completedPaths: (string | number | undefined)[][]\n}\ntype OnKeyCompleteCallback = (data: OnKeyCompleteCallbackParams) => void | undefined\n\n/**\n * SchemaStream builds a progressively populated \"stub\" object for a JSON stream\n * based on a provided Zod schema. This allows consumers to read a safe partial\n * structure before the upstream JSON has fully completed.\n *\n * All schema introspection relies exclusively on public Zod APIs compatible\n * with both Zod v3 and v4. No internal properties (e.g. `_def`) are used.\n */\nexport class SchemaStream {\n private schemaInstance: NestedObject\n private activePath: (string | number | undefined)[] = []\n private completedPaths: (string | number | undefined)[][] = []\n private readonly onKeyComplete?: OnKeyCompleteCallback\n\n constructor(\n schema: SchemaType,\n opts: {\n defaultData?: NestedObject\n typeDefaults?: TypeDefaults\n onKeyComplete?: OnKeyCompleteCallback\n } = {}\n ) {\n const { defaultData, onKeyComplete, typeDefaults } = opts\n this.schemaInstance = this.createBlankObject(schema, defaultData, typeDefaults)\n this.onKeyComplete = onKeyComplete\n }\n\n /**\n * Attempt to extract a default value for a schema using **only public APIs**.\n *\n * Strategy:\n * 1. `safeParse(undefined)` – captures `.default()`, `.catch()`, and Zod v4\n * short‑circuit behaviour without introspecting internals.\n * 2. Structural defaults for primitives/collections.\n * 3. Recursively unwrap optional/nullable/effects schemas via `unwrap()`.\n */\n private getDefaultValue(schema: SchemaType, typeDefaults?: TypeDefaults): unknown {\n /** Try parsing undefined to trigger defaults/catches. */\n try {\n const parsed = schema.safeParse(undefined)\n if (parsed.success && parsed.data !== undefined) {\n return parsed.data as unknown\n }\n } catch {\n /** ignore parse errors; fall through to structural defaults */\n }\n /** Structural defaults based on public instanceof checks. */\n if (schema instanceof z.ZodString) {\n return Object.prototype.hasOwnProperty.call(typeDefaults ?? {}, 'string') ?\n typeDefaults?.string\n : null\n }\n if (schema instanceof z.ZodNumber) {\n return Object.prototype.hasOwnProperty.call(typeDefaults ?? {}, 'number') ?\n typeDefaults?.number\n : null\n }\n if (schema instanceof z.ZodBoolean) {\n return Object.prototype.hasOwnProperty.call(typeDefaults ?? {}, 'boolean') ?\n typeDefaults?.boolean\n : null\n }\n if (schema instanceof z.ZodArray) {\n return []\n }\n if (schema instanceof z.ZodObject) {\n return this.createBlankObject(schema, undefined, typeDefaults)\n }\n if (schema instanceof z.ZodRecord) {\n /** Empty object for records; keys appear only as stream provides them. */\n return {}\n }\n if (\n schema instanceof z.ZodOptional ||\n schema instanceof z.ZodNullable ||\n /**\n /* ZodEffects (v3 + v4); public API exposes unwrap()\n * We intentionally check existence of unwrap to avoid instanceof mismatch across versions.\n */\n ('unwrap' in schema &&\n typeof (schema as unknown as { unwrap: () => unknown }).unwrap === 'function')\n ) {\n try {\n /** unwrap() exists on Optional/Nullable/Effects in both versions. */\n const unwrapped = (schema as unknown as { unwrap: () => SchemaType }).unwrap()\n return this.getDefaultValue(unwrapped as SchemaType, typeDefaults)\n