{"version":3,"sources":["../../../../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","../../shared/src/utils/tool-utils.ts","../../shared/src/utils/warnings.ts","../../shared/src/tool-calling/build-json-system-prompt.ts","../../shared/src/tool-calling/format-tool-results.ts","../../shared/src/tool-calling/parse-json-function-calls.ts","../../shared/src/streaming/tool-call-detector.ts","../../shared/src/streaming/tool-call-stream-utils.ts","../../shared/src/streaming/stream-processor.ts","../src/utils/convert-to-webllm-messages.tsx","../src/chat/web-llm-language-model.ts","../src/utils/prompt-utils.ts","../src/utils/browser.ts","../src/embedding/web-llm-embedding-model.ts","../src/index.ts","../src/web-llm-provider.ts"],"sourcesContent":["/**\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","/**\n * Utilities for working with AI SDK tools\n */\n\nimport type {\n  LanguageModelV3FunctionTool,\n  LanguageModelV3ProviderTool,\n} from \"@ai-sdk/provider\";\n\n/**\n * Type guard to check if a tool is a function tool\n *\n * @param tool - The tool to check\n * @returns true if the tool is a LanguageModelV3FunctionTool\n */\nexport function isFunctionTool(\n  tool: LanguageModelV3FunctionTool | LanguageModelV3ProviderTool,\n): tool is LanguageModelV3FunctionTool {\n  return tool.type === \"function\";\n}\n","/**\n * Warning generation utilities for unsupported settings and tools\n */\n\nimport type {\n  SharedV3Warning,\n  LanguageModelV3ProviderTool,\n} from \"@ai-sdk/provider\";\n\n/**\n * Creates a warning for an unsupported setting\n *\n * @param setting - Name of the setting 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 this provider\"\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\"\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  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 { ToolResult } from \"../types\";\n\n/**\n * Builds a JSON-serializable payload for a single tool result.\n * Includes tool name, result data, error flag, and optional call ID.\n *\n * @param result - The tool execution result to format\n * @returns Object containing formatted result data ready for JSON serialization\n */\nfunction buildResultPayload(result: ToolResult): Record<string, unknown> {\n  const payload: Record<string, unknown> = {\n    name: result.toolName,\n    result: result.result ?? null,\n    error: Boolean(result.isError),\n  };\n\n  if (result.toolCallId) {\n    payload.id = result.toolCallId;\n  }\n\n  return payload;\n}\n\n/**\n * Formats tool execution results as JSON for continuation in the conversation.\n *\n * Each result is serialized as a single JSON object. Multiple results (for parallel\n * execution scenarios) are emitted on separate lines within a ```tool_result code fence.\n *\n * @param results - Array of tool execution results to format\n * @returns Formatted string with results in tool_result code fence, or empty string if no results\n * @example\n * ```typescript\n * formatToolResults([\n *   { toolCallId: \"call_123\", toolName: \"search\", result: { data: \"...\" } }\n * ])\n * // Returns: ```tool_result\\n{\"id\":\"call_123\",\"name\":\"search\",\"result\":{...},\"error\":false}\\n```\n * ```\n */\nexport function formatToolResults(results: ToolResult[]): string {\n  if (!results || results.length === 0) {\n    return \"\";\n  }\n\n  const payloads = results.map((result) =>\n    JSON.stringify(buildResultPayload(result)),\n  );\n\n  return `\\`\\`\\`tool_result\n${payloads.join(\"\\n\")}\n\\`\\`\\``;\n}\n\n/**\n * Formats a single tool result.\n * Convenience wrapper around formatToolResults for single result scenarios.\n *\n * @param result - The tool execution result to format\n * @returns Formatted string with result in tool_result code fence\n */\nexport function formatSingleToolResult(result: ToolResult): string {\n  return formatToolResults([result]);\n}\n","import type { ParsedResponse, ParsedToolCall } from \"../types\";\n\n/**\n * Options for configuring the JSON function call parser\n */\nexport interface ParseJsonFunctionCallsOptions {\n  /** Support XML-style tags: <tool_call>...</tool_call> */\n  supportXmlTags?: boolean;\n  /** Support Python-style: [functionName(arg=\"value\")] */\n  supportPythonStyle?: boolean;\n  /** Support \"parameters\" as alias for \"arguments\" (Llama format) */\n  supportParametersField?: boolean;\n}\n\nconst DEFAULT_OPTIONS: ParseJsonFunctionCallsOptions = {\n  supportXmlTags: true,\n  supportPythonStyle: true,\n  supportParametersField: true,\n};\n\nfunction generateToolCallId(): string {\n  return `call_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction buildRegex(options: ParseJsonFunctionCallsOptions): RegExp {\n  const patterns: string[] = [];\n\n  // Always support markdown fences\n  patterns.push(\"```tool[_-]?call\\\\s*([\\\\s\\\\S]*?)```\");\n\n  if (options.supportXmlTags) {\n    patterns.push(\"<tool_call>\\\\s*([\\\\s\\\\S]*?)\\\\s*</tool_call>\");\n  }\n\n  if (options.supportPythonStyle) {\n    patterns.push(\"\\\\[(\\\\w+)\\\\(([^)]*)\\\\)\\\\]\");\n  }\n\n  return new RegExp(patterns.join(\"|\"), \"gi\");\n}\n\n/**\n * Parses JSON-formatted tool calls from model response.\n * Supports multiple formats:\n * 1. Single object: {\"name\": \"tool\", \"arguments\": {...}} or {\"name\": \"tool\", \"parameters\": {...}}\n * 2. Array: [{\"name\": \"tool1\", ...}, {\"name\": \"tool2\", ...}]\n * 3. Newline-separated objects:\n *    {\"name\": \"tool1\", \"arguments\": {...}}\n *    {\"name\": \"tool2\", \"arguments\": {...}}\n *\n * Note: Handles both \"arguments\" (OpenAI/Mistral format) and \"parameters\" (Llama format)\n *\n * @param response - The model's response text to parse\n * @param options - Configuration options for parsing\n * @returns Object containing parsed tool calls and remaining text content\n */\nexport function parseJsonFunctionCalls(\n  response: string,\n  options: ParseJsonFunctionCallsOptions = DEFAULT_OPTIONS,\n): ParsedResponse {\n  const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n  const regex = buildRegex(mergedOptions);\n\n  const matches = Array.from(response.matchAll(regex));\n  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 fullMatch = match[0];\n    textContent = textContent.replace(fullMatch, \"\");\n\n    try {\n      // Check for Python-style match: [functionName(args)]\n      if (mergedOptions.supportPythonStyle && match[0].startsWith(\"[\")) {\n        const pythonMatch = /\\[(\\w+)\\(([^)]*)\\)\\]/.exec(match[0]);\n        if (pythonMatch) {\n          const [, funcName, pythonArgs] = pythonMatch;\n          const args: Record<string, unknown> = {};\n\n          if (pythonArgs && pythonArgs.trim()) {\n            const argPairs = pythonArgs.split(\",\").map((s) => s.trim());\n            for (const pair of argPairs) {\n              const equalIndex = pair.indexOf(\"=\");\n              if (equalIndex > 0) {\n                const key = pair.substring(0, equalIndex).trim();\n                let value = pair.substring(equalIndex + 1).trim();\n                if (\n                  (value.startsWith('\"') && value.endsWith('\"')) ||\n                  (value.startsWith(\"'\") && value.endsWith(\"'\"))\n                ) {\n                  value = value.substring(1, value.length - 1);\n                }\n                args[key] = value;\n              }\n            }\n          }\n\n          toolCalls.push({\n            type: \"tool-call\",\n            toolCallId: generateToolCallId(),\n            toolName: funcName,\n            args: args,\n          });\n          continue;\n        }\n      }\n\n      // Get the captured content from the first capturing group\n      const innerContent = match[1] || match[2] || \"\";\n      const trimmed = innerContent.trim();\n\n      if (!trimmed) continue;\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          let args =\n            call.arguments ||\n            (mergedOptions.supportParametersField ? call.parameters : null) ||\n            {};\n\n          // If args is a string, try to parse it as JSON\n          if (typeof args === \"string\") {\n            try {\n              args = JSON.parse(args);\n            } catch {\n              // If parsing fails, keep it as string\n            }\n          }\n\n          toolCalls.push({\n            type: \"tool-call\",\n            toolCallId: call.id || generateToolCallId(),\n            toolName: call.name,\n            args: args,\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            let args =\n              call.arguments ||\n              (mergedOptions.supportParametersField ? call.parameters : null) ||\n              {};\n\n            if (typeof args === \"string\") {\n              try {\n                args = JSON.parse(args);\n              } catch {\n                // If parsing fails, keep it as string\n              }\n            }\n\n            toolCalls.push({\n              type: \"tool-call\",\n              toolCallId: call.id || generateToolCallId(),\n              toolName: call.name,\n              args: args,\n            });\n          } catch {\n            // Skip invalid JSON lines\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\n/**\n * Checks if a response contains JSON function calls\n */\nexport function hasJsonFunctionCalls(\n  response: string,\n  options: ParseJsonFunctionCallsOptions = DEFAULT_OPTIONS,\n): boolean {\n  const regex = buildRegex({ ...DEFAULT_OPTIONS, ...options });\n  const hasMatch = regex.test(response);\n  regex.lastIndex = 0;\n  return hasMatch;\n}\n\n/**\n * Extracts the first JSON function call block from a response\n */\nexport function extractJsonFunctionCallsBlock(\n  response: string,\n  options: ParseJsonFunctionCallsOptions = DEFAULT_OPTIONS,\n): string | null {\n  const regex = buildRegex({ ...DEFAULT_OPTIONS, ...options });\n  const match = regex.exec(response);\n  regex.lastIndex = 0;\n  return match ? match[0] : null;\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  /** Length of potential partial fence at buffer end */\n  overlapLength: number;\n}\n\n/**\n * Result of streaming fence content detection\n */\nexport interface StreamingFenceResult {\n  inFence: boolean;\n  /** Content that can be safely emitted (either as text or tool-input-delta) */\n  safeContent: string;\n  completeFence: string | null;\n  textAfterFence: string;\n}\n\n/**\n * Fence pattern configuration\n */\nexport interface FencePattern {\n  start: string;\n  end: string;\n  reconstructStart: string;\n  isRegex?: boolean;\n  matchedStart?: string;\n}\n\n/**\n * Options for configuring the ToolCallFenceDetector\n */\nexport interface ToolCallFenceDetectorOptions {\n  /** Custom fence patterns to use instead of defaults */\n  patterns?: FencePattern[];\n  /** Enable Python-style function call detection: [functionName(args)] */\n  enablePythonStyle?: boolean;\n}\n\n/**\n * Default fence patterns for tool call detection\n */\nexport const DEFAULT_FENCE_PATTERNS: FencePattern[] = [\n  { start: \"```tool_call\", end: \"```\", reconstructStart: \"```tool_call\\n\" },\n  { start: \"```tool-call\", end: \"```\", reconstructStart: \"```tool-call\\n\" },\n];\n\n/**\n * Extended fence patterns including XML-style tags\n */\nexport const EXTENDED_FENCE_PATTERNS: FencePattern[] = [\n  ...DEFAULT_FENCE_PATTERNS,\n  {\n    start: \"<tool_call>\",\n    end: \"</tool_call>\",\n    reconstructStart: \"<tool_call>\",\n  },\n];\n\n/**\n * Detects tool call fences in streaming text with support for partial matches\n */\nexport class ToolCallFenceDetector {\n  private readonly fencePatterns: FencePattern[];\n  private readonly enablePythonStyle: boolean;\n  private readonly pythonStyleRegex = /\\[(\\w+)\\(/g;\n  private readonly fenceStarts: string[];\n  private buffer = \"\";\n\n  private inFence = false;\n  private fenceStartBuffer = \"\"; // Accumulated fence content\n  private currentFencePattern: FencePattern | null = null;\n\n  constructor(options: ToolCallFenceDetectorOptions = {}) {\n    this.fencePatterns = options.patterns ?? EXTENDED_FENCE_PATTERNS;\n    this.enablePythonStyle = options.enablePythonStyle ?? true;\n    this.fenceStarts = this.fencePatterns.map((p) => p.start);\n  }\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   * @returns Detection result with fence info and safe text\n   */\n  detectFence(): FenceDetectionResult {\n    const {\n      index: startIdx,\n      prefix: matchedPrefix,\n      pattern,\n    } = this.findFenceStart(this.buffer);\n\n    // No fence start found\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.fenceStarts);\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      // Update buffer to keep only the overlap\n      this.buffer = remaining;\n\n      return {\n        fence: null,\n        prefixText,\n        remainingText: \"\",\n        overlapLength: overlap,\n      };\n    }\n\n    const prefixText = this.buffer.slice(0, startIdx);\n    this.buffer = this.buffer.slice(startIdx);\n\n    // Look for closing fence using the matched pattern's end marker\n    const prefixLength = matchedPrefix?.length ?? 0;\n    const fenceEnd = pattern?.end ?? \"```\";\n    const closingIdx = this.buffer.indexOf(fenceEnd, prefixLength);\n\n    // Fence not complete yet\n    if (closingIdx === -1) {\n      // Keep the buffer as-is, waiting for more data\n      return {\n        fence: null,\n        prefixText,\n        remainingText: \"\",\n        overlapLength: 0,\n      };\n    }\n\n    // Complete fence found!\n    const endPos = closingIdx + fenceEnd.length;\n    const fence = this.buffer.slice(0, endPos);\n    const remainingText = this.buffer.slice(endPos);\n\n    // Clear the buffer since we extracted everything\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 pattern matched\n   * @private\n   */\n  private findFenceStart(text: string): {\n    index: number;\n    prefix: string | null;\n    pattern: FencePattern | null;\n  } {\n    let bestIndex = -1;\n    let matchedPrefix: string | null = null;\n    let matchedPattern: FencePattern | null = null;\n\n    for (const pattern of this.fencePatterns) {\n      const idx = text.indexOf(pattern.start);\n      if (idx !== -1 && (bestIndex === -1 || idx < bestIndex)) {\n        bestIndex = idx;\n        matchedPrefix = pattern.start;\n        matchedPattern = pattern;\n      }\n    }\n\n    if (this.enablePythonStyle) {\n      this.pythonStyleRegex.lastIndex = 0;\n      const pythonMatch = this.pythonStyleRegex.exec(text);\n      if (pythonMatch && (bestIndex === -1 || pythonMatch.index < bestIndex)) {\n        bestIndex = pythonMatch.index;\n        matchedPrefix = pythonMatch[0];\n        matchedPattern = {\n          start: pythonMatch[0],\n          end: \")]\",\n          reconstructStart: pythonMatch[0],\n          isRegex: true,\n        };\n      }\n    }\n\n    return { index: bestIndex, prefix: matchedPrefix, pattern: matchedPattern };\n  }\n\n  /**\n   * Computes the maximum overlap between the end of text and the start of any prefix\n   * @param text - Text to check for overlap\n   * @param prefixes - List of prefixes to check against\n   * @returns Length of the maximum overlap found\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  /**\n   * Checks if the buffer currently contains any text\n   */\n  hasContent(): boolean {\n    return this.buffer.length > 0;\n  }\n\n  /**\n   * Gets the buffer size\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   * @returns Streaming result with current state and safe content to emit\n   */\n  detectStreamingFence(): StreamingFenceResult {\n    if (!this.inFence) {\n      // Look for fence start\n      const {\n        index: startIdx,\n        prefix: matchedPrefix,\n        pattern,\n      } = this.findFenceStart(this.buffer);\n\n      if (startIdx === -1) {\n        // No fence start found - emit safe text\n        const overlap = this.computeOverlapLength(\n          this.buffer,\n          this.fenceStarts,\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      // Move buffer past the fence start marker\n      this.buffer = this.buffer.slice(startIdx + fenceStartLength);\n\n      if (\n        pattern &&\n        pattern.start.startsWith(\"```\") &&\n        this.buffer.startsWith(\"\\n\")\n      ) {\n        this.buffer = this.buffer.slice(1);\n      }\n\n      this.inFence = true;\n      this.fenceStartBuffer = \"\";\n      this.currentFencePattern = pattern;\n\n      return {\n        inFence: true,\n        safeContent: prefixText, // Emit any text before the fence\n        completeFence: null,\n        textAfterFence: \"\",\n      };\n    }\n\n    // We're inside a fence - look for fence end using the current pattern\n    const fenceEnd = this.currentFencePattern?.end ?? \"```\";\n    const closingIdx = this.buffer.indexOf(fenceEnd);\n\n    if (closingIdx === -1) {\n      // No fence end yet - emit safe content (leaving potential fence end marker)\n      const overlap = this.computeOverlapLength(this.buffer, [fenceEnd]);\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      // Nothing safe to emit yet\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    // Reconstruct complete fence using the current pattern\n    const reconstructStart =\n      this.currentFencePattern?.reconstructStart ?? \"```tool_call\\n\";\n    const completeFence = `${reconstructStart}${this.fenceStartBuffer}${fenceEnd}`;\n\n    // Get text after fence\n    const textAfterFence = this.buffer.slice(closingIdx + fenceEnd.length);\n\n    // Reset state\n    this.inFence = false;\n    this.fenceStartBuffer = \"\";\n    this.currentFencePattern = null;\n    this.buffer = textAfterFence;\n\n    return {\n      inFence: false,\n      safeContent: fenceContent, // Emit the last bit of fence content\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    this.currentFencePattern = null;\n  }\n}\n\n/**\n * Creates a basic ToolCallFenceDetector with default markdown fence patterns\n */\nexport function createBasicDetector(): ToolCallFenceDetector {\n  return new ToolCallFenceDetector({\n    patterns: DEFAULT_FENCE_PATTERNS,\n    enablePythonStyle: false,\n  });\n}\n\n/**\n * Creates an extended ToolCallFenceDetector with all fence patterns\n */\nexport function createExtendedDetector(): ToolCallFenceDetector {\n  return new ToolCallFenceDetector({\n    patterns: EXTENDED_FENCE_PATTERNS,\n    enablePythonStyle: true,\n  });\n}\n","/**\n * Extracts tool name from partial fence content for early tool-input-start emission.\n * Expects a JSON fragment like: {\"name\":\"toolName\"\n */\nexport function extractToolName(content: string): string | null {\n  const jsonMatch = content.match(/\\{\\s*\"name\"\\s*:\\s*\"([^\"]+)\"/);\n  if (jsonMatch) {\n    return jsonMatch[1];\n  }\n  return null;\n}\n\nexport interface ArgumentsStreamState {\n  searchFrom: number;\n  valueStartIndex: number | null;\n  parseIndex: number;\n  started: boolean;\n  depth: number;\n  inString: boolean;\n  escaped: boolean;\n  complete: boolean;\n}\n\nconst ARGUMENTS_FIELD_REGEX = /\"arguments\"\\s*:\\s*/g;\nconst ARGUMENTS_SEARCH_OVERLAP = 32;\n\nexport function createArgumentsStreamState(): ArgumentsStreamState {\n  return {\n    searchFrom: 0,\n    valueStartIndex: null,\n    parseIndex: 0,\n    started: false,\n    depth: 0,\n    inString: false,\n    escaped: false,\n    complete: false,\n  };\n}\n\n/**\n * Incrementally extracts only new argument content from a streaming tool call fence.\n */\nexport function extractArgumentsDelta(\n  content: string,\n  state: ArgumentsStreamState,\n): string {\n  if (state.complete) {\n    return \"\";\n  }\n\n  if (state.valueStartIndex === null) {\n    ARGUMENTS_FIELD_REGEX.lastIndex = state.searchFrom;\n    const match = ARGUMENTS_FIELD_REGEX.exec(content);\n    ARGUMENTS_FIELD_REGEX.lastIndex = 0;\n\n    if (!match || match.index === undefined) {\n      state.searchFrom = Math.max(0, content.length - ARGUMENTS_SEARCH_OVERLAP);\n      return \"\";\n    }\n\n    state.valueStartIndex = match.index + match[0].length;\n    state.parseIndex = state.valueStartIndex;\n    state.searchFrom = state.valueStartIndex;\n  }\n\n  if (state.parseIndex >= content.length) {\n    return \"\";\n  }\n\n  let delta = \"\";\n  for (let i = state.parseIndex; i < content.length; i++) {\n    const char = content[i];\n    delta += char;\n\n    if (!state.started) {\n      if (!/\\s/.test(char)) {\n        state.started = true;\n        if (char === \"{\" || char === \"[\") {\n          state.depth = 1;\n        }\n      }\n      continue;\n    }\n\n    if (state.escaped) {\n      state.escaped = false;\n      continue;\n    }\n\n    if (char === \"\\\\\") {\n      state.escaped = true;\n      continue;\n    }\n\n    if (char === '\"') {\n      state.inString = !state.inString;\n      continue;\n    }\n\n    if (!state.inString) {\n      if (char === \"{\" || char === \"[\") {\n        state.depth += 1;\n      } else if (char === \"}\" || char === \"]\") {\n        if (state.depth > 0) {\n          state.depth -= 1;\n          if (state.depth === 0) {\n            state.parseIndex = i + 1;\n            state.complete = true;\n            return delta;\n          }\n        }\n      }\n    }\n  }\n\n  state.parseIndex = content.length;\n  return delta;\n}\n","import type { LanguageModelV3StreamPart } from \"@ai-sdk/provider\";\nimport { ToolCallFenceDetector } from \"./tool-call-detector\";\nimport {\n  createArgumentsStreamState,\n  extractArgumentsDelta,\n  extractToolName,\n} from \"./tool-call-stream-utils\";\nimport { parseJsonFunctionCalls } from \"../tool-calling/parse-json-function-calls\";\nimport type { ParsedToolCall } from \"../types\";\n\nexport interface ToolCallStreamResult {\n  toolCallDetected: boolean;\n  toolCalls: ParsedToolCall[];\n  /** Text appearing after the tool call fence — caller decides when to emit it */\n  trailingText: string;\n}\n\nexport function generateToolCallId(): string {\n  return `call_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Processes an async iterable of string chunks, detecting tool call fences and\n * emitting the appropriate stream events via `controller` and `emitTextDelta`.\n *\n * When `stopEarlyOnToolCall` is true the function stops consuming chunks as soon as\n * a tool call is detected (useful when the caller needs to cancel the source).\n * When false (the default) the function continues draining remaining chunks without\n * processing them, allowing the underlying stream/engine to conclude normally.\n */\nexport async function processToolCallStream(\n  chunks: AsyncIterable<string>,\n  emitTextDelta: (delta: string) => void,\n  controller: ReadableStreamDefaultController<LanguageModelV3StreamPart>,\n  options?: { stopEarlyOnToolCall?: boolean },\n): Promise<ToolCallStreamResult> {\n  const fenceDetector = new ToolCallFenceDetector();\n\n  let currentToolCallId: string | null = null;\n  let toolInputStartEmitted = false;\n  let accumulatedFenceContent = \"\";\n  let argumentsStreamState = createArgumentsStreamState();\n  let insideFence = false;\n\n  let toolCallDetected = false;\n  let toolCalls: ParsedToolCall[] = [];\n  let trailingText = \"\";\n\n  const resetFenceState = () => {\n    currentToolCallId = null;\n    toolInputStartEmitted = false;\n    accumulatedFenceContent = \"\";\n    argumentsStreamState = createArgumentsStreamState();\n    insideFence = false;\n  };\n\n  for await (const chunk of chunks) {\n    if (toolCallDetected) {\n      // Drain without processing so the underlying stream/engine can conclude.\n      continue;\n    }\n\n    fenceDetector.addChunk(chunk);\n\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 = generateToolCallId();\n        toolInputStartEmitted = false;\n        accumulatedFenceContent = \"\";\n        argumentsStreamState = createArgumentsStreamState();\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 delta = extractArgumentsDelta(\n            accumulatedFenceContent,\n            argumentsStreamState,\n          );\n          if (delta.length > 0) {\n            controller.enqueue({\n              type: \"tool-input-delta\",\n              id: currentToolCallId,\n              delta,\n            });\n          }\n        }\n\n        const parsed = parseJsonFunctionCalls(result.completeFence);\n        const selectedToolCalls = parsed.toolCalls.slice(0, 1);\n\n        if (selectedToolCalls.length === 0) {\n          emitTextDelta(result.completeFence);\n          if (result.textAfterFence) {\n            emitTextDelta(result.textAfterFence);\n          }\n          resetFenceState();\n          continue;\n        }\n\n        if (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 delta = extractArgumentsDelta(\n              accumulatedFenceContent,\n              argumentsStreamState,\n            );\n            if (delta.length > 0) {\n              controller.enqueue({\n                type: \"tool-input-delta\",\n                id: toolCallId,\n                delta,\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({ type: \"tool-input-end\", id: toolCallId });\n          controller.enqueue({\n            type: \"tool-call\",\n            toolCallId,\n            toolName,\n            input: argsJson,\n            providerExecuted: false,\n          });\n        }\n\n        trailingText = result.textAfterFence ?? \"\";\n        toolCalls = selectedToolCalls;\n        toolCallDetected = true;\n        resetFenceState();\n        break; // stop processing inner buffer\n      }\n\n      if (insideFence) {\n        if (result.safeContent) {\n          accumulatedFenceContent += result.safeContent;\n          madeProgress = true;\n\n          const toolName = extractToolName(accumulatedFenceContent);\n          if (toolName && !toolInputStartEmitted && currentToolCallId) {\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 delta = extractArgumentsDelta(\n              accumulatedFenceContent,\n              argumentsStreamState,\n            );\n            if (delta.length > 0) {\n              controller.enqueue({\n                type: \"tool-input-delta\",\n                id: currentToolCallId,\n                delta,\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    if (toolCallDetected && options?.stopEarlyOnToolCall) {\n      break; // caller will cancel/drain the underlying source\n    }\n  }\n\n  // Flush any remaining buffer when no tool call was detected\n  if (!toolCallDetected && fenceDetector.hasContent()) {\n    emitTextDelta(fenceDetector.getBuffer());\n    fenceDetector.clearBuffer();\n  }\n\n  return { toolCallDetected, toolCalls, trailingText };\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, type ToolResult } from \"@browser-ai/shared\";\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 \"../utils/convert-to-webllm-messages\";\n\nimport {\n  AppConfig,\n  ChatCompletionRequestNonStreaming,\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  createUnsupportedSettingWarning,\n  createUnsupportedToolWarning,\n  isFunctionTool,\n  processToolCallStream,\n  type ToolDefinition,\n  type DownloadProgressCallback,\n} from \"@browser-ai/shared\";\nimport {\n  prependSystemPromptToMessages,\n  extractSystemPrompt,\n} from \"../utils/prompt-utils\";\nimport {\n  isMobile,\n  checkWebGPU,\n  doesBrowserSupportWebLLM,\n} from \"../utils/browser\";\n\nexport { doesBrowserSupportWebLLM };\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\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    providerOptions,\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: ChatCompletionRequestNonStreaming = {\n      messages,\n      temperature,\n      max_tokens: maxOutputTokens,\n      top_p: topP,\n      seed,\n    };\n\n    const webLLMOptions = providerOptions?.[this.provider];\n    const extraBody = webLLMOptions?.extra_body as\n      | Record<string, unknown>\n      | undefined;\n    if (extraBody) {\n      // https://webllm.mlc.ai/docs/user/api_reference.html#generationconfig\n      requestOptions.extra_body = {\n        enable_thinking: extraBody.enable_thinking as boolean | undefined,\n        enable_latency_breakdown: extraBody.enable_latency_breakdown as\n          | boolean\n          | undefined,\n      };\n    }\n\n    // Handle response format\n    if (responseFormat?.type === \"json\") {\n      requestOptions.response_format = {\n        type: \"json_object\",\n        ...(responseFormat.schema && {\n          schema: JSON.stringify(responseFormat.schema),\n        }),\n      };\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: { ...requestOptions, messages: promptMessages } },\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: { ...requestOptions, messages: promptMessages } },\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 model = await model.createSessionWithProgress(\n   *   (progress) => {\n   *     console.log(`Download progress: ${Math.round(progress * 100)}%`);\n   *   }\n   * );\n   * ```\n   *\n   * @param onDownloadProgress Optional callback receiving progress values from 0 to 1\n   * @returns Promise resolving to the model instance\n   * @throws {LoadSettingError} When WebLLM is not available or model is unavailable\n   */\n  public async createSessionWithProgress(\n    onDownloadProgress?: DownloadProgressCallback,\n  ): Promise<WebLLMLanguageModel> {\n    const adaptedCallback = onDownloadProgress\n      ? (report: InitProgressReport) => {\n          onDownloadProgress(report.progress);\n        }\n      : undefined;\n    await this.getEngine(undefined, adaptedCallback);\n    return this;\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          let lastUsage:\n            | {\n                prompt_tokens?: number;\n                completion_tokens?: number;\n                total_tokens?: number;\n              }\n            | undefined;\n          let isAbort = false;\n\n          const chunks = (async function* () {\n            for await (const chunk of response) {\n              const choice = chunk.choices[0];\n              if (!choice) continue;\n              if (choice.delta.content) yield choice.delta.content;\n              if (chunk.usage) lastUsage = chunk.usage;\n              if (choice.finish_reason === \"abort\") isAbort = true;\n            }\n          })();\n\n          const result = await processToolCallStream(\n            chunks,\n            emitTextDelta,\n            controller,\n          );\n\n          if (result.trailingText) {\n            emitTextDelta(result.trailingText);\n          }\n\n          const finishReason: LanguageModelV3FinishReason = isAbort\n            ? { unified: \"other\", raw: \"abort\" }\n            : result.toolCallDetected\n              ? { unified: \"tool-calls\", raw: \"tool-calls\" }\n              : { unified: \"stop\", raw: \"stop\" };\n\n          finishStream(finishReason, lastUsage);\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: { ...requestOptions, messages: promptMessages } },\n    };\n  }\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","declare global {\n  interface Navigator {\n    gpu?: GPU;\n  }\n}\n\nexport function 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\nexport function checkWebGPU(): boolean {\n  try {\n    return !!globalThis?.navigator?.gpu;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Check if the browser supports WebLLM (WebGPU)\n */\nexport function doesBrowserSupportWebLLM(): boolean {\n  return checkWebGPU();\n}\n","import {\n  EmbeddingModelV3,\n  EmbeddingModelV3CallOptions,\n  EmbeddingModelV3Result,\n  TooManyEmbeddingValuesForCallError,\n  LoadSettingError,\n} from \"@ai-sdk/provider\";\nimport {\n  AppConfig,\n  CreateWebWorkerMLCEngine,\n  InitProgressReport,\n  MLCEngine,\n  MLCEngineConfig,\n  MLCEngineInterface,\n} from \"@mlc-ai/web-llm\";\nimport { Availability } from \"../types\";\nimport { isMobile, checkWebGPU } from \"../utils/browser\";\n\nexport type WebLLMEmbeddingModelId = string;\n\nexport interface WebLLMEmbeddingSettings {\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   * Maximum number of texts to embed in a single call.\n   * @default 100\n   */\n  maxEmbeddingsPerCall?: number;\n}\n\ntype WebLLMEmbeddingConfig = {\n  provider: string;\n  modelId: WebLLMEmbeddingModelId;\n  options: WebLLMEmbeddingSettings;\n};\n\nexport class WebLLMEmbeddingModel implements EmbeddingModelV3 {\n  readonly specificationVersion = \"v3\";\n  readonly provider = \"web-llm\";\n  readonly modelId: WebLLMEmbeddingModelId;\n  readonly maxEmbeddingsPerCall: number;\n  readonly supportsParallelCalls = false;\n\n  private readonly config: WebLLMEmbeddingConfig;\n  private engine?: MLCEngineInterface;\n  private isInitialized = false;\n  private initializationPromise?: Promise<void>;\n\n  constructor(\n    modelId: WebLLMEmbeddingModelId,\n    options: WebLLMEmbeddingSettings = {},\n  ) {\n    this.modelId = modelId;\n    this.maxEmbeddingsPerCall = options.maxEmbeddingsPerCall ?? 100;\n    this.config = {\n      provider: this.provider,\n      modelId,\n      options,\n    };\n  }\n\n  /**\n   * Check if the model is initialized and ready to use\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 (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      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        await this.engine.reload(this.modelId);\n      }\n\n      this.isInitialized = true;\n    } catch (error) {\n      this.engine = undefined;\n      this.isInitialized = false;\n      this.initializationPromise = undefined;\n\n      throw new LoadSettingError({\n        message: `Failed to initialize WebLLM embedding engine: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      });\n    }\n  }\n\n  /**\n   * Check the availability of the WebLLM embedding model\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    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.progress * 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 isn't 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   * Embed texts using the WebLLM embedding model\n   */\n  public async doEmbed(\n    options: EmbeddingModelV3CallOptions,\n  ): Promise<EmbeddingModelV3Result> {\n    const { values, abortSignal } = options;\n\n    if (values.length > this.maxEmbeddingsPerCall) {\n      throw new TooManyEmbeddingValuesForCallError({\n        provider: this.provider,\n        modelId: this.modelId,\n        maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,\n        values,\n      });\n    }\n\n    if (abortSignal?.aborted) {\n      throw new Error(\"Operation was aborted\");\n    }\n\n    const engine = await this.getEngine();\n\n    const abortHandler = () => {\n      engine.interruptGenerate();\n    };\n\n    if (abortSignal) {\n      abortSignal.addEventListener(\"abort\", abortHandler);\n    }\n\n    try {\n      const response = await engine.embeddings.create({\n        input: values,\n        model: this.modelId,\n        ...(abortSignal &&\n          !this.config.options.worker && { signal: abortSignal }),\n      });\n\n      const sortedEmbeddings = response.data\n        .sort((a, b) => a.index - b.index)\n        .map((e) => e.embedding);\n\n      return {\n        embeddings: sortedEmbeddings,\n        usage: {\n          tokens: response.usage.total_tokens,\n        },\n        providerMetadata: {\n          webllm: {\n            model: response.model,\n            promptTokens: response.usage.prompt_tokens,\n            totalTokens: response.usage.total_tokens,\n            prefillTokensPerSecond: response.usage.extra?.prefill_tokens_per_s,\n          },\n        },\n        warnings: [],\n      };\n    } catch (error) {\n      throw new Error(\n        `WebLLM embedding failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      );\n    } finally {\n      if (abortSignal) {\n        abortSignal.removeEventListener(\"abort\", abortHandler);\n      }\n    }\n  }\n}\n","export {\n  WebLLMLanguageModel,\n  doesBrowserSupportWebLLM,\n} from \"./chat/web-llm-language-model\";\nexport type {\n  WebLLMModelId,\n  WebLLMSettings,\n} from \"./chat/web-llm-language-model\";\n\nexport { WebLLMEmbeddingModel } from \"./embedding/web-llm-embedding-model\";\nexport type {\n  WebLLMEmbeddingModelId,\n  WebLLMEmbeddingSettings,\n} from \"./embedding/web-llm-embedding-model\";\n\nexport type { WebLLMUIMessage, WebLLMProgress } from \"./types\";\n\nexport { WebWorkerMLCEngineHandler } from \"@mlc-ai/web-llm\";\n\nexport { webLLM, createWebLLM } from \"./web-llm-provider\";\nexport type { WebLLMProvider } from \"./web-llm-provider\";\n","import {\n  EmbeddingModelV3,\n  NoSuchModelError,\n  ProviderV3,\n} from \"@ai-sdk/provider\";\nimport {\n  WebLLMLanguageModel,\n  WebLLMModelId,\n  WebLLMSettings,\n} from \"./chat/web-llm-language-model\";\nimport {\n  WebLLMEmbeddingModel,\n  WebLLMEmbeddingModelId,\n  WebLLMEmbeddingSettings,\n} from \"./embedding/web-llm-embedding-model\";\n\nexport interface WebLLMProvider extends ProviderV3 {\n  (modelId: WebLLMModelId, settings?: WebLLMSettings): WebLLMLanguageModel;\n\n  /**\n   * Creates a model for text generation.\n   */\n  languageModel(\n    modelId: WebLLMModelId,\n    settings?: WebLLMSettings,\n  ): WebLLMLanguageModel;\n\n  /**\n   * Creates a model for text generation.\n   */\n  chat(modelId: WebLLMModelId, settings?: WebLLMSettings): WebLLMLanguageModel;\n\n  /**\n   * Creates a model for text embeddings.\n   */\n  embedding(\n    modelId: WebLLMEmbeddingModelId,\n    settings?: WebLLMEmbeddingSettings,\n  ): EmbeddingModelV3;\n\n  /**\n   * Creates a model for text embeddings.\n   */\n  embeddingModel: (\n    modelId: WebLLMEmbeddingModelId,\n    settings?: WebLLMEmbeddingSettings,\n  ) => EmbeddingModelV3;\n}\n\n/**\n * Create a WebLLM provider instance.\n */\nexport function createWebLLM(): WebLLMProvider {\n  const createLanguageModel = (\n    modelId: WebLLMModelId,\n    settings?: WebLLMSettings,\n  ) => {\n    return new WebLLMLanguageModel(modelId, settings);\n  };\n\n  const createEmbeddingModel = (\n    modelId: WebLLMEmbeddingModelId,\n    settings?: WebLLMEmbeddingSettings,\n  ) => {\n    return new WebLLMEmbeddingModel(modelId, settings);\n  };\n\n  const provider = function (\n    modelId: WebLLMModelId,\n    settings?: WebLLMSettings,\n  ) {\n    if (new.target) {\n      throw new Error(\n        \"The WebLLM model function cannot be called with the new keyword.\",\n      );\n    }\n\n    return createLanguageModel(modelId, settings);\n  };\n\n  provider.specificationVersion = \"v3\" as const;\n  provider.languageModel = createLanguageModel;\n  provider.chat = createLanguageModel;\n  provider.embedding = createEmbeddingModel;\n  provider.embeddingModel = createEmbeddingModel;\n\n  provider.imageModel = (modelId: string) => {\n    throw new NoSuchModelError({ modelId, modelType: \"imageModel\" });\n  };\n\n  provider.speechModel = (modelId: string) => {\n    throw new NoSuchModelError({ modelId, modelType: \"speechModel\" });\n  };\n\n  provider.transcriptionModel = (modelId: string) => {\n    throw new NoSuchModelError({ modelId, modelType: \"transcriptionModel\" });\n  };\n\n  return provider as WebLLMProvider;\n}\n\n/**\n * Default WebLLM provider instance\n *\n * @example\n * ```typescript\n * import { webLLM } from \"@browser-ai/web-llm\";\n *\n * // Language model\n * const chat = webLLM(\"Llama-3.2-3B-Instruct-q4f16_1-MLC\");\n *\n * // Embedding model\n * const embed = webLLM.embeddingModel(\"snowflake-arctic-embed-m-q0f32-MLC-b32\");\n * ```\n */\nexport const webLLM = createWebLLM();\n"],"mappings":"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","names":["name","marker","symbol","_a","_b","prefixText","generateToolCallId","CreateWebWorkerMLCEngine","MLCEngine","CreateWebWorkerMLCEngine","MLCEngine"]}