@browser-ai/web-llm 1.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../../../../node_modules/@ai-sdk/provider/src/errors/ai-sdk-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/api-call-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/empty-response-body-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/get-error-message.ts","../../../../node_modules/@ai-sdk/provider/src/errors/invalid-argument-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/invalid-prompt-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/invalid-response-data-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/json-parse-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/load-api-key-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/load-setting-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/no-content-generated-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/no-such-model-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/too-many-embedding-values-for-call-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/type-validation-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/unsupported-functionality-error.ts","../../../../node_modules/@ai-sdk/provider/src/json-value/is-json.ts","../src/tool-calling/build-json-system-prompt.ts","../src/tool-calling/parse-json-function-calls.ts","../src/tool-calling/format-tool-results.ts","../src/convert-to-webllm-messages.tsx","../src/web-llm-language-model.ts","../src/utils/warnings.ts","../src/utils/tool-utils.ts","../src/utils/prompt-utils.ts","../src/streaming/tool-call-detector.ts","../src/web-llm-provider.ts"],"sourcesContent":["export {\n WebLLMLanguageModel,\n doesBrowserSupportWebLLM,\n} from \"./web-llm-language-model\";\nexport type { WebLLMModelId, WebLLMSettings } from \"./web-llm-language-model\";\nexport type { WebLLMUIMessage, WebLLMProgress } from \"./types\";\n\nexport { WebWorkerMLCEngineHandler } from \"@mlc-ai/web-llm\";\n\nexport { webLLM } from \"./web-llm-provider\";\n","/**\n * Symbol used for identifying AI SDK Error instances.\n * Enables checking if an error is an instance of AISDKError across package versions.\n */\nconst marker = 'vercel.ai.error';\nconst symbol = Symbol.for(marker);\n\n/**\n * Custom error class for AI SDK related errors.\n * @extends Error\n */\nexport class AISDKError extends Error {\n private readonly [symbol] = true; // used in isInstance\n\n /**\n * The underlying cause of the error, if any.\n */\n readonly cause?: unknown;\n\n /**\n * Creates an AI SDK Error.\n *\n * @param {Object} params - The parameters for creating the error.\n * @param {string} params.name - The name of the error.\n * @param {string} params.message - The error message.\n * @param {unknown} [params.cause] - The underlying cause of the error.\n */\n constructor({\n name,\n message,\n cause,\n }: {\n name: string;\n message: string;\n cause?: unknown;\n }) {\n super(message);\n\n this.name = name;\n this.cause = cause;\n }\n\n /**\n * Checks if the given error is an AI SDK Error.\n * @param {unknown} error - The error to check.\n * @returns {boolean} True if the error is an AI SDK Error, false otherwise.\n */\n static isInstance(error: unknown): error is AISDKError {\n return AISDKError.hasMarker(error, marker);\n }\n\n protected static hasMarker(error: unknown, marker: string): boolean {\n const markerSymbol = Symbol.for(marker);\n return (\n error != null &&\n typeof error === 'object' &&\n markerSymbol in error &&\n typeof error[markerSymbol] === 'boolean' &&\n error[markerSymbol] === true\n );\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_APICallError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class APICallError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly url: string;\n readonly requestBodyValues: unknown;\n readonly statusCode?: number;\n\n readonly responseHeaders?: Record<string, string>;\n readonly responseBody?: string;\n\n readonly isRetryable: boolean;\n readonly data?: unknown;\n\n constructor({\n message,\n url,\n requestBodyValues,\n statusCode,\n responseHeaders,\n responseBody,\n cause,\n isRetryable = statusCode != null &&\n (statusCode === 408 || // request timeout\n statusCode === 409 || // conflict\n statusCode === 429 || // too many requests\n statusCode >= 500), // server error\n data,\n }: {\n message: string;\n url: string;\n requestBodyValues: unknown;\n statusCode?: number;\n responseHeaders?: Record<string, string>;\n responseBody?: string;\n cause?: unknown;\n isRetryable?: boolean;\n data?: unknown;\n }) {\n super({ name, message, cause });\n\n this.url = url;\n this.requestBodyValues = requestBodyValues;\n this.statusCode = statusCode;\n this.responseHeaders = responseHeaders;\n this.responseBody = responseBody;\n this.isRetryable = isRetryable;\n this.data = data;\n }\n\n static isInstance(error: unknown): error is APICallError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_EmptyResponseBodyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class EmptyResponseBodyError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message = 'Empty response body' }: { message?: string } = {}) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is EmptyResponseBodyError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","export function getErrorMessage(error: unknown | undefined) {\n if (error == null) {\n return 'unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return JSON.stringify(error);\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidArgumentError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * A function argument is invalid.\n */\nexport class InvalidArgumentError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly argument: string;\n\n constructor({\n message,\n cause,\n argument,\n }: {\n argument: string;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message, cause });\n\n this.argument = argument;\n }\n\n static isInstance(error: unknown): error is InvalidArgumentError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidPromptError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * A prompt is invalid. This error should be thrown by providers when they cannot\n * process a prompt.\n */\nexport class InvalidPromptError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly prompt: unknown;\n\n constructor({\n prompt,\n message,\n cause,\n }: {\n prompt: unknown;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message: `Invalid prompt: ${message}`, cause });\n\n this.prompt = prompt;\n }\n\n static isInstance(error: unknown): error is InvalidPromptError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidResponseDataError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Server returned a response with invalid data content.\n * This should be thrown by providers when they cannot parse the response from the API.\n */\nexport class InvalidResponseDataError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly data: unknown;\n\n constructor({\n data,\n message = `Invalid response data: ${JSON.stringify(data)}.`,\n }: {\n data: unknown;\n message?: string;\n }) {\n super({ name, message });\n\n this.data = data;\n }\n\n static isInstance(error: unknown): error is InvalidResponseDataError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_JSONParseError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n// TODO v5: rename to ParseError\nexport class JSONParseError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly text: string;\n\n constructor({ text, cause }: { text: string; cause: unknown }) {\n super({\n name,\n message:\n `JSON parsing failed: ` +\n `Text: ${text}.\\n` +\n `Error message: ${getErrorMessage(cause)}`,\n cause,\n });\n\n this.text = text;\n }\n\n static isInstance(error: unknown): error is JSONParseError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadAPIKeyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadAPIKeyError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message }: { message: string }) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is LoadAPIKeyError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadSettingError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadSettingError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message }: { message: string }) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is LoadSettingError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_NoContentGeneratedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\nThrown when the AI provider fails to generate any content.\n */\nexport class NoContentGeneratedError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({\n message = 'No content generated.',\n }: { message?: string } = {}) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is NoContentGeneratedError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_NoSuchModelError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class NoSuchModelError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly modelId: string;\n readonly modelType:\n | 'languageModel'\n | 'textEmbeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel';\n\n constructor({\n errorName = name,\n modelId,\n modelType,\n message = `No such ${modelType}: ${modelId}`,\n }: {\n errorName?: string;\n modelId: string;\n modelType:\n | 'languageModel'\n | 'textEmbeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel';\n message?: string;\n }) {\n super({ name: errorName, message });\n\n this.modelId = modelId;\n this.modelType = modelType;\n }\n\n static isInstance(error: unknown): error is NoSuchModelError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_TooManyEmbeddingValuesForCallError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class TooManyEmbeddingValuesForCallError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly provider: string;\n readonly modelId: string;\n readonly maxEmbeddingsPerCall: number;\n readonly values: Array<unknown>;\n\n constructor(options: {\n provider: string;\n modelId: string;\n maxEmbeddingsPerCall: number;\n values: Array<unknown>;\n }) {\n super({\n name,\n message:\n `Too many values for a single embedding call. ` +\n `The ${options.provider} model \"${options.modelId}\" can only embed up to ` +\n `${options.maxEmbeddingsPerCall} values per call, but ${options.values.length} values were provided.`,\n });\n\n this.provider = options.provider;\n this.modelId = options.modelId;\n this.maxEmbeddingsPerCall = options.maxEmbeddingsPerCall;\n this.values = options.values;\n }\n\n static isInstance(\n error: unknown,\n ): error is TooManyEmbeddingValuesForCallError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_TypeValidationError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class TypeValidationError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly value: unknown;\n\n constructor({ value, cause }: { value: unknown; cause: unknown }) {\n super({\n name,\n message:\n `Type validation failed: ` +\n `Value: ${JSON.stringify(value)}.\\n` +\n `Error message: ${getErrorMessage(cause)}`,\n cause,\n });\n\n this.value = value;\n }\n\n static isInstance(error: unknown): error is TypeValidationError {\n return AISDKError.hasMarker(error, marker);\n }\n\n /**\n * Wraps an error into a TypeValidationError.\n * If the cause is already a TypeValidationError with the same value, it returns the cause.\n * Otherwise, it creates a new TypeValidationError.\n *\n * @param {Object} params - The parameters for wrapping the error.\n * @param {unknown} params.value - The value that failed validation.\n * @param {unknown} params.cause - The original error or cause of the validation failure.\n * @returns {TypeValidationError} A TypeValidationError instance.\n */\n static wrap({\n value,\n cause,\n }: {\n value: unknown;\n cause: unknown;\n }): TypeValidationError {\n return TypeValidationError.isInstance(cause) && cause.value === value\n ? cause\n : new TypeValidationError({ value, cause });\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_UnsupportedFunctionalityError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class UnsupportedFunctionalityError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly functionality: string;\n\n constructor({\n functionality,\n message = `'${functionality}' functionality not supported.`,\n }: {\n functionality: string;\n message?: string;\n }) {\n super({ name, message });\n this.functionality = functionality;\n }\n\n static isInstance(error: unknown): error is UnsupportedFunctionalityError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { JSONArray, JSONObject, JSONValue } from './json-value';\n\nexport function isJSONValue(value: unknown): value is JSONValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.every(isJSONValue);\n }\n\n if (typeof value === 'object') {\n return Object.entries(value).every(\n ([key, val]) => typeof key === 'string' && isJSONValue(val),\n );\n }\n\n return false;\n}\n\nexport function isJSONArray(value: unknown): value is JSONArray {\n return Array.isArray(value) && value.every(isJSONValue);\n}\n\nexport function isJSONObject(value: unknown): value is JSONObject {\n return (\n value != null &&\n typeof value === 'object' &&\n Object.entries(value).every(\n ([key, val]) => typeof key === 'string' && isJSONValue(val),\n )\n );\n}\n","import type {\r\n JSONSchema7,\r\n LanguageModelV2FunctionTool,\r\n} from \"@ai-sdk/provider\";\r\nimport type { ToolDefinition } from \"./types\";\r\n\r\n/**\r\n * Builds an enhanced system prompt for JSON-based tool calling.\r\n * The model receives JSON schemas and is expected to return JSON tool calls.\r\n *\r\n * @param originalSystemPrompt - The original system prompt (if any)\r\n * @param tools - Array of available tool definitions\r\n * @param options - Configuration options for tool calling behavior (unused, kept for backwards compatibility)\r\n * @returns Enhanced system prompt with JSON tool calling instructions\r\n */\r\nexport function buildJsonToolSystemPrompt(\r\n originalSystemPrompt: string | undefined,\r\n tools: Array<ToolDefinition | LanguageModelV2FunctionTool>,\r\n options?: { allowParallelToolCalls?: boolean },\r\n): string {\r\n if (!tools || tools.length === 0) {\r\n return originalSystemPrompt || \"\";\r\n }\r\n\r\n const parallelInstruction =\r\n \"Only request one tool call at a time. Wait for tool results before asking for another tool.\";\r\n\r\n const toolSchemas = tools.map((tool) => {\r\n const schema = getParameters(tool);\r\n return {\r\n name: tool.name,\r\n description: tool.description ?? \"No description provided.\",\r\n parameters: schema || { type: \"object\", properties: {} },\r\n };\r\n });\r\n\r\n const toolsJson = JSON.stringify(toolSchemas, null, 2);\r\n\r\n const instructionBody = `You are a helpful AI assistant with access to tools.\r\n\r\n# Available Tools\r\n${toolsJson}\r\n\r\n# Tool Calling Instructions\r\n${parallelInstruction}\r\n\r\nTo call a tool, output JSON in this exact format inside a \\`\\`\\`tool_call code fence:\r\n\r\n\\`\\`\\`tool_call\r\n{\"name\": \"tool_name\", \"arguments\": {\"param1\": \"value1\", \"param2\": \"value2\"}}\r\n\\`\\`\\`\r\n\r\nTool responses will be provided in \\`\\`\\`tool_result fences. Each line contains JSON like:\r\n\\`\\`\\`tool_result\r\n{\"id\": \"call_123\", \"name\": \"tool_name\", \"result\": {...}, \"error\": false}\r\n\\`\\`\\`\r\nUse the \\`result\\` payload (and treat \\`error\\` as a boolean flag) when continuing the conversation.\r\n\r\nImportant:\r\n- Use exact tool and parameter names from the schema above\r\n- Arguments must be a valid JSON object matching the tool's parameters\r\n- You can include brief reasoning before or after the tool call\r\n- If no tool is needed, respond directly without tool_call fences`;\r\n\r\n if (originalSystemPrompt?.trim()) {\r\n return `${originalSystemPrompt.trim()}\\n\\n${instructionBody}`;\r\n }\r\n\r\n return instructionBody;\r\n}\r\n\r\n/**\r\n * Extracts the parameters/input schema from a tool definition.\r\n * Handles both ToolDefinition (parameters field) and LanguageModelV2FunctionTool (inputSchema field).\r\n *\r\n * @param tool - The tool definition to extract parameters from\r\n * @returns The JSON Schema for the tool's parameters, or undefined if not present\r\n */\r\nfunction getParameters(\r\n tool: ToolDefinition | LanguageModelV2FunctionTool,\r\n): JSONSchema7 | undefined {\r\n if (\"parameters\" in tool) {\r\n return tool.parameters;\r\n }\r\n\r\n return tool.inputSchema as JSONSchema7 | undefined;\r\n}\r\n","import type { ParsedResponse, ParsedToolCall } from \"./types\";\n\nconst JSON_TOOL_CALL_FENCE_REGEX = /```tool[_-]?call\\s*([\\s\\S]*?)```/gi;\n\nfunction generateToolCallId(): string {\n return `call_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Parses JSON-formatted tool calls from model response.\n * Supports multiple formats:\n * 1. Single object: {\"name\": \"tool\", \"arguments\": {...}}\n * 2. Array: [{\"name\": \"tool1\", ...}, {\"name\": \"tool2\", ...}]\n * 3. Newline-separated objects:\n * {\"name\": \"tool1\", \"arguments\": {...}}\n * {\"name\": \"tool2\", \"arguments\": {...}}\n *\n * @param response - The model's response text to parse\n * @returns Object containing parsed tool calls and remaining text content\n */\nexport function parseJsonFunctionCalls(response: string): ParsedResponse {\n const matches = Array.from(response.matchAll(JSON_TOOL_CALL_FENCE_REGEX));\n JSON_TOOL_CALL_FENCE_REGEX.lastIndex = 0;\n\n if (matches.length === 0) {\n return { toolCalls: [], textContent: response };\n }\n\n const toolCalls: ParsedToolCall[] = [];\n let textContent = response;\n\n for (const match of matches) {\n const [fullFence, innerContent] = match;\n textContent = textContent.replace(fullFence, \"\");\n\n try {\n const trimmed = innerContent.trim();\n\n // Try parsing as a single JSON value first (object or array)\n try {\n const parsed = JSON.parse(trimmed);\n const callsArray = Array.isArray(parsed) ? parsed : [parsed];\n\n for (const call of callsArray) {\n if (!call.name) continue;\n\n toolCalls.push({\n type: \"tool-call\",\n toolCallId: call.id || generateToolCallId(),\n toolName: call.name,\n args: call.arguments || {},\n });\n }\n } catch {\n // If single JSON parsing fails, try parsing as newline-separated JSON objects\n const lines = trimmed.split(\"\\n\").filter((line) => line.trim());\n\n for (const line of lines) {\n try {\n const call = JSON.parse(line.trim());\n if (!call.name) continue;\n\n toolCalls.push({\n type: \"tool-call\",\n toolCallId: call.id || generateToolCallId(),\n toolName: call.name,\n args: call.arguments || {},\n });\n } catch {\n continue;\n }\n }\n }\n } catch (error) {\n console.warn(\"Failed to parse JSON tool call:\", error);\n continue;\n }\n }\n\n textContent = textContent.replace(/\\n{2,}/g, \"\\n\");\n\n return { toolCalls, textContent: textContent.trim() };\n}\n\nexport function hasJsonFunctionCalls(response: string): boolean {\n const hasMatch = JSON_TOOL_CALL_FENCE_REGEX.test(response);\n JSON_TOOL_CALL_FENCE_REGEX.lastIndex = 0;\n return hasMatch;\n}\n\nexport function extractJsonFunctionCallsBlock(response: string): string | null {\n const match = JSON_TOOL_CALL_FENCE_REGEX.exec(response);\n JSON_TOOL_CALL_FENCE_REGEX.lastIndex = 0;\n return match ? match[0] : null;\n}\n","import type { ToolResult } from \"./types\";\n\n/**\n * Formats tool execution results into a JSON-formatted string for the model.\n *\n * Each result is formatted as:\n * ```tool_result\n * {\"id\": \"call_123\", \"name\": \"tool_name\", \"result\": {...}, \"error\": false}\n * {\"id\": \"call_456\", \"name\": \"tool_name2\", \"result\": {...}, \"error\": false}\n * ```\n *\n * @param results - Array of tool results to format\n * @returns Formatted tool result string in JSON format\n *\n * @example\n * ```typescript\n * const results = [\n * { toolCallId: \"call_1\", toolName: \"search\", result: { found: true }, isError: false }\n * ];\n * const formatted = formatToolResults(results);\n * // Returns:\n * // ```tool_result\n * // {\"id\":\"call_1\",\"name\":\"search\",\"result\":{\"found\":true},\"error\":false}\n * // ```\n * ```\n */\nexport function formatToolResults(results: ToolResult[]): string {\n if (results.length === 0) {\n return \"\";\n }\n\n const lines = results\n .map((result) => formatSingleToolResult(result))\n .join(\"\\n\");\n\n return `\\`\\`\\`tool_result\\n${lines}\\n\\`\\`\\``;\n}\n\n/**\n * Formats a single tool result as a JSON string\n *\n * @param result - The tool result to format\n * @returns JSON-formatted string representation of the result\n *\n * @example\n * ```typescript\n * const result = {\n * toolCallId: \"call_1\",\n * toolName: \"search\",\n * result: { found: true },\n * isError: false\n * };\n * const formatted = formatSingleToolResult(result);\n * // Returns: '{\"id\":\"call_1\",\"name\":\"search\",\"result\":{\"found\":true},\"error\":false}'\n * ```\n */\nexport function formatSingleToolResult(result: ToolResult): string {\n return JSON.stringify({\n id: result.toolCallId,\n name: result.toolName,\n result: result.result,\n error: result.isError ?? false,\n });\n}\n","import {\r\n LanguageModelV2Prompt,\r\n LanguageModelV2ToolResultPart,\r\n LanguageModelV2ToolResultOutput,\r\n UnsupportedFunctionalityError,\r\n} from \"@ai-sdk/provider\";\r\nimport * as webllm from \"@mlc-ai/web-llm\";\r\nimport { formatToolResults } from \"./tool-calling\";\r\nimport type { ToolResult } from \"./tool-calling\";\r\n\r\n/**\r\n * Converts the AI SDK ToolResultOutput format to a simple value + error flag\r\n */\r\nfunction convertToolResultOutput(output: LanguageModelV2ToolResultOutput): {\r\n value: unknown;\r\n isError: boolean;\r\n} {\r\n switch (output.type) {\r\n case \"text\":\r\n return { value: output.value, isError: false };\r\n case \"json\":\r\n return { value: output.value, isError: false };\r\n case \"error-text\":\r\n return { value: output.value, isError: true };\r\n case \"error-json\":\r\n return { value: output.value, isError: true };\r\n case \"content\":\r\n return { value: output.value, isError: false };\r\n default: {\r\n const exhaustiveCheck: never = output;\r\n return { value: exhaustiveCheck, isError: false };\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Converts a ToolResultPart to our internal ToolResult format\r\n */\r\nfunction toToolResult(part: LanguageModelV2ToolResultPart): ToolResult {\r\n const { value, isError } = convertToolResultOutput(part.output);\r\n return {\r\n toolCallId: part.toolCallId,\r\n toolName: part.toolName,\r\n result: value,\r\n isError,\r\n };\r\n}\r\n\r\nfunction uint8ArrayToBase64(uint8array: Uint8Array): string {\r\n const binary = Array.from(uint8array, (byte) =>\r\n String.fromCharCode(byte),\r\n ).join(\"\");\r\n return btoa(binary);\r\n}\r\n\r\nfunction convertDataToURL(\r\n data:\r\n | string\r\n | Buffer\r\n | URL\r\n | Uint8Array\r\n | ArrayBuffer\r\n | ReadableStream\r\n | undefined,\r\n mediaType: string,\r\n): string {\r\n if (data instanceof URL) {\r\n return data.toString();\r\n }\r\n\r\n if (typeof data === \"string\") {\r\n // AI SDK provides base64 string\r\n return `data:${mediaType};base64,${data}`;\r\n }\r\n\r\n if (data instanceof Uint8Array) {\r\n return `data:${mediaType};base64,${uint8ArrayToBase64(data)}`;\r\n }\r\n\r\n if (data instanceof ArrayBuffer) {\r\n return `data:${mediaType};base64,${uint8ArrayToBase64(\r\n new Uint8Array(data),\r\n )}`;\r\n }\r\n\r\n if (typeof Buffer !== \"undefined\" && data instanceof Buffer) {\r\n return `data:${mediaType};base64,${data.toString(\"base64\")}`;\r\n }\r\n\r\n throw new UnsupportedFunctionalityError({\r\n functionality: `file data type: ${typeof data}`,\r\n });\r\n}\r\n\r\nexport function convertToWebLLMMessages(\r\n prompt: LanguageModelV2Prompt,\r\n): webllm.ChatCompletionMessageParam[] {\r\n const messages: webllm.ChatCompletionMessageParam[] = [];\r\n\r\n for (const message of prompt) {\r\n switch (message.role) {\r\n case \"system\":\r\n messages.push({\r\n role: \"system\",\r\n content: message.content,\r\n });\r\n break;\r\n\r\n case \"user\":\r\n const hasFileContent = message.content.some(\r\n (part) => part.type === \"file\",\r\n );\r\n\r\n if (!hasFileContent) {\r\n const userContent: string[] = [];\r\n for (const part of message.content) {\r\n if (part.type === \"text\") {\r\n userContent.push(part.text);\r\n }\r\n }\r\n messages.push({\r\n role: \"user\",\r\n content: userContent.join(\"\\n\"),\r\n });\r\n break;\r\n }\r\n\r\n const content: webllm.ChatCompletionContentPart[] = [];\r\n for (const part of message.content) {\r\n if (part.type === \"text\") {\r\n content.push({ type: \"text\", text: part.text });\r\n } else if (part.type === \"file\") {\r\n if (!part.mediaType?.startsWith(\"image/\")) {\r\n throw new UnsupportedFunctionalityError({\r\n functionality: `file input with media type '${part.mediaType}'`,\r\n });\r\n }\r\n content.push({\r\n type: \"image_url\",\r\n image_url: {\r\n url: convertDataToURL(part.data, part.mediaType),\r\n },\r\n });\r\n }\r\n }\r\n messages.push({ role: \"user\", content });\r\n break;\r\n\r\n case \"assistant\":\r\n let assistantContent = \"\";\r\n const toolCallsInMessage: Array<{\r\n toolCallId: string;\r\n toolName: string;\r\n }> = [];\r\n\r\n for (const part of message.content) {\r\n if (part.type === \"text\") {\r\n assistantContent += part.text;\r\n } else if (part.type === \"tool-call\") {\r\n // Store tool call info but don't include in content\r\n // Tool calls will be tracked separately\r\n toolCallsInMessage.push({\r\n toolCallId: part.toolCallId,\r\n toolName: part.toolName,\r\n });\r\n }\r\n }\r\n\r\n // Only add assistant message if there's text content\r\n // Tool calls are handled via the JSON fence format in the text\r\n if (assistantContent) {\r\n messages.push({\r\n role: \"assistant\",\r\n content: assistantContent,\r\n });\r\n }\r\n break;\r\n\r\n case \"tool\":\r\n // Collect tool results and format them\r\n const toolResults: ToolResult[] = message.content.map(toToolResult);\r\n\r\n // Format tool results as user message with JSON fence format\r\n const formattedResults = formatToolResults(toolResults);\r\n messages.push({\r\n role: \"user\",\r\n content: formattedResults,\r\n });\r\n break;\r\n }\r\n }\r\n\r\n return messages;\r\n}\r\n","import {\r\n LanguageModelV2,\r\n LanguageModelV2CallOptions,\r\n LanguageModelV2CallWarning,\r\n LanguageModelV2Content,\r\n LanguageModelV2FinishReason,\r\n LanguageModelV2ProviderDefinedTool,\r\n LanguageModelV2StreamPart,\r\n LanguageModelV2ToolCall,\r\n LoadSettingError,\r\n} from \"@ai-sdk/provider\";\r\nimport { convertToWebLLMMessages } from \"./convert-to-webllm-messages\";\r\n\r\nimport {\r\n AppConfig,\r\n ChatCompletionRequestStreaming,\r\n CreateWebWorkerMLCEngine,\r\n InitProgressReport,\r\n MLCEngine,\r\n MLCEngineConfig,\r\n MLCEngineInterface,\r\n} from \"@mlc-ai/web-llm\";\r\nimport { Availability } from \"./types\";\r\nimport {\r\n buildJsonToolSystemPrompt,\r\n parseJsonFunctionCalls,\r\n} from \"./tool-calling\";\r\nimport type { ParsedToolCall, ToolDefinition } from \"./tool-calling\";\r\nimport {\r\n createUnsupportedSettingWarning,\r\n createUnsupportedToolWarning,\r\n} from \"./utils/warnings\";\r\nimport { isFunctionTool } from \"./utils/tool-utils\";\r\nimport {\r\n prependSystemPromptToMessages,\r\n extractSystemPrompt,\r\n} from \"./utils/prompt-utils\";\r\nimport { ToolCallFenceDetector } from \"./streaming/tool-call-detector\";\r\n\r\ndeclare global {\r\n interface Navigator {\r\n gpu?: unknown;\r\n }\r\n}\r\n\r\nexport type WebLLMModelId = string;\r\n\r\nexport interface WebLLMSettings {\r\n /**\r\n * Custom app configuration for WebLLM\r\n */\r\n appConfig?: AppConfig;\r\n /**\r\n * Progress callback for model initialization\r\n */\r\n initProgressCallback?: (progress: InitProgressReport) => void;\r\n /**\r\n * Engine configuration options\r\n */\r\n engineConfig?: MLCEngineConfig;\r\n /**\r\n * A web worker instance to run the model in.\r\n * When provided, the model will run in a separate thread.\r\n *\r\n * @default undefined\r\n */\r\n worker?: Worker;\r\n}\r\n\r\n/**\r\n * Check if the browser supports WebLLM\r\n * @returns true if the browser supports WebLLM, false otherwise\r\n */\r\nexport function doesBrowserSupportWebLLM(): boolean {\r\n return globalThis?.navigator?.gpu !== undefined;\r\n}\r\n\r\nfunction extractToolName(content: string): string | null {\r\n // For JSON mode: {\"name\":\"toolName\"\r\n const jsonMatch = content.match(/\\{\\s*\"name\"\\s*:\\s*\"([^\"]+)\"/);\r\n if (jsonMatch) {\r\n return jsonMatch[1];\r\n }\r\n return null;\r\n}\r\n\r\nfunction extractArgumentsContent(content: string): string {\r\n const match = content.match(/\"arguments\"\\s*:\\s*/);\r\n if (!match || match.index === undefined) {\r\n return \"\";\r\n }\r\n\r\n const startIndex = match.index + match[0].length;\r\n let result = \"\";\r\n let depth = 0;\r\n let inString = false;\r\n let escaped = false;\r\n let started = false;\r\n\r\n for (let i = startIndex; i < content.length; i++) {\r\n const char = content[i];\r\n result += char;\r\n\r\n if (!started) {\r\n if (!/\\s/.test(char)) {\r\n started = true;\r\n if (char === \"{\" || char === \"[\") {\r\n depth = 1;\r\n }\r\n }\r\n continue;\r\n }\r\n\r\n if (escaped) {\r\n escaped = false;\r\n continue;\r\n }\r\n\r\n if (char === \"\\\\\") {\r\n escaped = true;\r\n continue;\r\n }\r\n\r\n if (char === '\"') {\r\n inString = !inString;\r\n continue;\r\n }\r\n\r\n if (!inString) {\r\n if (char === \"{\" || char === \"[\") {\r\n depth += 1;\r\n } else if (char === \"}\" || char === \"]\") {\r\n if (depth > 0) {\r\n depth -= 1;\r\n if (depth === 0) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\ntype WebLLMConfig = {\r\n provider: string;\r\n modelId: WebLLMModelId;\r\n options: WebLLMSettings;\r\n};\r\n\r\nexport class WebLLMLanguageModel implements LanguageModelV2 {\r\n readonly specificationVersion = \"v2\";\r\n readonly modelId: WebLLMModelId;\r\n readonly provider = \"web-llm\";\r\n\r\n private readonly config: WebLLMConfig;\r\n private engine?: MLCEngineInterface;\r\n private isInitialized = false;\r\n private initializationPromise?: Promise<void>;\r\n\r\n constructor(modelId: WebLLMModelId, options: WebLLMSettings = {}) {\r\n this.modelId = modelId;\r\n this.config = {\r\n provider: this.provider,\r\n modelId,\r\n options,\r\n };\r\n }\r\n\r\n readonly supportedUrls: Record<string, RegExp[]> = {\r\n // WebLLM doesn't support URLs natively\r\n };\r\n\r\n /**\r\n * Check if the model is initialized and ready to use\r\n * @returns true if the model is initialized, false otherwise\r\n */\r\n get isModelInitialized(): boolean {\r\n return this.isInitialized;\r\n }\r\n\r\n private async getEngine(\r\n options?: MLCEngineConfig,\r\n onInitProgress?: (progress: InitProgressReport) => void,\r\n ): Promise<MLCEngineInterface> {\r\n const availability = await this.availability();\r\n if (availability === \"unavailable\") {\r\n throw new LoadSettingError({\r\n message:\r\n \"WebLLM is not available. This library requires a browser with WebGPU support.\",\r\n });\r\n }\r\n\r\n if (this.engine && this.isInitialized) return this.engine;\r\n\r\n // If initialization is already in progress, wait for it\r\n if (this.initializationPromise) {\r\n await this.initializationPromise;\r\n if (this.engine) return this.engine;\r\n }\r\n\r\n this.initializationPromise = this._initializeEngine(\r\n options,\r\n onInitProgress,\r\n );\r\n await this.initializationPromise;\r\n\r\n if (!this.engine) {\r\n throw new LoadSettingError({\r\n message: \"Engine initialization failed\",\r\n });\r\n }\r\n\r\n return this.engine;\r\n }\r\n\r\n private async _initializeEngine(\r\n options?: MLCEngineConfig,\r\n onInitProgress?: (progress: InitProgressReport) => void,\r\n ): Promise<void> {\r\n try {\r\n // Create engine instance\r\n const engineConfig = {\r\n ...this.config.options.engineConfig,\r\n ...options,\r\n initProgressCallback:\r\n onInitProgress || this.config.options.initProgressCallback,\r\n };\r\n\r\n if (this.config.options.worker) {\r\n this.engine = await CreateWebWorkerMLCEngine(\r\n this.config.options.worker,\r\n this.modelId,\r\n engineConfig,\r\n );\r\n } else {\r\n this.engine = new MLCEngine(engineConfig);\r\n // Load the model\r\n await this.engine.reload(this.modelId);\r\n }\r\n\r\n this.isInitialized = true;\r\n } catch (error) {\r\n // Reset state on error so we can retry\r\n this.engine = undefined;\r\n this.isInitialized = false;\r\n this.initializationPromise = undefined;\r\n\r\n throw new LoadSettingError({\r\n message: `Failed to initialize WebLLM engine: ${error instanceof Error ? error.message : \"Unknown error\"}`,\r\n });\r\n }\r\n }\r\n\r\n private getArgs({\r\n prompt,\r\n maxOutputTokens,\r\n temperature,\r\n topP,\r\n topK,\r\n frequencyPenalty,\r\n presencePenalty,\r\n stopSequences,\r\n responseFormat,\r\n seed,\r\n tools,\r\n toolChoice,\r\n }: Parameters<LanguageModelV2[\"doGenerate\"]>[0]) {\r\n const warnings: LanguageModelV2CallWarning[] = [];\r\n\r\n const functionTools: ToolDefinition[] = (tools ?? [])\r\n .filter(isFunctionTool)\r\n .map((tool) => ({\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: tool.inputSchema,\r\n }));\r\n\r\n const unsupportedTools = (tools ?? []).filter(\r\n (tool): tool is LanguageModelV2ProviderDefinedTool =>\r\n !isFunctionTool(tool),\r\n );\r\n\r\n for (const tool of unsupportedTools) {\r\n warnings.push(\r\n createUnsupportedToolWarning(\r\n tool,\r\n \"Only function tools are supported by WebLLM\",\r\n ),\r\n );\r\n }\r\n\r\n if (topK != null) {\r\n warnings.push(\r\n createUnsupportedSettingWarning(\r\n \"topK\",\r\n \"topK is not supported by WebLLM\",\r\n ),\r\n );\r\n }\r\n\r\n if (stopSequences != null) {\r\n warnings.push(\r\n createUnsupportedSettingWarning(\r\n \"stopSequences\",\r\n \"Stop sequences may not be fully implemented\",\r\n ),\r\n );\r\n }\r\n\r\n if (presencePenalty != null) {\r\n warnings.push(\r\n createUnsupportedSettingWarning(\r\n \"presencePenalty\",\r\n \"Presence penalty is not fully implemented\",\r\n ),\r\n );\r\n }\r\n\r\n if (frequencyPenalty != null) {\r\n warnings.push(\r\n createUnsupportedSettingWarning(\r\n \"frequencyPenalty\",\r\n \"Frequency penalty is not fully implemented\",\r\n ),\r\n );\r\n }\r\n\r\n if (toolChoice != null) {\r\n warnings.push(\r\n createUnsupportedSettingWarning(\r\n \"toolChoice\",\r\n \"toolChoice is not supported by WebLLM\",\r\n ),\r\n );\r\n }\r\n\r\n // Convert messages to WebLLM format\r\n const messages = convertToWebLLMMessages(prompt);\r\n\r\n // Build request options\r\n const requestOptions: any = {\r\n messages,\r\n temperature,\r\n max_tokens: maxOutputTokens,\r\n top_p: topP,\r\n seed,\r\n };\r\n\r\n // Handle response format\r\n if (responseFormat?.type === \"json\") {\r\n requestOptions.response_format = { type: \"json_object\" };\r\n }\r\n\r\n return {\r\n messages,\r\n warnings,\r\n requestOptions,\r\n functionTools,\r\n };\r\n }\r\n\r\n /**\r\n * Generates a complete text response using WebLLM\r\n * @param options\r\n * @returns Promise resolving to the generated content with finish reason, usage stats, and any warnings\r\n * @throws {LoadSettingError} When WebLLM is not available or model needs to be downloaded\r\n * @throws {UnsupportedFunctionalityError} When unsupported features like file input are used\r\n */\r\n public async doGenerate(options: LanguageModelV2CallOptions) {\r\n const converted = this.getArgs(options);\r\n const { messages, warnings, requestOptions, functionTools } = converted;\r\n\r\n // Extract system prompt and build tool calling prompt\r\n const {\r\n systemPrompt: originalSystemPrompt,\r\n messages: messagesWithoutSystem,\r\n } = extractSystemPrompt(messages);\r\n\r\n const systemPrompt = buildJsonToolSystemPrompt(\r\n originalSystemPrompt,\r\n functionTools,\r\n {\r\n allowParallelToolCalls: false,\r\n },\r\n );\r\n\r\n // Prepend system prompt to messages\r\n const promptMessages = prependSystemPromptToMessages(\r\n messagesWithoutSystem,\r\n systemPrompt,\r\n );\r\n\r\n const engine = await this.getEngine();\r\n\r\n const abortHandler = async () => {\r\n await engine.interruptGenerate();\r\n };\r\n\r\n if (options.abortSignal) {\r\n options.abortSignal.addEventListener(\"abort\", abortHandler);\r\n }\r\n\r\n try {\r\n const response = await engine.chat.completions.create({\r\n ...requestOptions,\r\n messages: promptMessages,\r\n stream: false,\r\n ...(options.abortSignal &&\r\n !this.config.options.worker && { signal: options.abortSignal }),\r\n });\r\n\r\n const choice = response.choices[0];\r\n if (!choice) {\r\n throw new Error(\"No response choice returned from WebLLM\");\r\n }\r\n\r\n const rawResponse = choice.message.content || \"\";\r\n\r\n // Parse JSON tool calls from response\r\n const { toolCalls, textContent } = parseJsonFunctionCalls(rawResponse);\r\n\r\n if (toolCalls.length > 0) {\r\n const toolCallsToEmit = toolCalls.slice(0, 1);\r\n\r\n const parts: LanguageModelV2Content[] = [];\r\n\r\n if (textContent) {\r\n parts.push({\r\n type: \"text\",\r\n text: textContent,\r\n });\r\n }\r\n\r\n for (const call of toolCallsToEmit) {\r\n parts.push({\r\n type: \"tool-call\",\r\n toolCallId: call.toolCallId,\r\n toolName: call.toolName,\r\n input: JSON.stringify(call.args ?? {}),\r\n } satisfies LanguageModelV2ToolCall);\r\n }\r\n\r\n return {\r\n content: parts,\r\n finishReason: \"tool-calls\" as LanguageModelV2FinishReason,\r\n usage: {\r\n inputTokens: response.usage?.prompt_tokens,\r\n outputTokens: response.usage?.completion_tokens,\r\n totalTokens: response.usage?.total_tokens,\r\n },\r\n request: { body: { messages: promptMessages, ...requestOptions } },\r\n warnings,\r\n };\r\n }\r\n\r\n const content: LanguageModelV2Content[] = [\r\n {\r\n type: \"text\",\r\n text: textContent || rawResponse,\r\n },\r\n ];\r\n\r\n let finishReason: LanguageModelV2FinishReason = \"stop\";\r\n if (choice.finish_reason === \"abort\") {\r\n finishReason = \"other\";\r\n }\r\n\r\n return {\r\n content,\r\n finishReason,\r\n usage: {\r\n inputTokens: response.usage?.prompt_tokens,\r\n outputTokens: response.usage?.completion_tokens,\r\n totalTokens: response.usage?.total_tokens,\r\n },\r\n request: { body: { messages: promptMessages, ...requestOptions } },\r\n warnings,\r\n };\r\n } catch (error) {\r\n throw new Error(\r\n `WebLLM generation failed: ${\r\n error instanceof Error ? error.message : \"Unknown error\"\r\n }`,\r\n );\r\n } finally {\r\n if (options.abortSignal) {\r\n options.abortSignal.removeEventListener(\"abort\", abortHandler);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Check the availability of the WebLLM model\r\n * @returns Promise resolving to \"unavailable\", \"available\", or \"available-after-download\"\r\n */\r\n public async availability(): Promise<Availability> {\r\n if (!doesBrowserSupportWebLLM()) {\r\n return \"unavailable\";\r\n }\r\n\r\n if (this.isInitialized) {\r\n return \"available\";\r\n }\r\n\r\n return \"downloadable\";\r\n }\r\n\r\n /**\r\n * Creates an engine session with download progress monitoring.\r\n *\r\n * @example\r\n * ```typescript\r\n * const engine = await model.createSessionWithProgress(\r\n * (progress) => {\r\n * console.log(`Download progress: ${Math.round(progress.loaded * 100)}%`);\r\n * }\r\n * );\r\n * ```\r\n *\r\n * @param onInitProgress Optional callback receiving progress reports during model download\r\n * @returns Promise resolving to a configured WebLLM engine\r\n * @throws {LoadSettingError} When WebLLM is not available or model is unavailable\r\n */\r\n public async createSessionWithProgress(\r\n onInitProgress?: (progress: InitProgressReport) => void,\r\n ): Promise<MLCEngineInterface> {\r\n return this.getEngine(undefined, onInitProgress);\r\n }\r\n\r\n /**\r\n * Generates a streaming text response using WebLLM\r\n * @param options\r\n * @returns Promise resolving to a readable stream of text chunks and request metadata\r\n * @throws {LoadSettingError} When WebLLM is not available or model needs to be downloaded\r\n * @throws {UnsupportedFunctionalityError} When unsupported features like file input are used\r\n */\r\n public async doStream(options: LanguageModelV2CallOptions) {\r\n const converted = this.getArgs(options);\r\n const { messages, warnings, requestOptions, functionTools } = converted;\r\n\r\n // Extract system prompt and build tool calling prompt\r\n const {\r\n systemPrompt: originalSystemPrompt,\r\n messages: messagesWithoutSystem,\r\n } = extractSystemPrompt(messages);\r\n\r\n const systemPrompt = buildJsonToolSystemPrompt(\r\n originalSystemPrompt,\r\n functionTools,\r\n {\r\n allowParallelToolCalls: false,\r\n },\r\n );\r\n\r\n // Prepend system prompt to messages\r\n const promptMessages = prependSystemPromptToMessages(\r\n messagesWithoutSystem,\r\n systemPrompt,\r\n );\r\n\r\n const engine = await this.getEngine();\r\n const useWorker = this.config.options.worker != null;\r\n\r\n const abortHandler = async () => {\r\n await engine.interruptGenerate();\r\n };\r\n\r\n if (options.abortSignal) {\r\n options.abortSignal.addEventListener(\"abort\", abortHandler);\r\n }\r\n\r\n const textId = \"text-0\";\r\n\r\n const stream = new ReadableStream<LanguageModelV2StreamPart>({\r\n async start(controller) {\r\n controller.enqueue({\r\n type: \"stream-start\",\r\n warnings,\r\n });\r\n\r\n let textStarted = false;\r\n let finished = false;\r\n\r\n const ensureTextStart = () => {\r\n if (!textStarted) {\r\n controller.enqueue({\r\n type: \"text-start\",\r\n id: textId,\r\n });\r\n textStarted = true;\r\n }\r\n };\r\n\r\n const emitTextDelta = (delta: string) => {\r\n if (!delta) return;\r\n ensureTextStart();\r\n controller.enqueue({\r\n type: \"text-delta\",\r\n id: textId,\r\n delta,\r\n });\r\n };\r\n\r\n const emitTextEndIfNeeded = () => {\r\n if (!textStarted) return;\r\n controller.enqueue({\r\n type: \"text-end\",\r\n id: textId,\r\n });\r\n textStarted = false;\r\n };\r\n\r\n const finishStream = (\r\n finishReason: LanguageModelV2FinishReason,\r\n usage?: {\r\n prompt_tokens?: number;\r\n completion_tokens?: number;\r\n total_tokens?: number;\r\n },\r\n ) => {\r\n if (finished) return;\r\n finished = true;\r\n emitTextEndIfNeeded();\r\n controller.enqueue({\r\n type: \"finish\",\r\n finishReason,\r\n usage: {\r\n inputTokens: usage?.prompt_tokens,\r\n outputTokens: usage?.completion_tokens,\r\n totalTokens: usage?.total_tokens,\r\n },\r\n });\r\n controller.close();\r\n };\r\n\r\n try {\r\n const streamingRequest: ChatCompletionRequestStreaming = {\r\n ...requestOptions,\r\n messages: promptMessages,\r\n stream: true,\r\n stream_options: { include_usage: true },\r\n ...(options.abortSignal &&\r\n !useWorker && { signal: options.abortSignal }),\r\n };\r\n\r\n const response =\r\n await engine.chat.completions.create(streamingRequest);\r\n\r\n // Use ToolCallFenceDetector for real-time streaming\r\n const fenceDetector = new ToolCallFenceDetector();\r\n let accumulatedText = \"\";\r\n\r\n // Streaming tool call state\r\n let currentToolCallId: string | null = null;\r\n let toolInputStartEmitted = false;\r\n let accumulatedFenceContent = \"\";\r\n let streamedArgumentsLength = 0;\r\n let insideFence = false;\r\n\r\n for await (const chunk of response) {\r\n const choice = chunk.choices[0];\r\n if (!choice) continue;\r\n\r\n if (choice.delta.content) {\r\n const delta = choice.delta.content;\r\n accumulatedText += delta;\r\n\r\n // Add chunk to detector\r\n fenceDetector.addChunk(delta);\r\n\r\n // Process buffer using streaming detection\r\n while (fenceDetector.hasContent()) {\r\n const wasInsideFence = insideFence;\r\n const result = fenceDetector.detectStreamingFence();\r\n insideFence = result.inFence;\r\n\r\n let madeProgress = false;\r\n\r\n if (!wasInsideFence && result.inFence) {\r\n if (result.safeContent) {\r\n emitTextDelta(result.safeContent);\r\n madeProgress = true;\r\n }\r\n\r\n currentToolCallId = `call_${Date.now()}_${Math.random()\r\n .toString(36)\r\n .slice(2, 9)}`;\r\n toolInputStartEmitted = false;\r\n accumulatedFenceContent = \"\";\r\n streamedArgumentsLength = 0;\r\n insideFence = true;\r\n\r\n continue;\r\n }\r\n\r\n if (result.completeFence) {\r\n madeProgress = true;\r\n if (result.safeContent) {\r\n accumulatedFenceContent += result.safeContent;\r\n }\r\n\r\n if (toolInputStartEmitted && currentToolCallId) {\r\n const argsContent = extractArgumentsContent(\r\n accumulatedFenceContent,\r\n );\r\n if (argsContent.length > streamedArgumentsLength) {\r\n const delta = argsContent.slice(streamedArgumentsLength);\r\n streamedArgumentsLength = argsContent.length;\r\n if (delta.length > 0) {\r\n controller.enqueue({\r\n type: \"tool-input-delta\",\r\n id: currentToolCallId,\r\n delta,\r\n });\r\n }\r\n }\r\n }\r\n\r\n const parsed = parseJsonFunctionCalls(result.completeFence);\r\n const parsedToolCalls = parsed.toolCalls;\r\n const selectedToolCalls = parsedToolCalls.slice(0, 1);\r\n\r\n if (selectedToolCalls.length === 0) {\r\n emitTextDelta(result.completeFence);\r\n if (result.textAfterFence) {\r\n emitTextDelta(result.textAfterFence);\r\n }\r\n\r\n currentToolCallId = null;\r\n toolInputStartEmitted = false;\r\n accumulatedFenceContent = \"\";\r\n streamedArgumentsLength = 0;\r\n insideFence = false;\r\n continue;\r\n }\r\n\r\n if (selectedToolCalls.length > 0 && currentToolCallId) {\r\n selectedToolCalls[0].toolCallId = currentToolCallId;\r\n }\r\n\r\n for (const [index, call] of selectedToolCalls.entries()) {\r\n const toolCallId =\r\n index === 0 && currentToolCallId\r\n ? currentToolCallId\r\n : call.toolCallId;\r\n const toolName = call.toolName;\r\n const argsJson = JSON.stringify(call.args ?? {});\r\n\r\n if (toolCallId === currentToolCallId) {\r\n if (!toolInputStartEmitted) {\r\n controller.enqueue({\r\n type: \"tool-input-start\",\r\n id: toolCallId,\r\n toolName,\r\n });\r\n toolInputStartEmitted = true;\r\n }\r\n\r\n const argsContent = extractArgumentsContent(\r\n accumulatedFenceContent,\r\n );\r\n if (argsContent.length > streamedArgumentsLength) {\r\n const delta = argsContent.slice(\r\n streamedArgumentsLength,\r\n );\r\n streamedArgumentsLength = argsContent.length;\r\n if (delta.length > 0) {\r\n controller.enqueue({\r\n type: \"tool-input-delta\",\r\n id: toolCallId,\r\n delta,\r\n });\r\n }\r\n }\r\n } else {\r\n controller.enqueue({\r\n type: \"tool-input-start\",\r\n id: toolCallId,\r\n toolName,\r\n });\r\n if (argsJson.length > 0) {\r\n controller.enqueue({\r\n type: \"tool-input-delta\",\r\n id: toolCallId,\r\n delta: argsJson,\r\n });\r\n }\r\n }\r\n\r\n controller.enqueue({\r\n type: \"tool-input-end\",\r\n id: toolCallId,\r\n });\r\n controller.enqueue({\r\n type: \"tool-call\",\r\n toolCallId,\r\n toolName,\r\n input: argsJson,\r\n providerExecuted: false,\r\n });\r\n }\r\n\r\n if (result.textAfterFence) {\r\n emitTextDelta(result.textAfterFence);\r\n }\r\n\r\n madeProgress = true;\r\n\r\n currentToolCallId = null;\r\n toolInputStartEmitted = false;\r\n accumulatedFenceContent = \"\";\r\n streamedArgumentsLength = 0;\r\n insideFence = false;\r\n continue;\r\n }\r\n\r\n if (insideFence) {\r\n if (result.safeContent) {\r\n accumulatedFenceContent += result.safeContent;\r\n madeProgress = true;\r\n\r\n const toolName = extractToolName(accumulatedFenceContent);\r\n if (\r\n toolName &&\r\n !toolInputStartEmitted &&\r\n currentToolCallId\r\n ) {\r\n controller.enqueue({\r\n type: \"tool-input-start\",\r\n id: currentToolCallId,\r\n toolName,\r\n });\r\n toolInputStartEmitted = true;\r\n }\r\n\r\n if (toolInputStartEmitted && currentToolCallId) {\r\n const argsContent = extractArgumentsContent(\r\n accumulatedFenceContent,\r\n );\r\n if (argsContent.length > streamedArgumentsLength) {\r\n const delta = argsContent.slice(\r\n streamedArgumentsLength,\r\n );\r\n streamedArgumentsLength = argsContent.length;\r\n if (delta.length > 0) {\r\n controller.enqueue({\r\n type: \"tool-input-delta\",\r\n id: currentToolCallId,\r\n delta,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n continue;\r\n }\r\n\r\n if (!insideFence && result.safeContent) {\r\n emitTextDelta(result.safeContent);\r\n madeProgress = true;\r\n }\r\n\r\n if (!madeProgress) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (choice.finish_reason) {\r\n // Emit any remaining buffer content\r\n if (fenceDetector.hasContent()) {\r\n emitTextDelta(fenceDetector.getBuffer());\r\n fenceDetector.clearBuffer();\r\n }\r\n\r\n let finishReason: LanguageModelV2FinishReason = \"stop\";\r\n if (choice.finish_reason === \"abort\") {\r\n finishReason = \"other\";\r\n } else {\r\n // Check if we detected any tool calls\r\n const { toolCalls } = parseJsonFunctionCalls(accumulatedText);\r\n if (toolCalls.length > 0) {\r\n finishReason = \"tool-calls\";\r\n }\r\n }\r\n\r\n finishStream(finishReason, chunk.usage);\r\n }\r\n }\r\n\r\n if (!finished) {\r\n finishStream(\"stop\");\r\n }\r\n } catch (error) {\r\n // Propagate all other errors.\r\n controller.error(error);\r\n } finally {\r\n if (options.abortSignal) {\r\n options.abortSignal.removeEventListener(\"abort\", abortHandler);\r\n }\r\n if (!finished) {\r\n controller.close();\r\n }\r\n }\r\n },\r\n });\r\n\r\n return {\r\n stream,\r\n request: { body: { messages: promptMessages, ...requestOptions } },\r\n };\r\n }\r\n}\r\n","import type {\r\n LanguageModelV2CallWarning,\r\n LanguageModelV2ProviderDefinedTool,\r\n} from \"@ai-sdk/provider\";\r\n\r\n/**\r\n * Creates a warning for an unsupported setting\r\n *\r\n * @param setting - Name of the setting that is not supported\r\n * @param details - Additional details about why it's not supported\r\n * @returns A call warning object\r\n *\r\n * @example\r\n * ```typescript\r\n * const warning = createUnsupportedSettingWarning(\r\n * \"maxOutputTokens\",\r\n * \"maxOutputTokens is not supported by WebLLM\"\r\n * );\r\n * ```\r\n */\r\nexport function createUnsupportedSettingWarning(\r\n setting: string,\r\n details: string,\r\n): LanguageModelV2CallWarning {\r\n return {\r\n type: \"unsupported-setting\",\r\n setting,\r\n details,\r\n };\r\n}\r\n\r\n/**\r\n * Creates a warning for an unsupported tool type\r\n *\r\n * @param tool - The provider-defined tool that is not supported\r\n * @param details - Additional details about why it's not supported\r\n * @returns A call warning object\r\n *\r\n * @example\r\n * ```typescript\r\n * const warning = createUnsupportedToolWarning(\r\n * providerTool,\r\n * \"Only function tools are supported by WebLLM\"\r\n * );\r\n * ```\r\n */\r\nexport function createUnsupportedToolWarning(\r\n tool: LanguageModelV2ProviderDefinedTool,\r\n details: string,\r\n): LanguageModelV2CallWarning {\r\n return {\r\n type: \"unsupported-tool\",\r\n tool,\r\n details,\r\n };\r\n}\r\n","import type {\r\n LanguageModelV2FunctionTool,\r\n LanguageModelV2ProviderDefinedTool,\r\n} from \"@ai-sdk/provider\";\r\n\r\nexport function isFunctionTool(\r\n tool: LanguageModelV2FunctionTool | LanguageModelV2ProviderDefinedTool,\r\n): tool is LanguageModelV2FunctionTool {\r\n return tool.type === \"function\";\r\n}\r\n","import type { ChatCompletionMessageParam } from \"@mlc-ai/web-llm\";\n\n/**\n * Extracts the system prompt from a message array and returns both the system prompt\n * and the remaining messages without the system message.\n *\n * @param messages - Array of chat messages\n * @returns Object with systemPrompt string and messages array without system messages\n */\nexport function extractSystemPrompt(messages: ChatCompletionMessageParam[]): {\n systemPrompt: string | undefined;\n messages: ChatCompletionMessageParam[];\n} {\n const systemMessages = messages.filter((msg) => msg.role === \"system\");\n const nonSystemMessages = messages.filter((msg) => msg.role !== \"system\");\n\n if (systemMessages.length === 0) {\n return { systemPrompt: undefined, messages };\n }\n\n // Combine all system messages into one\n const systemPrompt = systemMessages\n .map((msg) => msg.content)\n .filter((content): content is string => typeof content === \"string\")\n .join(\"\\n\\n\");\n\n return {\n systemPrompt: systemPrompt || undefined,\n messages: nonSystemMessages,\n };\n}\n\n/**\n * Prepends a system prompt to the messages array.\n * If there's already a system message, it prepends to it.\n * Otherwise, creates a new system message at the start.\n *\n * @param messages - Array of chat messages\n * @param systemPrompt - System prompt to prepend\n * @returns New messages array with system prompt prepended\n */\nexport function prependSystemPromptToMessages(\n messages: ChatCompletionMessageParam[],\n systemPrompt: string,\n): ChatCompletionMessageParam[] {\n if (!systemPrompt.trim()) {\n return messages;\n }\n\n const systemMessageIndex = messages.findIndex((msg) => msg.role === \"system\");\n\n if (systemMessageIndex !== -1) {\n const newMessages = [...messages];\n const existingSystemMessage = messages[systemMessageIndex];\n const existingContent =\n typeof existingSystemMessage.content === \"string\"\n ? existingSystemMessage.content\n : \"\";\n\n newMessages[systemMessageIndex] = {\n ...existingSystemMessage,\n content: systemPrompt + (existingContent ? `\\n\\n${existingContent}` : \"\"),\n };\n\n return newMessages;\n }\n\n return [\n {\n role: \"system\",\n content: systemPrompt,\n },\n ...messages,\n ];\n}\n","/**\n * ToolCallFenceDetector - Detects and extracts tool call fences from streaming text\n *\n * This module handles the complex task of detecting tool call fences in a stream\n * where fences might be split across multiple chunks. It uses overlap detection\n * to avoid emitting text that might be the beginning of a fence.\n */\n\n/**\n * Result of fence detection operation\n */\nexport interface FenceDetectionResult {\n fence: string | null;\n prefixText: string;\n remainingText: string;\n overlapLength: number;\n}\n\n/**\n * Result of streaming fence content detection\n */\nexport interface StreamingFenceResult {\n inFence: boolean;\n safeContent: string;\n completeFence: string | null;\n textAfterFence: string;\n}\n\n/**\n * Detects tool call fences in streaming text with support for partial matches\n *\n * @example\n * ```typescript\n * const detector = new ToolCallFenceDetector();\n *\n * // Add chunks as they arrive\n * detector.addChunk(\"Here's the answer: \");\n * detector.addChunk(\"```tool_call\\n<tool_call>\");\n * detector.addChunk(\"<name>search</name></tool_call>\\n```\");\n *\n * // Detect fence\n * const result = detector.detectFence();\n * if (result.fence) {\n * console.log(\"Found tool call!\");\n * }\n * ```\n */\nexport class ToolCallFenceDetector {\n private readonly FENCE_STARTS = [\"```tool_call\"];\n private readonly FENCE_END = \"```\";\n private buffer = \"\";\n\n private inFence = false;\n private fenceStartBuffer = \"\";\n\n addChunk(chunk: string): void {\n this.buffer += chunk;\n }\n\n getBuffer(): string {\n return this.buffer;\n }\n\n clearBuffer(): void {\n this.buffer = \"\";\n }\n\n /**\n * Detects if there's a complete fence in the buffer\n *\n * 1. Searches for fence start markers\n * 2. If found, looks for closing fence\n * 3. Computes overlap for partial fences\n * 4. Returns safe text that can be emitted\n *\n * @returns Detection result with fence info and safe text\n */\n detectFence(): FenceDetectionResult {\n const { index: startIdx, prefix: matchedPrefix } = this.findFenceStart(\n this.buffer,\n );\n\n if (startIdx === -1) {\n // Compute how much of the buffer end might be a partial fence start\n const overlap = this.computeOverlapLength(this.buffer, this.FENCE_STARTS);\n const safeTextLength = this.buffer.length - overlap;\n\n const prefixText =\n safeTextLength > 0 ? this.buffer.slice(0, safeTextLength) : \"\";\n const remaining = overlap > 0 ? this.buffer.slice(-overlap) : \"\";\n\n this.buffer = remaining;\n\n return {\n fence: null,\n prefixText,\n remainingText: \"\",\n overlapLength: overlap,\n };\n }\n\n // Found fence start - extract prefix text before it\n const prefixText = this.buffer.slice(0, startIdx);\n this.buffer = this.buffer.slice(startIdx);\n\n const prefixLength = matchedPrefix?.length ?? 0;\n const closingIdx = this.buffer.indexOf(this.FENCE_END, prefixLength);\n\n // Fence not complete yet\n if (closingIdx === -1) {\n return {\n fence: null,\n prefixText,\n remainingText: \"\",\n overlapLength: 0,\n };\n }\n\n // Complete fence found!\n const endPos = closingIdx + this.FENCE_END.length;\n const fence = this.buffer.slice(0, endPos);\n const remainingText = this.buffer.slice(endPos);\n\n this.buffer = \"\";\n\n return {\n fence,\n prefixText,\n remainingText,\n overlapLength: 0,\n };\n }\n\n /**\n * Finds the first occurrence of any fence start marker\n *\n * @param text - Text to search in\n * @returns Index of first fence start and which prefix matched\n * @private\n */\n private findFenceStart(text: string): {\n index: number;\n prefix: string | null;\n } {\n let bestIndex = -1;\n let matchedPrefix: string | null = null;\n\n for (const prefix of this.FENCE_STARTS) {\n const idx = text.indexOf(prefix);\n if (idx !== -1 && (bestIndex === -1 || idx < bestIndex)) {\n bestIndex = idx;\n matchedPrefix = prefix;\n }\n }\n\n return { index: bestIndex, prefix: matchedPrefix };\n }\n\n private computeOverlapLength(text: string, prefixes: string[]): number {\n let overlap = 0;\n\n for (const prefix of prefixes) {\n const maxLength = Math.min(text.length, prefix.length - 1);\n\n for (let size = maxLength; size > 0; size -= 1) {\n // Check if the last 'size' characters of text match the first 'size' characters of prefix\n if (prefix.startsWith(text.slice(-size))) {\n overlap = Math.max(overlap, size);\n break;\n }\n }\n }\n\n return overlap;\n }\n\n hasContent(): boolean {\n return this.buffer.length > 0;\n }\n\n getBufferSize(): number {\n return this.buffer.length;\n }\n\n /**\n * Detect and stream fence content in real-time for true incremental streaming\n *\n * This method is designed for streaming tool calls as they arrive:\n * 1. Detects when a fence starts and transitions to \"inFence\" state\n * 2. While inFence, emits safe content that won't conflict with fence end marker\n * 3. When fence ends, returns the complete fence for parsing\n *\n * @returns Streaming result with current state and safe content to emit\n */\n detectStreamingFence(): StreamingFenceResult {\n if (!this.inFence) {\n const { index: startIdx, prefix: matchedPrefix } = this.findFenceStart(\n this.buffer,\n );\n\n if (startIdx === -1) {\n const overlap = this.computeOverlapLength(\n this.buffer,\n this.FENCE_STARTS,\n );\n const safeTextLength = this.buffer.length - overlap;\n const safeContent =\n safeTextLength > 0 ? this.buffer.slice(0, safeTextLength) : \"\";\n this.buffer = this.buffer.slice(safeTextLength);\n\n return {\n inFence: false,\n safeContent,\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n // Found fence start!\n const prefixText = this.buffer.slice(0, startIdx);\n const fenceStartLength = matchedPrefix?.length ?? 0;\n\n this.buffer = this.buffer.slice(startIdx + fenceStartLength);\n\n // Skip newline after fence start if present\n if (this.buffer.startsWith(\"\\n\")) {\n this.buffer = this.buffer.slice(1);\n }\n\n this.inFence = true;\n this.fenceStartBuffer = \"\";\n\n return {\n inFence: true,\n safeContent: prefixText,\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n // We're inside a fence - look for fence end\n const closingIdx = this.buffer.indexOf(this.FENCE_END);\n\n if (closingIdx === -1) {\n const overlap = this.computeOverlapLength(this.buffer, [this.FENCE_END]);\n const safeContentLength = this.buffer.length - overlap;\n\n if (safeContentLength > 0) {\n const safeContent = this.buffer.slice(0, safeContentLength);\n this.fenceStartBuffer += safeContent;\n this.buffer = this.buffer.slice(safeContentLength);\n\n return {\n inFence: true,\n safeContent,\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n return {\n inFence: true,\n safeContent: \"\",\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n // Found fence end!\n const fenceContent = this.buffer.slice(0, closingIdx);\n this.fenceStartBuffer += fenceContent;\n\n const completeFence = `${this.FENCE_STARTS[0]}\\n${this.fenceStartBuffer}\\n${this.FENCE_END}`;\n\n const textAfterFence = this.buffer.slice(\n closingIdx + this.FENCE_END.length,\n );\n\n this.inFence = false;\n this.fenceStartBuffer = \"\";\n this.buffer = textAfterFence;\n\n return {\n inFence: false,\n safeContent: fenceContent,\n completeFence,\n textAfterFence,\n };\n }\n\n isInFence(): boolean {\n return this.inFence;\n }\n\n resetStreamingState(): void {\n this.inFence = false;\n this.fenceStartBuffer = \"\";\n }\n}\n","import {\n WebLLMLanguageModel,\n WebLLMModelId,\n WebLLMSettings,\n} from \"./web-llm-language-model\";\n\n/**\n * Create a new WebLLMLanguageModel.\n * @param modelId The model ID to use (e.g., 'Llama-3.1-8B-Instruct-q4f32_1-MLC')\n * @param settings Options for the model\n */\nexport function webLLM(\n modelId: WebLLMModelId,\n settings?: WebLLMSettings,\n): WebLLMLanguageModel {\n return new WebLLMLanguageModel(modelId, settings);\n}\n"],"mappings":"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","names":["_AISDKError","name","marker","symbol","_a","_a","symbol","name","marker","_a","symbol","name","marker","symbol","_a","_a","symbol","name","marker","_a","symbol","name","marker","_a","symbol","name","marker","_a","symbol","name","marker","_a","symbol","name","marker","_a","symbol","name","marker","_a","symbol","name","marker","_a","symbol","name","marker","_a","symbol","name","marker","symbol","_a","prefixText","delta","import_web_llm"]}
1
+ {"version":3,"sources":["../src/index.ts","../../../../node_modules/@ai-sdk/provider/src/errors/ai-sdk-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/api-call-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/empty-response-body-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/get-error-message.ts","../../../../node_modules/@ai-sdk/provider/src/errors/invalid-argument-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/invalid-prompt-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/invalid-response-data-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/json-parse-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/load-api-key-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/load-setting-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/no-content-generated-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/no-such-model-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/too-many-embedding-values-for-call-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/type-validation-error.ts","../../../../node_modules/@ai-sdk/provider/src/errors/unsupported-functionality-error.ts","../../../../node_modules/@ai-sdk/provider/src/json-value/is-json.ts","../src/tool-calling/build-json-system-prompt.ts","../src/tool-calling/parse-json-function-calls.ts","../src/tool-calling/format-tool-results.ts","../src/convert-to-webllm-messages.tsx","../src/web-llm-language-model.ts","../src/utils/warnings.ts","../src/utils/tool-utils.ts","../src/utils/prompt-utils.ts","../src/streaming/tool-call-detector.ts","../src/web-llm-provider.ts"],"sourcesContent":["export {\n WebLLMLanguageModel,\n doesBrowserSupportWebLLM,\n} from \"./web-llm-language-model\";\nexport type { WebLLMModelId, WebLLMSettings } from \"./web-llm-language-model\";\nexport type { WebLLMUIMessage, WebLLMProgress } from \"./types\";\n\nexport { WebWorkerMLCEngineHandler } from \"@mlc-ai/web-llm\";\n\nexport { webLLM } from \"./web-llm-provider\";\n","/**\n * Symbol used for identifying AI SDK Error instances.\n * Enables checking if an error is an instance of AISDKError across package versions.\n */\nconst marker = 'vercel.ai.error';\nconst symbol = Symbol.for(marker);\n\n/**\n * Custom error class for AI SDK related errors.\n * @extends Error\n */\nexport class AISDKError extends Error {\n private readonly [symbol] = true; // used in isInstance\n\n /**\n * The underlying cause of the error, if any.\n */\n readonly cause?: unknown;\n\n /**\n * Creates an AI SDK Error.\n *\n * @param {Object} params - The parameters for creating the error.\n * @param {string} params.name - The name of the error.\n * @param {string} params.message - The error message.\n * @param {unknown} [params.cause] - The underlying cause of the error.\n */\n constructor({\n name,\n message,\n cause,\n }: {\n name: string;\n message: string;\n cause?: unknown;\n }) {\n super(message);\n\n this.name = name;\n this.cause = cause;\n }\n\n /**\n * Checks if the given error is an AI SDK Error.\n * @param {unknown} error - The error to check.\n * @returns {boolean} True if the error is an AI SDK Error, false otherwise.\n */\n static isInstance(error: unknown): error is AISDKError {\n return AISDKError.hasMarker(error, marker);\n }\n\n protected static hasMarker(error: unknown, marker: string): boolean {\n const markerSymbol = Symbol.for(marker);\n return (\n error != null &&\n typeof error === 'object' &&\n markerSymbol in error &&\n typeof error[markerSymbol] === 'boolean' &&\n error[markerSymbol] === true\n );\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_APICallError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class APICallError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly url: string;\n readonly requestBodyValues: unknown;\n readonly statusCode?: number;\n\n readonly responseHeaders?: Record<string, string>;\n readonly responseBody?: string;\n\n readonly isRetryable: boolean;\n readonly data?: unknown;\n\n constructor({\n message,\n url,\n requestBodyValues,\n statusCode,\n responseHeaders,\n responseBody,\n cause,\n isRetryable = statusCode != null &&\n (statusCode === 408 || // request timeout\n statusCode === 409 || // conflict\n statusCode === 429 || // too many requests\n statusCode >= 500), // server error\n data,\n }: {\n message: string;\n url: string;\n requestBodyValues: unknown;\n statusCode?: number;\n responseHeaders?: Record<string, string>;\n responseBody?: string;\n cause?: unknown;\n isRetryable?: boolean;\n data?: unknown;\n }) {\n super({ name, message, cause });\n\n this.url = url;\n this.requestBodyValues = requestBodyValues;\n this.statusCode = statusCode;\n this.responseHeaders = responseHeaders;\n this.responseBody = responseBody;\n this.isRetryable = isRetryable;\n this.data = data;\n }\n\n static isInstance(error: unknown): error is APICallError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_EmptyResponseBodyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class EmptyResponseBodyError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message = 'Empty response body' }: { message?: string } = {}) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is EmptyResponseBodyError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","export function getErrorMessage(error: unknown | undefined) {\n if (error == null) {\n return 'unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return JSON.stringify(error);\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidArgumentError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * A function argument is invalid.\n */\nexport class InvalidArgumentError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly argument: string;\n\n constructor({\n message,\n cause,\n argument,\n }: {\n argument: string;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message, cause });\n\n this.argument = argument;\n }\n\n static isInstance(error: unknown): error is InvalidArgumentError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidPromptError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * A prompt is invalid. This error should be thrown by providers when they cannot\n * process a prompt.\n */\nexport class InvalidPromptError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly prompt: unknown;\n\n constructor({\n prompt,\n message,\n cause,\n }: {\n prompt: unknown;\n message: string;\n cause?: unknown;\n }) {\n super({ name, message: `Invalid prompt: ${message}`, cause });\n\n this.prompt = prompt;\n }\n\n static isInstance(error: unknown): error is InvalidPromptError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_InvalidResponseDataError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\n * Server returned a response with invalid data content.\n * This should be thrown by providers when they cannot parse the response from the API.\n */\nexport class InvalidResponseDataError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly data: unknown;\n\n constructor({\n data,\n message = `Invalid response data: ${JSON.stringify(data)}.`,\n }: {\n data: unknown;\n message?: string;\n }) {\n super({ name, message });\n\n this.data = data;\n }\n\n static isInstance(error: unknown): error is InvalidResponseDataError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_JSONParseError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class JSONParseError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly text: string;\n\n constructor({ text, cause }: { text: string; cause: unknown }) {\n super({\n name,\n message:\n `JSON parsing failed: ` +\n `Text: ${text}.\\n` +\n `Error message: ${getErrorMessage(cause)}`,\n cause,\n });\n\n this.text = text;\n }\n\n static isInstance(error: unknown): error is JSONParseError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadAPIKeyError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadAPIKeyError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message }: { message: string }) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is LoadAPIKeyError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_LoadSettingError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class LoadSettingError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({ message }: { message: string }) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is LoadSettingError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_NoContentGeneratedError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\n/**\nThrown when the AI provider fails to generate any content.\n */\nexport class NoContentGeneratedError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n constructor({\n message = 'No content generated.',\n }: { message?: string } = {}) {\n super({ name, message });\n }\n\n static isInstance(error: unknown): error is NoContentGeneratedError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_NoSuchModelError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class NoSuchModelError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly modelId: string;\n readonly modelType:\n | 'languageModel'\n | 'embeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel'\n | 'rerankingModel';\n\n constructor({\n errorName = name,\n modelId,\n modelType,\n message = `No such ${modelType}: ${modelId}`,\n }: {\n errorName?: string;\n modelId: string;\n modelType:\n | 'languageModel'\n | 'embeddingModel'\n | 'imageModel'\n | 'transcriptionModel'\n | 'speechModel'\n | 'rerankingModel';\n message?: string;\n }) {\n super({ name: errorName, message });\n\n this.modelId = modelId;\n this.modelType = modelType;\n }\n\n static isInstance(error: unknown): error is NoSuchModelError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_TooManyEmbeddingValuesForCallError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class TooManyEmbeddingValuesForCallError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly provider: string;\n readonly modelId: string;\n readonly maxEmbeddingsPerCall: number;\n readonly values: Array<unknown>;\n\n constructor(options: {\n provider: string;\n modelId: string;\n maxEmbeddingsPerCall: number;\n values: Array<unknown>;\n }) {\n super({\n name,\n message:\n `Too many values for a single embedding call. ` +\n `The ${options.provider} model \"${options.modelId}\" can only embed up to ` +\n `${options.maxEmbeddingsPerCall} values per call, but ${options.values.length} values were provided.`,\n });\n\n this.provider = options.provider;\n this.modelId = options.modelId;\n this.maxEmbeddingsPerCall = options.maxEmbeddingsPerCall;\n this.values = options.values;\n }\n\n static isInstance(\n error: unknown,\n ): error is TooManyEmbeddingValuesForCallError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { AISDKError } from './ai-sdk-error';\nimport { getErrorMessage } from './get-error-message';\n\nconst name = 'AI_TypeValidationError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class TypeValidationError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly value: unknown;\n\n constructor({ value, cause }: { value: unknown; cause: unknown }) {\n super({\n name,\n message:\n `Type validation failed: ` +\n `Value: ${JSON.stringify(value)}.\\n` +\n `Error message: ${getErrorMessage(cause)}`,\n cause,\n });\n\n this.value = value;\n }\n\n static isInstance(error: unknown): error is TypeValidationError {\n return AISDKError.hasMarker(error, marker);\n }\n\n /**\n * Wraps an error into a TypeValidationError.\n * If the cause is already a TypeValidationError with the same value, it returns the cause.\n * Otherwise, it creates a new TypeValidationError.\n *\n * @param {Object} params - The parameters for wrapping the error.\n * @param {unknown} params.value - The value that failed validation.\n * @param {unknown} params.cause - The original error or cause of the validation failure.\n * @returns {TypeValidationError} A TypeValidationError instance.\n */\n static wrap({\n value,\n cause,\n }: {\n value: unknown;\n cause: unknown;\n }): TypeValidationError {\n return TypeValidationError.isInstance(cause) && cause.value === value\n ? cause\n : new TypeValidationError({ value, cause });\n }\n}\n","import { AISDKError } from './ai-sdk-error';\n\nconst name = 'AI_UnsupportedFunctionalityError';\nconst marker = `vercel.ai.error.${name}`;\nconst symbol = Symbol.for(marker);\n\nexport class UnsupportedFunctionalityError extends AISDKError {\n private readonly [symbol] = true; // used in isInstance\n\n readonly functionality: string;\n\n constructor({\n functionality,\n message = `'${functionality}' functionality not supported.`,\n }: {\n functionality: string;\n message?: string;\n }) {\n super({ name, message });\n this.functionality = functionality;\n }\n\n static isInstance(error: unknown): error is UnsupportedFunctionalityError {\n return AISDKError.hasMarker(error, marker);\n }\n}\n","import { JSONArray, JSONObject, JSONValue } from './json-value';\n\nexport function isJSONValue(value: unknown): value is JSONValue {\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.every(isJSONValue);\n }\n\n if (typeof value === 'object') {\n return Object.entries(value).every(\n ([key, val]) =>\n typeof key === 'string' && (val === undefined || isJSONValue(val)),\n );\n }\n\n return false;\n}\n\nexport function isJSONArray(value: unknown): value is JSONArray {\n return Array.isArray(value) && value.every(isJSONValue);\n}\n\nexport function isJSONObject(value: unknown): value is JSONObject {\n return (\n value != null &&\n typeof value === 'object' &&\n Object.entries(value).every(\n ([key, val]) =>\n typeof key === 'string' && (val === undefined || isJSONValue(val)),\n )\n );\n}\n","import type {\n JSONSchema7,\n LanguageModelV3FunctionTool,\n} from \"@ai-sdk/provider\";\nimport type { ToolDefinition } from \"./types\";\n\n/**\n * Builds an enhanced system prompt for JSON-based tool calling.\n * The model receives JSON schemas and is expected to return JSON tool calls.\n *\n * @param originalSystemPrompt - The original system prompt (if any)\n * @param tools - Array of available tool definitions\n * @param options - Configuration options for tool calling behavior (unused, kept for backwards compatibility)\n * @returns Enhanced system prompt with JSON tool calling instructions\n */\nexport function buildJsonToolSystemPrompt(\n originalSystemPrompt: string | undefined,\n tools: Array<ToolDefinition | LanguageModelV3FunctionTool>,\n options?: { allowParallelToolCalls?: boolean },\n): string {\n if (!tools || tools.length === 0) {\n return originalSystemPrompt || \"\";\n }\n\n const parallelInstruction =\n \"Only request one tool call at a time. Wait for tool results before asking for another tool.\";\n\n const toolSchemas = tools.map((tool) => {\n const schema = getParameters(tool);\n return {\n name: tool.name,\n description: tool.description ?? \"No description provided.\",\n parameters: schema || { type: \"object\", properties: {} },\n };\n });\n\n const toolsJson = JSON.stringify(toolSchemas, null, 2);\n\n const instructionBody = `You are a helpful AI assistant with access to tools.\n\n# Available Tools\n${toolsJson}\n\n# Tool Calling Instructions\n${parallelInstruction}\n\nTo call a tool, output JSON in this exact format inside a \\`\\`\\`tool_call code fence:\n\n\\`\\`\\`tool_call\n{\"name\": \"tool_name\", \"arguments\": {\"param1\": \"value1\", \"param2\": \"value2\"}}\n\\`\\`\\`\n\nTool responses will be provided in \\`\\`\\`tool_result fences. Each line contains JSON like:\n\\`\\`\\`tool_result\n{\"id\": \"call_123\", \"name\": \"tool_name\", \"result\": {...}, \"error\": false}\n\\`\\`\\`\nUse the \\`result\\` payload (and treat \\`error\\` as a boolean flag) when continuing the conversation.\n\nImportant:\n- Use exact tool and parameter names from the schema above\n- Arguments must be a valid JSON object matching the tool's parameters\n- You can include brief reasoning before or after the tool call\n- If no tool is needed, respond directly without tool_call fences`;\n\n if (originalSystemPrompt?.trim()) {\n return `${originalSystemPrompt.trim()}\\n\\n${instructionBody}`;\n }\n\n return instructionBody;\n}\n\n/**\n * Extracts the parameters/input schema from a tool definition.\n * Handles both ToolDefinition (parameters field) and LanguageModelV3FunctionTool (inputSchema field).\n *\n * @param tool - The tool definition to extract parameters from\n * @returns The JSON Schema for the tool's parameters, or undefined if not present\n */\nfunction getParameters(\n tool: ToolDefinition | LanguageModelV3FunctionTool,\n): JSONSchema7 | undefined {\n if (\"parameters\" in tool) {\n return tool.parameters;\n }\n\n return tool.inputSchema as JSONSchema7 | undefined;\n}\n","import type { ParsedResponse, ParsedToolCall } from \"./types\";\n\nconst JSON_TOOL_CALL_FENCE_REGEX = /```tool[_-]?call\\s*([\\s\\S]*?)```/gi;\n\nfunction generateToolCallId(): string {\n return `call_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Parses JSON-formatted tool calls from model response.\n * Supports multiple formats:\n * 1. Single object: {\"name\": \"tool\", \"arguments\": {...}}\n * 2. Array: [{\"name\": \"tool1\", ...}, {\"name\": \"tool2\", ...}]\n * 3. Newline-separated objects:\n * {\"name\": \"tool1\", \"arguments\": {...}}\n * {\"name\": \"tool2\", \"arguments\": {...}}\n *\n * @param response - The model's response text to parse\n * @returns Object containing parsed tool calls and remaining text content\n */\nexport function parseJsonFunctionCalls(response: string): ParsedResponse {\n const matches = Array.from(response.matchAll(JSON_TOOL_CALL_FENCE_REGEX));\n JSON_TOOL_CALL_FENCE_REGEX.lastIndex = 0;\n\n if (matches.length === 0) {\n return { toolCalls: [], textContent: response };\n }\n\n const toolCalls: ParsedToolCall[] = [];\n let textContent = response;\n\n for (const match of matches) {\n const [fullFence, innerContent] = match;\n textContent = textContent.replace(fullFence, \"\");\n\n try {\n const trimmed = innerContent.trim();\n\n // Try parsing as a single JSON value first (object or array)\n try {\n const parsed = JSON.parse(trimmed);\n const callsArray = Array.isArray(parsed) ? parsed : [parsed];\n\n for (const call of callsArray) {\n if (!call.name) continue;\n\n toolCalls.push({\n type: \"tool-call\",\n toolCallId: call.id || generateToolCallId(),\n toolName: call.name,\n args: call.arguments || {},\n });\n }\n } catch {\n // If single JSON parsing fails, try parsing as newline-separated JSON objects\n const lines = trimmed.split(\"\\n\").filter((line) => line.trim());\n\n for (const line of lines) {\n try {\n const call = JSON.parse(line.trim());\n if (!call.name) continue;\n\n toolCalls.push({\n type: \"tool-call\",\n toolCallId: call.id || generateToolCallId(),\n toolName: call.name,\n args: call.arguments || {},\n });\n } catch {\n continue;\n }\n }\n }\n } catch (error) {\n console.warn(\"Failed to parse JSON tool call:\", error);\n continue;\n }\n }\n\n textContent = textContent.replace(/\\n{2,}/g, \"\\n\");\n\n return { toolCalls, textContent: textContent.trim() };\n}\n\nexport function hasJsonFunctionCalls(response: string): boolean {\n const hasMatch = JSON_TOOL_CALL_FENCE_REGEX.test(response);\n JSON_TOOL_CALL_FENCE_REGEX.lastIndex = 0;\n return hasMatch;\n}\n\nexport function extractJsonFunctionCallsBlock(response: string): string | null {\n const match = JSON_TOOL_CALL_FENCE_REGEX.exec(response);\n JSON_TOOL_CALL_FENCE_REGEX.lastIndex = 0;\n return match ? match[0] : null;\n}\n","import type { ToolResult } from \"./types\";\n\n/**\n * Formats tool execution results into a JSON-formatted string for the model.\n *\n * Each result is formatted as:\n * ```tool_result\n * {\"id\": \"call_123\", \"name\": \"tool_name\", \"result\": {...}, \"error\": false}\n * {\"id\": \"call_456\", \"name\": \"tool_name2\", \"result\": {...}, \"error\": false}\n * ```\n *\n * @param results - Array of tool results to format\n * @returns Formatted tool result string in JSON format\n *\n * @example\n * ```typescript\n * const results = [\n * { toolCallId: \"call_1\", toolName: \"search\", result: { found: true }, isError: false }\n * ];\n * const formatted = formatToolResults(results);\n * // Returns:\n * // ```tool_result\n * // {\"id\":\"call_1\",\"name\":\"search\",\"result\":{\"found\":true},\"error\":false}\n * // ```\n * ```\n */\nexport function formatToolResults(results: ToolResult[]): string {\n if (results.length === 0) {\n return \"\";\n }\n\n const lines = results\n .map((result) => formatSingleToolResult(result))\n .join(\"\\n\");\n\n return `\\`\\`\\`tool_result\\n${lines}\\n\\`\\`\\``;\n}\n\n/**\n * Formats a single tool result as a JSON string\n *\n * @param result - The tool result to format\n * @returns JSON-formatted string representation of the result\n *\n * @example\n * ```typescript\n * const result = {\n * toolCallId: \"call_1\",\n * toolName: \"search\",\n * result: { found: true },\n * isError: false\n * };\n * const formatted = formatSingleToolResult(result);\n * // Returns: '{\"id\":\"call_1\",\"name\":\"search\",\"result\":{\"found\":true},\"error\":false}'\n * ```\n */\nexport function formatSingleToolResult(result: ToolResult): string {\n return JSON.stringify({\n id: result.toolCallId,\n name: result.toolName,\n result: result.result,\n error: result.isError ?? false,\n });\n}\n","import {\n LanguageModelV3Prompt,\n LanguageModelV3ToolResultPart,\n LanguageModelV3ToolResultOutput,\n UnsupportedFunctionalityError,\n} from \"@ai-sdk/provider\";\nimport * as webllm from \"@mlc-ai/web-llm\";\nimport { formatToolResults } from \"./tool-calling\";\nimport type { ToolResult } from \"./tool-calling\";\nimport { ca } from \"zod/v4/locales\";\n\n/**\n * Converts the AI SDK ToolResultOutput format to a simple value + error flag\n */\nfunction convertToolResultOutput(output: LanguageModelV3ToolResultOutput): {\n value: unknown;\n isError: boolean;\n} {\n switch (output.type) {\n case \"text\":\n return { value: output.value, isError: false };\n case \"json\":\n return { value: output.value, isError: false };\n case \"error-text\":\n return { value: output.value, isError: true };\n case \"error-json\":\n return { value: output.value, isError: true };\n case \"content\":\n return { value: output.value, isError: false };\n case \"execution-denied\":\n return { value: output.reason, isError: true };\n default: {\n const exhaustiveCheck: never = output;\n return { value: exhaustiveCheck, isError: false };\n }\n }\n}\n\n/**\n * Converts a ToolResultPart to our internal ToolResult format\n */\nfunction toToolResult(part: LanguageModelV3ToolResultPart): ToolResult {\n const { value, isError } = convertToolResultOutput(part.output);\n return {\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: value,\n isError,\n };\n}\n\nfunction uint8ArrayToBase64(uint8array: Uint8Array): string {\n const binary = Array.from(uint8array, (byte) =>\n String.fromCharCode(byte),\n ).join(\"\");\n return btoa(binary);\n}\n\nfunction convertDataToURL(\n data:\n | string\n | Buffer\n | URL\n | Uint8Array\n | ArrayBuffer\n | ReadableStream\n | undefined,\n mediaType: string,\n): string {\n if (data instanceof URL) {\n return data.toString();\n }\n\n if (typeof data === \"string\") {\n // AI SDK provides base64 string\n return `data:${mediaType};base64,${data}`;\n }\n\n if (data instanceof Uint8Array) {\n return `data:${mediaType};base64,${uint8ArrayToBase64(data)}`;\n }\n\n if (data instanceof ArrayBuffer) {\n return `data:${mediaType};base64,${uint8ArrayToBase64(\n new Uint8Array(data),\n )}`;\n }\n\n if (typeof Buffer !== \"undefined\" && data instanceof Buffer) {\n return `data:${mediaType};base64,${data.toString(\"base64\")}`;\n }\n\n throw new UnsupportedFunctionalityError({\n functionality: `file data type: ${typeof data}`,\n });\n}\n\nexport function convertToWebLLMMessages(\n prompt: LanguageModelV3Prompt,\n): webllm.ChatCompletionMessageParam[] {\n const messages: webllm.ChatCompletionMessageParam[] = [];\n\n for (const message of prompt) {\n switch (message.role) {\n case \"system\":\n messages.push({\n role: \"system\",\n content: message.content,\n });\n break;\n\n case \"user\":\n const hasFileContent = message.content.some(\n (part) => part.type === \"file\",\n );\n\n if (!hasFileContent) {\n const userContent: string[] = [];\n for (const part of message.content) {\n if (part.type === \"text\") {\n userContent.push(part.text);\n }\n }\n messages.push({\n role: \"user\",\n content: userContent.join(\"\\n\"),\n });\n break;\n }\n\n const content: webllm.ChatCompletionContentPart[] = [];\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text });\n } else if (part.type === \"file\") {\n if (!part.mediaType?.startsWith(\"image/\")) {\n throw new UnsupportedFunctionalityError({\n functionality: `file input with media type '${part.mediaType}'`,\n });\n }\n content.push({\n type: \"image_url\",\n image_url: {\n url: convertDataToURL(part.data, part.mediaType),\n },\n });\n }\n }\n messages.push({ role: \"user\", content });\n break;\n\n case \"assistant\":\n let assistantContent = \"\";\n const toolCallsInMessage: Array<{\n toolCallId: string;\n toolName: string;\n }> = [];\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n assistantContent += part.text;\n } else if (part.type === \"tool-call\") {\n // Store tool call info but don't include in content\n // Tool calls will be tracked separately\n toolCallsInMessage.push({\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n });\n }\n }\n\n // Only add assistant message if there's text content\n // Tool calls are handled via the JSON fence format in the text\n if (assistantContent) {\n messages.push({\n role: \"assistant\",\n content: assistantContent,\n });\n }\n break;\n\n case \"tool\":\n // Collect tool results and format them\n // filter for tool-result parts only\n // not sure how to support tool-approval-response parts yet\n const toolResults: ToolResult[] = message.content\n .filter((part) => part.type === \"tool-result\")\n .map(toToolResult);\n\n // Format tool results as user message with JSON fence format\n const formattedResults = formatToolResults(toolResults);\n messages.push({\n role: \"user\",\n content: formattedResults,\n });\n break;\n }\n }\n\n return messages;\n}\n","import {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n SharedV3Warning,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3ProviderTool,\n LanguageModelV3StreamPart,\n LanguageModelV3ToolCall,\n LoadSettingError,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n} from \"@ai-sdk/provider\";\nimport { convertToWebLLMMessages } from \"./convert-to-webllm-messages\";\n\nimport {\n AppConfig,\n ChatCompletionRequestStreaming,\n CreateWebWorkerMLCEngine,\n InitProgressReport,\n MLCEngine,\n MLCEngineConfig,\n MLCEngineInterface,\n} from \"@mlc-ai/web-llm\";\nimport { Availability } from \"./types\";\nimport {\n buildJsonToolSystemPrompt,\n parseJsonFunctionCalls,\n} from \"./tool-calling\";\nimport type { ParsedToolCall, ToolDefinition } from \"./tool-calling\";\nimport {\n createUnsupportedSettingWarning,\n createUnsupportedToolWarning,\n} from \"./utils/warnings\";\nimport { isFunctionTool } from \"./utils/tool-utils\";\nimport {\n prependSystemPromptToMessages,\n extractSystemPrompt,\n} from \"./utils/prompt-utils\";\nimport { ToolCallFenceDetector } from \"./streaming/tool-call-detector\";\n\ndeclare global {\n interface Navigator {\n gpu?: GPU;\n }\n}\n\nexport type WebLLMModelId = string;\n\nexport interface WebLLMSettings {\n /**\n * Custom app configuration for WebLLM\n */\n appConfig?: AppConfig;\n /**\n * Progress callback for model initialization\n */\n initProgressCallback?: (progress: InitProgressReport) => void;\n /**\n * Engine configuration options\n */\n engineConfig?: MLCEngineConfig;\n /**\n * A web worker instance to run the model in.\n * When provided, the model will run in a separate thread.\n *\n * @default undefined\n */\n worker?: Worker;\n}\n\nfunction isMobile(): boolean {\n if (typeof navigator === \"undefined\") return false;\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent,\n );\n}\n\nfunction checkWebGPU(): boolean {\n try {\n return !!globalThis?.navigator?.gpu;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if the browser supports WebGPU (required for WebLLM).\n * @returns boolean - true if WebGPU API is available\n */\nexport function doesBrowserSupportWebLLM(): boolean {\n return checkWebGPU();\n}\n\nfunction extractToolName(content: string): string | null {\n // For JSON mode: {\"name\":\"toolName\"\n const jsonMatch = content.match(/\\{\\s*\"name\"\\s*:\\s*\"([^\"]+)\"/);\n if (jsonMatch) {\n return jsonMatch[1];\n }\n return null;\n}\n\nfunction extractArgumentsContent(content: string): string {\n const match = content.match(/\"arguments\"\\s*:\\s*/);\n if (!match || match.index === undefined) {\n return \"\";\n }\n\n const startIndex = match.index + match[0].length;\n let result = \"\";\n let depth = 0;\n let inString = false;\n let escaped = false;\n let started = false;\n\n for (let i = startIndex; i < content.length; i++) {\n const char = content[i];\n result += char;\n\n if (!started) {\n if (!/\\s/.test(char)) {\n started = true;\n if (char === \"{\" || char === \"[\") {\n depth = 1;\n }\n }\n continue;\n }\n\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (!inString) {\n if (char === \"{\" || char === \"[\") {\n depth += 1;\n } else if (char === \"}\" || char === \"]\") {\n if (depth > 0) {\n depth -= 1;\n if (depth === 0) {\n break;\n }\n }\n }\n }\n }\n\n return result;\n}\n\ntype WebLLMConfig = {\n provider: string;\n modelId: WebLLMModelId;\n options: WebLLMSettings;\n};\n\nexport class WebLLMLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = \"v3\";\n readonly modelId: WebLLMModelId;\n readonly provider = \"web-llm\";\n\n private readonly config: WebLLMConfig;\n private engine?: MLCEngineInterface;\n private isInitialized = false;\n private initializationPromise?: Promise<void>;\n\n constructor(modelId: WebLLMModelId, options: WebLLMSettings = {}) {\n this.modelId = modelId;\n this.config = {\n provider: this.provider,\n modelId,\n options,\n };\n }\n\n readonly supportedUrls: Record<string, RegExp[]> = {\n // WebLLM doesn't support URLs natively\n };\n\n /**\n * Check if the model is initialized and ready to use\n * @returns true if the model is initialized, false otherwise\n */\n get isModelInitialized(): boolean {\n return this.isInitialized;\n }\n\n private async getEngine(\n options?: MLCEngineConfig,\n onInitProgress?: (progress: InitProgressReport) => void,\n ): Promise<MLCEngineInterface> {\n const availability = await this.availability();\n if (availability === \"unavailable\") {\n throw new LoadSettingError({\n message:\n \"WebLLM is not available. This library requires a browser with WebGPU support.\",\n });\n }\n\n if (this.engine && this.isInitialized) return this.engine;\n\n // If initialization is already in progress, wait for it\n if (this.initializationPromise) {\n await this.initializationPromise;\n if (this.engine) return this.engine;\n }\n\n this.initializationPromise = this._initializeEngine(\n options,\n onInitProgress,\n );\n await this.initializationPromise;\n\n if (!this.engine) {\n throw new LoadSettingError({\n message: \"Engine initialization failed\",\n });\n }\n\n return this.engine;\n }\n\n private async _initializeEngine(\n options?: MLCEngineConfig,\n onInitProgress?: (progress: InitProgressReport) => void,\n ): Promise<void> {\n try {\n // Create engine instance\n const engineConfig = {\n ...this.config.options.engineConfig,\n ...options,\n initProgressCallback:\n onInitProgress || this.config.options.initProgressCallback,\n };\n\n if (this.config.options.worker) {\n this.engine = await CreateWebWorkerMLCEngine(\n this.config.options.worker,\n this.modelId,\n engineConfig,\n );\n } else {\n this.engine = new MLCEngine(engineConfig);\n // Load the model\n await this.engine.reload(this.modelId);\n }\n\n this.isInitialized = true;\n } catch (error) {\n // Reset state on error so we can retry\n this.engine = undefined;\n this.isInitialized = false;\n this.initializationPromise = undefined;\n\n throw new LoadSettingError({\n message: `Failed to initialize WebLLM engine: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n });\n }\n }\n\n private getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n responseFormat,\n seed,\n tools,\n toolChoice,\n }: Parameters<LanguageModelV3[\"doGenerate\"]>[0]) {\n const warnings: SharedV3Warning[] = [];\n\n const functionTools: ToolDefinition[] = (tools ?? [])\n .filter(isFunctionTool)\n .map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n }));\n\n const unsupportedTools = (tools ?? []).filter(\n (tool): tool is LanguageModelV3ProviderTool => !isFunctionTool(tool),\n );\n\n for (const tool of unsupportedTools) {\n warnings.push(\n createUnsupportedToolWarning(\n tool,\n \"Only function tools are supported by WebLLM\",\n ),\n );\n }\n\n if (topK != null) {\n warnings.push(\n createUnsupportedSettingWarning(\n \"topK\",\n \"topK is not supported by WebLLM\",\n ),\n );\n }\n\n if (stopSequences != null) {\n warnings.push(\n createUnsupportedSettingWarning(\n \"stopSequences\",\n \"Stop sequences may not be fully implemented\",\n ),\n );\n }\n\n if (presencePenalty != null) {\n warnings.push(\n createUnsupportedSettingWarning(\n \"presencePenalty\",\n \"Presence penalty is not fully implemented\",\n ),\n );\n }\n\n if (frequencyPenalty != null) {\n warnings.push(\n createUnsupportedSettingWarning(\n \"frequencyPenalty\",\n \"Frequency penalty is not fully implemented\",\n ),\n );\n }\n\n if (toolChoice != null) {\n warnings.push(\n createUnsupportedSettingWarning(\n \"toolChoice\",\n \"toolChoice is not supported by WebLLM\",\n ),\n );\n }\n\n // Convert messages to WebLLM format\n const messages = convertToWebLLMMessages(prompt);\n\n // Build request options\n const requestOptions: any = {\n messages,\n temperature,\n max_tokens: maxOutputTokens,\n top_p: topP,\n seed,\n };\n\n // Handle response format\n if (responseFormat?.type === \"json\") {\n requestOptions.response_format = { type: \"json_object\" };\n }\n\n return {\n messages,\n warnings,\n requestOptions,\n functionTools,\n };\n }\n\n /**\n * Generates a complete text response using WebLLM\n * @param options\n * @returns Promise resolving to the generated content with finish reason, usage stats, and any warnings\n * @throws {LoadSettingError} When WebLLM is not available or model needs to be downloaded\n * @throws {UnsupportedFunctionalityError} When unsupported features like file input are used\n */\n public async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const converted = this.getArgs(options);\n const { messages, warnings, requestOptions, functionTools } = converted;\n\n // Extract system prompt and build tool calling prompt\n const {\n systemPrompt: originalSystemPrompt,\n messages: messagesWithoutSystem,\n } = extractSystemPrompt(messages);\n\n const systemPrompt = buildJsonToolSystemPrompt(\n originalSystemPrompt,\n functionTools,\n {\n allowParallelToolCalls: false,\n },\n );\n\n // Prepend system prompt to messages\n const promptMessages = prependSystemPromptToMessages(\n messagesWithoutSystem,\n systemPrompt,\n );\n\n const engine = await this.getEngine();\n\n const abortHandler = async () => {\n await engine.interruptGenerate();\n };\n\n if (options.abortSignal) {\n options.abortSignal.addEventListener(\"abort\", abortHandler);\n }\n\n try {\n const response = await engine.chat.completions.create({\n ...requestOptions,\n messages: promptMessages,\n stream: false,\n ...(options.abortSignal &&\n !this.config.options.worker && { signal: options.abortSignal }),\n });\n\n const choice = response.choices[0];\n if (!choice) {\n throw new Error(\"No response choice returned from WebLLM\");\n }\n\n const rawResponse = choice.message.content || \"\";\n\n // Parse JSON tool calls from response\n const { toolCalls, textContent } = parseJsonFunctionCalls(rawResponse);\n\n if (toolCalls.length > 0) {\n const toolCallsToEmit = toolCalls.slice(0, 1);\n\n const parts: LanguageModelV3Content[] = [];\n\n if (textContent) {\n parts.push({\n type: \"text\",\n text: textContent,\n });\n }\n\n for (const call of toolCallsToEmit) {\n parts.push({\n type: \"tool-call\",\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: JSON.stringify(call.args ?? {}),\n } satisfies LanguageModelV3ToolCall);\n }\n\n return {\n content: parts,\n finishReason: { unified: \"tool-calls\", raw: \"tool-calls\" },\n usage: {\n inputTokens: {\n total: response.usage?.prompt_tokens,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: response.usage?.completion_tokens,\n text: undefined,\n reasoning: undefined,\n },\n },\n request: { body: { messages: promptMessages, ...requestOptions } },\n warnings,\n };\n }\n\n const content: LanguageModelV3Content[] = [\n {\n type: \"text\",\n text: textContent || rawResponse,\n },\n ];\n\n let finishReason: LanguageModelV3FinishReason = {\n unified: \"stop\",\n raw: choice.finish_reason,\n };\n if (choice.finish_reason === \"abort\") {\n finishReason = { unified: \"other\", raw: choice.finish_reason };\n }\n\n return {\n content,\n finishReason,\n usage: {\n inputTokens: {\n total: response.usage?.prompt_tokens,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: response.usage?.completion_tokens,\n text: undefined,\n reasoning: undefined,\n },\n raw: {\n total: response.usage?.total_tokens,\n },\n },\n request: { body: { messages: promptMessages, ...requestOptions } },\n warnings,\n };\n } catch (error) {\n throw new Error(\n `WebLLM generation failed: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n );\n } finally {\n if (options.abortSignal) {\n options.abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n }\n }\n\n /**\n * Check the availability of the WebLLM model.\n * Note: On mobile devices with a worker, WebGPU detection is skipped since it\n * can't be done reliably. The actual availability will be determined at init.\n * @returns Promise resolving to \"unavailable\", \"available\", or \"downloadable\"\n */\n public async availability(): Promise<Availability> {\n if (this.isInitialized) {\n return \"available\";\n }\n\n // Skip on mobile if using a worker, since detecting GPU is unreliable.\n // Let worker initialization handle it and return an error if unavailable.\n if (this.config.options.worker && isMobile()) {\n return \"downloadable\";\n }\n\n const supported = checkWebGPU();\n return supported ? \"downloadable\" : \"unavailable\";\n }\n\n /**\n * Creates an engine session with download progress monitoring.\n *\n * @example\n * ```typescript\n * const engine = await model.createSessionWithProgress(\n * (progress) => {\n * console.log(`Download progress: ${Math.round(progress.loaded * 100)}%`);\n * }\n * );\n * ```\n *\n * @param onInitProgress Optional callback receiving progress reports during model download\n * @returns Promise resolving to a configured WebLLM engine\n * @throws {LoadSettingError} When WebLLM is not available or model is unavailable\n */\n public async createSessionWithProgress(\n onInitProgress?: (progress: InitProgressReport) => void,\n ): Promise<MLCEngineInterface> {\n return this.getEngine(undefined, onInitProgress);\n }\n\n /**\n * Generates a streaming text response using WebLLM\n * @param options\n * @returns Promise resolving to a readable stream of text chunks and request metadata\n * @throws {LoadSettingError} When WebLLM is not available or model needs to be downloaded\n * @throws {UnsupportedFunctionalityError} When unsupported features like file input are used\n */\n public async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n const converted = this.getArgs(options);\n const { messages, warnings, requestOptions, functionTools } = converted;\n\n // Extract system prompt and build tool calling prompt\n const {\n systemPrompt: originalSystemPrompt,\n messages: messagesWithoutSystem,\n } = extractSystemPrompt(messages);\n\n const systemPrompt = buildJsonToolSystemPrompt(\n originalSystemPrompt,\n functionTools,\n {\n allowParallelToolCalls: false,\n },\n );\n\n // Prepend system prompt to messages\n const promptMessages = prependSystemPromptToMessages(\n messagesWithoutSystem,\n systemPrompt,\n );\n\n const engine = await this.getEngine();\n const useWorker = this.config.options.worker != null;\n\n const abortHandler = async () => {\n await engine.interruptGenerate();\n };\n\n if (options.abortSignal) {\n options.abortSignal.addEventListener(\"abort\", abortHandler);\n }\n\n const textId = \"text-0\";\n\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n async start(controller) {\n controller.enqueue({\n type: \"stream-start\",\n warnings,\n });\n\n let textStarted = false;\n let finished = false;\n\n const ensureTextStart = () => {\n if (!textStarted) {\n controller.enqueue({\n type: \"text-start\",\n id: textId,\n });\n textStarted = true;\n }\n };\n\n const emitTextDelta = (delta: string) => {\n if (!delta) return;\n ensureTextStart();\n controller.enqueue({\n type: \"text-delta\",\n id: textId,\n delta,\n });\n };\n\n const emitTextEndIfNeeded = () => {\n if (!textStarted) return;\n controller.enqueue({\n type: \"text-end\",\n id: textId,\n });\n textStarted = false;\n };\n\n const finishStream = (\n finishReason: LanguageModelV3FinishReason,\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n },\n ) => {\n if (finished) return;\n finished = true;\n emitTextEndIfNeeded();\n controller.enqueue({\n type: \"finish\",\n finishReason,\n usage: {\n inputTokens: {\n total: usage?.prompt_tokens,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: usage?.completion_tokens,\n text: undefined,\n reasoning: undefined,\n },\n raw: {\n total: usage?.total_tokens,\n },\n },\n });\n controller.close();\n };\n\n try {\n const streamingRequest: ChatCompletionRequestStreaming = {\n ...requestOptions,\n messages: promptMessages,\n stream: true,\n stream_options: { include_usage: true },\n ...(options.abortSignal &&\n !useWorker && { signal: options.abortSignal }),\n };\n\n const response =\n await engine.chat.completions.create(streamingRequest);\n\n // Use ToolCallFenceDetector for real-time streaming\n const fenceDetector = new ToolCallFenceDetector();\n let accumulatedText = \"\";\n\n // Streaming tool call state\n let currentToolCallId: string | null = null;\n let toolInputStartEmitted = false;\n let accumulatedFenceContent = \"\";\n let streamedArgumentsLength = 0;\n let insideFence = false;\n\n for await (const chunk of response) {\n const choice = chunk.choices[0];\n if (!choice) continue;\n\n if (choice.delta.content) {\n const delta = choice.delta.content;\n accumulatedText += delta;\n\n // Add chunk to detector\n fenceDetector.addChunk(delta);\n\n // Process buffer using streaming detection\n while (fenceDetector.hasContent()) {\n const wasInsideFence = insideFence;\n const result = fenceDetector.detectStreamingFence();\n insideFence = result.inFence;\n\n let madeProgress = false;\n\n if (!wasInsideFence && result.inFence) {\n if (result.safeContent) {\n emitTextDelta(result.safeContent);\n madeProgress = true;\n }\n\n currentToolCallId = `call_${Date.now()}_${Math.random()\n .toString(36)\n .slice(2, 9)}`;\n toolInputStartEmitted = false;\n accumulatedFenceContent = \"\";\n streamedArgumentsLength = 0;\n insideFence = true;\n\n continue;\n }\n\n if (result.completeFence) {\n madeProgress = true;\n if (result.safeContent) {\n accumulatedFenceContent += result.safeContent;\n }\n\n if (toolInputStartEmitted && currentToolCallId) {\n const argsContent = extractArgumentsContent(\n accumulatedFenceContent,\n );\n if (argsContent.length > streamedArgumentsLength) {\n const delta = argsContent.slice(streamedArgumentsLength);\n streamedArgumentsLength = argsContent.length;\n if (delta.length > 0) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: currentToolCallId,\n delta,\n });\n }\n }\n }\n\n const parsed = parseJsonFunctionCalls(result.completeFence);\n const parsedToolCalls = parsed.toolCalls;\n const selectedToolCalls = parsedToolCalls.slice(0, 1);\n\n if (selectedToolCalls.length === 0) {\n emitTextDelta(result.completeFence);\n if (result.textAfterFence) {\n emitTextDelta(result.textAfterFence);\n }\n\n currentToolCallId = null;\n toolInputStartEmitted = false;\n accumulatedFenceContent = \"\";\n streamedArgumentsLength = 0;\n insideFence = false;\n continue;\n }\n\n if (selectedToolCalls.length > 0 && currentToolCallId) {\n selectedToolCalls[0].toolCallId = currentToolCallId;\n }\n\n for (const [index, call] of selectedToolCalls.entries()) {\n const toolCallId =\n index === 0 && currentToolCallId\n ? currentToolCallId\n : call.toolCallId;\n const toolName = call.toolName;\n const argsJson = JSON.stringify(call.args ?? {});\n\n if (toolCallId === currentToolCallId) {\n if (!toolInputStartEmitted) {\n controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallId,\n toolName,\n });\n toolInputStartEmitted = true;\n }\n\n const argsContent = extractArgumentsContent(\n accumulatedFenceContent,\n );\n if (argsContent.length > streamedArgumentsLength) {\n const delta = argsContent.slice(\n streamedArgumentsLength,\n );\n streamedArgumentsLength = argsContent.length;\n if (delta.length > 0) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCallId,\n delta,\n });\n }\n }\n } else {\n controller.enqueue({\n type: \"tool-input-start\",\n id: toolCallId,\n toolName,\n });\n if (argsJson.length > 0) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: toolCallId,\n delta: argsJson,\n });\n }\n }\n\n controller.enqueue({\n type: \"tool-input-end\",\n id: toolCallId,\n });\n controller.enqueue({\n type: \"tool-call\",\n toolCallId,\n toolName,\n input: argsJson,\n providerExecuted: false,\n });\n }\n\n if (result.textAfterFence) {\n emitTextDelta(result.textAfterFence);\n }\n\n madeProgress = true;\n\n currentToolCallId = null;\n toolInputStartEmitted = false;\n accumulatedFenceContent = \"\";\n streamedArgumentsLength = 0;\n insideFence = false;\n continue;\n }\n\n if (insideFence) {\n if (result.safeContent) {\n accumulatedFenceContent += result.safeContent;\n madeProgress = true;\n\n const toolName = extractToolName(accumulatedFenceContent);\n if (\n toolName &&\n !toolInputStartEmitted &&\n currentToolCallId\n ) {\n controller.enqueue({\n type: \"tool-input-start\",\n id: currentToolCallId,\n toolName,\n });\n toolInputStartEmitted = true;\n }\n\n if (toolInputStartEmitted && currentToolCallId) {\n const argsContent = extractArgumentsContent(\n accumulatedFenceContent,\n );\n if (argsContent.length > streamedArgumentsLength) {\n const delta = argsContent.slice(\n streamedArgumentsLength,\n );\n streamedArgumentsLength = argsContent.length;\n if (delta.length > 0) {\n controller.enqueue({\n type: \"tool-input-delta\",\n id: currentToolCallId,\n delta,\n });\n }\n }\n }\n }\n\n continue;\n }\n\n if (!insideFence && result.safeContent) {\n emitTextDelta(result.safeContent);\n madeProgress = true;\n }\n\n if (!madeProgress) {\n break;\n }\n }\n }\n\n if (choice.finish_reason) {\n // Emit any remaining buffer content\n if (fenceDetector.hasContent()) {\n emitTextDelta(fenceDetector.getBuffer());\n fenceDetector.clearBuffer();\n }\n\n let finishReason: LanguageModelV3FinishReason = {\n unified: \"stop\",\n raw: \"stop\",\n };\n if (choice.finish_reason === \"abort\") {\n finishReason = { unified: \"other\", raw: \"abort\" };\n } else {\n // Check if we detected any tool calls\n const { toolCalls } = parseJsonFunctionCalls(accumulatedText);\n if (toolCalls.length > 0) {\n finishReason = { unified: \"tool-calls\", raw: \"tool-calls\" };\n }\n }\n\n finishStream(finishReason, chunk.usage);\n }\n }\n\n if (!finished) {\n finishStream({ unified: \"stop\", raw: \"stop\" });\n }\n } catch (error) {\n // Propagate all other errors.\n controller.error(error);\n } finally {\n if (options.abortSignal) {\n options.abortSignal.removeEventListener(\"abort\", abortHandler);\n }\n if (!finished) {\n controller.close();\n }\n }\n },\n });\n\n return {\n stream,\n request: { body: { messages: promptMessages, ...requestOptions } },\n };\n }\n}\n","import type {\n SharedV3Warning,\n LanguageModelV3ProviderTool,\n} from \"@ai-sdk/provider\";\n\n/**\n * Creates a warning for an unsupported feature\n *\n * @param feature - Name of the feature that is not supported\n * @param details - Additional details about why it's not supported\n * @returns A call warning object\n *\n * @example\n * ```typescript\n * const warning = createUnsupportedSettingWarning(\n * \"maxOutputTokens\",\n * \"maxOutputTokens is not supported by WebLLM\"\n * );\n * ```\n */\nexport function createUnsupportedSettingWarning(\n feature: string,\n details: string,\n): SharedV3Warning {\n return {\n type: \"unsupported\",\n feature,\n details,\n };\n}\n\n/**\n * Creates a warning for an unsupported tool type\n *\n * @param tool - The provider-defined tool that is not supported\n * @param details - Additional details about why it's not supported\n * @returns A call warning object\n *\n * @example\n * ```typescript\n * const warning = createUnsupportedToolWarning(\n * providerTool,\n * \"Only function tools are supported by WebLLM\"\n * );\n * ```\n */\nexport function createUnsupportedToolWarning(\n tool: LanguageModelV3ProviderTool,\n details: string,\n): SharedV3Warning {\n return {\n type: \"unsupported\",\n feature: `tool:${tool.name}`,\n details,\n };\n}\n","import type {\n LanguageModelV3FunctionTool,\n LanguageModelV3ProviderTool,\n} from \"@ai-sdk/provider\";\n\nexport function isFunctionTool(\n tool: LanguageModelV3FunctionTool | LanguageModelV3ProviderTool,\n): tool is LanguageModelV3FunctionTool {\n return tool.type === \"function\";\n}\n","import type { ChatCompletionMessageParam } from \"@mlc-ai/web-llm\";\n\n/**\n * Extracts the system prompt from a message array and returns both the system prompt\n * and the remaining messages without the system message.\n *\n * @param messages - Array of chat messages\n * @returns Object with systemPrompt string and messages array without system messages\n */\nexport function extractSystemPrompt(messages: ChatCompletionMessageParam[]): {\n systemPrompt: string | undefined;\n messages: ChatCompletionMessageParam[];\n} {\n const systemMessages = messages.filter((msg) => msg.role === \"system\");\n const nonSystemMessages = messages.filter((msg) => msg.role !== \"system\");\n\n if (systemMessages.length === 0) {\n return { systemPrompt: undefined, messages };\n }\n\n // Combine all system messages into one\n const systemPrompt = systemMessages\n .map((msg) => msg.content)\n .filter((content): content is string => typeof content === \"string\")\n .join(\"\\n\\n\");\n\n return {\n systemPrompt: systemPrompt || undefined,\n messages: nonSystemMessages,\n };\n}\n\n/**\n * Prepends a system prompt to the messages array.\n * If there's already a system message, it prepends to it.\n * Otherwise, creates a new system message at the start.\n *\n * @param messages - Array of chat messages\n * @param systemPrompt - System prompt to prepend\n * @returns New messages array with system prompt prepended\n */\nexport function prependSystemPromptToMessages(\n messages: ChatCompletionMessageParam[],\n systemPrompt: string,\n): ChatCompletionMessageParam[] {\n if (!systemPrompt.trim()) {\n return messages;\n }\n\n const systemMessageIndex = messages.findIndex((msg) => msg.role === \"system\");\n\n if (systemMessageIndex !== -1) {\n const newMessages = [...messages];\n const existingSystemMessage = messages[systemMessageIndex];\n const existingContent =\n typeof existingSystemMessage.content === \"string\"\n ? existingSystemMessage.content\n : \"\";\n\n newMessages[systemMessageIndex] = {\n ...existingSystemMessage,\n content: systemPrompt + (existingContent ? `\\n\\n${existingContent}` : \"\"),\n };\n\n return newMessages;\n }\n\n return [\n {\n role: \"system\",\n content: systemPrompt,\n },\n ...messages,\n ];\n}\n","/**\n * ToolCallFenceDetector - Detects and extracts tool call fences from streaming text\n *\n * This module handles the complex task of detecting tool call fences in a stream\n * where fences might be split across multiple chunks. It uses overlap detection\n * to avoid emitting text that might be the beginning of a fence.\n */\n\n/**\n * Result of fence detection operation\n */\nexport interface FenceDetectionResult {\n fence: string | null;\n prefixText: string;\n remainingText: string;\n overlapLength: number;\n}\n\n/**\n * Result of streaming fence content detection\n */\nexport interface StreamingFenceResult {\n inFence: boolean;\n safeContent: string;\n completeFence: string | null;\n textAfterFence: string;\n}\n\n/**\n * Detects tool call fences in streaming text with support for partial matches\n *\n * @example\n * ```typescript\n * const detector = new ToolCallFenceDetector();\n *\n * // Add chunks as they arrive\n * detector.addChunk(\"Here's the answer: \");\n * detector.addChunk(\"```tool_call\\n<tool_call>\");\n * detector.addChunk(\"<name>search</name></tool_call>\\n```\");\n *\n * // Detect fence\n * const result = detector.detectFence();\n * if (result.fence) {\n * console.log(\"Found tool call!\");\n * }\n * ```\n */\nexport class ToolCallFenceDetector {\n private readonly FENCE_STARTS = [\"```tool_call\"];\n private readonly FENCE_END = \"```\";\n private buffer = \"\";\n\n private inFence = false;\n private fenceStartBuffer = \"\";\n\n addChunk(chunk: string): void {\n this.buffer += chunk;\n }\n\n getBuffer(): string {\n return this.buffer;\n }\n\n clearBuffer(): void {\n this.buffer = \"\";\n }\n\n /**\n * Detects if there's a complete fence in the buffer\n *\n * 1. Searches for fence start markers\n * 2. If found, looks for closing fence\n * 3. Computes overlap for partial fences\n * 4. Returns safe text that can be emitted\n *\n * @returns Detection result with fence info and safe text\n */\n detectFence(): FenceDetectionResult {\n const { index: startIdx, prefix: matchedPrefix } = this.findFenceStart(\n this.buffer,\n );\n\n if (startIdx === -1) {\n // Compute how much of the buffer end might be a partial fence start\n const overlap = this.computeOverlapLength(this.buffer, this.FENCE_STARTS);\n const safeTextLength = this.buffer.length - overlap;\n\n const prefixText =\n safeTextLength > 0 ? this.buffer.slice(0, safeTextLength) : \"\";\n const remaining = overlap > 0 ? this.buffer.slice(-overlap) : \"\";\n\n this.buffer = remaining;\n\n return {\n fence: null,\n prefixText,\n remainingText: \"\",\n overlapLength: overlap,\n };\n }\n\n // Found fence start - extract prefix text before it\n const prefixText = this.buffer.slice(0, startIdx);\n this.buffer = this.buffer.slice(startIdx);\n\n const prefixLength = matchedPrefix?.length ?? 0;\n const closingIdx = this.buffer.indexOf(this.FENCE_END, prefixLength);\n\n // Fence not complete yet\n if (closingIdx === -1) {\n return {\n fence: null,\n prefixText,\n remainingText: \"\",\n overlapLength: 0,\n };\n }\n\n // Complete fence found!\n const endPos = closingIdx + this.FENCE_END.length;\n const fence = this.buffer.slice(0, endPos);\n const remainingText = this.buffer.slice(endPos);\n\n this.buffer = \"\";\n\n return {\n fence,\n prefixText,\n remainingText,\n overlapLength: 0,\n };\n }\n\n /**\n * Finds the first occurrence of any fence start marker\n *\n * @param text - Text to search in\n * @returns Index of first fence start and which prefix matched\n * @private\n */\n private findFenceStart(text: string): {\n index: number;\n prefix: string | null;\n } {\n let bestIndex = -1;\n let matchedPrefix: string | null = null;\n\n for (const prefix of this.FENCE_STARTS) {\n const idx = text.indexOf(prefix);\n if (idx !== -1 && (bestIndex === -1 || idx < bestIndex)) {\n bestIndex = idx;\n matchedPrefix = prefix;\n }\n }\n\n return { index: bestIndex, prefix: matchedPrefix };\n }\n\n private computeOverlapLength(text: string, prefixes: string[]): number {\n let overlap = 0;\n\n for (const prefix of prefixes) {\n const maxLength = Math.min(text.length, prefix.length - 1);\n\n for (let size = maxLength; size > 0; size -= 1) {\n // Check if the last 'size' characters of text match the first 'size' characters of prefix\n if (prefix.startsWith(text.slice(-size))) {\n overlap = Math.max(overlap, size);\n break;\n }\n }\n }\n\n return overlap;\n }\n\n hasContent(): boolean {\n return this.buffer.length > 0;\n }\n\n getBufferSize(): number {\n return this.buffer.length;\n }\n\n /**\n * Detect and stream fence content in real-time for true incremental streaming\n *\n * This method is designed for streaming tool calls as they arrive:\n * 1. Detects when a fence starts and transitions to \"inFence\" state\n * 2. While inFence, emits safe content that won't conflict with fence end marker\n * 3. When fence ends, returns the complete fence for parsing\n *\n * @returns Streaming result with current state and safe content to emit\n */\n detectStreamingFence(): StreamingFenceResult {\n if (!this.inFence) {\n const { index: startIdx, prefix: matchedPrefix } = this.findFenceStart(\n this.buffer,\n );\n\n if (startIdx === -1) {\n const overlap = this.computeOverlapLength(\n this.buffer,\n this.FENCE_STARTS,\n );\n const safeTextLength = this.buffer.length - overlap;\n const safeContent =\n safeTextLength > 0 ? this.buffer.slice(0, safeTextLength) : \"\";\n this.buffer = this.buffer.slice(safeTextLength);\n\n return {\n inFence: false,\n safeContent,\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n // Found fence start!\n const prefixText = this.buffer.slice(0, startIdx);\n const fenceStartLength = matchedPrefix?.length ?? 0;\n\n this.buffer = this.buffer.slice(startIdx + fenceStartLength);\n\n // Skip newline after fence start if present\n if (this.buffer.startsWith(\"\\n\")) {\n this.buffer = this.buffer.slice(1);\n }\n\n this.inFence = true;\n this.fenceStartBuffer = \"\";\n\n return {\n inFence: true,\n safeContent: prefixText,\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n // We're inside a fence - look for fence end\n const closingIdx = this.buffer.indexOf(this.FENCE_END);\n\n if (closingIdx === -1) {\n const overlap = this.computeOverlapLength(this.buffer, [this.FENCE_END]);\n const safeContentLength = this.buffer.length - overlap;\n\n if (safeContentLength > 0) {\n const safeContent = this.buffer.slice(0, safeContentLength);\n this.fenceStartBuffer += safeContent;\n this.buffer = this.buffer.slice(safeContentLength);\n\n return {\n inFence: true,\n safeContent,\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n return {\n inFence: true,\n safeContent: \"\",\n completeFence: null,\n textAfterFence: \"\",\n };\n }\n\n // Found fence end!\n const fenceContent = this.buffer.slice(0, closingIdx);\n this.fenceStartBuffer += fenceContent;\n\n const completeFence = `${this.FENCE_STARTS[0]}\\n${this.fenceStartBuffer}\\n${this.FENCE_END}`;\n\n const textAfterFence = this.buffer.slice(\n closingIdx + this.FENCE_END.length,\n );\n\n this.inFence = false;\n this.fenceStartBuffer = \"\";\n this.buffer = textAfterFence;\n\n return {\n inFence: false,\n safeContent: fenceContent,\n completeFence,\n textAfterFence,\n };\n }\n\n isInFence(): boolean {\n return this.inFence;\n }\n\n resetStreamingState(): void {\n this.inFence = false;\n this.fenceStartBuffer = \"\";\n }\n}\n","import {\n WebLLMLanguageModel,\n WebLLMModelId,\n WebLLMSettings,\n} from \"./web-llm-language-model\";\n\n/**\n * Create a new WebLLMLanguageModel.\n * @param modelId The model ID to use (e.g., 'Llama-3.1-8B-Instruct-q4f32_1-MLC')\n * @param settings Options for the model\n */\nexport function webLLM(\n modelId: WebLLMModelId,\n settings?: WebLLMSettings,\n): WebLLMLanguageModel {\n return new WebLLMLanguageModel(modelId, settings);\n}\n"],"mappings":"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","names":["name","marker","symbol","_a","_b","prefixText","delta","import_web_llm"]}