kimi-vercel-ai-sdk-provider 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -15
- package/dist/index.d.mts +154 -7
- package/dist/index.d.ts +154 -7
- package/dist/index.js +278 -48
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +278 -48
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -1
- package/src/__tests__/code-integration.test.ts +37 -31
- package/src/__tests__/code-provider.test.ts +5 -6
- package/src/__tests__/code.test.ts +1 -3
- package/src/__tests__/file-cache.test.ts +310 -0
- package/src/__tests__/model-config.test.ts +120 -0
- package/src/__tests__/provider.test.ts +3 -2
- package/src/__tests__/reasoning-utils.test.ts +164 -0
- package/src/__tests__/tools.test.ts +75 -7
- package/src/chat/kimi-chat-language-model.ts +42 -3
- package/src/core/errors.ts +1 -1
- package/src/core/index.ts +10 -3
- package/src/core/types.ts +57 -2
- package/src/core/utils.ts +138 -0
- package/src/files/attachment-processor.ts +53 -5
- package/src/files/file-cache.ts +260 -0
- package/src/files/index.ts +16 -1
- package/src/tools/prepare-tools.ts +88 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/kimi-provider.ts","../src/chat/kimi-chat-language-model.ts","../src/core/errors.ts","../src/core/types.ts","../src/core/utils.ts","../src/tools/builtin-tools.ts","../src/tools/prepare-tools.ts","../src/chat/kimi-chat-messages.ts","../src/chat/kimi-chat-response.ts","../src/chat/kimi-chat-settings.ts","../src/files/file-utils.ts","../src/files/kimi-file-client.ts","../src/files/attachment-processor.ts","../src/version.ts","../src/code/kimi-code-language-model.ts","../src/code/kimi-code-messages.ts","../src/code/kimi-code-settings.ts","../src/code/kimi-code-types.ts","../src/code/kimi-code-provider.ts"],"sourcesContent":["/**\n * Kimi provider factory.\n * @module\n */\n\nimport { type LanguageModelV3, NoSuchModelError, type ProviderV3 } from '@ai-sdk/provider';\nimport {\n type FetchFunction,\n loadApiKey,\n loadOptionalSetting,\n withUserAgentSuffix,\n withoutTrailingSlash\n} from '@ai-sdk/provider-utils';\nimport { KimiChatLanguageModel, type KimiChatModelId, type KimiChatSettings } from './chat';\nimport { KimiFileClient } from './files';\nimport { kimiTools } from './tools';\nimport { VERSION } from './version';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst GLOBAL_BASE_URL = 'https://api.moonshot.ai/v1';\nconst CN_BASE_URL = 'https://api.moonshot.cn/v1';\n\n// ============================================================================\n// Provider Settings\n// ============================================================================\n\n/**\n * Settings for creating a Kimi provider instance.\n */\nexport interface KimiProviderSettings {\n /**\n * Moonshot AI API key. Defaults to the MOONSHOT_API_KEY environment variable.\n */\n apiKey?: string;\n\n /**\n * Base URL override. Defaults to the global or China endpoint.\n */\n baseURL?: string;\n\n /**\n * Select the regional endpoint when baseURL is not provided.\n * - `global`: Use the global API endpoint (api.moonshot.ai)\n * - `cn`: Use the China API endpoint (api.moonshot.cn)\n *\n * @default 'global'\n */\n endpoint?: 'global' | 'cn';\n\n /**\n * Default headers for all requests.\n */\n headers?: Record<string, string | undefined>;\n\n /**\n * Custom fetch implementation.\n */\n fetch?: FetchFunction;\n\n /**\n * ID generator for tool call fallback IDs.\n */\n generateId?: () => string;\n\n /**\n * Enable JSON schema structured outputs by default.\n */\n supportsStructuredOutputs?: boolean;\n\n /**\n * Include usage details in streaming responses if supported.\n */\n includeUsageInStream?: boolean;\n\n /**\n * Override supported URL patterns for file parts.\n */\n supportedUrls?: LanguageModelV3['supportedUrls'];\n}\n\n// ============================================================================\n// Provider Interface\n// ============================================================================\n\n/**\n * The Kimi provider interface.\n */\nexport interface KimiProvider extends Omit<ProviderV3, 'specificationVersion'> {\n specificationVersion: 'v3';\n\n /**\n * Creates a chat language model.\n * @param modelId - The model identifier\n * @param settings - Optional model settings\n */\n (modelId: KimiChatModelId, settings?: KimiChatSettings): LanguageModelV3;\n\n /**\n * Creates a chat language model.\n * @param modelId - The model identifier\n * @param settings - Optional model settings\n */\n languageModel(modelId: KimiChatModelId, settings?: KimiChatSettings): LanguageModelV3;\n\n /**\n * Creates a chat language model (alias for languageModel).\n * @param modelId - The model identifier\n * @param settings - Optional model settings\n */\n chat(modelId: KimiChatModelId, settings?: KimiChatSettings): LanguageModelV3;\n\n /**\n * Built-in tools that can be used with Kimi models.\n */\n tools: typeof kimiTools;\n\n /**\n * File client for uploading and extracting content from files.\n * Pre-configured with the provider's API key and base URL.\n *\n * @example\n * ```ts\n * const kimi = createKimi();\n * const result = await kimi.files.uploadAndExtract({\n * data: pdfBuffer,\n * filename: 'document.pdf',\n * });\n * console.log(result.content);\n * ```\n */\n files: KimiFileClient;\n}\n\n// ============================================================================\n// Provider Factory\n// ============================================================================\n\n/**\n * Create a Kimi provider instance.\n *\n * @param options - Provider settings\n * @returns A configured Kimi provider\n *\n * @example\n * ```ts\n * import { createKimi } from 'ai-sdk-provider-kimi';\n *\n * const kimi = createKimi({\n * apiKey: process.env.MOONSHOT_API_KEY,\n * });\n *\n * const result = await generateText({\n * model: kimi('kimi-k2.5'),\n * prompt: 'Hello!',\n * });\n * ```\n *\n * @example\n * ```ts\n * // With web search enabled\n * const result = await generateText({\n * model: kimi('kimi-k2.5', { webSearch: true }),\n * prompt: 'What are the latest AI news?',\n * });\n * ```\n *\n * @example\n * ```ts\n * // With code interpreter\n * const result = await generateText({\n * model: kimi('kimi-k2.5', { codeInterpreter: true }),\n * prompt: 'Calculate the factorial of 20',\n * });\n * ```\n */\nexport function createKimi(options: KimiProviderSettings = {}): KimiProvider {\n const resolvedBaseURL =\n loadOptionalSetting({\n settingValue: options.baseURL,\n environmentVariableName: 'MOONSHOT_BASE_URL'\n }) ?? (options.endpoint === 'cn' ? CN_BASE_URL : GLOBAL_BASE_URL);\n\n const baseURL = withoutTrailingSlash(resolvedBaseURL) ?? GLOBAL_BASE_URL;\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'MOONSHOT_API_KEY',\n description: 'Moonshot'\n })}`,\n ...options.headers\n },\n `ai-sdk/kimi/${VERSION}`\n );\n\n const createChatModel = (modelId: KimiChatModelId, settings: KimiChatSettings = {}) =>\n new KimiChatLanguageModel(modelId, settings, {\n provider: 'kimi.chat',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n generateId: options.generateId,\n supportsStructuredOutputs: settings.supportsStructuredOutputs ?? options.supportsStructuredOutputs,\n includeUsageInStream: settings.includeUsageInStream ?? options.includeUsageInStream,\n supportedUrls: settings.supportedUrls ?? options.supportedUrls\n });\n\n const provider: KimiProvider = (modelId: KimiChatModelId, settings?: KimiChatSettings): KimiChatLanguageModel => {\n if (new.target) {\n throw new Error('The Kimi provider function cannot be called with new.');\n }\n\n return createChatModel(modelId, settings);\n };\n\n provider.specificationVersion = 'v3';\n provider.languageModel = createChatModel;\n provider.chat = createChatModel;\n provider.tools = kimiTools;\n provider.files = new KimiFileClient({\n baseURL,\n headers: getHeaders,\n fetch: options.fetch\n });\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n provider.rerankingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'rerankingModel' });\n };\n\n return provider;\n}\n\n/**\n * Default Kimi provider instance.\n *\n * Uses the MOONSHOT_API_KEY environment variable for authentication.\n *\n * @example\n * ```ts\n * import { kimi } from 'ai-sdk-provider-kimi';\n *\n * const result = await generateText({\n * model: kimi('kimi-k2.5'),\n * prompt: 'Hello!',\n * });\n * ```\n */\nexport const kimi = createKimi();\n","/**\n * Kimi chat language model implementation.\n * @module\n */\n\nimport {\n InvalidResponseDataError,\n type JSONValue,\n type LanguageModelV3,\n type LanguageModelV3CallOptions,\n type LanguageModelV3Content,\n type LanguageModelV3FinishReason,\n type LanguageModelV3GenerateResult,\n type LanguageModelV3StreamPart,\n type LanguageModelV3StreamResult,\n type SharedV3ProviderMetadata,\n type SharedV3Warning\n} from '@ai-sdk/provider';\nimport {\n type ParseResult,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n generateId,\n isParsableJson,\n parseProviderOptions,\n postJsonToApi,\n removeUndefinedEntries\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { kimiErrorSchema, kimiFailedResponseHandler } from '../core';\nimport { type KimiCodeInterpreterToolOptions, type KimiWebSearchToolOptions, prepareKimiTools } from '../tools';\nimport { convertToKimiChatMessages } from './kimi-chat-messages';\nimport {\n convertKimiUsage,\n extractCodeInterpreterTokens,\n extractMessageContent,\n extractWebSearchTokens,\n getKimiRequestId,\n getResponseMetadata,\n mapKimiFinishReason\n} from './kimi-chat-response';\nimport {\n type KimiCachingConfig,\n type KimiChatConfig,\n type KimiChatModelId,\n type KimiChatSettings,\n type KimiProviderOptions,\n inferModelCapabilities,\n kimiProviderOptionsSchema\n} from './kimi-chat-settings';\n\n// ============================================================================\n// Language Model Implementation\n// ============================================================================\n\n/**\n * Kimi chat language model implementing LanguageModelV3.\n */\nexport class KimiChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3';\n readonly modelId: KimiChatModelId;\n\n private readonly config: KimiChatConfig;\n private readonly settings: KimiChatSettings;\n private readonly generateIdFn: () => string;\n private readonly supportsStructuredOutputs: boolean;\n\n constructor(modelId: KimiChatModelId, settings: KimiChatSettings, config: KimiChatConfig) {\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n this.generateIdFn = config.generateId ?? generateId;\n this.supportsStructuredOutputs = config.supportsStructuredOutputs ?? false;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get providerOptionsName(): string {\n return this.config.provider.split('.')[0].trim();\n }\n\n /**\n * Get the inferred or configured capabilities for this model.\n */\n get capabilities() {\n const inferred = inferModelCapabilities(this.modelId);\n return {\n ...inferred,\n ...this.settings.capabilities\n };\n }\n\n get supportedUrls() {\n const caps = this.capabilities;\n const patterns: Record<string, RegExp[]> = {\n 'image/*': [/^https?:\\/\\/.*$/i]\n };\n\n // Add video support for models that support it\n if (caps.videoInput) {\n patterns['video/*'] = [/^https?:\\/\\/.*$/i];\n }\n\n return this.settings.supportedUrls ?? this.config.supportedUrls ?? patterns;\n }\n\n private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n responseFormat,\n seed,\n providerOptions,\n tools,\n toolChoice\n }: LanguageModelV3CallOptions) {\n const warnings: SharedV3Warning[] = [];\n\n const deprecatedOptions = await parseProviderOptions({\n provider: 'moonshot',\n providerOptions,\n schema: kimiProviderOptionsSchema\n });\n\n if (deprecatedOptions != null) {\n warnings.push({\n type: 'other',\n message: \"The 'moonshot' key in providerOptions is deprecated. Use 'kimi' instead.\"\n });\n }\n\n const providerOptionsName = this.providerOptionsName;\n const kimiOptions = await parseProviderOptions({\n provider: providerOptionsName,\n providerOptions,\n schema: kimiProviderOptionsSchema\n });\n\n const options: KimiProviderOptions = {\n ...(deprecatedOptions ?? {}),\n ...(kimiOptions ?? {})\n };\n\n if (topK != null) {\n warnings.push({ type: 'unsupported', feature: 'topK' });\n }\n\n const strictJsonSchema = options.strictJsonSchema ?? true;\n\n if (responseFormat?.type === 'json' && responseFormat.schema != null && !this.supportsStructuredOutputs) {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details: 'JSON schema response format requires structured outputs support.'\n });\n }\n\n // Resolve web search configuration from settings and provider options\n const webSearch = resolveBuiltinToolConfig(this.settings.webSearch, options.webSearch);\n\n // Resolve code interpreter configuration from settings and provider options\n const codeInterpreter = resolveBuiltinToolConfig(this.settings.codeInterpreter, options.codeInterpreter);\n\n // Resolve tool choice polyfill setting\n const toolChoicePolyfill = options.toolChoicePolyfill ?? this.settings.toolChoicePolyfill ?? true;\n\n const {\n tools: kimiTools,\n toolChoice: kimiToolChoice,\n toolWarnings,\n toolChoiceSystemMessage\n } = prepareKimiTools({\n tools,\n toolChoice,\n webSearch,\n codeInterpreter,\n toolChoicePolyfill\n });\n\n // Resolve caching configuration\n const caching = resolveCachingConfig(this.settings.caching, options.caching);\n\n // Build caching headers\n const cachingHeaders = buildCachingHeaders(caching);\n\n const passthroughOptions = getPassthroughOptions({\n providerOptions,\n providerOptionsName,\n deprecatedProviderOptionsName: 'moonshot',\n knownKeys: Object.keys(kimiProviderOptionsSchema.shape)\n });\n\n // Convert messages and optionally inject tool choice system message\n const messages = convertToKimiChatMessages(prompt);\n if (toolChoiceSystemMessage) {\n // Prepend the tool choice instruction as a system message\n messages.unshift({ role: 'system', content: toolChoiceSystemMessage });\n }\n\n const body = removeUndefinedEntries({\n model: this.modelId,\n messages,\n max_tokens: maxOutputTokens,\n temperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n stop: stopSequences,\n seed,\n response_format:\n responseFormat?.type === 'json'\n ? this.supportsStructuredOutputs && responseFormat.schema != null\n ? {\n type: 'json_schema',\n json_schema: {\n schema: responseFormat.schema,\n strict: strictJsonSchema,\n name: responseFormat.name ?? 'response',\n description: responseFormat.description\n }\n }\n : { type: 'json_object' }\n : undefined,\n tools: kimiTools,\n tool_choice: kimiToolChoice,\n user: options.user,\n ...(kimiTools != null && options.parallelToolCalls != null\n ? { parallel_tool_calls: options.parallelToolCalls }\n : {}),\n ...passthroughOptions\n });\n\n const requestHeaders: Record<string, string | undefined> = {\n ...(options.requestId ? { 'X-Request-ID': options.requestId } : {}),\n ...(options.extraHeaders ?? {}),\n ...cachingHeaders\n };\n\n return {\n body,\n warnings: [...warnings, ...toolWarnings],\n requestHeaders\n };\n }\n\n async doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult> {\n const { body, warnings, requestHeaders } = await this.getArgs(options);\n\n const {\n responseHeaders,\n value: response,\n rawValue\n } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: combineHeaders(this.config.headers(), requestHeaders, options.headers),\n body,\n failedResponseHandler: kimiFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(kimiChatResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n\n const choice = response.choices[0];\n const content: Array<LanguageModelV3Content> = [];\n\n const { text, reasoning } = extractMessageContent(choice.message);\n\n if (reasoning.length > 0) {\n content.push({ type: 'reasoning', text: reasoning });\n }\n\n if (text.length > 0) {\n content.push({ type: 'text', text });\n }\n\n if (choice.message.tool_calls != null) {\n for (const toolCall of choice.message.tool_calls) {\n content.push({\n type: 'tool-call',\n toolCallId: toolCall.id ?? this.generateIdFn(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments ?? ''\n });\n }\n }\n\n // Extract built-in tool token usage from tool calls\n const webSearchTokens = extractWebSearchTokens(choice.message.tool_calls);\n const codeInterpreterTokens = extractCodeInterpreterTokens(choice.message.tool_calls);\n\n const providerMetadata = buildProviderMetadata({\n providerOptionsName: this.providerOptionsName,\n responseHeaders,\n webSearchTokens,\n codeInterpreterTokens\n });\n\n return {\n content,\n finishReason: {\n unified: mapKimiFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined\n },\n usage: convertKimiUsage(response.usage, webSearchTokens, codeInterpreterTokens),\n ...(providerMetadata ? { providerMetadata } : {}),\n request: { body },\n response: {\n ...getResponseMetadata(response),\n headers: responseHeaders,\n body: rawValue\n },\n warnings\n };\n }\n\n async doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult> {\n const { body, warnings, requestHeaders } = await this.getArgs(options);\n const streamBody = {\n ...body,\n stream: true,\n stream_options: this.config.includeUsageInStream ? { include_usage: true } : undefined\n };\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: combineHeaders(this.config.headers(), requestHeaders, options.headers),\n body: streamBody,\n failedResponseHandler: kimiFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(kimiChatChunkSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n\n const requestId = getKimiRequestId(responseHeaders);\n\n let finishReason: LanguageModelV3FinishReason = {\n unified: 'other',\n raw: undefined\n };\n let usage: z.infer<typeof kimiTokenUsageSchema> | undefined;\n\n let isFirstChunk = true;\n let isActiveText = false;\n let isActiveReasoning = false;\n\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n hasFinished: boolean;\n }> = [];\n\n const providerOptionsName = this.providerOptionsName;\n const _generateIdFn = this.generateIdFn;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<ParseResult<z.infer<typeof kimiChatChunkSchema>>, LanguageModelV3StreamPart>({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n if (!chunk.success) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n if ('error' in chunk.value) {\n finishReason = { unified: 'error', raw: undefined };\n const error = (chunk.value as { error?: { message?: string } }).error;\n controller.enqueue({\n type: 'error',\n error: error?.message ?? chunk.value\n });\n return;\n }\n\n const value = chunk.value as z.infer<typeof kimiChatChunkBaseSchema>;\n\n if (isFirstChunk) {\n isFirstChunk = false;\n controller.enqueue({\n type: 'response-metadata',\n ...getResponseMetadata(value)\n });\n }\n\n if (value.usage != null) {\n usage = value.usage;\n }\n\n const choice = value.choices[0];\n if (!choice) {\n return;\n }\n\n if (choice.finish_reason != null) {\n finishReason = {\n unified: mapKimiFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined\n };\n }\n\n const delta = choice.delta;\n if (!delta) {\n return;\n }\n\n const reasoningDelta = delta.reasoning_content ?? delta.reasoning;\n if (reasoningDelta) {\n if (!isActiveReasoning) {\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'text-0' });\n isActiveText = false;\n }\n controller.enqueue({\n type: 'reasoning-start',\n id: 'reasoning-0'\n });\n isActiveReasoning = true;\n }\n\n controller.enqueue({\n type: 'reasoning-delta',\n id: 'reasoning-0',\n delta: reasoningDelta\n });\n }\n\n if (delta.content) {\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n isActiveReasoning = false;\n }\n\n if (!isActiveText) {\n controller.enqueue({ type: 'text-start', id: 'text-0' });\n isActiveText = true;\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: 'text-0',\n delta: delta.content\n });\n }\n\n if (delta.tool_calls != null) {\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n isActiveReasoning = false;\n }\n\n for (const toolCallDelta of delta.tool_calls) {\n const index = toolCallDelta.index ?? toolCalls.length;\n\n if (toolCalls[index] == null) {\n if (toolCallDelta.id == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: \"Expected 'id' to be a string.\"\n });\n }\n\n if (toolCallDelta.function?.name == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: \"Expected 'function.name' to be a string.\"\n });\n }\n\n controller.enqueue({\n type: 'tool-input-start',\n id: toolCallDelta.id,\n toolName: toolCallDelta.function.name\n });\n\n toolCalls[index] = {\n id: toolCallDelta.id,\n type: 'function',\n function: {\n name: toolCallDelta.function.name,\n arguments: toolCallDelta.function.arguments ?? ''\n },\n hasFinished: false\n };\n\n const toolCall = toolCalls[index];\n\n if (toolCall.function.arguments.length > 0) {\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCall.id,\n delta: toolCall.function.arguments\n });\n }\n\n if (isParsableJson(toolCall.function.arguments)) {\n controller.enqueue({ type: 'tool-input-end', id: toolCall.id });\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n input: toolCall.function.arguments\n });\n\n toolCall.hasFinished = true;\n }\n\n continue;\n }\n\n const toolCall = toolCalls[index];\n if (toolCall.hasFinished) {\n continue;\n }\n\n if (toolCallDelta.function?.arguments != null) {\n toolCall.function.arguments += toolCallDelta.function.arguments;\n }\n\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCall.id,\n delta: toolCallDelta.function?.arguments ?? ''\n });\n\n if (isParsableJson(toolCall.function.arguments)) {\n controller.enqueue({ type: 'tool-input-end', id: toolCall.id });\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n input: toolCall.function.arguments\n });\n\n toolCall.hasFinished = true;\n }\n }\n }\n },\n\n flush(controller) {\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n isActiveReasoning = false;\n }\n\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'text-0' });\n isActiveText = false;\n }\n\n for (const toolCall of toolCalls.filter((call) => !call.hasFinished)) {\n controller.enqueue({ type: 'tool-input-end', id: toolCall.id });\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n input: toolCall.function.arguments\n });\n }\n\n // Extract built-in tool tokens from accumulated tool calls\n const webSearchTokens = extractWebSearchTokens(toolCalls);\n const codeInterpreterTokens = extractCodeInterpreterTokens(toolCalls);\n\n const providerMetadata: SharedV3ProviderMetadata | undefined =\n requestId || webSearchTokens != null || codeInterpreterTokens != null\n ? {\n [providerOptionsName]: {\n ...(requestId ? { requestId } : {}),\n ...(webSearchTokens != null ? { webSearchTokens } : {}),\n ...(codeInterpreterTokens != null ? { codeInterpreterTokens } : {})\n }\n }\n : undefined;\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertKimiUsage(usage, webSearchTokens, codeInterpreterTokens),\n ...(providerMetadata ? { providerMetadata } : {})\n });\n }\n })\n ),\n request: { body: streamBody },\n response: { headers: responseHeaders }\n };\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction buildProviderMetadata({\n providerOptionsName,\n responseHeaders,\n webSearchTokens,\n codeInterpreterTokens\n}: {\n providerOptionsName: string;\n responseHeaders?: Record<string, string>;\n webSearchTokens?: number;\n codeInterpreterTokens?: number;\n}): SharedV3ProviderMetadata | undefined {\n const requestId = getKimiRequestId(responseHeaders);\n\n if (!requestId && webSearchTokens == null && codeInterpreterTokens == null) {\n return undefined;\n }\n\n return {\n [providerOptionsName]: {\n ...(requestId ? { requestId } : {}),\n ...(webSearchTokens != null ? { webSearchTokens } : {}),\n ...(codeInterpreterTokens != null ? { codeInterpreterTokens } : {})\n }\n };\n}\n\nfunction getPassthroughOptions({\n providerOptions,\n providerOptionsName,\n deprecatedProviderOptionsName,\n knownKeys\n}: {\n providerOptions: LanguageModelV3CallOptions['providerOptions'];\n providerOptionsName: string;\n deprecatedProviderOptionsName: string;\n knownKeys: string[];\n}) {\n const rawOptions = [providerOptions?.[deprecatedProviderOptionsName], providerOptions?.[providerOptionsName]].filter(\n (entry): entry is Record<string, JSONValue | undefined> => entry != null && typeof entry === 'object'\n );\n\n const passthrough: Record<string, JSONValue | undefined> = {};\n\n for (const options of rawOptions) {\n for (const [key, value] of Object.entries(options ?? {})) {\n if (!knownKeys.includes(key)) {\n passthrough[key] = value;\n }\n }\n }\n\n return passthrough;\n}\n\ntype BuiltinToolOptions = boolean | KimiWebSearchToolOptions | KimiCodeInterpreterToolOptions | undefined;\n\nfunction resolveBuiltinToolConfig<T extends BuiltinToolOptions>(\n settingsConfig: T | undefined,\n optionsConfig: T | undefined\n): T | undefined {\n // Provider options take precedence\n if (optionsConfig != null) {\n if (typeof optionsConfig === 'boolean') {\n return optionsConfig ? ({ enabled: true } as T) : undefined;\n }\n const config = optionsConfig as { enabled: boolean };\n return config.enabled ? optionsConfig : undefined;\n }\n\n // Fall back to settings\n if (settingsConfig != null) {\n if (typeof settingsConfig === 'boolean') {\n return settingsConfig ? ({ enabled: true } as T) : undefined;\n }\n const config = settingsConfig as { enabled: boolean };\n return config.enabled ? settingsConfig : undefined;\n }\n\n return undefined;\n}\n\ntype CachingOptions = boolean | KimiCachingConfig | undefined;\n\n/**\n * Resolve caching configuration from settings and provider options.\n */\nfunction resolveCachingConfig(\n settingsConfig: CachingOptions,\n optionsConfig: CachingOptions\n): KimiCachingConfig | undefined {\n // Provider options take precedence\n const config = optionsConfig ?? settingsConfig;\n\n if (config == null) {\n return undefined;\n }\n\n if (typeof config === 'boolean') {\n return config ? { enabled: true } : undefined;\n }\n\n return config.enabled ? config : undefined;\n}\n\n/**\n * Build HTTP headers for context caching.\n * Kimi uses specific headers to control caching behavior.\n */\nfunction buildCachingHeaders(caching: KimiCachingConfig | undefined): Record<string, string> {\n if (!caching?.enabled) {\n return {};\n }\n\n const headers: Record<string, string> = {\n 'X-Kimi-Cache': 'enabled'\n };\n\n if (caching.cacheKey) {\n headers['X-Kimi-Cache-Key'] = caching.cacheKey;\n }\n\n if (caching.ttlSeconds) {\n headers['X-Kimi-Cache-TTL'] = String(caching.ttlSeconds);\n }\n\n if (caching.resetCache) {\n headers['X-Kimi-Cache-Reset'] = 'true';\n }\n\n return headers;\n}\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\nconst kimiTokenUsageSchema = z\n .object({\n prompt_tokens: z.number().nullish(),\n completion_tokens: z.number().nullish(),\n total_tokens: z.number().nullish(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().nullish()\n })\n .nullish(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().nullish()\n })\n .nullish()\n })\n .nullish();\n\nconst kimiChatResponseSchema = z.looseObject({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.string().nullish(),\n content: z.union([z.string(), z.array(z.any())]).nullish(),\n reasoning_content: z.string().nullish(),\n reasoning: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n id: z.string().nullish(),\n function: z.object({\n name: z.string(),\n arguments: z.string().nullish()\n })\n })\n )\n .nullish()\n }),\n finish_reason: z.string().nullish()\n })\n ),\n usage: kimiTokenUsageSchema\n});\n\nconst kimiChatChunkBaseSchema = z.looseObject({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n delta: z\n .object({\n role: z.enum(['assistant']).nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n reasoning: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n index: z.number().nullish(),\n id: z.string().nullish(),\n function: z.object({\n name: z.string().nullish(),\n arguments: z.string().nullish()\n })\n })\n )\n .nullish()\n })\n .nullish(),\n finish_reason: z.string().nullish()\n })\n ),\n usage: kimiTokenUsageSchema\n});\n\nconst kimiChatChunkSchema = z.union([kimiChatChunkBaseSchema, kimiErrorSchema]);\n","/**\n * Custom error classes for the Kimi provider.\n * @module\n */\n\nimport { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// ============================================================================\n// Error Schema\n// ============================================================================\n\n/**\n * Zod schema for Kimi API error responses.\n * Handles both standard OpenAI-style errors and simple message errors.\n */\nexport const kimiErrorSchema = z.union([\n z.object({\n error: z.object({\n message: z.string(),\n type: z.string().nullish(),\n param: z.any().nullish(),\n code: z.union([z.string(), z.number()]).nullish(),\n request_id: z.string().nullish()\n })\n }),\n z.object({\n message: z.string()\n })\n]);\n\n/**\n * Type for Kimi API error data.\n */\nexport type KimiErrorData = z.infer<typeof kimiErrorSchema>;\n\n// ============================================================================\n// Error Handler\n// ============================================================================\n\n/**\n * Failed response handler for Kimi API errors.\n * Parses error responses and creates appropriate error objects.\n */\nexport const kimiFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: kimiErrorSchema,\n errorToMessage: (error: KimiErrorData) => {\n if ('error' in error) {\n return error.error.message;\n }\n return error.message;\n },\n isRetryable: (response) =>\n response.status === 408 || response.status === 409 || response.status === 429 || response.status >= 500\n});\n\n// ============================================================================\n// Custom Error Classes\n// ============================================================================\n\n/**\n * Base error class for Kimi provider errors.\n */\nexport class KimiError extends Error {\n readonly code: string;\n readonly statusCode?: number;\n\n constructor(message: string, code: string, statusCode?: number) {\n super(message);\n this.name = 'KimiError';\n this.code = code;\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Error thrown when authentication fails.\n */\nexport class KimiAuthenticationError extends KimiError {\n constructor(message: string = 'Invalid API key or authentication failed') {\n super(message, 'authentication_error', 401);\n this.name = 'KimiAuthenticationError';\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded.\n */\nexport class KimiRateLimitError extends KimiError {\n readonly retryAfter?: number;\n\n constructor(message: string = 'Rate limit exceeded', retryAfter?: number) {\n super(message, 'rate_limit_error', 429);\n this.name = 'KimiRateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Error thrown when the request is invalid.\n */\nexport class KimiValidationError extends KimiError {\n constructor(message: string, param?: string) {\n super(param ? `${message} (param: ${param})` : message, 'validation_error', 400);\n this.name = 'KimiValidationError';\n }\n}\n\n/**\n * Error thrown when a model is not found.\n */\nexport class KimiModelNotFoundError extends KimiError {\n readonly modelId: string;\n\n constructor(modelId: string) {\n super(`Model '${modelId}' not found`, 'model_not_found', 404);\n this.name = 'KimiModelNotFoundError';\n this.modelId = modelId;\n }\n}\n\n/**\n * Error thrown when content is filtered.\n */\nexport class KimiContentFilterError extends KimiError {\n constructor(message: string = 'Content was filtered due to policy violation') {\n super(message, 'content_filter', 400);\n this.name = 'KimiContentFilterError';\n }\n}\n\n/**\n * Error thrown when context length is exceeded.\n */\nexport class KimiContextLengthError extends KimiError {\n constructor(message: string = 'Context length exceeded') {\n super(message, 'context_length_exceeded', 400);\n this.name = 'KimiContextLengthError';\n }\n}\n","/**\n * Core types for the Kimi provider.\n * @module\n */\n\nimport type { LanguageModelV3 } from '@ai-sdk/provider';\n\n// ============================================================================\n// Model IDs\n// ============================================================================\n\n/**\n * Available Kimi chat model IDs.\n *\n * @remarks\n * - `kimi-k2.5` - Latest flagship model with multimodal support\n * - `kimi-k2.5-thinking` - K2.5 with always-on deep reasoning\n * - `kimi-k2-turbo` - Fast, cost-effective model\n * - `kimi-k2-thinking` - K2 with always-on deep reasoning\n */\nexport type KimiChatModelId = 'kimi-k2.5' | 'kimi-k2.5-thinking' | 'kimi-k2-turbo' | 'kimi-k2-thinking' | (string & {});\n\n// ============================================================================\n// Model Capabilities\n// ============================================================================\n\n/**\n * Capabilities that can be detected from model ID patterns or explicitly set.\n */\nexport interface KimiModelCapabilities {\n /**\n * Whether the model supports thinking/reasoning mode.\n * Models with `-thinking` suffix have this enabled by default.\n */\n thinking?: boolean;\n\n /**\n * Whether the model always uses thinking mode (cannot be disabled).\n * Thinking models like `kimi-k2.5-thinking` have this set to true.\n */\n alwaysThinking?: boolean;\n\n /**\n * Whether the model supports image inputs.\n */\n imageInput?: boolean;\n\n /**\n * Whether the model supports video inputs.\n * Currently only kimi-k2.5 models support video.\n */\n videoInput?: boolean;\n\n /**\n * Maximum context window size in tokens.\n */\n maxContextSize?: number;\n\n /**\n * Whether the model supports tool/function calling.\n */\n toolCalling?: boolean;\n\n /**\n * Whether the model supports JSON mode.\n */\n jsonMode?: boolean;\n\n /**\n * Whether the model supports structured outputs.\n */\n structuredOutputs?: boolean;\n}\n\n/**\n * Infer model capabilities from the model ID.\n *\n * @param modelId - The model identifier\n * @returns Inferred capabilities based on model name patterns\n *\n * @example\n * ```ts\n * const caps = inferModelCapabilities('kimi-k2.5-thinking');\n * // { thinking: true, alwaysThinking: true, videoInput: true, ... }\n * ```\n */\nexport function inferModelCapabilities(modelId: string): KimiModelCapabilities {\n const isThinkingModel = modelId.includes('-thinking');\n const isK25Model = modelId.includes('k2.5') || modelId.includes('k2-5');\n\n return {\n thinking: isThinkingModel,\n alwaysThinking: isThinkingModel,\n imageInput: true, // All Kimi models support images\n videoInput: isK25Model, // Only K2.5 models support video\n maxContextSize: 256_000, // 256k context window\n toolCalling: true,\n jsonMode: true,\n structuredOutputs: true\n };\n}\n\n// ============================================================================\n// Provider Configuration\n// ============================================================================\n\n/**\n * Configuration for the chat language model.\n * @internal\n */\nexport interface KimiChatConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string | undefined>;\n fetch?: typeof globalThis.fetch;\n generateId?: () => string;\n supportsStructuredOutputs?: boolean;\n includeUsageInStream?: boolean;\n supportedUrls?: LanguageModelV3['supportedUrls'];\n}\n\n// ============================================================================\n// API Response Types\n// ============================================================================\n\n/**\n * Token usage information from Kimi API.\n */\nexport interface KimiTokenUsage {\n prompt_tokens?: number | null;\n completion_tokens?: number | null;\n total_tokens?: number | null;\n prompt_tokens_details?: {\n cached_tokens?: number | null;\n } | null;\n completion_tokens_details?: {\n reasoning_tokens?: number | null;\n } | null;\n}\n\n/**\n * Response metadata from Kimi API.\n */\nexport interface KimiResponseMetadata {\n id?: string | null;\n model?: string | null;\n created?: number | null;\n}\n","/**\n * Utility functions for the Kimi provider.\n * @module\n */\n\nimport type { JSONObject, LanguageModelV3FinishReason, LanguageModelV3Usage } from '@ai-sdk/provider';\nimport type { KimiResponseMetadata, KimiTokenUsage } from './types';\n\n// ============================================================================\n// Finish Reason Mapping\n// ============================================================================\n\n/**\n * Map Kimi finish reasons to standard AI SDK finish reasons.\n *\n * @param finishReason - The raw finish reason from Kimi API\n * @returns The mapped unified finish reason\n */\nexport function mapKimiFinishReason(finishReason: string | null | undefined): LanguageModelV3FinishReason['unified'] {\n switch (finishReason) {\n case 'stop':\n return 'stop';\n case 'length':\n return 'length';\n case 'content_filter':\n return 'content-filter';\n case 'tool_calls':\n case 'function_call':\n return 'tool-calls';\n default:\n return 'other';\n }\n}\n\n// ============================================================================\n// Usage Conversion\n// ============================================================================\n\n/**\n * Extended usage information including web search and code interpreter tokens.\n */\nexport interface KimiExtendedUsage extends LanguageModelV3Usage {\n /**\n * Tokens used by the built-in web search tool.\n */\n webSearchTokens?: number;\n\n /**\n * Tokens used by the built-in code interpreter.\n */\n codeInterpreterTokens?: number;\n}\n\n/**\n * Convert Kimi usage data to standard AI SDK usage format.\n *\n * @param usage - The raw usage data from Kimi API\n * @param webSearchTokens - Optional web search token count\n * @param codeInterpreterTokens - Optional code interpreter token count\n * @returns Standardized usage object\n */\nexport function convertKimiUsage(\n usage: KimiTokenUsage | null | undefined,\n webSearchTokens?: number,\n codeInterpreterTokens?: number\n): KimiExtendedUsage {\n if (usage == null) {\n return {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined\n },\n raw: undefined,\n ...(webSearchTokens != null ? { webSearchTokens } : {}),\n ...(codeInterpreterTokens != null ? { codeInterpreterTokens } : {})\n };\n }\n\n const promptTokens = usage.prompt_tokens ?? 0;\n const completionTokens = usage.completion_tokens ?? 0;\n const cacheReadTokens = usage.prompt_tokens_details?.cached_tokens ?? 0;\n const reasoningTokens = usage.completion_tokens_details?.reasoning_tokens ?? 0;\n\n // Convert to JSONObject for the raw field\n const rawUsage: JSONObject = {\n prompt_tokens: usage.prompt_tokens ?? undefined,\n completion_tokens: usage.completion_tokens ?? undefined,\n total_tokens: usage.total_tokens ?? undefined,\n ...(usage.prompt_tokens_details\n ? {\n prompt_tokens_details: {\n cached_tokens: usage.prompt_tokens_details.cached_tokens ?? undefined\n }\n }\n : {}),\n ...(usage.completion_tokens_details\n ? {\n completion_tokens_details: {\n reasoning_tokens: usage.completion_tokens_details.reasoning_tokens ?? undefined\n }\n }\n : {})\n };\n\n return {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cacheReadTokens,\n cacheRead: cacheReadTokens,\n cacheWrite: undefined\n },\n outputTokens: {\n total: completionTokens,\n text: completionTokens - reasoningTokens,\n reasoning: reasoningTokens\n },\n raw: rawUsage,\n ...(webSearchTokens != null ? { webSearchTokens } : {}),\n ...(codeInterpreterTokens != null ? { codeInterpreterTokens } : {})\n };\n}\n\n// ============================================================================\n// Response Metadata\n// ============================================================================\n\n/**\n * Extract response metadata from Kimi API response.\n *\n * @param response - The raw response metadata\n * @returns Formatted response metadata\n */\nexport function getResponseMetadata(response: KimiResponseMetadata) {\n return {\n id: response.id ?? undefined,\n modelId: response.model ?? undefined,\n timestamp: response.created != null ? new Date(response.created * 1000) : undefined\n };\n}\n\n/**\n * Extract request ID from response headers.\n *\n * @param headers - Response headers\n * @returns The request ID if found\n */\nexport function getKimiRequestId(headers?: Record<string, string>): string | undefined {\n if (!headers) {\n return undefined;\n }\n\n const lowerHeaders = Object.fromEntries(Object.entries(headers).map(([key, value]) => [key.toLowerCase(), value]));\n\n return lowerHeaders['x-request-id'] || lowerHeaders['x-trace-id'] || lowerHeaders['x-moonshot-request-id'];\n}\n\n// ============================================================================\n// Message Content Extraction\n// ============================================================================\n\n/**\n * Extract text and reasoning content from a message.\n *\n * @param message - The message object from API response\n * @returns Extracted text and reasoning content\n */\nexport function extractMessageContent(message: {\n content?: unknown;\n reasoning_content?: string | null;\n reasoning?: string | null;\n}): { text: string; reasoning: string } {\n let text = '';\n let reasoning = '';\n\n if (typeof message.content === 'string') {\n text = message.content;\n } else if (Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part && typeof part === 'object') {\n const candidate = part as Record<string, unknown>;\n if (candidate.type === 'text' && typeof candidate.text === 'string') {\n text += candidate.text;\n }\n if (candidate.type === 'thinking' && typeof candidate.thinking === 'string') {\n reasoning += candidate.thinking;\n }\n if (candidate.type === 'reasoning' && typeof candidate.text === 'string') {\n reasoning += candidate.text;\n }\n }\n }\n }\n\n if (typeof message.reasoning_content === 'string') {\n reasoning += message.reasoning_content;\n }\n\n if (typeof message.reasoning === 'string') {\n reasoning += message.reasoning;\n }\n\n return { text, reasoning };\n}\n","/**\n * Built-in tools for Kimi API.\n *\n * Kimi provides server-side tools that can be invoked during chat completions:\n * - `$web_search`: Search the web for information\n * - `$code`: Execute code using Kimi's code interpreter\n *\n * @module\n */\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Kimi's built-in web search tool identifier.\n * This tool allows Kimi to search the web for up-to-date information.\n */\nexport const KIMI_WEB_SEARCH_TOOL_NAME = '$web_search';\n\n/**\n * Kimi's built-in code interpreter tool identifier.\n * This tool allows Kimi to execute code and return results.\n */\nexport const KIMI_CODE_INTERPRETER_TOOL_NAME = '$code';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Configuration for Kimi's built-in web search tool.\n */\nexport interface KimiWebSearchConfig {\n /**\n * Whether to include search results in the response.\n * When true, the search results will be included in the tool output.\n */\n search_result?: boolean;\n /**\n * Allow additional configuration options.\n */\n [key: string]: unknown;\n}\n\n/**\n * Configuration for Kimi's built-in code interpreter tool.\n */\nexport interface KimiCodeInterpreterConfig {\n /**\n * Maximum execution time in seconds.\n * Default varies by model and API tier.\n */\n timeout?: number;\n\n /**\n * Whether to return execution output.\n * When true, stdout/stderr will be included in results.\n */\n include_output?: boolean;\n\n /**\n * Allow additional configuration options.\n */\n [key: string]: unknown;\n}\n\n/**\n * A Kimi built-in tool definition.\n * These are handled server-side by Kimi's API.\n */\nexport interface KimiBuiltinTool {\n type: 'builtin_function';\n function: {\n name: string;\n config?: Record<string, unknown>;\n };\n}\n\n// ============================================================================\n// Web Search Tool\n// ============================================================================\n\n/**\n * Configuration options for the web search tool.\n */\nexport interface KimiWebSearchToolOptions {\n /**\n * Whether the web search tool is enabled.\n */\n enabled: boolean;\n\n /**\n * Optional configuration for the web search tool.\n */\n config?: KimiWebSearchConfig;\n}\n\nexport type KimiWebSearchToolConfig = KimiWebSearchToolOptions;\n\n/**\n * Create a Kimi built-in web search tool definition.\n *\n * @param config - Optional configuration for the web search tool\n * @returns A built-in tool definition for $web_search\n *\n * @example\n * ```ts\n * // Basic usage\n * const tool = createWebSearchTool();\n *\n * // With configuration\n * const tool = createWebSearchTool({ search_result: true });\n * ```\n */\nexport function createWebSearchTool(config?: KimiWebSearchConfig): KimiBuiltinTool {\n return {\n type: 'builtin_function',\n function: {\n name: KIMI_WEB_SEARCH_TOOL_NAME,\n ...(config ? { config } : {})\n }\n };\n}\n\nexport function createKimiWebSearchTool(config?: KimiWebSearchConfig): KimiBuiltinTool {\n return createWebSearchTool(config);\n}\n\n// ============================================================================\n// Code Interpreter Tool\n// ============================================================================\n\n/**\n * Configuration options for the code interpreter tool.\n */\nexport interface KimiCodeInterpreterToolOptions {\n /**\n * Whether the code interpreter tool is enabled.\n */\n enabled: boolean;\n\n /**\n * Optional configuration for the code interpreter tool.\n */\n config?: KimiCodeInterpreterConfig;\n}\n\n/**\n * Create a Kimi built-in code interpreter tool definition.\n *\n * @param config - Optional configuration for the code interpreter tool\n * @returns A built-in tool definition for $code\n *\n * @example\n * ```ts\n * // Basic usage\n * const tool = createCodeInterpreterTool();\n *\n * // With configuration\n * const tool = createCodeInterpreterTool({ timeout: 30, include_output: true });\n * ```\n */\nexport function createCodeInterpreterTool(config?: KimiCodeInterpreterConfig): KimiBuiltinTool {\n return {\n type: 'builtin_function',\n function: {\n name: KIMI_CODE_INTERPRETER_TOOL_NAME,\n ...(config ? { config } : {})\n }\n };\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Check if a tool name is a Kimi built-in tool.\n * Built-in tools are prefixed with '$'.\n *\n * @param toolName - The tool name to check\n * @returns True if the tool is a built-in tool\n */\nexport function isBuiltinToolName(toolName: string): boolean {\n return toolName.startsWith('$');\n}\n\n/**\n * Check if a tool name is the web search tool.\n *\n * @param toolName - The tool name to check\n * @returns True if the tool is the web search tool\n */\nexport function isWebSearchTool(toolName: string): boolean {\n return toolName === KIMI_WEB_SEARCH_TOOL_NAME;\n}\n\n/**\n * Check if a tool name is the code interpreter tool.\n *\n * @param toolName - The tool name to check\n * @returns True if the tool is the code interpreter tool\n */\nexport function isCodeInterpreterTool(toolName: string): boolean {\n return toolName === KIMI_CODE_INTERPRETER_TOOL_NAME;\n}\n\n// ============================================================================\n// Provider Tool Definitions\n// ============================================================================\n\n/**\n * Create provider-level tool definitions for use with the AI SDK.\n * These can be passed directly to the tools option.\n */\nexport const kimiTools = {\n /**\n * Create a web search tool for use with Kimi models.\n *\n * @param config - Optional configuration\n * @returns A provider tool definition\n *\n * @example\n * ```ts\n * import { kimi, kimiTools } from 'ai-sdk-provider-kimi';\n *\n * const result = await generateText({\n * model: kimi('kimi-k2.5'),\n * tools: {\n * webSearch: kimiTools.webSearch(),\n * },\n * prompt: 'What are the latest AI news?',\n * });\n * ```\n */\n webSearch: (config?: KimiWebSearchConfig) => {\n return {\n type: 'provider' as const,\n id: 'kimi.webSearch',\n args: createWebSearchTool(config)\n };\n },\n\n /**\n * Create a code interpreter tool for use with Kimi models.\n *\n * @param config - Optional configuration\n * @returns A provider tool definition\n *\n * @example\n * ```ts\n * import { kimi, kimiTools } from 'ai-sdk-provider-kimi';\n *\n * const result = await generateText({\n * model: kimi('kimi-k2.5'),\n * tools: {\n * codeInterpreter: kimiTools.codeInterpreter(),\n * },\n * prompt: 'Calculate the factorial of 10',\n * });\n * ```\n */\n codeInterpreter: (config?: KimiCodeInterpreterConfig) => {\n return {\n type: 'provider' as const,\n id: 'kimi.codeInterpreter',\n args: createCodeInterpreterTool(config)\n };\n }\n};\n","/**\n * Tool preparation utilities for Kimi API.\n * @module\n */\n\nimport {\n type LanguageModelV3CallOptions,\n type LanguageModelV3ProviderTool,\n type SharedV3Warning,\n UnsupportedFunctionalityError\n} from '@ai-sdk/provider';\nimport {\n type KimiBuiltinTool,\n type KimiCodeInterpreterToolOptions,\n type KimiWebSearchToolOptions,\n createCodeInterpreterTool,\n createWebSearchTool\n} from './builtin-tools';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A standard function tool for Kimi API.\n */\nexport interface KimiFunctionTool {\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n strict?: boolean;\n };\n}\n\n/**\n * Union of all tool types supported by Kimi API.\n */\nexport type KimiTool = KimiFunctionTool | KimiBuiltinTool;\n\n/**\n * Options for preparing tools.\n */\nexport interface PrepareToolsOptions {\n /**\n * The tools from the call options.\n */\n tools: LanguageModelV3CallOptions['tools'];\n\n /**\n * The tool choice from the call options.\n */\n toolChoice?: LanguageModelV3CallOptions['toolChoice'];\n\n /**\n * Web search configuration.\n */\n webSearch?: boolean | KimiWebSearchToolOptions;\n\n /**\n * Code interpreter configuration.\n */\n codeInterpreter?: boolean | KimiCodeInterpreterToolOptions;\n\n /**\n * Enable tool choice polyfill for unsupported modes.\n * When true, uses system message injection to simulate\n * `required` and `tool` choices.\n */\n toolChoicePolyfill?: boolean;\n}\n\n/**\n * Result of preparing tools.\n */\nexport interface PrepareToolsResult {\n /**\n * The prepared tools for the API request.\n */\n tools: KimiTool[] | undefined;\n\n /**\n * The tool choice setting for the API request.\n */\n toolChoice: 'auto' | 'none' | undefined;\n\n /**\n * Any warnings generated during tool preparation.\n */\n toolWarnings: SharedV3Warning[];\n\n /**\n * System message to inject for tool choice polyfill.\n * This should be prepended to the messages array.\n */\n toolChoiceSystemMessage?: string;\n}\n\n// ============================================================================\n// Main Function\n// ============================================================================\n\n/**\n * Prepare tools for a Kimi API request.\n *\n * This function processes user-defined tools and built-in tools,\n * converting them to the format expected by the Kimi API.\n *\n * When `toolChoicePolyfill` is enabled, the function will generate\n * system messages to simulate unsupported tool choice modes:\n * - `required`: Injects a message instructing the model to use a tool\n * - `tool`: Injects a message instructing the model to use a specific tool\n *\n * @param options - Tool preparation options\n * @returns Prepared tools, tool choice, warnings, and optional system message\n */\nexport function prepareKimiTools({\n tools,\n toolChoice,\n webSearch,\n codeInterpreter,\n toolChoicePolyfill = true\n}: PrepareToolsOptions): PrepareToolsResult {\n tools = tools?.length ? tools : undefined;\n\n const toolWarnings: SharedV3Warning[] = [];\n const kimiTools: KimiTool[] = [];\n\n // Add built-in web search tool if enabled\n if (webSearch) {\n const config = typeof webSearch === 'boolean' ? undefined : webSearch.config;\n kimiTools.push(createWebSearchTool(config));\n }\n\n // Add built-in code interpreter tool if enabled\n if (codeInterpreter) {\n const config = typeof codeInterpreter === 'boolean' ? undefined : codeInterpreter.config;\n kimiTools.push(createCodeInterpreterTool(config));\n }\n\n // Process user-defined tools\n if (tools != null) {\n for (const tool of tools) {\n if (tool.type === 'provider') {\n // Check if this is a Kimi built-in tool\n const builtinTool = tryConvertToKimiBuiltinTool(tool);\n if (builtinTool) {\n kimiTools.push(builtinTool);\n continue;\n }\n\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`\n });\n continue;\n }\n\n kimiTools.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n ...(tool.strict != null ? { strict: tool.strict } : {})\n }\n });\n }\n }\n\n // Return undefined if no tools\n if (kimiTools.length === 0) {\n return { tools: undefined, toolChoice: undefined, toolWarnings };\n }\n\n // Handle tool choice\n if (toolChoice == null) {\n return { tools: kimiTools, toolChoice: undefined, toolWarnings };\n }\n\n switch (toolChoice.type) {\n case 'auto':\n case 'none':\n return { tools: kimiTools, toolChoice: toolChoice.type, toolWarnings };\n\n case 'required': {\n if (toolChoicePolyfill) {\n // Generate system message to force tool usage\n const toolNames = kimiTools.map((t) => (t.type === 'function' ? t.function.name : t.function.name)).join(', ');\n const systemMessage = generateRequiredToolMessage(toolNames);\n\n toolWarnings.push({\n type: 'compatibility',\n feature: 'toolChoice.required',\n details: 'Using tool choice polyfill with system message injection.'\n });\n\n return {\n tools: kimiTools,\n toolChoice: 'auto',\n toolWarnings,\n toolChoiceSystemMessage: systemMessage\n };\n }\n\n toolWarnings.push({\n type: 'compatibility',\n feature: 'toolChoice.required',\n details: 'Moonshot does not support required tool choice. Falling back to auto.'\n });\n return { tools: kimiTools, toolChoice: 'auto', toolWarnings };\n }\n\n case 'tool': {\n if (toolChoicePolyfill) {\n // Generate system message to force specific tool\n const systemMessage = generateSpecificToolMessage(toolChoice.toolName);\n\n toolWarnings.push({\n type: 'compatibility',\n feature: `toolChoice.tool:${toolChoice.toolName}`,\n details: 'Using tool choice polyfill with system message injection.'\n });\n\n return {\n tools: kimiTools,\n toolChoice: 'auto',\n toolWarnings,\n toolChoiceSystemMessage: systemMessage\n };\n }\n\n toolWarnings.push({\n type: 'compatibility',\n feature: `toolChoice.tool:${toolChoice.toolName}`,\n details: 'Moonshot does not support forcing a specific tool. Falling back to auto.'\n });\n return { tools: kimiTools, toolChoice: 'auto', toolWarnings };\n }\n\n default: {\n const _exhaustiveCheck: never = toolChoice;\n throw new UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`\n });\n }\n }\n}\n\n// ============================================================================\n// Tool Choice Polyfill Messages\n// ============================================================================\n\n/**\n * Generate a system message to force the model to use a tool.\n */\nfunction generateRequiredToolMessage(toolNames: string): string {\n return `IMPORTANT INSTRUCTION: You MUST use one of the available tools (${toolNames}) to respond to the user's request. Do NOT provide a direct text response without first calling a tool. Always invoke a tool to complete this task.`;\n}\n\n/**\n * Generate a system message to force the model to use a specific tool.\n */\nfunction generateSpecificToolMessage(toolName: string): string {\n return `IMPORTANT INSTRUCTION: You MUST use the \"${toolName}\" tool to respond to this request. Do NOT use any other tool or provide a direct text response. Call the \"${toolName}\" tool with appropriate parameters.`;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Try to convert a provider-defined tool to a Kimi built-in tool.\n * Returns undefined if the tool is not a Kimi built-in tool.\n */\nfunction tryConvertToKimiBuiltinTool(tool: LanguageModelV3ProviderTool): KimiBuiltinTool | undefined {\n // Check if this is a Kimi provider tool (id starts with 'kimi.')\n if (!tool.id.startsWith('kimi.')) {\n return undefined;\n }\n\n // Check if the args indicate a builtin_function type\n const args = tool.args;\n if (\n args &&\n typeof args === 'object' &&\n 'type' in args &&\n args.type === 'builtin_function' &&\n 'function' in args &&\n typeof args.function === 'object'\n ) {\n const fn = args.function as { name?: string; config?: Record<string, unknown> };\n if (typeof fn.name === 'string') {\n return {\n type: 'builtin_function',\n function: {\n name: fn.name,\n ...(fn.config ? { config: fn.config } : {})\n }\n };\n }\n }\n\n return undefined;\n}\n","/**\n * Message conversion utilities for Kimi API.\n * @module\n */\n\nimport {\n type LanguageModelV3Prompt,\n type LanguageModelV3ToolResultPart,\n UnsupportedFunctionalityError\n} from '@ai-sdk/provider';\nimport { convertToBase64 } from '@ai-sdk/provider-utils';\nimport { isBuiltinToolName } from '../tools';\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/**\n * A Kimi chat message.\n */\nexport type KimiChatMessage =\n | {\n role: 'system';\n content: string;\n }\n | {\n role: 'user';\n content: string | Array<KimiChatContentPart>;\n }\n | {\n role: 'assistant';\n content: string | null;\n reasoning_content?: string;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }>;\n }\n | {\n role: 'tool';\n tool_call_id: string;\n content: string;\n };\n\n/**\n * A content part in a user message.\n */\nexport type KimiChatContentPart =\n | { type: 'text'; text: string }\n | { type: 'image_url'; image_url: { url: string } }\n | { type: 'video_url'; video_url: { url: string } };\n\n/**\n * A sequence of Kimi chat messages.\n */\nexport type KimiChatPrompt = Array<KimiChatMessage>;\n\n// ============================================================================\n// Supported Media Types\n// ============================================================================\n\nconst SUPPORTED_IMAGE_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/*'];\n\nconst SUPPORTED_VIDEO_TYPES = ['video/mp4', 'video/webm', 'video/ogg', 'video/*'];\n\n// ============================================================================\n// Message Conversion\n// ============================================================================\n\n/**\n * Convert AI SDK prompt format to Kimi chat messages.\n *\n * @param prompt - The AI SDK prompt\n * @returns Kimi chat messages\n */\nexport function convertToKimiChatMessages(prompt: LanguageModelV3Prompt): KimiChatPrompt {\n const messages: KimiChatPrompt = [];\n\n for (const { role, content } of prompt) {\n switch (role) {\n case 'system': {\n messages.push({ role: 'system', content });\n break;\n }\n case 'user': {\n if (content.length === 1 && content[0].type === 'text') {\n messages.push({ role: 'user', content: content[0].text });\n break;\n }\n\n messages.push({\n role: 'user',\n content: content.map((part) => {\n switch (part.type) {\n case 'text':\n return { type: 'text' as const, text: part.text };\n case 'file': {\n // Handle image files\n if (isImageMediaType(part.mediaType)) {\n return convertImagePart(part);\n }\n\n // Handle video files (Kimi K2.5 supports video)\n if (isVideoMediaType(part.mediaType)) {\n return convertVideoPart(part);\n }\n\n // Handle text files\n if (part.mediaType.startsWith('text/')) {\n const text =\n part.data instanceof URL\n ? part.data.toString()\n : typeof part.data === 'string'\n ? part.data\n : new TextDecoder().decode(part.data);\n\n return { type: 'text' as const, text };\n }\n\n throw new UnsupportedFunctionalityError({\n functionality: `file part media type ${part.mediaType}`\n });\n }\n default: {\n const _exhaustiveCheck: never = part;\n throw new Error(`Unsupported part type: ${_exhaustiveCheck}`);\n }\n }\n })\n });\n break;\n }\n case 'assistant': {\n let text = '';\n let reasoning = '';\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }> = [];\n\n for (const part of content) {\n switch (part.type) {\n case 'text': {\n text += part.text;\n break;\n }\n case 'reasoning': {\n reasoning += part.text;\n break;\n }\n case 'tool-call': {\n toolCalls.push({\n id: part.toolCallId,\n type: 'function',\n function: {\n name: part.toolName,\n arguments: JSON.stringify(part.input)\n }\n });\n break;\n }\n case 'file': {\n // Assistant file parts are not directly supported by Kimi API\n // We could convert images to text descriptions, but for now skip\n break;\n }\n case 'tool-result': {\n // Tool results in assistant messages are unusual but handle gracefully\n // These would typically be in a 'tool' role message\n break;\n }\n default: {\n const _exhaustiveCheck: never = part;\n throw new Error(`Unsupported assistant part: ${_exhaustiveCheck}`);\n }\n }\n }\n\n messages.push({\n role: 'assistant',\n content: text.length > 0 ? text : null,\n ...(reasoning.length > 0 ? { reasoning_content: reasoning } : {}),\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {})\n });\n break;\n }\n case 'tool': {\n for (const toolResponse of content) {\n if (toolResponse.type === 'tool-approval-response') {\n continue;\n }\n\n messages.push({\n role: 'tool',\n tool_call_id: toolResponse.toolCallId,\n content: serializeToolResult(toolResponse)\n });\n }\n break;\n }\n default: {\n const _exhaustiveCheck: never = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n\n return messages;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction isImageMediaType(mediaType: string): boolean {\n return mediaType.startsWith('image/') || SUPPORTED_IMAGE_TYPES.includes(mediaType);\n}\n\nfunction isVideoMediaType(mediaType: string): boolean {\n return mediaType.startsWith('video/') || SUPPORTED_VIDEO_TYPES.includes(mediaType);\n}\n\nfunction convertImagePart(part: { mediaType: string; data: URL | Uint8Array | string }): {\n type: 'image_url';\n image_url: { url: string };\n} {\n const mediaType = part.mediaType === 'image/*' ? 'image/jpeg' : part.mediaType;\n\n const url =\n part.data instanceof URL ? part.data.toString() : `data:${mediaType};base64,${convertToBase64(part.data)}`;\n\n return { type: 'image_url', image_url: { url } };\n}\n\nfunction convertVideoPart(part: { mediaType: string; data: URL | Uint8Array | string }): {\n type: 'video_url';\n video_url: { url: string };\n} {\n // Video must be provided as a URL - base64 inline video is not practical\n if (!(part.data instanceof URL)) {\n throw new UnsupportedFunctionalityError({\n functionality: 'inline video data (video must be provided as a URL)'\n });\n }\n\n return { type: 'video_url', video_url: { url: part.data.toString() } };\n}\n\nfunction serializeToolResult(toolResponse: LanguageModelV3ToolResultPart): string {\n const { toolName } = toolResponse;\n const output = toolResponse.output;\n\n // For built-in tools like $web_search, just pass through the arguments\n // The Kimi API expects the tool result to be the same as what was passed\n if (isBuiltinToolName(toolName)) {\n return serializeBuiltinToolResult(output);\n }\n\n // Standard tool result serialization\n switch (output.type) {\n case 'text':\n case 'error-text':\n return output.value;\n case 'execution-denied':\n return output.reason ?? 'Tool execution denied.';\n case 'json':\n case 'error-json':\n case 'content':\n return JSON.stringify(output.value);\n default: {\n const _exhaustiveCheck: never = output;\n return JSON.stringify(_exhaustiveCheck);\n }\n }\n}\n\nfunction serializeBuiltinToolResult(output: LanguageModelV3ToolResultPart['output']): string {\n // For built-in tools, we need to pass through the result as-is\n // The model expects the arguments it passed to be echoed back\n switch (output.type) {\n case 'text':\n case 'error-text':\n return output.value;\n case 'json':\n case 'error-json':\n case 'content':\n return JSON.stringify(output.value);\n case 'execution-denied':\n return output.reason ?? 'Tool execution denied.';\n default: {\n const _exhaustiveCheck: never = output;\n return JSON.stringify(_exhaustiveCheck);\n }\n }\n}\n","/**\n * Response processing utilities for Kimi API.\n * @module\n */\n\nimport { KIMI_CODE_INTERPRETER_TOOL_NAME, KIMI_WEB_SEARCH_TOOL_NAME } from '../tools';\n\nexport type { KimiExtendedUsage, KimiTokenUsage } from '../core';\nexport {\n convertKimiUsage,\n extractMessageContent,\n getKimiRequestId,\n getResponseMetadata,\n mapKimiFinishReason\n} from '../core';\n\n// ============================================================================\n// Built-in Tool Token Extraction\n// ============================================================================\n\n/**\n * Tool call structure for token extraction.\n */\ninterface ToolCallForTokens {\n function: { name: string; arguments?: string | null };\n}\n\n/**\n * Extract total_tokens from $web_search tool call arguments.\n * The Kimi API includes usage information in the tool call arguments.\n *\n * @param toolCalls - The tool calls from the response\n * @returns The total web search tokens, or undefined if no web search was used\n */\nexport function extractWebSearchTokens(toolCalls: Array<ToolCallForTokens> | null | undefined): number | undefined {\n return extractBuiltinToolTokens(toolCalls, KIMI_WEB_SEARCH_TOOL_NAME);\n}\n\n/**\n * Extract total_tokens from $code tool call arguments.\n * The Kimi API includes usage information in the tool call arguments.\n *\n * @param toolCalls - The tool calls from the response\n * @returns The total code interpreter tokens, or undefined if no code was executed\n */\nexport function extractCodeInterpreterTokens(\n toolCalls: Array<ToolCallForTokens> | null | undefined\n): number | undefined {\n return extractBuiltinToolTokens(toolCalls, KIMI_CODE_INTERPRETER_TOOL_NAME);\n}\n\n/**\n * Extract tokens from a specific built-in tool.\n */\nfunction extractBuiltinToolTokens(\n toolCalls: Array<ToolCallForTokens> | null | undefined,\n toolName: string\n): number | undefined {\n if (!toolCalls) {\n return undefined;\n }\n\n let totalTokens = 0;\n let foundTool = false;\n\n for (const toolCall of toolCalls) {\n if (toolCall.function.name === toolName) {\n foundTool = true;\n\n if (toolCall.function.arguments) {\n try {\n const args = JSON.parse(toolCall.function.arguments);\n if (typeof args.total_tokens === 'number') {\n totalTokens += args.total_tokens;\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n\n return foundTool ? totalTokens : undefined;\n}\n","/**\n * Chat model settings and provider options schema.\n * @module\n */\n\nimport type { LanguageModelV3 } from '@ai-sdk/provider';\nimport type { KimiModelCapabilities } from '../core';\nimport type { KimiCodeInterpreterToolOptions, KimiWebSearchToolOptions } from '../tools';\nimport { z } from 'zod/v4';\n\n// ============================================================================\n// Re-exports\n// ============================================================================\n\nexport type {\n KimiChatConfig,\n KimiChatModelId,\n KimiModelCapabilities\n} from '../core';\nexport { inferModelCapabilities } from '../core';\n\n// ============================================================================\n// Context Caching Types\n// ============================================================================\n\n/**\n * Configuration for context caching.\n * Enables cost reduction for long, repeated prompts.\n */\nexport interface KimiCachingConfig {\n /**\n * Enable context caching for this request.\n */\n enabled: boolean;\n\n /**\n * Optional cache key for identifying cached context.\n * Use the same key across requests to hit the same cache.\n */\n cacheKey?: string;\n\n /**\n * Time-to-live for the cache in seconds.\n * Defaults to API default (typically 3600 seconds / 1 hour).\n */\n ttlSeconds?: number;\n\n /**\n * Reset the cache even if a matching cache exists.\n */\n resetCache?: boolean;\n}\n\n// ============================================================================\n// Chat Settings\n// ============================================================================\n\n/**\n * Settings for creating a Kimi chat model instance.\n */\nexport interface KimiChatSettings {\n /**\n * Enable JSON schema structured outputs when a schema is provided.\n */\n supportsStructuredOutputs?: boolean;\n\n /**\n * Request usage metrics during streaming (if supported by the API).\n */\n includeUsageInStream?: boolean;\n\n /**\n * Override supported URL patterns for file parts.\n */\n supportedUrls?: LanguageModelV3['supportedUrls'];\n\n /**\n * Enable the built-in web search tool.\n * When true, Kimi can search the web to answer questions.\n * You can also pass a configuration object for more control.\n */\n webSearch?: boolean | KimiWebSearchToolOptions;\n\n /**\n * Enable the built-in code interpreter tool.\n * When true, Kimi can execute code to solve problems.\n * You can also pass a configuration object for more control.\n */\n codeInterpreter?: boolean | KimiCodeInterpreterToolOptions;\n\n /**\n * Override inferred model capabilities.\n */\n capabilities?: Partial<KimiModelCapabilities>;\n\n /**\n * Enable tool choice polyfill for unsupported tool choice modes.\n * When true (default), uses system message injection to simulate\n * `required` and `tool` choices that Kimi doesn't natively support.\n *\n * @default true\n */\n toolChoicePolyfill?: boolean;\n\n /**\n * Enable automatic file handling for experimental_attachments.\n * When true, PDFs and documents will be automatically uploaded\n * to Kimi's file API and their content injected into the context.\n *\n * @default false\n */\n autoFileUpload?: boolean;\n\n /**\n * Context caching configuration.\n * Reduces costs by up to 90% for repeated long prompts.\n */\n caching?: boolean | KimiCachingConfig;\n}\n\n// ============================================================================\n// Provider Options Schema\n// ============================================================================\n\n/**\n * Zod schema for caching configuration.\n */\nexport const kimiCachingConfigSchema = z.object({\n enabled: z.boolean(),\n cacheKey: z.string().optional(),\n ttlSeconds: z.number().optional(),\n resetCache: z.boolean().optional()\n});\n\n/**\n * Zod schema for validating provider options passed to individual calls.\n */\nexport const kimiProviderOptionsSchema = z.object({\n /**\n * A unique identifier representing your end-user.\n */\n user: z.string().optional(),\n\n /**\n * Whether to use strict JSON schema validation when supported.\n */\n strictJsonSchema: z.boolean().optional(),\n\n /**\n * Optional request ID to correlate logs.\n */\n requestId: z.string().optional(),\n\n /**\n * Optional extra headers for this call.\n */\n extraHeaders: z.record(z.string(), z.string()).optional(),\n\n /**\n * Whether the provider should allow parallel tool calls.\n */\n parallelToolCalls: z.boolean().optional(),\n\n /**\n * Enable or configure the built-in web search tool for this request.\n * This allows Kimi to search the web to help answer questions.\n */\n webSearch: z\n .union([\n z.boolean(),\n z.object({\n enabled: z.boolean(),\n config: z\n .object({\n search_result: z.boolean().optional()\n })\n .optional()\n })\n ])\n .optional(),\n\n /**\n * Enable or configure the built-in code interpreter tool for this request.\n * This allows Kimi to execute code to help solve problems.\n */\n codeInterpreter: z\n .union([\n z.boolean(),\n z.object({\n enabled: z.boolean(),\n config: z\n .object({\n timeout: z.number().optional(),\n include_output: z.boolean().optional()\n })\n .optional()\n })\n ])\n .optional(),\n\n /**\n * Enable or configure context caching for this request.\n * Reduces costs for repeated long prompts.\n */\n caching: z.union([z.boolean(), kimiCachingConfigSchema]).optional(),\n\n /**\n * Enable tool choice polyfill for this request.\n */\n toolChoicePolyfill: z.boolean().optional()\n});\n\n/**\n * Type for provider options passed to individual calls.\n */\nexport type KimiProviderOptions = z.infer<typeof kimiProviderOptionsSchema>;\n","/**\n * File utility functions for Kimi API.\n * @module\n */\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * File extensions supported by Kimi's file upload API.\n */\nexport const SUPPORTED_FILE_EXTENSIONS = [\n // Documents\n '.pdf',\n '.txt',\n '.csv',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.ppt',\n '.pptx',\n '.md',\n '.epub',\n '.mobi',\n '.html',\n '.json',\n '.log',\n '.dot',\n '.ini',\n '.conf',\n '.yaml',\n '.yml',\n // Images\n '.jpeg',\n '.jpg',\n '.png',\n '.bmp',\n '.gif',\n '.svg',\n '.svgz',\n '.webp',\n '.ico',\n '.xbm',\n '.dib',\n '.pjp',\n '.tif',\n '.tiff',\n '.pjpeg',\n '.avif',\n '.apng',\n '.jfif',\n // Code files\n '.go',\n '.h',\n '.c',\n '.cpp',\n '.cxx',\n '.cc',\n '.cs',\n '.java',\n '.js',\n '.css',\n '.jsp',\n '.php',\n '.py',\n '.py3',\n '.asp',\n '.ts',\n '.tsx'\n] as const;\n\n/**\n * MIME types supported by Kimi's file upload API.\n */\nexport const SUPPORTED_MIME_TYPES = {\n // Documents\n 'application/pdf': 'file-extract',\n 'text/plain': 'file-extract',\n 'text/csv': 'file-extract',\n 'application/msword': 'file-extract',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'file-extract',\n 'application/vnd.ms-excel': 'file-extract',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'file-extract',\n 'application/vnd.ms-powerpoint': 'file-extract',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'file-extract',\n 'text/markdown': 'file-extract',\n 'text/html': 'file-extract',\n 'application/json': 'file-extract',\n 'application/epub+zip': 'file-extract',\n 'text/yaml': 'file-extract',\n 'application/x-yaml': 'file-extract',\n // Code files (treated as text)\n 'text/javascript': 'file-extract',\n 'text/typescript': 'file-extract',\n 'text/x-python': 'file-extract',\n 'text/x-java': 'file-extract',\n 'text/x-c': 'file-extract',\n 'text/x-c++': 'file-extract',\n 'text/css': 'file-extract',\n // Images\n 'image/jpeg': 'image',\n 'image/png': 'image',\n 'image/gif': 'image',\n 'image/webp': 'image',\n 'image/svg+xml': 'image',\n 'image/bmp': 'image',\n 'image/tiff': 'image',\n 'image/avif': 'image',\n 'image/apng': 'image',\n 'image/x-icon': 'image',\n // Videos\n 'video/mp4': 'video',\n 'video/webm': 'video',\n 'video/ogg': 'video',\n 'video/quicktime': 'video'\n} as const;\n\nexport type SupportedMimeType = keyof typeof SUPPORTED_MIME_TYPES;\nexport type FilePurpose = 'file-extract' | 'image' | 'video';\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if a media type is for image files.\n */\nexport function isImageMediaType(mediaType: string): boolean {\n return mediaType.startsWith('image/');\n}\n\n/**\n * Check if a media type is for video files.\n */\nexport function isVideoMediaType(mediaType: string): boolean {\n return mediaType.startsWith('video/');\n}\n\n/**\n * Check if a media type should use file-extract purpose.\n */\nexport function isFileExtractMediaType(mediaType: string): boolean {\n // Check explicit types\n if (mediaType in SUPPORTED_MIME_TYPES) {\n return SUPPORTED_MIME_TYPES[mediaType as SupportedMimeType] === 'file-extract';\n }\n // Check text/* and application/* prefixes\n if (mediaType.startsWith('text/') || mediaType === 'application/pdf') {\n return true;\n }\n return false;\n}\n\n/**\n * Check if a media type is for document files (PDFs, Word, etc.).\n */\nexport function isDocumentMediaType(mediaType: string): boolean {\n const documentTypes = [\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/epub+zip'\n ];\n return documentTypes.includes(mediaType);\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get the file purpose based on media type.\n */\nexport function getPurposeFromMediaType(mediaType: string): FilePurpose {\n if (isImageMediaType(mediaType)) {\n return 'image';\n }\n if (isVideoMediaType(mediaType)) {\n return 'video';\n }\n return 'file-extract';\n}\n\n/**\n * Get MIME type from file extension.\n */\nexport function getMediaTypeFromExtension(extension: string): string {\n const ext = extension.toLowerCase().startsWith('.') ? extension.toLowerCase() : `.${extension.toLowerCase()}`;\n\n const extensionToMime: Record<string, string> = {\n // Documents\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.csv': 'text/csv',\n '.doc': 'application/msword',\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n '.ppt': 'application/vnd.ms-powerpoint',\n '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n '.md': 'text/markdown',\n '.html': 'text/html',\n '.json': 'application/json',\n '.epub': 'application/epub+zip',\n '.yaml': 'text/yaml',\n '.yml': 'text/yaml',\n '.log': 'text/plain',\n '.ini': 'text/plain',\n '.conf': 'text/plain',\n // Code\n '.js': 'text/javascript',\n '.ts': 'text/typescript',\n '.tsx': 'text/typescript',\n '.py': 'text/x-python',\n '.java': 'text/x-java',\n '.c': 'text/x-c',\n '.cpp': 'text/x-c++',\n '.h': 'text/x-c',\n '.css': 'text/css',\n '.go': 'text/plain',\n '.php': 'text/plain',\n // Images\n '.jpeg': 'image/jpeg',\n '.jpg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.bmp': 'image/bmp',\n '.tif': 'image/tiff',\n '.tiff': 'image/tiff',\n '.avif': 'image/avif',\n '.apng': 'image/apng',\n '.ico': 'image/x-icon',\n // Videos\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.ogg': 'video/ogg',\n '.mov': 'video/quicktime'\n };\n\n return extensionToMime[ext] ?? 'application/octet-stream';\n}\n\n/**\n * Extract file extension from URL or filename.\n */\nexport function getExtensionFromPath(path: string): string | null {\n const match = path.match(/\\.([^./?#]+)(?:[?#]|$)/);\n return match ? `.${match[1].toLowerCase()}` : null;\n}\n","/**\n * Kimi File API client for uploading and managing files.\n * @module\n */\n\nimport type { FetchFunction } from '@ai-sdk/provider-utils';\nimport { getExtensionFromPath, getMediaTypeFromExtension, getPurposeFromMediaType } from './file-utils';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A file object returned by the Kimi File API.\n */\nexport interface KimiFile {\n /** Unique file identifier */\n id: string;\n /** File size in bytes */\n bytes: number;\n /** Unix timestamp of creation */\n created_at: number;\n /** Original filename */\n filename: string;\n /** Object type (always 'file') */\n object: 'file';\n /** File purpose (file-extract, image, video) */\n purpose: 'file-extract' | 'image' | 'video';\n /** Processing status */\n status: 'ok' | 'error' | 'processing';\n /** Status details if error */\n status_details?: string;\n}\n\n/**\n * Options for uploading a file.\n */\nexport interface FileUploadOptions {\n /** The file data as a Buffer, Uint8Array, or string (base64) */\n data: Uint8Array | string;\n /** The filename */\n filename: string;\n /** MIME type of the file */\n mediaType?: string;\n /** Purpose of the file (defaults based on mediaType) */\n purpose?: 'file-extract' | 'image' | 'video';\n}\n\n/**\n * Result of a file upload operation.\n */\nexport interface FileUploadResult {\n /** The uploaded file object */\n file: KimiFile;\n /** The extracted content (for file-extract purpose) */\n content?: string;\n}\n\n/**\n * Configuration for the file client.\n */\nexport interface KimiFileClientConfig {\n /** Base URL for the API */\n baseURL: string;\n /** Function to get authorization headers */\n headers: () => Record<string, string | undefined>;\n /** Custom fetch implementation */\n fetch?: FetchFunction;\n}\n\n// ============================================================================\n// File Client\n// ============================================================================\n\n/**\n * Client for interacting with Kimi's File API.\n *\n * Supports uploading files for content extraction, image understanding,\n * and video understanding.\n *\n * @example\n * ```ts\n * const client = new KimiFileClient({\n * baseURL: 'https://api.moonshot.ai/v1',\n * headers: () => ({\n * Authorization: `Bearer ${apiKey}`,\n * }),\n * });\n *\n * // Upload a PDF and extract content\n * const result = await client.uploadAndExtract({\n * data: pdfBuffer,\n * filename: 'document.pdf',\n * mediaType: 'application/pdf',\n * });\n *\n * console.log(result.content); // Extracted text content\n * ```\n */\nexport class KimiFileClient {\n private readonly config: KimiFileClientConfig;\n\n constructor(config: KimiFileClientConfig) {\n this.config = config;\n }\n\n /**\n * Upload a file to the Kimi API.\n */\n async upload(options: FileUploadOptions): Promise<KimiFile> {\n const { data, filename, mediaType, purpose } = options;\n\n // Determine MIME type\n const resolvedMediaType =\n mediaType ?? getMediaTypeFromExtension(getExtensionFromPath(filename) ?? '') ?? 'application/octet-stream';\n\n // Determine purpose\n const resolvedPurpose = purpose ?? getPurposeFromMediaType(resolvedMediaType);\n\n // Create form data\n const formData = new FormData();\n\n // Convert data to Blob\n const fileData = typeof data === 'string' ? base64ToUint8Array(data) : data;\n const blob = new Blob([new Uint8Array(fileData).buffer as ArrayBuffer], { type: resolvedMediaType });\n\n formData.append('file', blob, filename);\n formData.append('purpose', resolvedPurpose);\n\n const fetchFn = this.config.fetch ?? fetch;\n const headers = this.config.headers();\n\n const response = await fetchFn(`${this.config.baseURL}/files`, {\n method: 'POST',\n headers: {\n ...Object.fromEntries(\n Object.entries(headers).filter((entry): entry is [string, string] => entry[1] !== undefined)\n )\n // Don't set Content-Type - let the browser set it with boundary for FormData\n },\n body: formData\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`Failed to upload file: ${response.status} ${response.statusText} - ${errorBody}`);\n }\n\n return (await response.json()) as KimiFile;\n }\n\n /**\n * Get the content of an uploaded file (for file-extract purpose).\n */\n async getContent(fileId: string): Promise<string> {\n const fetchFn = this.config.fetch ?? fetch;\n const headers = this.config.headers();\n\n const response = await fetchFn(`${this.config.baseURL}/files/${fileId}/content`, {\n method: 'GET',\n headers: Object.fromEntries(\n Object.entries(headers).filter((entry): entry is [string, string] => entry[1] !== undefined)\n )\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`Failed to get file content: ${response.status} ${response.statusText} - ${errorBody}`);\n }\n\n return response.text();\n }\n\n /**\n * Upload a file and extract its content in one operation.\n * Only works for files with purpose=\"file-extract\".\n */\n async uploadAndExtract(options: FileUploadOptions): Promise<FileUploadResult> {\n const file = await this.upload({\n ...options,\n purpose: options.purpose ?? 'file-extract'\n });\n\n // Wait for processing if needed\n let currentFile = file;\n let attempts = 0;\n const maxAttempts = 30; // 30 seconds max wait\n const pollInterval = 1000; // 1 second\n\n while (currentFile.status === 'processing' && attempts < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n currentFile = await this.getFile(file.id);\n attempts++;\n }\n\n if (currentFile.status === 'error') {\n throw new Error(`File processing failed: ${currentFile.status_details ?? 'Unknown error'}`);\n }\n\n if (currentFile.status === 'processing') {\n throw new Error('File processing timed out');\n }\n\n // Get content for file-extract purpose\n let content: string | undefined;\n if (currentFile.purpose === 'file-extract') {\n content = await this.getContent(file.id);\n }\n\n return { file: currentFile, content };\n }\n\n /**\n * Get file information.\n */\n async getFile(fileId: string): Promise<KimiFile> {\n const fetchFn = this.config.fetch ?? fetch;\n const headers = this.config.headers();\n\n const response = await fetchFn(`${this.config.baseURL}/files/${fileId}`, {\n method: 'GET',\n headers: Object.fromEntries(\n Object.entries(headers).filter((entry): entry is [string, string] => entry[1] !== undefined)\n )\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`Failed to get file: ${response.status} ${response.statusText} - ${errorBody}`);\n }\n\n return (await response.json()) as KimiFile;\n }\n\n /**\n * List all uploaded files.\n */\n async listFiles(): Promise<KimiFile[]> {\n const fetchFn = this.config.fetch ?? fetch;\n const headers = this.config.headers();\n\n const response = await fetchFn(`${this.config.baseURL}/files`, {\n method: 'GET',\n headers: Object.fromEntries(\n Object.entries(headers).filter((entry): entry is [string, string] => entry[1] !== undefined)\n )\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`Failed to list files: ${response.status} ${response.statusText} - ${errorBody}`);\n }\n\n const result = (await response.json()) as { data: KimiFile[] };\n return result.data;\n }\n\n /**\n * Delete a file.\n */\n async deleteFile(fileId: string): Promise<void> {\n const fetchFn = this.config.fetch ?? fetch;\n const headers = this.config.headers();\n\n const response = await fetchFn(`${this.config.baseURL}/files/${fileId}`, {\n method: 'DELETE',\n headers: Object.fromEntries(\n Object.entries(headers).filter((entry): entry is [string, string] => entry[1] !== undefined)\n )\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`Failed to delete file: ${response.status} ${response.statusText} - ${errorBody}`);\n }\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction base64ToUint8Array(base64: string): Uint8Array {\n // Handle data URLs\n const base64Data = base64.includes(',') ? base64.split(',')[1] : base64;\n const binaryString = atob(base64Data);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n","/**\n * Attachment processor for experimental_attachments support.\n * Automatically uploads files to Kimi and injects content into prompts.\n * @module\n */\n\nimport {\n getExtensionFromPath,\n getMediaTypeFromExtension,\n isDocumentMediaType,\n isFileExtractMediaType,\n isImageMediaType,\n isVideoMediaType\n} from './file-utils';\nimport { KimiFileClient, type KimiFileClientConfig } from './kimi-file-client';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * An attachment from experimental_attachments.\n */\nexport interface Attachment {\n /** URL of the attachment */\n url?: string;\n /** Name of the attachment */\n name?: string;\n /** MIME type */\n contentType?: string;\n /** Raw content data */\n content?: Uint8Array | string;\n}\n\n/**\n * Processed attachment result.\n */\nexport interface ProcessedAttachment {\n /** Original attachment */\n original: Attachment;\n /** Processing type */\n type: 'text-inject' | 'image-url' | 'video-url' | 'skip';\n /** Extracted text content (for documents) */\n textContent?: string;\n /** URL to use in message (for images/videos) */\n mediaUrl?: string;\n /** Kimi file ID (if uploaded) */\n fileId?: string;\n /** Error if processing failed */\n error?: string;\n}\n\n/**\n * Options for processing attachments.\n */\nexport interface ProcessAttachmentsOptions {\n /** Attachments to process */\n attachments: Attachment[];\n /** File client configuration */\n clientConfig: KimiFileClientConfig;\n /** Whether to auto-upload documents for extraction */\n autoUploadDocuments?: boolean;\n /** Whether to upload images to Kimi's file API */\n uploadImages?: boolean;\n /** Whether to delete files after extraction (cleanup) */\n cleanupAfterExtract?: boolean;\n}\n\n// ============================================================================\n// Main Function\n// ============================================================================\n\n/**\n * Process experimental_attachments for Kimi.\n *\n * This function handles different attachment types:\n * - Documents (PDF, DOC, etc.): Uploads to Kimi, extracts content, returns text to inject\n * - Images: Returns URL for vision input\n * - Videos: Returns URL for video input\n *\n * @example\n * ```ts\n * const processed = await processAttachments({\n * attachments: message.experimental_attachments ?? [],\n * clientConfig: {\n * baseURL: 'https://api.moonshot.ai/v1',\n * headers: () => ({ Authorization: `Bearer ${apiKey}` }),\n * },\n * });\n *\n * // Inject document content into system messages\n * const documentContent = processed\n * .filter(p => p.type === 'text-inject' && p.textContent)\n * .map(p => p.textContent)\n * .join('\\n');\n * ```\n */\nexport async function processAttachments(options: ProcessAttachmentsOptions): Promise<ProcessedAttachment[]> {\n const {\n attachments,\n clientConfig,\n autoUploadDocuments = true,\n uploadImages = false,\n cleanupAfterExtract = false\n } = options;\n\n const results: ProcessedAttachment[] = [];\n const client = new KimiFileClient(clientConfig);\n\n for (const attachment of attachments) {\n try {\n const processed = await processAttachment(attachment, client, {\n autoUploadDocuments,\n uploadImages,\n cleanupAfterExtract\n });\n results.push(processed);\n } catch (error) {\n results.push({\n original: attachment,\n type: 'skip',\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n\n return results;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nasync function processAttachment(\n attachment: Attachment,\n client: KimiFileClient,\n options: { autoUploadDocuments: boolean; uploadImages: boolean; cleanupAfterExtract: boolean }\n): Promise<ProcessedAttachment> {\n // Determine content type\n const contentType = resolveContentType(attachment);\n\n // Handle images - just return URL for vision\n if (isImageMediaType(contentType)) {\n if (options.uploadImages && attachment.content) {\n // Upload image if content is provided\n const result = await client.upload({\n data: attachment.content,\n filename: attachment.name ?? 'image.jpg',\n mediaType: contentType,\n purpose: 'image'\n });\n\n return {\n original: attachment,\n type: 'image-url',\n fileId: result.id,\n mediaUrl: attachment.url\n };\n }\n\n return {\n original: attachment,\n type: 'image-url',\n mediaUrl: attachment.url\n };\n }\n\n // Handle videos - just return URL for video understanding\n if (isVideoMediaType(contentType)) {\n return {\n original: attachment,\n type: 'video-url',\n mediaUrl: attachment.url\n };\n }\n\n // Handle documents that need extraction\n if (options.autoUploadDocuments && (isDocumentMediaType(contentType) || isFileExtractMediaType(contentType))) {\n // Need to fetch content if only URL is provided\n let data: Uint8Array | string;\n\n if (attachment.content) {\n data = attachment.content;\n } else if (attachment.url) {\n // Fetch the file from URL\n const response = await fetch(attachment.url);\n if (!response.ok) {\n throw new Error(`Failed to fetch attachment: ${response.status}`);\n }\n data = new Uint8Array(await response.arrayBuffer());\n } else {\n return {\n original: attachment,\n type: 'skip',\n error: 'No content or URL provided for document attachment'\n };\n }\n\n // Upload and extract content\n const result = await client.uploadAndExtract({\n data,\n filename: attachment.name ?? guessFilename(attachment, contentType),\n mediaType: contentType,\n purpose: 'file-extract'\n });\n\n // Cleanup if requested\n if (options.cleanupAfterExtract && result.file.id) {\n try {\n await client.deleteFile(result.file.id);\n } catch {\n // Ignore cleanup errors\n }\n }\n\n return {\n original: attachment,\n type: 'text-inject',\n textContent: result.content,\n fileId: result.file.id\n };\n }\n\n // Skip unsupported types\n return {\n original: attachment,\n type: 'skip',\n error: `Unsupported content type: ${contentType}`\n };\n}\n\nfunction resolveContentType(attachment: Attachment): string {\n // Use explicit content type if provided\n if (attachment.contentType) {\n return attachment.contentType;\n }\n\n // Try to infer from filename or URL\n const path = attachment.name ?? attachment.url;\n if (path) {\n const ext = getExtensionFromPath(path);\n if (ext) {\n return getMediaTypeFromExtension(ext);\n }\n }\n\n // Default to octet-stream\n return 'application/octet-stream';\n}\n\nfunction guessFilename(attachment: Attachment, contentType: string): string {\n if (attachment.name) {\n return attachment.name;\n }\n\n if (attachment.url) {\n const urlPath = attachment.url.split('?')[0];\n const segments = urlPath.split('/');\n const lastSegment = segments[segments.length - 1];\n if (lastSegment && lastSegment.includes('.')) {\n return lastSegment;\n }\n }\n\n // Generate filename from content type\n const extensionMap: Record<string, string> = {\n 'application/pdf': 'document.pdf',\n 'text/plain': 'document.txt',\n 'application/msword': 'document.doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'document.docx',\n 'image/jpeg': 'image.jpg',\n 'image/png': 'image.png'\n };\n\n return extensionMap[contentType] ?? 'file.bin';\n}\n","declare const __PACKAGE_VERSION__: string | undefined;\n\nexport const VERSION =\n typeof __PACKAGE_VERSION__ === 'string' && __PACKAGE_VERSION__.length > 0 ? __PACKAGE_VERSION__ : '0.0.0';\n","/**\n * Kimi Code language model implementation.\n * @module\n */\n\nimport type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3FunctionTool,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamPart,\n LanguageModelV3StreamResult,\n SharedV3ProviderMetadata,\n SharedV3Warning\n} from '@ai-sdk/provider';\nimport {\n type ParseResult,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n generateId,\n parseProviderOptions,\n postJsonToApi,\n removeUndefinedEntries\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { convertToKimiCodePrompt } from './kimi-code-messages';\nimport {\n type KimiCodeSettings,\n effortToBudgetTokens,\n kimiCodeProviderOptionsSchema,\n normalizeExtendedThinkingConfig\n} from './kimi-code-settings';\nimport {\n type KimiCodeCapabilities,\n type KimiCodeConfig,\n type KimiCodeModelId,\n inferKimiCodeCapabilities\n} from './kimi-code-types';\n\n// ============================================================================\n// Response Schemas\n// ============================================================================\n\nconst kimiCodeErrorSchema = z.union([\n z.object({\n error: z.object({\n message: z.string(),\n type: z.string().nullish(),\n code: z.union([z.string(), z.number()]).nullish()\n })\n }),\n z.object({\n message: z.string()\n })\n]);\n\ntype KimiCodeErrorData = z.infer<typeof kimiCodeErrorSchema>;\n\nconst kimiCodeTextContentSchema = z.object({\n type: z.literal('text'),\n text: z.string()\n});\n\nconst kimiCodeThinkingContentSchema = z.object({\n type: z.literal('thinking'),\n thinking: z.string()\n});\n\nconst kimiCodeToolUseContentSchema = z.object({\n type: z.literal('tool_use'),\n id: z.string(),\n name: z.string(),\n input: z.record(z.string(), z.unknown())\n});\n\nconst kimiCodeContentBlockSchema = z.union([\n kimiCodeTextContentSchema,\n kimiCodeThinkingContentSchema,\n kimiCodeToolUseContentSchema\n]);\n\nconst kimiCodeResponseSchema = z.object({\n id: z.string().optional(),\n type: z.string().optional(),\n model: z.string().optional(),\n stop_reason: z.string().nullish(),\n stop_sequence: z.string().nullish(),\n content: z.array(kimiCodeContentBlockSchema),\n usage: z\n .object({\n input_tokens: z.number().optional(),\n output_tokens: z.number().optional(),\n cache_read_input_tokens: z.number().optional(),\n cache_creation_input_tokens: z.number().optional()\n })\n .optional()\n});\n\nconst kimiCodeStreamChunkSchema = z.object({\n type: z.string(),\n index: z.number().optional(),\n message: z\n .object({\n id: z.string().optional(),\n type: z.string().optional(),\n model: z.string().optional(),\n content: z.array(z.unknown()).optional(),\n stop_reason: z.string().nullish(),\n stop_sequence: z.string().nullish(),\n usage: z\n .object({\n input_tokens: z.number().optional(),\n output_tokens: z.number().optional()\n })\n .optional()\n })\n .optional(),\n content_block: z\n .object({\n type: z.string(),\n text: z.string().optional(),\n thinking: z.string().optional(),\n id: z.string().optional(),\n name: z.string().optional(),\n input: z.record(z.string(), z.unknown()).optional()\n })\n .optional(),\n delta: z\n .object({\n type: z.string().optional(),\n text: z.string().optional(),\n thinking: z.string().optional(),\n partial_json: z.string().optional(),\n stop_reason: z.string().optional(),\n stop_sequence: z.string().optional()\n })\n .optional(),\n usage: z\n .object({\n input_tokens: z.number().optional(),\n output_tokens: z.number().optional()\n })\n .optional()\n});\n\ntype KimiCodeResponse = z.infer<typeof kimiCodeResponseSchema>;\ntype KimiCodeStreamChunk = z.infer<typeof kimiCodeStreamChunkSchema>;\n\n// ============================================================================\n// Error Handler\n// ============================================================================\n\nconst kimiCodeFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: kimiCodeErrorSchema,\n errorToMessage: (error: KimiCodeErrorData) => {\n if ('error' in error) {\n return error.error.message;\n }\n return error.message;\n },\n isRetryable: (response) =>\n response.status === 408 || response.status === 409 || response.status === 429 || response.status >= 500\n});\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Map Kimi Code stop reason to AI SDK finish reason.\n */\nfunction mapStopReason(stopReason: string | null | undefined): LanguageModelV3FinishReason {\n switch (stopReason) {\n case 'end_turn':\n case 'stop_sequence':\n return { unified: 'stop', raw: stopReason };\n case 'tool_use':\n return { unified: 'tool-calls', raw: stopReason };\n case 'max_tokens':\n return { unified: 'length', raw: stopReason };\n default:\n return { unified: 'other', raw: stopReason ?? undefined };\n }\n}\n\n/**\n * Convert Kimi Code usage to AI SDK usage format.\n */\nfunction convertUsage(usage?: {\n input_tokens?: number;\n output_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n}) {\n const inputTokens = usage?.input_tokens ?? 0;\n const outputTokens = usage?.output_tokens ?? 0;\n const cacheRead = usage?.cache_read_input_tokens ?? 0;\n\n return {\n inputTokens: {\n total: inputTokens,\n cacheRead,\n cacheWrite: usage?.cache_creation_input_tokens,\n noCache: inputTokens - cacheRead\n },\n outputTokens: {\n total: outputTokens,\n text: outputTokens,\n reasoning: 0\n },\n raw: usage\n };\n}\n\n/**\n * Convert tools to Kimi Code (Anthropic) format.\n */\nfunction convertTools(tools?: LanguageModelV3FunctionTool[]) {\n if (!tools || tools.length === 0) {\n return undefined;\n }\n\n return tools.map((tool) => {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema ?? { type: 'object', properties: {} }\n };\n });\n}\n\n// ============================================================================\n// Language Model Implementation\n// ============================================================================\n\n/**\n * Kimi Code language model implementing LanguageModelV3.\n */\nexport class KimiCodeLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3';\n readonly modelId: KimiCodeModelId;\n\n private readonly config: KimiCodeConfig;\n private readonly settings: KimiCodeSettings;\n private readonly generateIdFn: () => string;\n\n constructor(modelId: KimiCodeModelId, settings: KimiCodeSettings, config: KimiCodeConfig) {\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n this.generateIdFn = config.generateId ?? generateId;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get providerOptionsName(): string {\n return 'kimiCode';\n }\n\n /**\n * Get the inferred or configured capabilities for this model.\n */\n get capabilities(): KimiCodeCapabilities {\n const inferred = inferKimiCodeCapabilities(this.modelId);\n return {\n ...inferred,\n ...this.settings.capabilities\n };\n }\n\n get supportedUrls() {\n const patterns: Record<string, RegExp[]> = {\n 'image/*': [/^https?:\\/\\/.*$/i]\n };\n return this.settings.supportedUrls ?? this.config.supportedUrls ?? patterns;\n }\n\n /**\n * Build request arguments.\n */\n private async getArgs(options: LanguageModelV3CallOptions) {\n const { prompt, maxOutputTokens, temperature, topP, topK, stopSequences, tools, toolChoice, providerOptions } =\n options;\n\n const warnings: SharedV3Warning[] = [];\n\n // Parse provider options\n const kimiCodeOptions = await parseProviderOptions({\n provider: this.providerOptionsName,\n providerOptions,\n schema: kimiCodeProviderOptionsSchema\n });\n\n // Merge extended thinking config from settings and provider options\n const extendedThinking =\n normalizeExtendedThinkingConfig(kimiCodeOptions?.extendedThinking) ??\n normalizeExtendedThinkingConfig(this.settings.extendedThinking);\n\n // Warn about unsupported options\n if (topK != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'topK'\n });\n }\n\n // Convert prompt to Kimi Code format\n const { system, messages } = await convertToKimiCodePrompt(prompt);\n\n // Prepare tool choice\n let toolChoiceParam: { type: string; name?: string } | undefined;\n if (toolChoice != null) {\n switch (toolChoice.type) {\n case 'auto':\n toolChoiceParam = { type: 'auto' };\n break;\n case 'none':\n toolChoiceParam = { type: 'none' };\n break;\n case 'required':\n toolChoiceParam = { type: 'any' };\n break;\n case 'tool':\n toolChoiceParam = { type: 'tool', name: toolChoice.toolName };\n break;\n }\n }\n\n // Filter to only function tools\n const functionTools = tools?.filter((t): t is LanguageModelV3FunctionTool => t.type === 'function');\n\n // Build request body\n const body = removeUndefinedEntries({\n model: this.modelId,\n system: kimiCodeOptions?.system ?? system,\n messages,\n max_tokens: maxOutputTokens ?? this.capabilities.maxOutputTokens ?? 32768,\n temperature,\n top_p: topP,\n stop_sequences: kimiCodeOptions?.stopSequences ?? stopSequences,\n tools: convertTools(functionTools),\n tool_choice: toolChoiceParam,\n // Extended thinking parameters\n ...(extendedThinking?.enabled && {\n thinking: {\n type: 'enabled',\n budget_tokens: extendedThinking.budgetTokens ?? effortToBudgetTokens(extendedThinking.effort ?? 'medium')\n }\n })\n });\n\n const requestHeaders: Record<string, string | undefined> = {\n ...(options.headers ?? {})\n };\n\n return {\n body,\n warnings,\n requestHeaders\n };\n }\n\n async doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult> {\n const { body, warnings, requestHeaders } = await this.getArgs(options);\n\n const {\n responseHeaders,\n value: rawResponse,\n rawValue\n } = await postJsonToApi({\n url: `${this.config.baseURL}/messages`,\n headers: combineHeaders(this.config.headers(), requestHeaders, options.headers),\n body,\n failedResponseHandler: kimiCodeFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(kimiCodeResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n\n // Parse and validate response\n const response = rawResponse as KimiCodeResponse;\n\n // Extract content from response\n const content: Array<LanguageModelV3Content> = [];\n\n for (const block of response.content) {\n switch (block.type) {\n case 'text':\n content.push({ type: 'text', text: block.text });\n break;\n\n case 'thinking':\n content.push({\n type: 'reasoning',\n text: block.thinking\n });\n break;\n\n case 'tool_use':\n content.push({\n type: 'tool-call',\n toolCallId: block.id,\n toolName: block.name,\n input: JSON.stringify(block.input)\n });\n break;\n }\n }\n\n const providerMetadata: SharedV3ProviderMetadata = {\n [this.providerOptionsName]: {\n requestId: responseHeaders?.['x-request-id'] ?? undefined,\n modelId: response.model,\n stopReason: response.stop_reason,\n stopSequence: response.stop_sequence\n }\n };\n\n return {\n content,\n finishReason: mapStopReason(response.stop_reason),\n usage: convertUsage(response.usage),\n providerMetadata,\n request: { body },\n response: {\n id: response.id,\n modelId: response.model,\n headers: responseHeaders,\n body: rawValue\n },\n warnings\n };\n }\n\n async doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult> {\n const { body, warnings, requestHeaders } = await this.getArgs(options);\n\n const streamBody = {\n ...body,\n stream: true\n };\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/messages`,\n headers: combineHeaders(this.config.headers(), requestHeaders, options.headers),\n body: streamBody,\n failedResponseHandler: kimiCodeFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(kimiCodeStreamChunkSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n\n const providerOptionsName = this.providerOptionsName;\n const generateIdFn = this.generateIdFn;\n const capturedResponseHeaders = responseHeaders;\n\n // Track state across stream\n let currentBlockType: string | undefined;\n let currentToolCallId: string | undefined;\n let currentToolName: string | undefined;\n let accumulatedToolInput = '';\n let finishReason: LanguageModelV3FinishReason = { unified: 'other', raw: undefined };\n let usage: ReturnType<typeof convertUsage> | undefined;\n let responseId: string | undefined;\n let responseModel: string | undefined;\n let isActiveText = false;\n let isActiveReasoning = false;\n let hasToolCallFinished = false;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<ParseResult<KimiCodeStreamChunk>, LanguageModelV3StreamPart>({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n if (!chunk.success) {\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n const data = chunk.value;\n\n switch (data.type) {\n case 'message_start':\n if (data.message) {\n responseId = data.message.id;\n responseModel = data.message.model;\n if (data.message.usage) {\n usage = convertUsage(data.message.usage);\n }\n // Emit response metadata\n controller.enqueue({\n type: 'response-metadata',\n id: responseId,\n modelId: responseModel\n });\n }\n break;\n\n case 'content_block_start':\n if (data.content_block) {\n currentBlockType = data.content_block.type;\n if (data.content_block.type === 'tool_use') {\n currentToolCallId = data.content_block.id ?? generateIdFn();\n currentToolName = data.content_block.name;\n accumulatedToolInput = '';\n hasToolCallFinished = false;\n\n // Close any active text/reasoning blocks\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'text-0' });\n isActiveText = false;\n }\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n isActiveReasoning = false;\n }\n\n controller.enqueue({\n type: 'tool-input-start',\n id: currentToolCallId,\n toolName: currentToolName ?? ''\n });\n } else if (data.content_block.type === 'text') {\n if (!isActiveText) {\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n isActiveReasoning = false;\n }\n controller.enqueue({ type: 'text-start', id: 'text-0' });\n isActiveText = true;\n }\n } else if (data.content_block.type === 'thinking') {\n if (!isActiveReasoning) {\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'text-0' });\n isActiveText = false;\n }\n controller.enqueue({ type: 'reasoning-start', id: 'reasoning-0' });\n isActiveReasoning = true;\n }\n }\n }\n break;\n\n case 'content_block_delta':\n if (data.delta) {\n if (data.delta.type === 'text_delta' && data.delta.text) {\n if (!isActiveText) {\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n isActiveReasoning = false;\n }\n controller.enqueue({ type: 'text-start', id: 'text-0' });\n isActiveText = true;\n }\n controller.enqueue({\n type: 'text-delta',\n id: 'text-0',\n delta: data.delta.text\n });\n } else if (data.delta.type === 'thinking_delta' && data.delta.thinking) {\n if (!isActiveReasoning) {\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'text-0' });\n isActiveText = false;\n }\n controller.enqueue({ type: 'reasoning-start', id: 'reasoning-0' });\n isActiveReasoning = true;\n }\n controller.enqueue({\n type: 'reasoning-delta',\n id: 'reasoning-0',\n delta: data.delta.thinking\n });\n } else if (data.delta.type === 'input_json_delta' && data.delta.partial_json) {\n accumulatedToolInput += data.delta.partial_json;\n controller.enqueue({\n type: 'tool-input-delta',\n id: currentToolCallId ?? '',\n delta: data.delta.partial_json\n });\n }\n }\n break;\n\n case 'content_block_stop':\n if (currentBlockType === 'tool_use' && currentToolCallId && !hasToolCallFinished) {\n // Parse accumulated input\n controller.enqueue({ type: 'tool-input-end', id: currentToolCallId });\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId: currentToolCallId,\n toolName: currentToolName ?? '',\n input: accumulatedToolInput\n });\n hasToolCallFinished = true;\n } else if (currentBlockType === 'text' && isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'text-0' });\n isActiveText = false;\n } else if (currentBlockType === 'thinking' && isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n isActiveReasoning = false;\n }\n currentBlockType = undefined;\n currentToolCallId = undefined;\n currentToolName = undefined;\n accumulatedToolInput = '';\n break;\n\n case 'message_delta':\n if (data.delta?.stop_reason) {\n finishReason = mapStopReason(data.delta.stop_reason);\n }\n if (data.usage) {\n usage = convertUsage(data.usage);\n }\n break;\n\n case 'message_stop':\n // Close any remaining active blocks\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'text-0' });\n }\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: usage ?? convertUsage({}),\n providerMetadata: {\n [providerOptionsName]: {\n requestId: capturedResponseHeaders?.['x-request-id'] ?? undefined,\n modelId: responseModel\n }\n }\n });\n break;\n\n case 'error':\n controller.enqueue({\n type: 'error',\n error: new Error(\n (data as unknown as { error?: { message?: string } }).error?.message ?? 'Unknown streaming error'\n )\n });\n break;\n }\n }\n })\n ),\n request: { body: streamBody },\n response: {\n headers: responseHeaders\n }\n };\n }\n}\n","/**\n * Message conversion for Kimi Code API.\n * Converts AI SDK messages to Anthropic-compatible format used by Kimi Code.\n * @module\n */\n\nimport type { LanguageModelV3FilePart, LanguageModelV3Prompt } from '@ai-sdk/provider';\nimport { UnsupportedFunctionalityError } from '@ai-sdk/provider';\nimport { convertToBase64 } from '@ai-sdk/provider-utils';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Kimi Code message content part types.\n */\nexport type KimiCodeContentPart =\n | { type: 'text'; text: string }\n | { type: 'image'; source: { type: 'base64'; media_type: string; data: string } }\n | { type: 'image'; source: { type: 'url'; url: string } }\n | { type: 'tool_use'; id: string; name: string; input: Record<string, unknown> }\n | { type: 'tool_result'; tool_use_id: string; content: string | KimiCodeContentPart[]; is_error?: boolean };\n\n/**\n * Kimi Code message format (Anthropic-compatible).\n */\nexport interface KimiCodeMessage {\n role: 'user' | 'assistant';\n content: string | KimiCodeContentPart[];\n}\n\n/**\n * Kimi Code prompt structure.\n */\nexport interface KimiCodePrompt {\n system?: string;\n messages: KimiCodeMessage[];\n}\n\n// ============================================================================\n// Conversion Functions\n// ============================================================================\n\n/**\n * Convert AI SDK prompt to Kimi Code message format.\n *\n * @param prompt - AI SDK prompt\n * @returns Kimi Code formatted prompt with system and messages\n */\nexport async function convertToKimiCodePrompt(prompt: LanguageModelV3Prompt): Promise<KimiCodePrompt> {\n let systemMessage: string | undefined;\n const messages: KimiCodeMessage[] = [];\n\n for (const message of prompt) {\n switch (message.role) {\n case 'system': {\n // System messages have content as string in V3\n const systemText = typeof message.content === 'string' ? message.content : '';\n systemMessage = systemMessage ? `${systemMessage}\\n\\n${systemText}` : systemText;\n break;\n }\n\n case 'user': {\n const content: KimiCodeContentPart[] = [];\n\n for (const part of message.content) {\n switch (part.type) {\n case 'text':\n content.push({ type: 'text', text: part.text });\n break;\n\n case 'file':\n // Check if it's an image file\n if (part.mediaType?.startsWith('image/')) {\n content.push(await convertFilePart(part));\n } else {\n throw new UnsupportedFunctionalityError({\n functionality: `file type: ${part.mediaType}`\n });\n }\n break;\n\n default:\n throw new UnsupportedFunctionalityError({\n functionality: `user content part type: ${(part as { type: string }).type}`\n });\n }\n }\n\n messages.push({\n role: 'user',\n content: content.length === 1 && content[0].type === 'text' ? content[0].text : content\n });\n break;\n }\n\n case 'assistant': {\n const content: KimiCodeContentPart[] = [];\n\n for (const part of message.content) {\n switch (part.type) {\n case 'text':\n content.push({ type: 'text', text: part.text });\n break;\n\n case 'tool-call':\n content.push({\n type: 'tool_use',\n id: part.toolCallId,\n name: part.toolName,\n input: typeof part.input === 'string' ? JSON.parse(part.input) : (part.input as Record<string, unknown>)\n });\n break;\n\n case 'reasoning':\n // Include reasoning as text (Kimi Code handles thinking blocks)\n if (part.text) {\n content.push({ type: 'text', text: `<thinking>${part.text}</thinking>` });\n }\n break;\n\n default:\n throw new UnsupportedFunctionalityError({\n functionality: `assistant content part type: ${(part as { type: string }).type}`\n });\n }\n }\n\n if (content.length > 0) {\n messages.push({\n role: 'assistant',\n content: content.length === 1 && content[0].type === 'text' ? content[0].text : content\n });\n }\n break;\n }\n\n case 'tool': {\n // Tool results need to be part of a user message in Anthropic format\n const toolResults: KimiCodeContentPart[] = [];\n\n for (const part of message.content) {\n if (part.type === 'tool-result') {\n toolResults.push(convertToolResultPart(part));\n }\n }\n\n // If the last message is from the assistant, add tool results as user message\n if (messages.length > 0 && messages[messages.length - 1].role === 'assistant') {\n messages.push({\n role: 'user',\n content: toolResults\n });\n } else {\n // Merge with existing user message or create new one\n const lastMessage = messages[messages.length - 1];\n if (lastMessage?.role === 'user' && Array.isArray(lastMessage.content)) {\n lastMessage.content.push(...toolResults);\n } else {\n messages.push({\n role: 'user',\n content: toolResults\n });\n }\n }\n break;\n }\n\n default:\n throw new UnsupportedFunctionalityError({\n functionality: `message role: ${(message as { role: string }).role}`\n });\n }\n }\n\n return {\n system: systemMessage,\n messages\n };\n}\n\n/**\n * Convert a file part to Kimi Code format.\n */\nasync function convertFilePart(part: LanguageModelV3FilePart): Promise<KimiCodeContentPart> {\n const mediaType = part.mediaType ?? 'image/png';\n\n // Handle URL data\n if (part.data instanceof URL) {\n return {\n type: 'image',\n source: {\n type: 'url',\n url: part.data.toString()\n }\n };\n }\n\n // Handle string data\n if (typeof part.data === 'string') {\n // Check if it's a URL string\n if (part.data.startsWith('http://') || part.data.startsWith('https://')) {\n return {\n type: 'image',\n source: {\n type: 'url',\n url: part.data\n }\n };\n }\n\n // Check if it's a data URL\n if (part.data.startsWith('data:')) {\n const [header, data] = part.data.split(',');\n const extractedMimeType = header.match(/data:([^;]+)/)?.[1] ?? mediaType;\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: extractedMimeType,\n data\n }\n };\n }\n\n // Assume it's base64 encoded\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: mediaType,\n data: part.data\n }\n };\n }\n\n // Handle Uint8Array - convert to base64\n const base64 = convertToBase64(part.data);\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: mediaType,\n data: base64\n }\n };\n}\n\n/**\n * Tool result output type from LanguageModelV3.\n */\ninterface ToolResultOutput {\n type: 'text' | 'error-text' | 'json' | 'error-json' | 'content' | 'execution-denied';\n value?: unknown;\n reason?: string;\n}\n\n/**\n * Convert a tool result part to Kimi Code format.\n */\nfunction convertToolResultPart(part: {\n type: 'tool-result';\n toolCallId: string;\n toolName: string;\n output: ToolResultOutput;\n}): KimiCodeContentPart {\n // Handle different output types based on the discriminated union\n const output = part.output;\n let content: string;\n let isError = false;\n\n switch (output.type) {\n case 'text':\n content = String(output.value ?? '');\n break;\n case 'error-text':\n content = String(output.value ?? '');\n isError = true;\n break;\n case 'execution-denied':\n content = output.reason ?? 'Tool execution denied.';\n isError = true;\n break;\n case 'json':\n case 'content':\n content = JSON.stringify(output.value);\n break;\n case 'error-json':\n content = JSON.stringify(output.value);\n isError = true;\n break;\n default:\n content = JSON.stringify(output);\n }\n\n return {\n type: 'tool_result',\n tool_use_id: part.toolCallId,\n content,\n is_error: isError || undefined\n };\n}\n","/**\n * Settings for the Kimi Code provider.\n *\n * @remarks\n * Kimi Code is compatible with Claude Code and Roo Code agents.\n * Default settings are based on Roo Code documentation:\n * - Max Output Tokens: 32768\n * - Context Window Size: 262144\n * - Reasoning Effort: Medium\n *\n * @see https://www.kimi.com/code/docs/en/more/third-party-agents.html\n * @module\n */\n\nimport type { ExtendedThinkingConfig, KimiCodeCapabilities, ReasoningEffort } from './kimi-code-types';\nimport { z } from 'zod/v4';\n\n// ============================================================================\n// Settings Interface\n// ============================================================================\n\n/**\n * Settings for creating a Kimi Code model instance.\n */\nexport interface KimiCodeSettings {\n /**\n * Override inferred model capabilities.\n */\n capabilities?: KimiCodeCapabilities;\n\n /**\n * Extended thinking/reasoning configuration.\n * When enabled, the model will show its reasoning process.\n *\n * @example\n * ```ts\n * const model = kimiCode('kimi-for-coding', {\n * extendedThinking: {\n * enabled: true,\n * effort: 'high'\n * }\n * });\n * ```\n */\n extendedThinking?: ExtendedThinkingConfig | boolean;\n\n /**\n * Whether to include usage in streaming responses.\n */\n includeUsageInStream?: boolean;\n\n /**\n * Override supported URL patterns.\n */\n supportedUrls?: Record<string, RegExp[]>;\n}\n\n// ============================================================================\n// Provider Options Schema\n// ============================================================================\n\n/**\n * Schema for Kimi Code provider options passed via providerOptions.\n */\nexport const kimiCodeProviderOptionsSchema = z.object({\n /**\n * Extended thinking configuration.\n */\n extendedThinking: z\n .union([\n z.boolean(),\n z.object({\n enabled: z.boolean().optional(),\n effort: z.enum(['low', 'medium', 'high']).optional(),\n budgetTokens: z.number().optional()\n })\n ])\n .optional(),\n\n /**\n * System prompt to prepend.\n */\n system: z.string().optional(),\n\n /**\n * Custom stop sequences.\n */\n stopSequences: z.array(z.string()).optional()\n});\n\n/**\n * Inferred type from the provider options schema.\n */\nexport type KimiCodeProviderOptions = z.infer<typeof kimiCodeProviderOptionsSchema>;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Normalize extended thinking config to a consistent format.\n *\n * @param config - Boolean or config object\n * @returns Normalized config object\n */\nexport function normalizeExtendedThinkingConfig(\n config: ExtendedThinkingConfig | boolean | undefined\n): ExtendedThinkingConfig | undefined {\n if (config === undefined) {\n return undefined;\n }\n\n if (typeof config === 'boolean') {\n return config ? { enabled: true, effort: 'medium' } : { enabled: false };\n }\n\n return {\n enabled: config.enabled ?? true,\n effort: config.effort ?? 'medium',\n budgetTokens: config.budgetTokens\n };\n}\n\n/**\n * Convert reasoning effort to budget tokens.\n *\n * @param effort - Reasoning effort level\n * @returns Approximate budget tokens for the effort level\n */\nexport function effortToBudgetTokens(effort: ReasoningEffort): number {\n switch (effort) {\n case 'low':\n return 2048;\n case 'medium':\n return 8192;\n case 'high':\n return 16384;\n default:\n return 8192;\n }\n}\n\n// ============================================================================\n// Anthropic API Conversion Helpers\n// ============================================================================\n\n/**\n * Convert ExtendedThinkingConfig to Anthropic API thinking parameter format.\n *\n * @remarks\n * This converts our config to the Anthropic API format expected by Kimi Code:\n * - `{ type: 'enabled', budget_tokens: number }` when enabled\n * - `{ type: 'disabled' }` when disabled\n * - `undefined` when not configured\n *\n * @param config - Extended thinking configuration (boolean or object)\n * @returns Anthropic-compatible thinking parameter or undefined\n *\n * @example\n * ```ts\n * // From boolean\n * toAnthropicThinking(true)\n * // => { type: 'enabled', budget_tokens: 8192 }\n *\n * // From config object\n * toAnthropicThinking({ enabled: true, effort: 'high' })\n * // => { type: 'enabled', budget_tokens: 16384 }\n *\n * // With explicit budget\n * toAnthropicThinking({ enabled: true, budgetTokens: 10000 })\n * // => { type: 'enabled', budget_tokens: 10000 }\n * ```\n */\nexport function toAnthropicThinking(\n config: ExtendedThinkingConfig | boolean | undefined\n): { type: 'enabled'; budget_tokens: number } | { type: 'disabled' } | undefined {\n const normalized = normalizeExtendedThinkingConfig(config);\n\n if (normalized === undefined) {\n return undefined;\n }\n\n if (!normalized.enabled) {\n return { type: 'disabled' };\n }\n\n const budgetTokens = normalized.budgetTokens ?? effortToBudgetTokens(normalized.effort ?? 'medium');\n\n return {\n type: 'enabled',\n budget_tokens: budgetTokens\n };\n}\n","/**\n * Types for the Kimi Code provider.\n *\n * Kimi Code is a premium coding service within the Kimi ecosystem that provides:\n * - High-speed output (up to 100 tokens/s)\n * - Extended thinking/reasoning support\n * - Full compatibility with Claude Code and Roo Code\n * - Anthropic-compatible API format\n *\n * @see https://www.kimi.com/code/docs/en/\n * @module\n */\n\nimport type { LanguageModelV3 } from '@ai-sdk/provider';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default Kimi Code API endpoint (Anthropic-compatible).\n * Used with Claude Code - set as ANTHROPIC_BASE_URL\n */\nexport const KIMI_CODE_BASE_URL = 'https://api.kimi.com/coding/v1';\n\n/**\n * OpenAI-compatible API endpoint.\n * Used with Roo Code - set as OpenAI Compatible entrypoint\n */\nexport const KIMI_CODE_OPENAI_BASE_URL = 'https://api.kimi.com/coding/v1';\n\n/**\n * Default Kimi Code model ID.\n * Primary coding model optimized for development tasks.\n */\nexport const KIMI_CODE_DEFAULT_MODEL = 'kimi-for-coding';\n\n/**\n * Alternative model with enhanced thinking/reasoning.\n * Can be toggled with Tab key in Claude Code.\n */\nexport const KIMI_CODE_THINKING_MODEL = 'kimi-k2-thinking';\n\n/**\n * All available Kimi Code models.\n */\nexport const KIMI_CODE_MODELS = [KIMI_CODE_DEFAULT_MODEL, KIMI_CODE_THINKING_MODEL] as const;\n\n/**\n * Default max output tokens for Kimi Code (per Roo Code docs).\n */\nexport const KIMI_CODE_DEFAULT_MAX_TOKENS = 32768;\n\n/**\n * Default context window size (per Roo Code docs).\n */\nexport const KIMI_CODE_DEFAULT_CONTEXT_WINDOW = 262144;\n\n/**\n * Anthropic API version header value.\n */\nexport const KIMI_CODE_ANTHROPIC_VERSION = '2023-06-01';\n\n// ============================================================================\n// Model IDs\n// ============================================================================\n\n/**\n * Available Kimi Code model IDs.\n *\n * @remarks\n * - `kimi-for-coding` - Primary coding model optimized for development tasks\n * - `kimi-k2-thinking` - Model with extended thinking for complex reasoning (toggle with Tab in Claude Code)\n *\n * @example\n * ```ts\n * // Default model\n * const model = kimiCode('kimi-for-coding');\n *\n * // Thinking model\n * const thinkingModel = kimiCode('kimi-k2-thinking');\n * ```\n */\nexport type KimiCodeModelId = 'kimi-for-coding' | 'kimi-k2-thinking' | (string & {});\n\n// ============================================================================\n// Model Capabilities\n// ============================================================================\n\n/**\n * Capabilities specific to Kimi Code models.\n * Based on Roo Code configuration documentation.\n */\nexport interface KimiCodeCapabilities {\n /**\n * Whether the model supports extended thinking/reasoning.\n * When enabled, use `thinking.type: 'enabled'` with `budget_tokens`.\n */\n extendedThinking?: boolean;\n\n /**\n * Maximum output tokens.\n * Default: 32768 (per Roo Code docs)\n */\n maxOutputTokens?: number;\n\n /**\n * Maximum context window size.\n * Default: 262144 (per Roo Code docs)\n */\n maxContextSize?: number;\n\n /**\n * Whether the model supports streaming.\n * Always true for Kimi Code.\n */\n streaming?: boolean;\n\n /**\n * Whether the model supports tool/function calling.\n * Always true for Kimi Code.\n */\n toolCalling?: boolean;\n\n /**\n * Whether the model supports image inputs.\n */\n imageInput?: boolean;\n}\n\n/**\n * Infer model capabilities from the model ID.\n *\n * @param modelId - The model identifier\n * @returns Inferred capabilities based on model name patterns\n *\n * @example\n * ```ts\n * const caps = inferKimiCodeCapabilities('kimi-k2-thinking');\n * // caps.extendedThinking === true\n * ```\n */\nexport function inferKimiCodeCapabilities(modelId: string): KimiCodeCapabilities {\n const isThinkingModel = modelId.includes('-thinking') || modelId.includes('k2-thinking');\n\n return {\n extendedThinking: isThinkingModel,\n maxOutputTokens: KIMI_CODE_DEFAULT_MAX_TOKENS,\n maxContextSize: KIMI_CODE_DEFAULT_CONTEXT_WINDOW,\n streaming: true,\n toolCalling: true,\n imageInput: true\n };\n}\n\n// ============================================================================\n// Provider Configuration\n// ============================================================================\n\n/**\n * Configuration for the Kimi Code language model.\n * @internal\n */\nexport interface KimiCodeConfig {\n /**\n * Provider identifier.\n */\n provider: string;\n\n /**\n * Base URL for the API.\n */\n baseURL: string;\n\n /**\n * Function to get headers for requests.\n */\n headers: () => Record<string, string | undefined>;\n\n /**\n * Custom fetch implementation.\n */\n fetch?: typeof globalThis.fetch;\n\n /**\n * ID generator for tool call fallback IDs.\n */\n generateId?: () => string;\n\n /**\n * Whether to include usage in streaming responses.\n */\n includeUsageInStream?: boolean;\n\n /**\n * Override supported URL patterns.\n */\n supportedUrls?: LanguageModelV3['supportedUrls'];\n}\n\n// ============================================================================\n// Extended Thinking Configuration\n// ============================================================================\n\n/**\n * Reasoning effort levels for extended thinking.\n * Maps to budget_tokens for the thinking parameter.\n *\n * Per Roo Code docs: Enable Reasoning Effort: Medium\n */\nexport type ReasoningEffort = 'low' | 'medium' | 'high';\n\n/**\n * Configuration for extended thinking/reasoning.\n * Compatible with Anthropic's thinking parameter format.\n *\n * @example\n * ```ts\n * // Enable thinking with medium effort\n * const config: ExtendedThinkingConfig = {\n * enabled: true,\n * effort: 'medium'\n * };\n *\n * // Or specify exact budget tokens\n * const config: ExtendedThinkingConfig = {\n * enabled: true,\n * budgetTokens: 10000\n * };\n * ```\n */\nexport interface ExtendedThinkingConfig {\n /**\n * Enable extended thinking mode.\n * @default false\n */\n enabled?: boolean;\n\n /**\n * Reasoning effort level.\n * Controls how much computation is spent on reasoning.\n * - low: ~2048 tokens\n * - medium: ~8192 tokens (default, recommended by Roo Code)\n * - high: ~16384 tokens\n * @default 'medium'\n */\n effort?: ReasoningEffort;\n\n /**\n * Budget tokens for thinking (alternative to effort).\n * Higher values allow for more complex reasoning.\n * Takes precedence over effort if both are specified.\n */\n budgetTokens?: number;\n}\n\n// ============================================================================\n// API Response Types (Anthropic-compatible)\n// ============================================================================\n\n/**\n * Token usage from Kimi Code API.\n * Follows Anthropic's usage format.\n */\nexport interface KimiCodeTokenUsage {\n input_tokens?: number | null;\n output_tokens?: number | null;\n cache_read_input_tokens?: number | null;\n cache_creation_input_tokens?: number | null;\n}\n\n/**\n * Response metadata from Kimi Code API.\n * Follows Anthropic's message format.\n */\nexport interface KimiCodeResponseMetadata {\n id?: string | null;\n model?: string | null;\n type?: string | null;\n stop_reason?: string | null;\n stop_sequence?: string | null;\n}\n\n/**\n * Thinking block in response (for extended thinking).\n * Appears when thinking is enabled.\n */\nexport interface KimiCodeThinkingBlock {\n type: 'thinking';\n thinking: string;\n}\n\n/**\n * Text block in response.\n */\nexport interface KimiCodeTextBlock {\n type: 'text';\n text: string;\n}\n\n/**\n * Tool use block in response.\n * Follows Anthropic's tool_use format.\n */\nexport interface KimiCodeToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\n/**\n * Content block types in Kimi Code responses.\n */\nexport type KimiCodeContentBlock = KimiCodeThinkingBlock | KimiCodeTextBlock | KimiCodeToolUseBlock;\n\n// ============================================================================\n// Streaming Event Types (Anthropic SSE format)\n// ============================================================================\n\n/**\n * Streaming event types from Kimi Code API.\n * Follows Anthropic's SSE format.\n *\n * Event sequence:\n * 1. message_start - Contains message metadata and initial usage\n * 2. content_block_start - Start of a content block (text, thinking, tool_use)\n * 3. content_block_delta - Incremental content updates\n * 4. content_block_stop - End of a content block\n * 5. message_delta - Final message updates (stop_reason, usage)\n * 6. message_stop - End of message\n *\n * @see https://docs.anthropic.com/claude/reference/streaming\n */\nexport type KimiCodeStreamEventType =\n | 'message_start'\n | 'content_block_start'\n | 'content_block_delta'\n | 'content_block_stop'\n | 'message_delta'\n | 'message_stop'\n | 'ping'\n | 'error';\n\n/**\n * Delta types for content_block_delta events.\n */\nexport type KimiCodeDeltaType = 'text_delta' | 'thinking_delta' | 'input_json_delta';\n\n/**\n * Stop reasons from Kimi Code API.\n * Follows Anthropic's stop_reason format.\n */\nexport type KimiCodeStopReason = 'end_turn' | 'max_tokens' | 'stop_sequence' | 'tool_use' | null;\n","/**\n * Kimi Code provider factory.\n * @module\n */\n\nimport type { KimiCodeSettings } from './kimi-code-settings';\nimport { type LanguageModelV3, NoSuchModelError, type ProviderV3 } from '@ai-sdk/provider';\nimport {\n type FetchFunction,\n loadOptionalSetting,\n withUserAgentSuffix,\n withoutTrailingSlash\n} from '@ai-sdk/provider-utils';\nimport { VERSION } from '../version';\nimport { KimiCodeLanguageModel } from './kimi-code-language-model';\nimport { KIMI_CODE_BASE_URL, KIMI_CODE_DEFAULT_MODEL, type KimiCodeModelId } from './kimi-code-types';\n\n// ============================================================================\n// Provider Settings\n// ============================================================================\n\n/**\n * Settings for creating a Kimi Code provider instance.\n */\nexport interface KimiCodeProviderSettings {\n /**\n * Kimi Code API key. Defaults to the KIMI_CODE_API_KEY or KIMI_API_KEY environment variable.\n */\n apiKey?: string;\n\n /**\n * Base URL override. Defaults to https://api.kimi.com/coding/v1\n */\n baseURL?: string;\n\n /**\n * Default headers for all requests.\n */\n headers?: Record<string, string | undefined>;\n\n /**\n * Custom fetch implementation.\n */\n fetch?: FetchFunction;\n\n /**\n * ID generator for tool call fallback IDs.\n */\n generateId?: () => string;\n\n /**\n * Include usage details in streaming responses.\n */\n includeUsageInStream?: boolean;\n\n /**\n * Override supported URL patterns for file parts.\n */\n supportedUrls?: LanguageModelV3['supportedUrls'];\n}\n\n// ============================================================================\n// Provider Interface\n// ============================================================================\n\n/**\n * The Kimi Code provider interface.\n */\nexport interface KimiCodeProvider extends Omit<ProviderV3, 'specificationVersion'> {\n specificationVersion: 'v3';\n\n /**\n * Creates a Kimi Code language model.\n * @param modelId - The model identifier (defaults to 'kimi-for-coding')\n * @param settings - Optional model settings\n */\n (modelId?: KimiCodeModelId, settings?: KimiCodeSettings): LanguageModelV3;\n\n /**\n * Creates a Kimi Code language model.\n * @param modelId - The model identifier\n * @param settings - Optional model settings\n */\n languageModel(modelId: KimiCodeModelId, settings?: KimiCodeSettings): LanguageModelV3;\n\n /**\n * Creates a Kimi Code language model (alias for languageModel).\n * @param modelId - The model identifier\n * @param settings - Optional model settings\n */\n chat(modelId: KimiCodeModelId, settings?: KimiCodeSettings): LanguageModelV3;\n}\n\n// ============================================================================\n// Provider Factory\n// ============================================================================\n\n/**\n * Create a Kimi Code provider instance.\n *\n * @param options - Provider settings\n * @returns A configured Kimi Code provider\n *\n * @example\n * ```ts\n * import { createKimiCode } from 'ai-sdk-provider-kimi';\n *\n * const kimiCode = createKimiCode({\n * apiKey: process.env.KIMI_CODE_API_KEY,\n * });\n *\n * const result = await generateText({\n * model: kimiCode(), // Uses default 'kimi-for-coding' model\n * prompt: 'Write a TypeScript function to merge two sorted arrays',\n * });\n * ```\n *\n * @example\n * ```ts\n * // With extended thinking enabled\n * const result = await generateText({\n * model: kimiCode('kimi-for-coding', {\n * extendedThinking: {\n * enabled: true,\n * effort: 'high'\n * }\n * }),\n * prompt: 'Design a distributed cache system',\n * });\n * ```\n *\n * @example\n * ```ts\n * // Using with Claude Code compatible settings\n * const result = await generateText({\n * model: kimiCode('kimi-k2-thinking'),\n * prompt: 'Explain and fix this bug',\n * });\n * ```\n */\nexport function createKimiCode(options: KimiCodeProviderSettings = {}): KimiCodeProvider {\n const resolvedBaseURL =\n loadOptionalSetting({\n settingValue: options.baseURL,\n environmentVariableName: 'KIMI_CODE_BASE_URL'\n }) ?? KIMI_CODE_BASE_URL;\n\n const baseURL = withoutTrailingSlash(resolvedBaseURL) ?? KIMI_CODE_BASE_URL;\n\n const getHeaders = () => {\n // Try KIMI_CODE_API_KEY first, fall back to KIMI_API_KEY\n let apiKey = options.apiKey;\n if (!apiKey) {\n apiKey = process.env.KIMI_CODE_API_KEY ?? process.env.KIMI_API_KEY;\n }\n if (!apiKey) {\n throw new Error(\n 'Kimi Code API key is required. Set the KIMI_CODE_API_KEY or KIMI_API_KEY environment variable, or pass the apiKey option.'\n );\n }\n\n return withUserAgentSuffix(\n {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n ...options.headers\n },\n `ai-sdk/kimi-code/${VERSION}`\n );\n };\n\n const createCodeModel = (modelId: KimiCodeModelId = KIMI_CODE_DEFAULT_MODEL, settings: KimiCodeSettings = {}) =>\n new KimiCodeLanguageModel(modelId, settings, {\n provider: 'kimi.code',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n generateId: options.generateId,\n includeUsageInStream: settings.includeUsageInStream ?? options.includeUsageInStream,\n supportedUrls: settings.supportedUrls ?? options.supportedUrls\n });\n\n const provider: KimiCodeProvider = (\n modelId: KimiCodeModelId = KIMI_CODE_DEFAULT_MODEL,\n settings?: KimiCodeSettings\n ): KimiCodeLanguageModel => {\n if (new.target) {\n throw new Error('The Kimi Code provider function cannot be called with new.');\n }\n\n return createCodeModel(modelId, settings);\n };\n\n provider.specificationVersion = 'v3';\n provider.languageModel = createCodeModel;\n provider.chat = createCodeModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n provider.rerankingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'rerankingModel' });\n };\n\n return provider;\n}\n\n/**\n * Default Kimi Code provider instance.\n *\n * Uses the KIMI_CODE_API_KEY or KIMI_API_KEY environment variable for authentication.\n *\n * @example\n * ```ts\n * import { kimiCode } from 'ai-sdk-provider-kimi';\n *\n * const result = await generateText({\n * model: kimiCode(), // Uses default model\n * prompt: 'Implement a binary search tree',\n * });\n * ```\n *\n * @example\n * ```ts\n * // With extended thinking\n * const result = await generateText({\n * model: kimiCode('kimi-for-coding', { extendedThinking: true }),\n * prompt: 'Design a microservices architecture',\n * });\n * ```\n */\nexport const kimiCode = createKimiCode();\n"],"mappings":";AAKA,SAA+B,wBAAyC;AACxE;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACPP;AAAA,EACE;AAAA,OAWK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,KAAAA,UAAS;;;ACxBlB,SAAS,sCAAsC;AAC/C,SAAS,SAAS;AAUX,IAAM,kBAAkB,EAAE,MAAM;AAAA,EACrC,EAAE,OAAO;AAAA,IACP,OAAO,EAAE,OAAO;AAAA,MACd,SAAS,EAAE,OAAO;AAAA,MAClB,MAAM,EAAE,OAAO,EAAE,QAAQ;AAAA,MACzB,OAAO,EAAE,IAAI,EAAE,QAAQ;AAAA,MACvB,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ;AAAA,MAChD,YAAY,EAAE,OAAO,EAAE,QAAQ;AAAA,IACjC,CAAC;AAAA,EACH,CAAC;AAAA,EACD,EAAE,OAAO;AAAA,IACP,SAAS,EAAE,OAAO;AAAA,EACpB,CAAC;AACH,CAAC;AAeM,IAAM,4BAA4B,+BAA+B;AAAA,EACtE,aAAa;AAAA,EACb,gBAAgB,CAAC,UAAyB;AACxC,QAAI,WAAW,OAAO;AACpB,aAAO,MAAM,MAAM;AAAA,IACrB;AACA,WAAO,MAAM;AAAA,EACf;AAAA,EACA,aAAa,CAAC,aACZ,SAAS,WAAW,OAAO,SAAS,WAAW,OAAO,SAAS,WAAW,OAAO,SAAS,UAAU;AACxG,CAAC;AASM,IAAM,YAAN,cAAwB,MAAM;AAAA,EAInC,YAAY,SAAiB,MAAc,YAAqB;AAC9D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACpB;AACF;AAKO,IAAM,0BAAN,cAAsC,UAAU;AAAA,EACrD,YAAY,UAAkB,4CAA4C;AACxE,UAAM,SAAS,wBAAwB,GAAG;AAC1C,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,qBAAN,cAAiC,UAAU;AAAA,EAGhD,YAAY,UAAkB,uBAAuB,YAAqB;AACxE,UAAM,SAAS,oBAAoB,GAAG;AACtC,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACpB;AACF;AAKO,IAAM,sBAAN,cAAkC,UAAU;AAAA,EACjD,YAAY,SAAiB,OAAgB;AAC3C,UAAM,QAAQ,GAAG,OAAO,YAAY,KAAK,MAAM,SAAS,oBAAoB,GAAG;AAC/E,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,yBAAN,cAAqC,UAAU;AAAA,EAGpD,YAAY,SAAiB;AAC3B,UAAM,UAAU,OAAO,eAAe,mBAAmB,GAAG;AAC5D,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACjB;AACF;AAKO,IAAM,yBAAN,cAAqC,UAAU;AAAA,EACpD,YAAY,UAAkB,gDAAgD;AAC5E,UAAM,SAAS,kBAAkB,GAAG;AACpC,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,yBAAN,cAAqC,UAAU;AAAA,EACpD,YAAY,UAAkB,2BAA2B;AACvD,UAAM,SAAS,2BAA2B,GAAG;AAC7C,SAAK,OAAO;AAAA,EACd;AACF;;;ACrDO,SAAS,uBAAuB,SAAwC;AAC7E,QAAM,kBAAkB,QAAQ,SAAS,WAAW;AACpD,QAAM,aAAa,QAAQ,SAAS,MAAM,KAAK,QAAQ,SAAS,MAAM;AAEtE,SAAO;AAAA,IACL,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA;AAAA,IACZ,YAAY;AAAA;AAAA,IACZ,gBAAgB;AAAA;AAAA,IAChB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,mBAAmB;AAAA,EACrB;AACF;;;AClFO,SAAS,oBAAoB,cAAiF;AACnH,UAAQ,cAAc;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AA6BO,SAAS,iBACd,OACA,iBACA,uBACmB;AACnB,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,MACL,aAAa;AAAA,QACX,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW;AAAA,QACX,YAAY;AAAA,MACd;AAAA,MACA,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,MAAM;AAAA,QACN,WAAW;AAAA,MACb;AAAA,MACA,KAAK;AAAA,MACL,GAAI,mBAAmB,OAAO,EAAE,gBAAgB,IAAI,CAAC;AAAA,MACrD,GAAI,yBAAyB,OAAO,EAAE,sBAAsB,IAAI,CAAC;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,eAAe,MAAM,iBAAiB;AAC5C,QAAM,mBAAmB,MAAM,qBAAqB;AACpD,QAAM,kBAAkB,MAAM,uBAAuB,iBAAiB;AACtE,QAAM,kBAAkB,MAAM,2BAA2B,oBAAoB;AAG7E,QAAM,WAAuB;AAAA,IAC3B,eAAe,MAAM,iBAAiB;AAAA,IACtC,mBAAmB,MAAM,qBAAqB;AAAA,IAC9C,cAAc,MAAM,gBAAgB;AAAA,IACpC,GAAI,MAAM,wBACN;AAAA,MACE,uBAAuB;AAAA,QACrB,eAAe,MAAM,sBAAsB,iBAAiB;AAAA,MAC9D;AAAA,IACF,IACA,CAAC;AAAA,IACL,GAAI,MAAM,4BACN;AAAA,MACE,2BAA2B;AAAA,QACzB,kBAAkB,MAAM,0BAA0B,oBAAoB;AAAA,MACxE;AAAA,IACF,IACA,CAAC;AAAA,EACP;AAEA,SAAO;AAAA,IACL,aAAa;AAAA,MACX,OAAO;AAAA,MACP,SAAS,eAAe;AAAA,MACxB,WAAW;AAAA,MACX,YAAY;AAAA,IACd;AAAA,IACA,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,MAAM,mBAAmB;AAAA,MACzB,WAAW;AAAA,IACb;AAAA,IACA,KAAK;AAAA,IACL,GAAI,mBAAmB,OAAO,EAAE,gBAAgB,IAAI,CAAC;AAAA,IACrD,GAAI,yBAAyB,OAAO,EAAE,sBAAsB,IAAI,CAAC;AAAA,EACnE;AACF;AAYO,SAAS,oBAAoB,UAAgC;AAClE,SAAO;AAAA,IACL,IAAI,SAAS,MAAM;AAAA,IACnB,SAAS,SAAS,SAAS;AAAA,IAC3B,WAAW,SAAS,WAAW,OAAO,IAAI,KAAK,SAAS,UAAU,GAAI,IAAI;AAAA,EAC5E;AACF;AAQO,SAAS,iBAAiB,SAAsD;AACrF,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,OAAO,YAAY,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,YAAY,GAAG,KAAK,CAAC,CAAC;AAEjH,SAAO,aAAa,cAAc,KAAK,aAAa,YAAY,KAAK,aAAa,uBAAuB;AAC3G;AAYO,SAAS,sBAAsB,SAIE;AACtC,MAAI,OAAO;AACX,MAAI,YAAY;AAEhB,MAAI,OAAO,QAAQ,YAAY,UAAU;AACvC,WAAO,QAAQ;AAAA,EACjB,WAAW,MAAM,QAAQ,QAAQ,OAAO,GAAG;AACzC,eAAW,QAAQ,QAAQ,SAAS;AAClC,UAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,cAAM,YAAY;AAClB,YAAI,UAAU,SAAS,UAAU,OAAO,UAAU,SAAS,UAAU;AACnE,kBAAQ,UAAU;AAAA,QACpB;AACA,YAAI,UAAU,SAAS,cAAc,OAAO,UAAU,aAAa,UAAU;AAC3E,uBAAa,UAAU;AAAA,QACzB;AACA,YAAI,UAAU,SAAS,eAAe,OAAO,UAAU,SAAS,UAAU;AACxE,uBAAa,UAAU;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ,sBAAsB,UAAU;AACjD,iBAAa,QAAQ;AAAA,EACvB;AAEA,MAAI,OAAO,QAAQ,cAAc,UAAU;AACzC,iBAAa,QAAQ;AAAA,EACvB;AAEA,SAAO,EAAE,MAAM,UAAU;AAC3B;;;AC/LO,IAAM,4BAA4B;AAMlC,IAAM,kCAAkC;AA2FxC,SAAS,oBAAoB,QAA+C;AACjF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM;AAAA,MACN,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC7B;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,QAA+C;AACrF,SAAO,oBAAoB,MAAM;AACnC;AAoCO,SAAS,0BAA0B,QAAqD;AAC7F,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM;AAAA,MACN,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC7B;AAAA,EACF;AACF;AAaO,SAAS,kBAAkB,UAA2B;AAC3D,SAAO,SAAS,WAAW,GAAG;AAChC;AA8BO,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBvB,WAAW,CAAC,WAAiC;AAC3C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,MAAM,oBAAoB,MAAM;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,iBAAiB,CAAC,WAAuC;AACvD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,MAAM,0BAA0B,MAAM;AAAA,IACxC;AAAA,EACF;AACF;;;ACzQA;AAAA,EAIE;AAAA,OACK;AA2GA,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB;AACvB,GAA4C;AAC1C,UAAQ,OAAO,SAAS,QAAQ;AAEhC,QAAM,eAAkC,CAAC;AACzC,QAAMC,aAAwB,CAAC;AAG/B,MAAI,WAAW;AACb,UAAM,SAAS,OAAO,cAAc,YAAY,SAAY,UAAU;AACtE,IAAAA,WAAU,KAAK,oBAAoB,MAAM,CAAC;AAAA,EAC5C;AAGA,MAAI,iBAAiB;AACnB,UAAM,SAAS,OAAO,oBAAoB,YAAY,SAAY,gBAAgB;AAClF,IAAAA,WAAU,KAAK,0BAA0B,MAAM,CAAC;AAAA,EAClD;AAGA,MAAI,SAAS,MAAM;AACjB,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,SAAS,YAAY;AAE5B,cAAM,cAAc,4BAA4B,IAAI;AACpD,YAAI,aAAa;AACf,UAAAA,WAAU,KAAK,WAAW;AAC1B;AAAA,QACF;AAEA,qBAAa,KAAK;AAAA,UAChB,MAAM;AAAA,UACN,SAAS,yBAAyB,KAAK,EAAE;AAAA,QAC3C,CAAC;AACD;AAAA,MACF;AAEA,MAAAA,WAAU,KAAK;AAAA,QACb,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,KAAK;AAAA,UACX,aAAa,KAAK;AAAA,UAClB,YAAY,KAAK;AAAA,UACjB,GAAI,KAAK,UAAU,OAAO,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,QACvD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAIA,WAAU,WAAW,GAAG;AAC1B,WAAO,EAAE,OAAO,QAAW,YAAY,QAAW,aAAa;AAAA,EACjE;AAGA,MAAI,cAAc,MAAM;AACtB,WAAO,EAAE,OAAOA,YAAW,YAAY,QAAW,aAAa;AAAA,EACjE;AAEA,UAAQ,WAAW,MAAM;AAAA,IACvB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,OAAOA,YAAW,YAAY,WAAW,MAAM,aAAa;AAAA,IAEvE,KAAK,YAAY;AACf,UAAI,oBAAoB;AAEtB,cAAM,YAAYA,WAAU,IAAI,CAAC,MAAO,EAAE,SAAS,aAAa,EAAE,SAAS,OAAO,EAAE,SAAS,IAAK,EAAE,KAAK,IAAI;AAC7G,cAAM,gBAAgB,4BAA4B,SAAS;AAE3D,qBAAa,KAAK;AAAA,UAChB,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,QACX,CAAC;AAED,eAAO;AAAA,UACL,OAAOA;AAAA,UACP,YAAY;AAAA,UACZ;AAAA,UACA,yBAAyB;AAAA,QAC3B;AAAA,MACF;AAEA,mBAAa,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AACD,aAAO,EAAE,OAAOA,YAAW,YAAY,QAAQ,aAAa;AAAA,IAC9D;AAAA,IAEA,KAAK,QAAQ;AACX,UAAI,oBAAoB;AAEtB,cAAM,gBAAgB,4BAA4B,WAAW,QAAQ;AAErE,qBAAa,KAAK;AAAA,UAChB,MAAM;AAAA,UACN,SAAS,mBAAmB,WAAW,QAAQ;AAAA,UAC/C,SAAS;AAAA,QACX,CAAC;AAED,eAAO;AAAA,UACL,OAAOA;AAAA,UACP,YAAY;AAAA,UACZ;AAAA,UACA,yBAAyB;AAAA,QAC3B;AAAA,MACF;AAEA,mBAAa,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,SAAS,mBAAmB,WAAW,QAAQ;AAAA,QAC/C,SAAS;AAAA,MACX,CAAC;AACD,aAAO,EAAE,OAAOA,YAAW,YAAY,QAAQ,aAAa;AAAA,IAC9D;AAAA,IAEA,SAAS;AACP,YAAM,mBAA0B;AAChC,YAAM,IAAI,8BAA8B;AAAA,QACtC,eAAe,qBAAqB,gBAAgB;AAAA,MACtD,CAAC;AAAA,IACH;AAAA,EACF;AACF;AASA,SAAS,4BAA4B,WAA2B;AAC9D,SAAO,mEAAmE,SAAS;AACrF;AAKA,SAAS,4BAA4B,UAA0B;AAC7D,SAAO,4CAA4C,QAAQ,6GAA6G,QAAQ;AAClL;AAUA,SAAS,4BAA4B,MAAgE;AAEnG,MAAI,CAAC,KAAK,GAAG,WAAW,OAAO,GAAG;AAChC,WAAO;AAAA,EACT;AAGA,QAAM,OAAO,KAAK;AAClB,MACE,QACA,OAAO,SAAS,YAChB,UAAU,QACV,KAAK,SAAS,sBACd,cAAc,QACd,OAAO,KAAK,aAAa,UACzB;AACA,UAAM,KAAK,KAAK;AAChB,QAAI,OAAO,GAAG,SAAS,UAAU;AAC/B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,GAAG;AAAA,UACT,GAAI,GAAG,SAAS,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC5SA;AAAA,EAGE,iCAAAC;AAAA,OACK;AACP,SAAS,uBAAuB;AAoDhC,IAAM,wBAAwB,CAAC,cAAc,aAAa,aAAa,cAAc,SAAS;AAE9F,IAAM,wBAAwB,CAAC,aAAa,cAAc,aAAa,SAAS;AAYzE,SAAS,0BAA0B,QAA+C;AACvF,QAAM,WAA2B,CAAC;AAElC,aAAW,EAAE,MAAM,QAAQ,KAAK,QAAQ;AACtC,YAAQ,MAAM;AAAA,MACZ,KAAK,UAAU;AACb,iBAAS,KAAK,EAAE,MAAM,UAAU,QAAQ,CAAC;AACzC;AAAA,MACF;AAAA,MACA,KAAK,QAAQ;AACX,YAAI,QAAQ,WAAW,KAAK,QAAQ,CAAC,EAAE,SAAS,QAAQ;AACtD,mBAAS,KAAK,EAAE,MAAM,QAAQ,SAAS,QAAQ,CAAC,EAAE,KAAK,CAAC;AACxD;AAAA,QACF;AAEA,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,QAAQ,IAAI,CAAC,SAAS;AAC7B,oBAAQ,KAAK,MAAM;AAAA,cACjB,KAAK;AACH,uBAAO,EAAE,MAAM,QAAiB,MAAM,KAAK,KAAK;AAAA,cAClD,KAAK,QAAQ;AAEX,oBAAI,iBAAiB,KAAK,SAAS,GAAG;AACpC,yBAAO,iBAAiB,IAAI;AAAA,gBAC9B;AAGA,oBAAI,iBAAiB,KAAK,SAAS,GAAG;AACpC,yBAAO,iBAAiB,IAAI;AAAA,gBAC9B;AAGA,oBAAI,KAAK,UAAU,WAAW,OAAO,GAAG;AACtC,wBAAM,OACJ,KAAK,gBAAgB,MACjB,KAAK,KAAK,SAAS,IACnB,OAAO,KAAK,SAAS,WACnB,KAAK,OACL,IAAI,YAAY,EAAE,OAAO,KAAK,IAAI;AAE1C,yBAAO,EAAE,MAAM,QAAiB,KAAK;AAAA,gBACvC;AAEA,sBAAM,IAAIC,+BAA8B;AAAA,kBACtC,eAAe,wBAAwB,KAAK,SAAS;AAAA,gBACvD,CAAC;AAAA,cACH;AAAA,cACA,SAAS;AACP,sBAAM,mBAA0B;AAChC,sBAAM,IAAI,MAAM,0BAA0B,gBAAgB,EAAE;AAAA,cAC9D;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AACD;AAAA,MACF;AAAA,MACA,KAAK,aAAa;AAChB,YAAI,OAAO;AACX,YAAI,YAAY;AAChB,cAAM,YAID,CAAC;AAEN,mBAAW,QAAQ,SAAS;AAC1B,kBAAQ,KAAK,MAAM;AAAA,YACjB,KAAK,QAAQ;AACX,sBAAQ,KAAK;AACb;AAAA,YACF;AAAA,YACA,KAAK,aAAa;AAChB,2BAAa,KAAK;AAClB;AAAA,YACF;AAAA,YACA,KAAK,aAAa;AAChB,wBAAU,KAAK;AAAA,gBACb,IAAI,KAAK;AAAA,gBACT,MAAM;AAAA,gBACN,UAAU;AAAA,kBACR,MAAM,KAAK;AAAA,kBACX,WAAW,KAAK,UAAU,KAAK,KAAK;AAAA,gBACtC;AAAA,cACF,CAAC;AACD;AAAA,YACF;AAAA,YACA,KAAK,QAAQ;AAGX;AAAA,YACF;AAAA,YACA,KAAK,eAAe;AAGlB;AAAA,YACF;AAAA,YACA,SAAS;AACP,oBAAM,mBAA0B;AAChC,oBAAM,IAAI,MAAM,+BAA+B,gBAAgB,EAAE;AAAA,YACnE;AAAA,UACF;AAAA,QACF;AAEA,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,KAAK,SAAS,IAAI,OAAO;AAAA,UAClC,GAAI,UAAU,SAAS,IAAI,EAAE,mBAAmB,UAAU,IAAI,CAAC;AAAA,UAC/D,GAAI,UAAU,SAAS,IAAI,EAAE,YAAY,UAAU,IAAI,CAAC;AAAA,QAC1D,CAAC;AACD;AAAA,MACF;AAAA,MACA,KAAK,QAAQ;AACX,mBAAW,gBAAgB,SAAS;AAClC,cAAI,aAAa,SAAS,0BAA0B;AAClD;AAAA,UACF;AAEA,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,cAAc,aAAa;AAAA,YAC3B,SAAS,oBAAoB,YAAY;AAAA,UAC3C,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAAA,MACA,SAAS;AACP,cAAM,mBAA0B;AAChC,cAAM,IAAI,MAAM,qBAAqB,gBAAgB,EAAE;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,iBAAiB,WAA4B;AACpD,SAAO,UAAU,WAAW,QAAQ,KAAK,sBAAsB,SAAS,SAAS;AACnF;AAEA,SAAS,iBAAiB,WAA4B;AACpD,SAAO,UAAU,WAAW,QAAQ,KAAK,sBAAsB,SAAS,SAAS;AACnF;AAEA,SAAS,iBAAiB,MAGxB;AACA,QAAM,YAAY,KAAK,cAAc,YAAY,eAAe,KAAK;AAErE,QAAM,MACJ,KAAK,gBAAgB,MAAM,KAAK,KAAK,SAAS,IAAI,QAAQ,SAAS,WAAW,gBAAgB,KAAK,IAAI,CAAC;AAE1G,SAAO,EAAE,MAAM,aAAa,WAAW,EAAE,IAAI,EAAE;AACjD;AAEA,SAAS,iBAAiB,MAGxB;AAEA,MAAI,EAAE,KAAK,gBAAgB,MAAM;AAC/B,UAAM,IAAIA,+BAA8B;AAAA,MACtC,eAAe;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,MAAM,aAAa,WAAW,EAAE,KAAK,KAAK,KAAK,SAAS,EAAE,EAAE;AACvE;AAEA,SAAS,oBAAoB,cAAqD;AAChF,QAAM,EAAE,SAAS,IAAI;AACrB,QAAM,SAAS,aAAa;AAI5B,MAAI,kBAAkB,QAAQ,GAAG;AAC/B,WAAO,2BAA2B,MAAM;AAAA,EAC1C;AAGA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AACH,aAAO,OAAO,UAAU;AAAA,IAC1B,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,KAAK,UAAU,OAAO,KAAK;AAAA,IACpC,SAAS;AACP,YAAM,mBAA0B;AAChC,aAAO,KAAK,UAAU,gBAAgB;AAAA,IACxC;AAAA,EACF;AACF;AAEA,SAAS,2BAA2B,QAAyD;AAG3F,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO;AAAA,IAChB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,KAAK,UAAU,OAAO,KAAK;AAAA,IACpC,KAAK;AACH,aAAO,OAAO,UAAU;AAAA,IAC1B,SAAS;AACP,YAAM,mBAA0B;AAChC,aAAO,KAAK,UAAU,gBAAgB;AAAA,IACxC;AAAA,EACF;AACF;;;ACtQO,SAAS,uBAAuB,WAA4E;AACjH,SAAO,yBAAyB,WAAW,yBAAyB;AACtE;AASO,SAAS,6BACd,WACoB;AACpB,SAAO,yBAAyB,WAAW,+BAA+B;AAC5E;AAKA,SAAS,yBACP,WACA,UACoB;AACpB,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,MAAI,cAAc;AAClB,MAAI,YAAY;AAEhB,aAAW,YAAY,WAAW;AAChC,QAAI,SAAS,SAAS,SAAS,UAAU;AACvC,kBAAY;AAEZ,UAAI,SAAS,SAAS,WAAW;AAC/B,YAAI;AACF,gBAAM,OAAO,KAAK,MAAM,SAAS,SAAS,SAAS;AACnD,cAAI,OAAO,KAAK,iBAAiB,UAAU;AACzC,2BAAe,KAAK;AAAA,UACtB;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,YAAY,cAAc;AACnC;;;AC3EA,SAAS,KAAAC,UAAS;AAuHX,IAAM,0BAA0BA,GAAE,OAAO;AAAA,EAC9C,SAASA,GAAE,QAAQ;AAAA,EACnB,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,YAAYA,GAAE,QAAQ,EAAE,SAAS;AACnC,CAAC;AAKM,IAAM,4BAA4BA,GAAE,OAAO;AAAA;AAAA;AAAA;AAAA,EAIhD,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAK1B,kBAAkBA,GAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKvC,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAK/B,cAAcA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKxD,mBAAmBA,GAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMxC,WAAWA,GACR,MAAM;AAAA,IACLA,GAAE,QAAQ;AAAA,IACVA,GAAE,OAAO;AAAA,MACP,SAASA,GAAE,QAAQ;AAAA,MACnB,QAAQA,GACL,OAAO;AAAA,QACN,eAAeA,GAAE,QAAQ,EAAE,SAAS;AAAA,MACtC,CAAC,EACA,SAAS;AAAA,IACd,CAAC;AAAA,EACH,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,iBAAiBA,GACd,MAAM;AAAA,IACLA,GAAE,QAAQ;AAAA,IACVA,GAAE,OAAO;AAAA,MACP,SAASA,GAAE,QAAQ;AAAA,MACnB,QAAQA,GACL,OAAO;AAAA,QACN,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,gBAAgBA,GAAE,QAAQ,EAAE,SAAS;AAAA,MACvC,CAAC,EACA,SAAS;AAAA,IACd,CAAC;AAAA,EACH,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,SAASA,GAAE,MAAM,CAACA,GAAE,QAAQ,GAAG,uBAAuB,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAKlE,oBAAoBA,GAAE,QAAQ,EAAE,SAAS;AAC3C,CAAC;;;ARvJM,IAAM,wBAAN,MAAuD;AAAA,EAS5D,YAAY,SAA0B,UAA4B,QAAwB;AAR1F,SAAS,uBAAuB;AAS9B,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,eAAe,OAAO,cAAc;AACzC,SAAK,4BAA4B,OAAO,6BAA6B;AAAA,EACvE;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAY,sBAA8B;AACxC,WAAO,KAAK,OAAO,SAAS,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAe;AACjB,UAAM,WAAW,uBAAuB,KAAK,OAAO;AACpD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG,KAAK,SAAS;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,IAAI,gBAAgB;AAClB,UAAM,OAAO,KAAK;AAClB,UAAM,WAAqC;AAAA,MACzC,WAAW,CAAC,kBAAkB;AAAA,IAChC;AAGA,QAAI,KAAK,YAAY;AACnB,eAAS,SAAS,IAAI,CAAC,kBAAkB;AAAA,IAC3C;AAEA,WAAO,KAAK,SAAS,iBAAiB,KAAK,OAAO,iBAAiB;AAAA,EACrE;AAAA,EAEA,MAAc,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAA+B;AAC7B,UAAM,WAA8B,CAAC;AAErC,UAAM,oBAAoB,MAAM,qBAAqB;AAAA,MACnD,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAED,QAAI,qBAAqB,MAAM;AAC7B,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,sBAAsB,KAAK;AACjC,UAAM,cAAc,MAAM,qBAAqB;AAAA,MAC7C,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,UAA+B;AAAA,MACnC,GAAI,qBAAqB,CAAC;AAAA,MAC1B,GAAI,eAAe,CAAC;AAAA,IACtB;AAEA,QAAI,QAAQ,MAAM;AAChB,eAAS,KAAK,EAAE,MAAM,eAAe,SAAS,OAAO,CAAC;AAAA,IACxD;AAEA,UAAM,mBAAmB,QAAQ,oBAAoB;AAErD,QAAI,gBAAgB,SAAS,UAAU,eAAe,UAAU,QAAQ,CAAC,KAAK,2BAA2B;AACvG,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAGA,UAAM,YAAY,yBAAyB,KAAK,SAAS,WAAW,QAAQ,SAAS;AAGrF,UAAM,kBAAkB,yBAAyB,KAAK,SAAS,iBAAiB,QAAQ,eAAe;AAGvG,UAAM,qBAAqB,QAAQ,sBAAsB,KAAK,SAAS,sBAAsB;AAE7F,UAAM;AAAA,MACJ,OAAOC;AAAA,MACP,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,IACF,IAAI,iBAAiB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,UAAM,UAAU,qBAAqB,KAAK,SAAS,SAAS,QAAQ,OAAO;AAG3E,UAAM,iBAAiB,oBAAoB,OAAO;AAElD,UAAM,qBAAqB,sBAAsB;AAAA,MAC/C;AAAA,MACA;AAAA,MACA,+BAA+B;AAAA,MAC/B,WAAW,OAAO,KAAK,0BAA0B,KAAK;AAAA,IACxD,CAAC;AAGD,UAAM,WAAW,0BAA0B,MAAM;AACjD,QAAI,yBAAyB;AAE3B,eAAS,QAAQ,EAAE,MAAM,UAAU,SAAS,wBAAwB,CAAC;AAAA,IACvE;AAEA,UAAM,OAAO,uBAAuB;AAAA,MAClC,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,MACA,OAAO;AAAA,MACP,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA,iBACE,gBAAgB,SAAS,SACrB,KAAK,6BAA6B,eAAe,UAAU,OACzD;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,UACX,QAAQ,eAAe;AAAA,UACvB,QAAQ;AAAA,UACR,MAAM,eAAe,QAAQ;AAAA,UAC7B,aAAa,eAAe;AAAA,QAC9B;AAAA,MACF,IACA,EAAE,MAAM,cAAc,IACxB;AAAA,MACN,OAAOA;AAAA,MACP,aAAa;AAAA,MACb,MAAM,QAAQ;AAAA,MACd,GAAIA,cAAa,QAAQ,QAAQ,qBAAqB,OAClD,EAAE,qBAAqB,QAAQ,kBAAkB,IACjD,CAAC;AAAA,MACL,GAAG;AAAA,IACL,CAAC;AAED,UAAM,iBAAqD;AAAA,MACzD,GAAI,QAAQ,YAAY,EAAE,gBAAgB,QAAQ,UAAU,IAAI,CAAC;AAAA,MACjE,GAAI,QAAQ,gBAAgB,CAAC;AAAA,MAC7B,GAAG;AAAA,IACL;AAEA,WAAO;AAAA,MACL;AAAA,MACA,UAAU,CAAC,GAAG,UAAU,GAAG,YAAY;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,SAA6E;AAC5F,UAAM,EAAE,MAAM,UAAU,eAAe,IAAI,MAAM,KAAK,QAAQ,OAAO;AAErE,UAAM;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,MACP;AAAA,IACF,IAAI,MAAM,cAAc;AAAA,MACtB,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,MAC3B,SAAS,eAAe,KAAK,OAAO,QAAQ,GAAG,gBAAgB,QAAQ,OAAO;AAAA,MAC9E;AAAA,MACA,uBAAuB;AAAA,MACvB,2BAA2B,0BAA0B,sBAAsB;AAAA,MAC3E,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,SAAS,SAAS,QAAQ,CAAC;AACjC,UAAM,UAAyC,CAAC;AAEhD,UAAM,EAAE,MAAM,UAAU,IAAI,sBAAsB,OAAO,OAAO;AAEhE,QAAI,UAAU,SAAS,GAAG;AACxB,cAAQ,KAAK,EAAE,MAAM,aAAa,MAAM,UAAU,CAAC;AAAA,IACrD;AAEA,QAAI,KAAK,SAAS,GAAG;AACnB,cAAQ,KAAK,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,IACrC;AAEA,QAAI,OAAO,QAAQ,cAAc,MAAM;AACrC,iBAAW,YAAY,OAAO,QAAQ,YAAY;AAChD,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,YAAY,SAAS,MAAM,KAAK,aAAa;AAAA,UAC7C,UAAU,SAAS,SAAS;AAAA,UAC5B,OAAO,SAAS,SAAS,aAAa;AAAA,QACxC,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,kBAAkB,uBAAuB,OAAO,QAAQ,UAAU;AACxE,UAAM,wBAAwB,6BAA6B,OAAO,QAAQ,UAAU;AAEpF,UAAM,mBAAmB,sBAAsB;AAAA,MAC7C,qBAAqB,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,cAAc;AAAA,QACZ,SAAS,oBAAoB,OAAO,aAAa;AAAA,QACjD,KAAK,OAAO,iBAAiB;AAAA,MAC/B;AAAA,MACA,OAAO,iBAAiB,SAAS,OAAO,iBAAiB,qBAAqB;AAAA,MAC9E,GAAI,mBAAmB,EAAE,iBAAiB,IAAI,CAAC;AAAA,MAC/C,SAAS,EAAE,KAAK;AAAA,MAChB,UAAU;AAAA,QACR,GAAG,oBAAoB,QAAQ;AAAA,QAC/B,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,SAA2E;AACxF,UAAM,EAAE,MAAM,UAAU,eAAe,IAAI,MAAM,KAAK,QAAQ,OAAO;AACrE,UAAM,aAAa;AAAA,MACjB,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,gBAAgB,KAAK,OAAO,uBAAuB,EAAE,eAAe,KAAK,IAAI;AAAA,IAC/E;AAEA,UAAM,EAAE,iBAAiB,OAAO,SAAS,IAAI,MAAM,cAAc;AAAA,MAC/D,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,MAC3B,SAAS,eAAe,KAAK,OAAO,QAAQ,GAAG,gBAAgB,QAAQ,OAAO;AAAA,MAC9E,MAAM;AAAA,MACN,uBAAuB;AAAA,MACvB,2BAA2B,iCAAiC,mBAAmB;AAAA,MAC/E,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,YAAY,iBAAiB,eAAe;AAElD,QAAI,eAA4C;AAAA,MAC9C,SAAS;AAAA,MACT,KAAK;AAAA,IACP;AACA,QAAI;AAEJ,QAAI,eAAe;AACnB,QAAI,eAAe;AACnB,QAAI,oBAAoB;AAExB,UAAM,YAKD,CAAC;AAEN,UAAM,sBAAsB,KAAK;AACjC,UAAM,gBAAgB,KAAK;AAE3B,WAAO;AAAA,MACL,QAAQ,SAAS;AAAA,QACf,IAAI,gBAA6F;AAAA,UAC/F,MAAM,YAAY;AAChB,uBAAW,QAAQ,EAAE,MAAM,gBAAgB,SAAS,CAAC;AAAA,UACvD;AAAA,UAEA,UAAU,OAAO,YAAY;AAC3B,gBAAI,QAAQ,kBAAkB;AAC5B,yBAAW,QAAQ,EAAE,MAAM,OAAO,UAAU,MAAM,SAAS,CAAC;AAAA,YAC9D;AAEA,gBAAI,CAAC,MAAM,SAAS;AAClB,6BAAe,EAAE,SAAS,SAAS,KAAK,OAAU;AAClD,yBAAW,QAAQ,EAAE,MAAM,SAAS,OAAO,MAAM,MAAM,CAAC;AACxD;AAAA,YACF;AAEA,gBAAI,WAAW,MAAM,OAAO;AAC1B,6BAAe,EAAE,SAAS,SAAS,KAAK,OAAU;AAClD,oBAAM,QAAS,MAAM,MAA2C;AAChE,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,OAAO,OAAO,WAAW,MAAM;AAAA,cACjC,CAAC;AACD;AAAA,YACF;AAEA,kBAAM,QAAQ,MAAM;AAEpB,gBAAI,cAAc;AAChB,6BAAe;AACf,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,GAAG,oBAAoB,KAAK;AAAA,cAC9B,CAAC;AAAA,YACH;AAEA,gBAAI,MAAM,SAAS,MAAM;AACvB,sBAAQ,MAAM;AAAA,YAChB;AAEA,kBAAM,SAAS,MAAM,QAAQ,CAAC;AAC9B,gBAAI,CAAC,QAAQ;AACX;AAAA,YACF;AAEA,gBAAI,OAAO,iBAAiB,MAAM;AAChC,6BAAe;AAAA,gBACb,SAAS,oBAAoB,OAAO,aAAa;AAAA,gBACjD,KAAK,OAAO,iBAAiB;AAAA,cAC/B;AAAA,YACF;AAEA,kBAAM,QAAQ,OAAO;AACrB,gBAAI,CAAC,OAAO;AACV;AAAA,YACF;AAEA,kBAAM,iBAAiB,MAAM,qBAAqB,MAAM;AACxD,gBAAI,gBAAgB;AAClB,kBAAI,CAAC,mBAAmB;AACtB,oBAAI,cAAc;AAChB,6BAAW,QAAQ,EAAE,MAAM,YAAY,IAAI,SAAS,CAAC;AACrD,iCAAe;AAAA,gBACjB;AACA,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN,IAAI;AAAA,gBACN,CAAC;AACD,oCAAoB;AAAA,cACtB;AAEA,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,OAAO;AAAA,cACT,CAAC;AAAA,YACH;AAEA,gBAAI,MAAM,SAAS;AACjB,kBAAI,mBAAmB;AACrB,2BAAW,QAAQ,EAAE,MAAM,iBAAiB,IAAI,cAAc,CAAC;AAC/D,oCAAoB;AAAA,cACtB;AAEA,kBAAI,CAAC,cAAc;AACjB,2BAAW,QAAQ,EAAE,MAAM,cAAc,IAAI,SAAS,CAAC;AACvD,+BAAe;AAAA,cACjB;AAEA,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,OAAO,MAAM;AAAA,cACf,CAAC;AAAA,YACH;AAEA,gBAAI,MAAM,cAAc,MAAM;AAC5B,kBAAI,mBAAmB;AACrB,2BAAW,QAAQ,EAAE,MAAM,iBAAiB,IAAI,cAAc,CAAC;AAC/D,oCAAoB;AAAA,cACtB;AAEA,yBAAW,iBAAiB,MAAM,YAAY;AAC5C,sBAAM,QAAQ,cAAc,SAAS,UAAU;AAE/C,oBAAI,UAAU,KAAK,KAAK,MAAM;AAC5B,sBAAI,cAAc,MAAM,MAAM;AAC5B,0BAAM,IAAI,yBAAyB;AAAA,sBACjC,MAAM;AAAA,sBACN,SAAS;AAAA,oBACX,CAAC;AAAA,kBACH;AAEA,sBAAI,cAAc,UAAU,QAAQ,MAAM;AACxC,0BAAM,IAAI,yBAAyB;AAAA,sBACjC,MAAM;AAAA,sBACN,SAAS;AAAA,oBACX,CAAC;AAAA,kBACH;AAEA,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN,IAAI,cAAc;AAAA,oBAClB,UAAU,cAAc,SAAS;AAAA,kBACnC,CAAC;AAED,4BAAU,KAAK,IAAI;AAAA,oBACjB,IAAI,cAAc;AAAA,oBAClB,MAAM;AAAA,oBACN,UAAU;AAAA,sBACR,MAAM,cAAc,SAAS;AAAA,sBAC7B,WAAW,cAAc,SAAS,aAAa;AAAA,oBACjD;AAAA,oBACA,aAAa;AAAA,kBACf;AAEA,wBAAMC,YAAW,UAAU,KAAK;AAEhC,sBAAIA,UAAS,SAAS,UAAU,SAAS,GAAG;AAC1C,+BAAW,QAAQ;AAAA,sBACjB,MAAM;AAAA,sBACN,IAAIA,UAAS;AAAA,sBACb,OAAOA,UAAS,SAAS;AAAA,oBAC3B,CAAC;AAAA,kBACH;AAEA,sBAAI,eAAeA,UAAS,SAAS,SAAS,GAAG;AAC/C,+BAAW,QAAQ,EAAE,MAAM,kBAAkB,IAAIA,UAAS,GAAG,CAAC;AAE9D,+BAAW,QAAQ;AAAA,sBACjB,MAAM;AAAA,sBACN,YAAYA,UAAS;AAAA,sBACrB,UAAUA,UAAS,SAAS;AAAA,sBAC5B,OAAOA,UAAS,SAAS;AAAA,oBAC3B,CAAC;AAED,oBAAAA,UAAS,cAAc;AAAA,kBACzB;AAEA;AAAA,gBACF;AAEA,sBAAM,WAAW,UAAU,KAAK;AAChC,oBAAI,SAAS,aAAa;AACxB;AAAA,gBACF;AAEA,oBAAI,cAAc,UAAU,aAAa,MAAM;AAC7C,2BAAS,SAAS,aAAa,cAAc,SAAS;AAAA,gBACxD;AAEA,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN,IAAI,SAAS;AAAA,kBACb,OAAO,cAAc,UAAU,aAAa;AAAA,gBAC9C,CAAC;AAED,oBAAI,eAAe,SAAS,SAAS,SAAS,GAAG;AAC/C,6BAAW,QAAQ,EAAE,MAAM,kBAAkB,IAAI,SAAS,GAAG,CAAC;AAE9D,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN,YAAY,SAAS;AAAA,oBACrB,UAAU,SAAS,SAAS;AAAA,oBAC5B,OAAO,SAAS,SAAS;AAAA,kBAC3B,CAAC;AAED,2BAAS,cAAc;AAAA,gBACzB;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UAEA,MAAM,YAAY;AAChB,gBAAI,mBAAmB;AACrB,yBAAW,QAAQ,EAAE,MAAM,iBAAiB,IAAI,cAAc,CAAC;AAC/D,kCAAoB;AAAA,YACtB;AAEA,gBAAI,cAAc;AAChB,yBAAW,QAAQ,EAAE,MAAM,YAAY,IAAI,SAAS,CAAC;AACrD,6BAAe;AAAA,YACjB;AAEA,uBAAW,YAAY,UAAU,OAAO,CAAC,SAAS,CAAC,KAAK,WAAW,GAAG;AACpE,yBAAW,QAAQ,EAAE,MAAM,kBAAkB,IAAI,SAAS,GAAG,CAAC;AAC9D,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,YAAY,SAAS;AAAA,gBACrB,UAAU,SAAS,SAAS;AAAA,gBAC5B,OAAO,SAAS,SAAS;AAAA,cAC3B,CAAC;AAAA,YACH;AAGA,kBAAM,kBAAkB,uBAAuB,SAAS;AACxD,kBAAM,wBAAwB,6BAA6B,SAAS;AAEpE,kBAAM,mBACJ,aAAa,mBAAmB,QAAQ,yBAAyB,OAC7D;AAAA,cACE,CAAC,mBAAmB,GAAG;AAAA,gBACrB,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,gBACjC,GAAI,mBAAmB,OAAO,EAAE,gBAAgB,IAAI,CAAC;AAAA,gBACrD,GAAI,yBAAyB,OAAO,EAAE,sBAAsB,IAAI,CAAC;AAAA,cACnE;AAAA,YACF,IACA;AAEN,uBAAW,QAAQ;AAAA,cACjB,MAAM;AAAA,cACN;AAAA,cACA,OAAO,iBAAiB,OAAO,iBAAiB,qBAAqB;AAAA,cACrE,GAAI,mBAAmB,EAAE,iBAAiB,IAAI,CAAC;AAAA,YACjD,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,SAAS,EAAE,MAAM,WAAW;AAAA,MAC5B,UAAU,EAAE,SAAS,gBAAgB;AAAA,IACvC;AAAA,EACF;AACF;AAMA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKyC;AACvC,QAAM,YAAY,iBAAiB,eAAe;AAElD,MAAI,CAAC,aAAa,mBAAmB,QAAQ,yBAAyB,MAAM;AAC1E,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,CAAC,mBAAmB,GAAG;AAAA,MACrB,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjC,GAAI,mBAAmB,OAAO,EAAE,gBAAgB,IAAI,CAAC;AAAA,MACrD,GAAI,yBAAyB,OAAO,EAAE,sBAAsB,IAAI,CAAC;AAAA,IACnE;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,aAAa,CAAC,kBAAkB,6BAA6B,GAAG,kBAAkB,mBAAmB,CAAC,EAAE;AAAA,IAC5G,CAAC,UAA0D,SAAS,QAAQ,OAAO,UAAU;AAAA,EAC/F;AAEA,QAAM,cAAqD,CAAC;AAE5D,aAAW,WAAW,YAAY;AAChC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAW,CAAC,CAAC,GAAG;AACxD,UAAI,CAAC,UAAU,SAAS,GAAG,GAAG;AAC5B,oBAAY,GAAG,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAIA,SAAS,yBACP,gBACA,eACe;AAEf,MAAI,iBAAiB,MAAM;AACzB,QAAI,OAAO,kBAAkB,WAAW;AACtC,aAAO,gBAAiB,EAAE,SAAS,KAAK,IAAU;AAAA,IACpD;AACA,UAAM,SAAS;AACf,WAAO,OAAO,UAAU,gBAAgB;AAAA,EAC1C;AAGA,MAAI,kBAAkB,MAAM;AAC1B,QAAI,OAAO,mBAAmB,WAAW;AACvC,aAAO,iBAAkB,EAAE,SAAS,KAAK,IAAU;AAAA,IACrD;AACA,UAAM,SAAS;AACf,WAAO,OAAO,UAAU,iBAAiB;AAAA,EAC3C;AAEA,SAAO;AACT;AAOA,SAAS,qBACP,gBACA,eAC+B;AAE/B,QAAM,SAAS,iBAAiB;AAEhC,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,WAAW;AAC/B,WAAO,SAAS,EAAE,SAAS,KAAK,IAAI;AAAA,EACtC;AAEA,SAAO,OAAO,UAAU,SAAS;AACnC;AAMA,SAAS,oBAAoB,SAAgE;AAC3F,MAAI,CAAC,SAAS,SAAS;AACrB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAkC;AAAA,IACtC,gBAAgB;AAAA,EAClB;AAEA,MAAI,QAAQ,UAAU;AACpB,YAAQ,kBAAkB,IAAI,QAAQ;AAAA,EACxC;AAEA,MAAI,QAAQ,YAAY;AACtB,YAAQ,kBAAkB,IAAI,OAAO,QAAQ,UAAU;AAAA,EACzD;AAEA,MAAI,QAAQ,YAAY;AACtB,YAAQ,oBAAoB,IAAI;AAAA,EAClC;AAEA,SAAO;AACT;AAMA,IAAM,uBAAuBC,GAC1B,OAAO;AAAA,EACN,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAClC,mBAAmBA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACtC,cAAcA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACjC,uBAAuBA,GACpB,OAAO;AAAA,IACN,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACpC,CAAC,EACA,QAAQ;AAAA,EACX,2BAA2BA,GACxB,OAAO;AAAA,IACN,kBAAkBA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACvC,CAAC,EACA,QAAQ;AACb,CAAC,EACA,QAAQ;AAEX,IAAM,yBAAyBA,GAAE,YAAY;AAAA,EAC3C,IAAIA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACvB,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC5B,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC1B,SAASA,GAAE;AAAA,IACTA,GAAE,OAAO;AAAA,MACP,SAASA,GAAE,OAAO;AAAA,QAChB,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,QACzB,SAASA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,MAAMA,GAAE,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ;AAAA,QACzD,mBAAmBA,GAAE,OAAO,EAAE,QAAQ;AAAA,QACtC,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC9B,YAAYA,GACT;AAAA,UACCA,GAAE,OAAO;AAAA,YACP,IAAIA,GAAE,OAAO,EAAE,QAAQ;AAAA,YACvB,UAAUA,GAAE,OAAO;AAAA,cACjB,MAAMA,GAAE,OAAO;AAAA,cACf,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,YAChC,CAAC;AAAA,UACH,CAAC;AAAA,QACH,EACC,QAAQ;AAAA,MACb,CAAC;AAAA,MACD,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AACT,CAAC;AAED,IAAM,0BAA0BA,GAAE,YAAY;AAAA,EAC5C,IAAIA,GAAE,OAAO,EAAE,QAAQ;AAAA,EACvB,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC5B,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAC1B,SAASA,GAAE;AAAA,IACTA,GAAE,OAAO;AAAA,MACP,OAAOA,GACJ,OAAO;AAAA,QACN,MAAMA,GAAE,KAAK,CAAC,WAAW,CAAC,EAAE,QAAQ;AAAA,QACpC,SAASA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC5B,mBAAmBA,GAAE,OAAO,EAAE,QAAQ;AAAA,QACtC,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,QAC9B,YAAYA,GACT;AAAA,UACCA,GAAE,OAAO;AAAA,YACP,OAAOA,GAAE,OAAO,EAAE,QAAQ;AAAA,YAC1B,IAAIA,GAAE,OAAO,EAAE,QAAQ;AAAA,YACvB,UAAUA,GAAE,OAAO;AAAA,cACjB,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,cACzB,WAAWA,GAAE,OAAO,EAAE,QAAQ;AAAA,YAChC,CAAC;AAAA,UACH,CAAC;AAAA,QACH,EACC,QAAQ;AAAA,MACb,CAAC,EACA,QAAQ;AAAA,MACX,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AACT,CAAC;AAED,IAAM,sBAAsBA,GAAE,MAAM,CAAC,yBAAyB,eAAe,CAAC;;;AShzBvE,IAAM,4BAA4B;AAAA;AAAA,EAEvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,IAAM,uBAAuB;AAAA;AAAA,EAElC,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,sBAAsB;AAAA,EACtB,2EAA2E;AAAA,EAC3E,4BAA4B;AAAA,EAC5B,qEAAqE;AAAA,EACrE,iCAAiC;AAAA,EACjC,6EAA6E;AAAA,EAC7E,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,wBAAwB;AAAA,EACxB,aAAa;AAAA,EACb,sBAAsB;AAAA;AAAA,EAEtB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,YAAY;AAAA;AAAA,EAEZ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAAA;AAAA,EAEhB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,mBAAmB;AACrB;AAYO,SAASC,kBAAiB,WAA4B;AAC3D,SAAO,UAAU,WAAW,QAAQ;AACtC;AAKO,SAASC,kBAAiB,WAA4B;AAC3D,SAAO,UAAU,WAAW,QAAQ;AACtC;AAKO,SAAS,uBAAuB,WAA4B;AAEjE,MAAI,aAAa,sBAAsB;AACrC,WAAO,qBAAqB,SAA8B,MAAM;AAAA,EAClE;AAEA,MAAI,UAAU,WAAW,OAAO,KAAK,cAAc,mBAAmB;AACpE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKO,SAAS,oBAAoB,WAA4B;AAC9D,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO,cAAc,SAAS,SAAS;AACzC;AASO,SAAS,wBAAwB,WAAgC;AACtE,MAAID,kBAAiB,SAAS,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,MAAIC,kBAAiB,SAAS,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKO,SAAS,0BAA0B,WAA2B;AACnE,QAAM,MAAM,UAAU,YAAY,EAAE,WAAW,GAAG,IAAI,UAAU,YAAY,IAAI,IAAI,UAAU,YAAY,CAAC;AAE3G,QAAM,kBAA0C;AAAA;AAAA,IAE9C,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA;AAAA,IAET,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA;AAAA,IAER,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA;AAAA,IAER,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAEA,SAAO,gBAAgB,GAAG,KAAK;AACjC;AAKO,SAAS,qBAAqB,MAA6B;AAChE,QAAM,QAAQ,KAAK,MAAM,wBAAwB;AACjD,SAAO,QAAQ,IAAI,MAAM,CAAC,EAAE,YAAY,CAAC,KAAK;AAChD;;;AC7JO,IAAM,iBAAN,MAAqB;AAAA,EAG1B,YAAY,QAA8B;AACxC,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,SAA+C;AAC1D,UAAM,EAAE,MAAM,UAAU,WAAW,QAAQ,IAAI;AAG/C,UAAM,oBACJ,aAAa,0BAA0B,qBAAqB,QAAQ,KAAK,EAAE,KAAK;AAGlF,UAAM,kBAAkB,WAAW,wBAAwB,iBAAiB;AAG5E,UAAM,WAAW,IAAI,SAAS;AAG9B,UAAM,WAAW,OAAO,SAAS,WAAW,mBAAmB,IAAI,IAAI;AACvE,UAAM,OAAO,IAAI,KAAK,CAAC,IAAI,WAAW,QAAQ,EAAE,MAAqB,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEnG,aAAS,OAAO,QAAQ,MAAM,QAAQ;AACtC,aAAS,OAAO,WAAW,eAAe;AAE1C,UAAM,UAAU,KAAK,OAAO,SAAS;AACrC,UAAM,UAAU,KAAK,OAAO,QAAQ;AAEpC,UAAM,WAAW,MAAM,QAAQ,GAAG,KAAK,OAAO,OAAO,UAAU;AAAA,MAC7D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,GAAG,OAAO;AAAA,UACR,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,UAAqC,MAAM,CAAC,MAAM,MAAS;AAAA,QAC7F;AAAA;AAAA,MAEF;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,YAAM,IAAI,MAAM,0BAA0B,SAAS,MAAM,IAAI,SAAS,UAAU,MAAM,SAAS,EAAE;AAAA,IACnG;AAEA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,QAAiC;AAChD,UAAM,UAAU,KAAK,OAAO,SAAS;AACrC,UAAM,UAAU,KAAK,OAAO,QAAQ;AAEpC,UAAM,WAAW,MAAM,QAAQ,GAAG,KAAK,OAAO,OAAO,UAAU,MAAM,YAAY;AAAA,MAC/E,QAAQ;AAAA,MACR,SAAS,OAAO;AAAA,QACd,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,UAAqC,MAAM,CAAC,MAAM,MAAS;AAAA,MAC7F;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,YAAM,IAAI,MAAM,+BAA+B,SAAS,MAAM,IAAI,SAAS,UAAU,MAAM,SAAS,EAAE;AAAA,IACxG;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBAAiB,SAAuD;AAC5E,UAAM,OAAO,MAAM,KAAK,OAAO;AAAA,MAC7B,GAAG;AAAA,MACH,SAAS,QAAQ,WAAW;AAAA,IAC9B,CAAC;AAGD,QAAI,cAAc;AAClB,QAAI,WAAW;AACf,UAAM,cAAc;AACpB,UAAM,eAAe;AAErB,WAAO,YAAY,WAAW,gBAAgB,WAAW,aAAa;AACpE,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,YAAY,CAAC;AAChE,oBAAc,MAAM,KAAK,QAAQ,KAAK,EAAE;AACxC;AAAA,IACF;AAEA,QAAI,YAAY,WAAW,SAAS;AAClC,YAAM,IAAI,MAAM,2BAA2B,YAAY,kBAAkB,eAAe,EAAE;AAAA,IAC5F;AAEA,QAAI,YAAY,WAAW,cAAc;AACvC,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAGA,QAAI;AACJ,QAAI,YAAY,YAAY,gBAAgB;AAC1C,gBAAU,MAAM,KAAK,WAAW,KAAK,EAAE;AAAA,IACzC;AAEA,WAAO,EAAE,MAAM,aAAa,QAAQ;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,QAAmC;AAC/C,UAAM,UAAU,KAAK,OAAO,SAAS;AACrC,UAAM,UAAU,KAAK,OAAO,QAAQ;AAEpC,UAAM,WAAW,MAAM,QAAQ,GAAG,KAAK,OAAO,OAAO,UAAU,MAAM,IAAI;AAAA,MACvE,QAAQ;AAAA,MACR,SAAS,OAAO;AAAA,QACd,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,UAAqC,MAAM,CAAC,MAAM,MAAS;AAAA,MAC7F;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,YAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,IAAI,SAAS,UAAU,MAAM,SAAS,EAAE;AAAA,IAChG;AAEA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAiC;AACrC,UAAM,UAAU,KAAK,OAAO,SAAS;AACrC,UAAM,UAAU,KAAK,OAAO,QAAQ;AAEpC,UAAM,WAAW,MAAM,QAAQ,GAAG,KAAK,OAAO,OAAO,UAAU;AAAA,MAC7D,QAAQ;AAAA,MACR,SAAS,OAAO;AAAA,QACd,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,UAAqC,MAAM,CAAC,MAAM,MAAS;AAAA,MAC7F;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,YAAM,IAAI,MAAM,yBAAyB,SAAS,MAAM,IAAI,SAAS,UAAU,MAAM,SAAS,EAAE;AAAA,IAClG;AAEA,UAAM,SAAU,MAAM,SAAS,KAAK;AACpC,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,QAA+B;AAC9C,UAAM,UAAU,KAAK,OAAO,SAAS;AACrC,UAAM,UAAU,KAAK,OAAO,QAAQ;AAEpC,UAAM,WAAW,MAAM,QAAQ,GAAG,KAAK,OAAO,OAAO,UAAU,MAAM,IAAI;AAAA,MACvE,QAAQ;AAAA,MACR,SAAS,OAAO;AAAA,QACd,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,UAAqC,MAAM,CAAC,MAAM,MAAS;AAAA,MAC7F;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,YAAM,IAAI,MAAM,0BAA0B,SAAS,MAAM,IAAI,SAAS,UAAU,MAAM,SAAS,EAAE;AAAA,IACnG;AAAA,EACF;AACF;AAMA,SAAS,mBAAmB,QAA4B;AAEtD,QAAM,aAAa,OAAO,SAAS,GAAG,IAAI,OAAO,MAAM,GAAG,EAAE,CAAC,IAAI;AACjE,QAAM,eAAe,KAAK,UAAU;AACpC,QAAM,QAAQ,IAAI,WAAW,aAAa,MAAM;AAChD,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,UAAM,CAAC,IAAI,aAAa,WAAW,CAAC;AAAA,EACtC;AACA,SAAO;AACT;;;AClMA,eAAsB,mBAAmB,SAAoE;AAC3G,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,IACtB,eAAe;AAAA,IACf,sBAAsB;AAAA,EACxB,IAAI;AAEJ,QAAM,UAAiC,CAAC;AACxC,QAAM,SAAS,IAAI,eAAe,YAAY;AAE9C,aAAW,cAAc,aAAa;AACpC,QAAI;AACF,YAAM,YAAY,MAAM,kBAAkB,YAAY,QAAQ;AAAA,QAC5D;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,cAAQ,KAAK,SAAS;AAAA,IACxB,SAAS,OAAO;AACd,cAAQ,KAAK;AAAA,QACX,UAAU;AAAA,QACV,MAAM;AAAA,QACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAMA,eAAe,kBACb,YACA,QACA,SAC8B;AAE9B,QAAM,cAAc,mBAAmB,UAAU;AAGjD,MAAIC,kBAAiB,WAAW,GAAG;AACjC,QAAI,QAAQ,gBAAgB,WAAW,SAAS;AAE9C,YAAM,SAAS,MAAM,OAAO,OAAO;AAAA,QACjC,MAAM,WAAW;AAAA,QACjB,UAAU,WAAW,QAAQ;AAAA,QAC7B,WAAW;AAAA,QACX,SAAS;AAAA,MACX,CAAC;AAED,aAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM;AAAA,QACN,QAAQ,OAAO;AAAA,QACf,UAAU,WAAW;AAAA,MACvB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU,WAAW;AAAA,IACvB;AAAA,EACF;AAGA,MAAIC,kBAAiB,WAAW,GAAG;AACjC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU,WAAW;AAAA,IACvB;AAAA,EACF;AAGA,MAAI,QAAQ,wBAAwB,oBAAoB,WAAW,KAAK,uBAAuB,WAAW,IAAI;AAE5G,QAAI;AAEJ,QAAI,WAAW,SAAS;AACtB,aAAO,WAAW;AAAA,IACpB,WAAW,WAAW,KAAK;AAEzB,YAAM,WAAW,MAAM,MAAM,WAAW,GAAG;AAC3C,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,+BAA+B,SAAS,MAAM,EAAE;AAAA,MAClE;AACA,aAAO,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;AAAA,IACpD,OAAO;AACL,aAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,SAAS,MAAM,OAAO,iBAAiB;AAAA,MAC3C;AAAA,MACA,UAAU,WAAW,QAAQ,cAAc,YAAY,WAAW;AAAA,MAClE,WAAW;AAAA,MACX,SAAS;AAAA,IACX,CAAC;AAGD,QAAI,QAAQ,uBAAuB,OAAO,KAAK,IAAI;AACjD,UAAI;AACF,cAAM,OAAO,WAAW,OAAO,KAAK,EAAE;AAAA,MACxC,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,aAAa,OAAO;AAAA,MACpB,QAAQ,OAAO,KAAK;AAAA,IACtB;AAAA,EACF;AAGA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO,6BAA6B,WAAW;AAAA,EACjD;AACF;AAEA,SAAS,mBAAmB,YAAgC;AAE1D,MAAI,WAAW,aAAa;AAC1B,WAAO,WAAW;AAAA,EACpB;AAGA,QAAM,OAAO,WAAW,QAAQ,WAAW;AAC3C,MAAI,MAAM;AACR,UAAM,MAAM,qBAAqB,IAAI;AACrC,QAAI,KAAK;AACP,aAAO,0BAA0B,GAAG;AAAA,IACtC;AAAA,EACF;AAGA,SAAO;AACT;AAEA,SAAS,cAAc,YAAwB,aAA6B;AAC1E,MAAI,WAAW,MAAM;AACnB,WAAO,WAAW;AAAA,EACpB;AAEA,MAAI,WAAW,KAAK;AAClB,UAAM,UAAU,WAAW,IAAI,MAAM,GAAG,EAAE,CAAC;AAC3C,UAAM,WAAW,QAAQ,MAAM,GAAG;AAClC,UAAM,cAAc,SAAS,SAAS,SAAS,CAAC;AAChD,QAAI,eAAe,YAAY,SAAS,GAAG,GAAG;AAC5C,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,eAAuC;AAAA,IAC3C,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,2EAA2E;AAAA,IAC3E,cAAc;AAAA,IACd,aAAa;AAAA,EACf;AAEA,SAAO,aAAa,WAAW,KAAK;AACtC;;;ACjRO,IAAM,UACgC,QAAoB,SAAS,IAAI,UAAsB;;;AbmBpG,IAAM,kBAAkB;AACxB,IAAM,cAAc;AA2Jb,SAAS,WAAW,UAAgC,CAAC,GAAiB;AAC3E,QAAM,kBACJ,oBAAoB;AAAA,IAClB,cAAc,QAAQ;AAAA,IACtB,yBAAyB;AAAA,EAC3B,CAAC,MAAM,QAAQ,aAAa,OAAO,cAAc;AAEnD,QAAM,UAAU,qBAAqB,eAAe,KAAK;AAEzD,QAAM,aAAa,MACjB;AAAA,IACE;AAAA,MACE,eAAe,UAAU,WAAW;AAAA,QAClC,QAAQ,QAAQ;AAAA,QAChB,yBAAyB;AAAA,QACzB,aAAa;AAAA,MACf,CAAC,CAAC;AAAA,MACF,GAAG,QAAQ;AAAA,IACb;AAAA,IACA,eAAe,OAAO;AAAA,EACxB;AAEF,QAAM,kBAAkB,CAAC,SAA0B,WAA6B,CAAC,MAC/E,IAAI,sBAAsB,SAAS,UAAU;AAAA,IAC3C,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,IACf,YAAY,QAAQ;AAAA,IACpB,2BAA2B,SAAS,6BAA6B,QAAQ;AAAA,IACzE,sBAAsB,SAAS,wBAAwB,QAAQ;AAAA,IAC/D,eAAe,SAAS,iBAAiB,QAAQ;AAAA,EACnD,CAAC;AAEH,QAAM,WAAyB,CAAC,SAA0B,aAAuD;AAC/G,QAAI,YAAY;AACd,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AAEA,WAAO,gBAAgB,SAAS,QAAQ;AAAA,EAC1C;AAEA,WAAS,uBAAuB;AAChC,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAChB,WAAS,QAAQ;AACjB,WAAS,QAAQ,IAAI,eAAe;AAAA,IAClC;AAAA,IACA,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,EACjB,CAAC;AAED,WAAS,iBAAiB,CAAC,YAAoB;AAC7C,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,iBAAiB,CAAC;AAAA,EACrE;AAEA,WAAS,aAAa,CAAC,YAAoB;AACzC,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,aAAa,CAAC;AAAA,EACjE;AAEA,WAAS,iBAAiB,CAAC,YAAoB;AAC7C,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,iBAAiB,CAAC;AAAA,EACrE;AAEA,SAAO;AACT;AAiBO,IAAM,OAAO,WAAW;;;AcnP/B;AAAA,EAEE,kBAAAC;AAAA,EACA,oCAAAC;AAAA,EACA,kCAAAC;AAAA,EACA,6BAAAC;AAAA,EACA,cAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,0BAAAC;AAAA,OACK;AACP,SAAS,KAAAC,UAAS;;;ACrBlB,SAAS,iCAAAC,sCAAqC;AAC9C,SAAS,mBAAAC,wBAAuB;AA0ChC,eAAsB,wBAAwB,QAAwD;AACpG,MAAI;AACJ,QAAM,WAA8B,CAAC;AAErC,aAAW,WAAW,QAAQ;AAC5B,YAAQ,QAAQ,MAAM;AAAA,MACpB,KAAK,UAAU;AAEb,cAAM,aAAa,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU;AAC3E,wBAAgB,gBAAgB,GAAG,aAAa;AAAA;AAAA,EAAO,UAAU,KAAK;AACtE;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,cAAM,UAAiC,CAAC;AAExC,mBAAW,QAAQ,QAAQ,SAAS;AAClC,kBAAQ,KAAK,MAAM;AAAA,YACjB,KAAK;AACH,sBAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,CAAC;AAC9C;AAAA,YAEF,KAAK;AAEH,kBAAI,KAAK,WAAW,WAAW,QAAQ,GAAG;AACxC,wBAAQ,KAAK,MAAM,gBAAgB,IAAI,CAAC;AAAA,cAC1C,OAAO;AACL,sBAAM,IAAID,+BAA8B;AAAA,kBACtC,eAAe,cAAc,KAAK,SAAS;AAAA,gBAC7C,CAAC;AAAA,cACH;AACA;AAAA,YAEF;AACE,oBAAM,IAAIA,+BAA8B;AAAA,gBACtC,eAAe,2BAA4B,KAA0B,IAAI;AAAA,cAC3E,CAAC;AAAA,UACL;AAAA,QACF;AAEA,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,QAAQ,WAAW,KAAK,QAAQ,CAAC,EAAE,SAAS,SAAS,QAAQ,CAAC,EAAE,OAAO;AAAA,QAClF,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,aAAa;AAChB,cAAM,UAAiC,CAAC;AAExC,mBAAW,QAAQ,QAAQ,SAAS;AAClC,kBAAQ,KAAK,MAAM;AAAA,YACjB,KAAK;AACH,sBAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,CAAC;AAC9C;AAAA,YAEF,KAAK;AACH,sBAAQ,KAAK;AAAA,gBACX,MAAM;AAAA,gBACN,IAAI,KAAK;AAAA,gBACT,MAAM,KAAK;AAAA,gBACX,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,MAAM,KAAK,KAAK,IAAK,KAAK;AAAA,cACzE,CAAC;AACD;AAAA,YAEF,KAAK;AAEH,kBAAI,KAAK,MAAM;AACb,wBAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,aAAa,KAAK,IAAI,cAAc,CAAC;AAAA,cAC1E;AACA;AAAA,YAEF;AACE,oBAAM,IAAIA,+BAA8B;AAAA,gBACtC,eAAe,gCAAiC,KAA0B,IAAI;AAAA,cAChF,CAAC;AAAA,UACL;AAAA,QACF;AAEA,YAAI,QAAQ,SAAS,GAAG;AACtB,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS,QAAQ,WAAW,KAAK,QAAQ,CAAC,EAAE,SAAS,SAAS,QAAQ,CAAC,EAAE,OAAO;AAAA,UAClF,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AAEX,cAAM,cAAqC,CAAC;AAE5C,mBAAW,QAAQ,QAAQ,SAAS;AAClC,cAAI,KAAK,SAAS,eAAe;AAC/B,wBAAY,KAAK,sBAAsB,IAAI,CAAC;AAAA,UAC9C;AAAA,QACF;AAGA,YAAI,SAAS,SAAS,KAAK,SAAS,SAAS,SAAS,CAAC,EAAE,SAAS,aAAa;AAC7E,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,QACH,OAAO;AAEL,gBAAM,cAAc,SAAS,SAAS,SAAS,CAAC;AAChD,cAAI,aAAa,SAAS,UAAU,MAAM,QAAQ,YAAY,OAAO,GAAG;AACtE,wBAAY,QAAQ,KAAK,GAAG,WAAW;AAAA,UACzC,OAAO;AACL,qBAAS,KAAK;AAAA,cACZ,MAAM;AAAA,cACN,SAAS;AAAA,YACX,CAAC;AAAA,UACH;AAAA,QACF;AACA;AAAA,MACF;AAAA,MAEA;AACE,cAAM,IAAIA,+BAA8B;AAAA,UACtC,eAAe,iBAAkB,QAA6B,IAAI;AAAA,QACpE,CAAC;AAAA,IACL;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,EACF;AACF;AAKA,eAAe,gBAAgB,MAA6D;AAC1F,QAAM,YAAY,KAAK,aAAa;AAGpC,MAAI,KAAK,gBAAgB,KAAK;AAC5B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,KAAK,KAAK,KAAK,SAAS;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAGA,MAAI,OAAO,KAAK,SAAS,UAAU;AAEjC,QAAI,KAAK,KAAK,WAAW,SAAS,KAAK,KAAK,KAAK,WAAW,UAAU,GAAG;AACvE,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,KAAK,KAAK;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,KAAK,WAAW,OAAO,GAAG;AACjC,YAAM,CAAC,QAAQ,IAAI,IAAI,KAAK,KAAK,MAAM,GAAG;AAC1C,YAAM,oBAAoB,OAAO,MAAM,cAAc,IAAI,CAAC,KAAK;AAC/D,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,MAAM,KAAK;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAGA,QAAM,SAASC,iBAAgB,KAAK,IAAI;AACxC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAcA,SAAS,sBAAsB,MAKP;AAEtB,QAAM,SAAS,KAAK;AACpB,MAAI;AACJ,MAAI,UAAU;AAEd,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,gBAAU,OAAO,OAAO,SAAS,EAAE;AACnC;AAAA,IACF,KAAK;AACH,gBAAU,OAAO,OAAO,SAAS,EAAE;AACnC,gBAAU;AACV;AAAA,IACF,KAAK;AACH,gBAAU,OAAO,UAAU;AAC3B,gBAAU;AACV;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,gBAAU,KAAK,UAAU,OAAO,KAAK;AACrC;AAAA,IACF,KAAK;AACH,gBAAU,KAAK,UAAU,OAAO,KAAK;AACrC,gBAAU;AACV;AAAA,IACF;AACE,gBAAU,KAAK,UAAU,MAAM;AAAA,EACnC;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa,KAAK;AAAA,IAClB;AAAA,IACA,UAAU,WAAW;AAAA,EACvB;AACF;;;AC/RA,SAAS,KAAAC,UAAS;AAiDX,IAAM,gCAAgCA,GAAE,OAAO;AAAA;AAAA;AAAA;AAAA,EAIpD,kBAAkBA,GACf,MAAM;AAAA,IACLA,GAAE,QAAQ;AAAA,IACVA,GAAE,OAAO;AAAA,MACP,SAASA,GAAE,QAAQ,EAAE,SAAS;AAAA,MAC9B,QAAQA,GAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,SAAS;AAAA,MACnD,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,IACpC,CAAC;AAAA,EACH,CAAC,EACA,SAAS;AAAA;AAAA;AAAA;AAAA,EAKZ,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,EAK5B,eAAeA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAC9C,CAAC;AAiBM,SAAS,gCACd,QACoC;AACpC,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,WAAW;AAC/B,WAAO,SAAS,EAAE,SAAS,MAAM,QAAQ,SAAS,IAAI,EAAE,SAAS,MAAM;AAAA,EACzE;AAEA,SAAO;AAAA,IACL,SAAS,OAAO,WAAW;AAAA,IAC3B,QAAQ,OAAO,UAAU;AAAA,IACzB,cAAc,OAAO;AAAA,EACvB;AACF;AAQO,SAAS,qBAAqB,QAAiC;AACpE,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;ACrHO,IAAM,qBAAqB;AAY3B,IAAM,0BAA0B;AAMhC,IAAM,2BAA2B;AAUjC,IAAM,+BAA+B;AAKrC,IAAM,mCAAmC;AAsFzC,SAAS,0BAA0B,SAAuC;AAC/E,QAAM,kBAAkB,QAAQ,SAAS,WAAW,KAAK,QAAQ,SAAS,aAAa;AAEvF,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AACF;;;AH1GA,IAAM,sBAAsBC,GAAE,MAAM;AAAA,EAClCA,GAAE,OAAO;AAAA,IACP,OAAOA,GAAE,OAAO;AAAA,MACd,SAASA,GAAE,OAAO;AAAA,MAClB,MAAMA,GAAE,OAAO,EAAE,QAAQ;AAAA,MACzB,MAAMA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,CAAC,EAAE,QAAQ;AAAA,IAClD,CAAC;AAAA,EACH,CAAC;AAAA,EACDA,GAAE,OAAO;AAAA,IACP,SAASA,GAAE,OAAO;AAAA,EACpB,CAAC;AACH,CAAC;AAID,IAAM,4BAA4BA,GAAE,OAAO;AAAA,EACzC,MAAMA,GAAE,QAAQ,MAAM;AAAA,EACtB,MAAMA,GAAE,OAAO;AACjB,CAAC;AAED,IAAM,gCAAgCA,GAAE,OAAO;AAAA,EAC7C,MAAMA,GAAE,QAAQ,UAAU;AAAA,EAC1B,UAAUA,GAAE,OAAO;AACrB,CAAC;AAED,IAAM,+BAA+BA,GAAE,OAAO;AAAA,EAC5C,MAAMA,GAAE,QAAQ,UAAU;AAAA,EAC1B,IAAIA,GAAE,OAAO;AAAA,EACb,MAAMA,GAAE,OAAO;AAAA,EACf,OAAOA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC;AACzC,CAAC;AAED,IAAM,6BAA6BA,GAAE,MAAM;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,yBAAyBA,GAAE,OAAO;AAAA,EACtC,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,EACxB,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,aAAaA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAChC,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,EAClC,SAASA,GAAE,MAAM,0BAA0B;AAAA,EAC3C,OAAOA,GACJ,OAAO;AAAA,IACN,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,IAClC,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,IACnC,yBAAyBA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC7C,6BAA6BA,GAAE,OAAO,EAAE,SAAS;AAAA,EACnD,CAAC,EACA,SAAS;AACd,CAAC;AAED,IAAM,4BAA4BA,GAAE,OAAO;AAAA,EACzC,MAAMA,GAAE,OAAO;AAAA,EACf,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAASA,GACN,OAAO;AAAA,IACN,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,IACxB,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,SAASA,GAAE,MAAMA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,IACvC,aAAaA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAChC,eAAeA,GAAE,OAAO,EAAE,QAAQ;AAAA,IAClC,OAAOA,GACJ,OAAO;AAAA,MACN,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,MAClC,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,IACrC,CAAC,EACA,SAAS;AAAA,EACd,CAAC,EACA,SAAS;AAAA,EACZ,eAAeA,GACZ,OAAO;AAAA,IACN,MAAMA,GAAE,OAAO;AAAA,IACf,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA,IACxB,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,OAAOA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACpD,CAAC,EACA,SAAS;AAAA,EACZ,OAAOA,GACJ,OAAO;AAAA,IACN,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,IAClC,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,IACjC,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,EACrC,CAAC,EACA,SAAS;AAAA,EACZ,OAAOA,GACJ,OAAO;AAAA,IACN,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,IAClC,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,EACrC,CAAC,EACA,SAAS;AACd,CAAC;AASD,IAAM,gCAAgCC,gCAA+B;AAAA,EACnE,aAAa;AAAA,EACb,gBAAgB,CAAC,UAA6B;AAC5C,QAAI,WAAW,OAAO;AACpB,aAAO,MAAM,MAAM;AAAA,IACrB;AACA,WAAO,MAAM;AAAA,EACf;AAAA,EACA,aAAa,CAAC,aACZ,SAAS,WAAW,OAAO,SAAS,WAAW,OAAO,SAAS,WAAW,OAAO,SAAS,UAAU;AACxG,CAAC;AASD,SAAS,cAAc,YAAoE;AACzF,UAAQ,YAAY;AAAA,IAClB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,SAAS,QAAQ,KAAK,WAAW;AAAA,IAC5C,KAAK;AACH,aAAO,EAAE,SAAS,cAAc,KAAK,WAAW;AAAA,IAClD,KAAK;AACH,aAAO,EAAE,SAAS,UAAU,KAAK,WAAW;AAAA,IAC9C;AACE,aAAO,EAAE,SAAS,SAAS,KAAK,cAAc,OAAU;AAAA,EAC5D;AACF;AAKA,SAAS,aAAa,OAKnB;AACD,QAAM,cAAc,OAAO,gBAAgB;AAC3C,QAAM,eAAe,OAAO,iBAAiB;AAC7C,QAAM,YAAY,OAAO,2BAA2B;AAEpD,SAAO;AAAA,IACL,aAAa;AAAA,MACX,OAAO;AAAA,MACP;AAAA,MACA,YAAY,OAAO;AAAA,MACnB,SAAS,cAAc;AAAA,IACzB;AAAA,IACA,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,IACA,KAAK;AAAA,EACP;AACF;AAKA,SAAS,aAAa,OAAuC;AAC3D,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK,eAAe,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,IACrE;AAAA,EACF,CAAC;AACH;AASO,IAAM,wBAAN,MAAuD;AAAA,EAQ5D,YAAY,SAA0B,UAA4B,QAAwB;AAP1F,SAAS,uBAAuB;AAQ9B,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,eAAe,OAAO,cAAcC;AAAA,EAC3C;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,IAAY,sBAA8B;AACxC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAqC;AACvC,UAAM,WAAW,0BAA0B,KAAK,OAAO;AACvD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG,KAAK,SAAS;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,IAAI,gBAAgB;AAClB,UAAM,WAAqC;AAAA,MACzC,WAAW,CAAC,kBAAkB;AAAA,IAChC;AACA,WAAO,KAAK,SAAS,iBAAiB,KAAK,OAAO,iBAAiB;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,QAAQ,SAAqC;AACzD,UAAM,EAAE,QAAQ,iBAAiB,aAAa,MAAM,MAAM,eAAe,OAAO,YAAY,gBAAgB,IAC1G;AAEF,UAAM,WAA8B,CAAC;AAGrC,UAAM,kBAAkB,MAAMC,sBAAqB;AAAA,MACjD,UAAU,KAAK;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAGD,UAAM,mBACJ,gCAAgC,iBAAiB,gBAAgB,KACjE,gCAAgC,KAAK,SAAS,gBAAgB;AAGhE,QAAI,QAAQ,MAAM;AAChB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAGA,UAAM,EAAE,QAAQ,SAAS,IAAI,MAAM,wBAAwB,MAAM;AAGjE,QAAI;AACJ,QAAI,cAAc,MAAM;AACtB,cAAQ,WAAW,MAAM;AAAA,QACvB,KAAK;AACH,4BAAkB,EAAE,MAAM,OAAO;AACjC;AAAA,QACF,KAAK;AACH,4BAAkB,EAAE,MAAM,OAAO;AACjC;AAAA,QACF,KAAK;AACH,4BAAkB,EAAE,MAAM,MAAM;AAChC;AAAA,QACF,KAAK;AACH,4BAAkB,EAAE,MAAM,QAAQ,MAAM,WAAW,SAAS;AAC5D;AAAA,MACJ;AAAA,IACF;AAGA,UAAM,gBAAgB,OAAO,OAAO,CAAC,MAAwC,EAAE,SAAS,UAAU;AAGlG,UAAM,OAAOC,wBAAuB;AAAA,MAClC,OAAO,KAAK;AAAA,MACZ,QAAQ,iBAAiB,UAAU;AAAA,MACnC;AAAA,MACA,YAAY,mBAAmB,KAAK,aAAa,mBAAmB;AAAA,MACpE;AAAA,MACA,OAAO;AAAA,MACP,gBAAgB,iBAAiB,iBAAiB;AAAA,MAClD,OAAO,aAAa,aAAa;AAAA,MACjC,aAAa;AAAA;AAAA,MAEb,GAAI,kBAAkB,WAAW;AAAA,QAC/B,UAAU;AAAA,UACR,MAAM;AAAA,UACN,eAAe,iBAAiB,gBAAgB,qBAAqB,iBAAiB,UAAU,QAAQ;AAAA,QAC1G;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,iBAAqD;AAAA,MACzD,GAAI,QAAQ,WAAW,CAAC;AAAA,IAC1B;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,SAA6E;AAC5F,UAAM,EAAE,MAAM,UAAU,eAAe,IAAI,MAAM,KAAK,QAAQ,OAAO;AAErE,UAAM;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,MACP;AAAA,IACF,IAAI,MAAMC,eAAc;AAAA,MACtB,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,MAC3B,SAASC,gBAAe,KAAK,OAAO,QAAQ,GAAG,gBAAgB,QAAQ,OAAO;AAAA,MAC9E;AAAA,MACA,uBAAuB;AAAA,MACvB,2BAA2BC,2BAA0B,sBAAsB;AAAA,MAC3E,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAGD,UAAM,WAAW;AAGjB,UAAM,UAAyC,CAAC;AAEhD,eAAW,SAAS,SAAS,SAAS;AACpC,cAAQ,MAAM,MAAM;AAAA,QAClB,KAAK;AACH,kBAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC;AAC/C;AAAA,QAEF,KAAK;AACH,kBAAQ,KAAK;AAAA,YACX,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,UACd,CAAC;AACD;AAAA,QAEF,KAAK;AACH,kBAAQ,KAAK;AAAA,YACX,MAAM;AAAA,YACN,YAAY,MAAM;AAAA,YAClB,UAAU,MAAM;AAAA,YAChB,OAAO,KAAK,UAAU,MAAM,KAAK;AAAA,UACnC,CAAC;AACD;AAAA,MACJ;AAAA,IACF;AAEA,UAAM,mBAA6C;AAAA,MACjD,CAAC,KAAK,mBAAmB,GAAG;AAAA,QAC1B,WAAW,kBAAkB,cAAc,KAAK;AAAA,QAChD,SAAS,SAAS;AAAA,QAClB,YAAY,SAAS;AAAA,QACrB,cAAc,SAAS;AAAA,MACzB;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,cAAc,cAAc,SAAS,WAAW;AAAA,MAChD,OAAO,aAAa,SAAS,KAAK;AAAA,MAClC;AAAA,MACA,SAAS,EAAE,KAAK;AAAA,MAChB,UAAU;AAAA,QACR,IAAI,SAAS;AAAA,QACb,SAAS,SAAS;AAAA,QAClB,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,SAA2E;AACxF,UAAM,EAAE,MAAM,UAAU,eAAe,IAAI,MAAM,KAAK,QAAQ,OAAO;AAErE,UAAM,aAAa;AAAA,MACjB,GAAG;AAAA,MACH,QAAQ;AAAA,IACV;AAEA,UAAM,EAAE,iBAAiB,OAAO,SAAS,IAAI,MAAMF,eAAc;AAAA,MAC/D,KAAK,GAAG,KAAK,OAAO,OAAO;AAAA,MAC3B,SAASC,gBAAe,KAAK,OAAO,QAAQ,GAAG,gBAAgB,QAAQ,OAAO;AAAA,MAC9E,MAAM;AAAA,MACN,uBAAuB;AAAA,MACvB,2BAA2BE,kCAAiC,yBAAyB;AAAA,MACrF,aAAa,QAAQ;AAAA,MACrB,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,UAAM,sBAAsB,KAAK;AACjC,UAAM,eAAe,KAAK;AAC1B,UAAM,0BAA0B;AAGhC,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI,uBAAuB;AAC3B,QAAI,eAA4C,EAAE,SAAS,SAAS,KAAK,OAAU;AACnF,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI,eAAe;AACnB,QAAI,oBAAoB;AACxB,QAAI,sBAAsB;AAE1B,WAAO;AAAA,MACL,QAAQ,SAAS;AAAA,QACf,IAAI,gBAA6E;AAAA,UAC/E,MAAM,YAAY;AAChB,uBAAW,QAAQ,EAAE,MAAM,gBAAgB,SAAS,CAAC;AAAA,UACvD;AAAA,UAEA,UAAU,OAAO,YAAY;AAC3B,gBAAI,CAAC,MAAM,SAAS;AAClB,yBAAW,QAAQ,EAAE,MAAM,SAAS,OAAO,MAAM,MAAM,CAAC;AACxD;AAAA,YACF;AAEA,kBAAM,OAAO,MAAM;AAEnB,oBAAQ,KAAK,MAAM;AAAA,cACjB,KAAK;AACH,oBAAI,KAAK,SAAS;AAChB,+BAAa,KAAK,QAAQ;AAC1B,kCAAgB,KAAK,QAAQ;AAC7B,sBAAI,KAAK,QAAQ,OAAO;AACtB,4BAAQ,aAAa,KAAK,QAAQ,KAAK;AAAA,kBACzC;AAEA,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN,IAAI;AAAA,oBACJ,SAAS;AAAA,kBACX,CAAC;AAAA,gBACH;AACA;AAAA,cAEF,KAAK;AACH,oBAAI,KAAK,eAAe;AACtB,qCAAmB,KAAK,cAAc;AACtC,sBAAI,KAAK,cAAc,SAAS,YAAY;AAC1C,wCAAoB,KAAK,cAAc,MAAM,aAAa;AAC1D,sCAAkB,KAAK,cAAc;AACrC,2CAAuB;AACvB,0CAAsB;AAGtB,wBAAI,cAAc;AAChB,iCAAW,QAAQ,EAAE,MAAM,YAAY,IAAI,SAAS,CAAC;AACrD,qCAAe;AAAA,oBACjB;AACA,wBAAI,mBAAmB;AACrB,iCAAW,QAAQ,EAAE,MAAM,iBAAiB,IAAI,cAAc,CAAC;AAC/D,0CAAoB;AAAA,oBACtB;AAEA,+BAAW,QAAQ;AAAA,sBACjB,MAAM;AAAA,sBACN,IAAI;AAAA,sBACJ,UAAU,mBAAmB;AAAA,oBAC/B,CAAC;AAAA,kBACH,WAAW,KAAK,cAAc,SAAS,QAAQ;AAC7C,wBAAI,CAAC,cAAc;AACjB,0BAAI,mBAAmB;AACrB,mCAAW,QAAQ,EAAE,MAAM,iBAAiB,IAAI,cAAc,CAAC;AAC/D,4CAAoB;AAAA,sBACtB;AACA,iCAAW,QAAQ,EAAE,MAAM,cAAc,IAAI,SAAS,CAAC;AACvD,qCAAe;AAAA,oBACjB;AAAA,kBACF,WAAW,KAAK,cAAc,SAAS,YAAY;AACjD,wBAAI,CAAC,mBAAmB;AACtB,0BAAI,cAAc;AAChB,mCAAW,QAAQ,EAAE,MAAM,YAAY,IAAI,SAAS,CAAC;AACrD,uCAAe;AAAA,sBACjB;AACA,iCAAW,QAAQ,EAAE,MAAM,mBAAmB,IAAI,cAAc,CAAC;AACjE,0CAAoB;AAAA,oBACtB;AAAA,kBACF;AAAA,gBACF;AACA;AAAA,cAEF,KAAK;AACH,oBAAI,KAAK,OAAO;AACd,sBAAI,KAAK,MAAM,SAAS,gBAAgB,KAAK,MAAM,MAAM;AACvD,wBAAI,CAAC,cAAc;AACjB,0BAAI,mBAAmB;AACrB,mCAAW,QAAQ,EAAE,MAAM,iBAAiB,IAAI,cAAc,CAAC;AAC/D,4CAAoB;AAAA,sBACtB;AACA,iCAAW,QAAQ,EAAE,MAAM,cAAc,IAAI,SAAS,CAAC;AACvD,qCAAe;AAAA,oBACjB;AACA,+BAAW,QAAQ;AAAA,sBACjB,MAAM;AAAA,sBACN,IAAI;AAAA,sBACJ,OAAO,KAAK,MAAM;AAAA,oBACpB,CAAC;AAAA,kBACH,WAAW,KAAK,MAAM,SAAS,oBAAoB,KAAK,MAAM,UAAU;AACtE,wBAAI,CAAC,mBAAmB;AACtB,0BAAI,cAAc;AAChB,mCAAW,QAAQ,EAAE,MAAM,YAAY,IAAI,SAAS,CAAC;AACrD,uCAAe;AAAA,sBACjB;AACA,iCAAW,QAAQ,EAAE,MAAM,mBAAmB,IAAI,cAAc,CAAC;AACjE,0CAAoB;AAAA,oBACtB;AACA,+BAAW,QAAQ;AAAA,sBACjB,MAAM;AAAA,sBACN,IAAI;AAAA,sBACJ,OAAO,KAAK,MAAM;AAAA,oBACpB,CAAC;AAAA,kBACH,WAAW,KAAK,MAAM,SAAS,sBAAsB,KAAK,MAAM,cAAc;AAC5E,4CAAwB,KAAK,MAAM;AACnC,+BAAW,QAAQ;AAAA,sBACjB,MAAM;AAAA,sBACN,IAAI,qBAAqB;AAAA,sBACzB,OAAO,KAAK,MAAM;AAAA,oBACpB,CAAC;AAAA,kBACH;AAAA,gBACF;AACA;AAAA,cAEF,KAAK;AACH,oBAAI,qBAAqB,cAAc,qBAAqB,CAAC,qBAAqB;AAEhF,6BAAW,QAAQ,EAAE,MAAM,kBAAkB,IAAI,kBAAkB,CAAC;AAEpE,6BAAW,QAAQ;AAAA,oBACjB,MAAM;AAAA,oBACN,YAAY;AAAA,oBACZ,UAAU,mBAAmB;AAAA,oBAC7B,OAAO;AAAA,kBACT,CAAC;AACD,wCAAsB;AAAA,gBACxB,WAAW,qBAAqB,UAAU,cAAc;AACtD,6BAAW,QAAQ,EAAE,MAAM,YAAY,IAAI,SAAS,CAAC;AACrD,iCAAe;AAAA,gBACjB,WAAW,qBAAqB,cAAc,mBAAmB;AAC/D,6BAAW,QAAQ,EAAE,MAAM,iBAAiB,IAAI,cAAc,CAAC;AAC/D,sCAAoB;AAAA,gBACtB;AACA,mCAAmB;AACnB,oCAAoB;AACpB,kCAAkB;AAClB,uCAAuB;AACvB;AAAA,cAEF,KAAK;AACH,oBAAI,KAAK,OAAO,aAAa;AAC3B,iCAAe,cAAc,KAAK,MAAM,WAAW;AAAA,gBACrD;AACA,oBAAI,KAAK,OAAO;AACd,0BAAQ,aAAa,KAAK,KAAK;AAAA,gBACjC;AACA;AAAA,cAEF,KAAK;AAEH,oBAAI,cAAc;AAChB,6BAAW,QAAQ,EAAE,MAAM,YAAY,IAAI,SAAS,CAAC;AAAA,gBACvD;AACA,oBAAI,mBAAmB;AACrB,6BAAW,QAAQ,EAAE,MAAM,iBAAiB,IAAI,cAAc,CAAC;AAAA,gBACjE;AAEA,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN;AAAA,kBACA,OAAO,SAAS,aAAa,CAAC,CAAC;AAAA,kBAC/B,kBAAkB;AAAA,oBAChB,CAAC,mBAAmB,GAAG;AAAA,sBACrB,WAAW,0BAA0B,cAAc,KAAK;AAAA,sBACxD,SAAS;AAAA,oBACX;AAAA,kBACF;AAAA,gBACF,CAAC;AACD;AAAA,cAEF,KAAK;AACH,2BAAW,QAAQ;AAAA,kBACjB,MAAM;AAAA,kBACN,OAAO,IAAI;AAAA,oBACR,KAAqD,OAAO,WAAW;AAAA,kBAC1E;AAAA,gBACF,CAAC;AACD;AAAA,YACJ;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,SAAS,EAAE,MAAM,WAAW;AAAA,MAC5B,UAAU;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;;;AItpBA,SAA+B,oBAAAC,yBAAyC;AACxE;AAAA,EAEE,uBAAAC;AAAA,EACA,uBAAAC;AAAA,EACA,wBAAAC;AAAA,OACK;AAgIA,SAAS,eAAe,UAAoC,CAAC,GAAqB;AACvF,QAAM,kBACJC,qBAAoB;AAAA,IAClB,cAAc,QAAQ;AAAA,IACtB,yBAAyB;AAAA,EAC3B,CAAC,KAAK;AAER,QAAM,UAAUC,sBAAqB,eAAe,KAAK;AAEzD,QAAM,aAAa,MAAM;AAEvB,QAAI,SAAS,QAAQ;AACrB,QAAI,CAAC,QAAQ;AACX,eAAS,QAAQ,IAAI,qBAAqB,QAAQ,IAAI;AAAA,IACxD;AACA,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAOC;AAAA,MACL;AAAA,QACE,aAAa;AAAA,QACb,qBAAqB;AAAA,QACrB,GAAG,QAAQ;AAAA,MACb;AAAA,MACA,oBAAoB,OAAO;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,kBAAkB,CAAC,UAA2B,yBAAyB,WAA6B,CAAC,MACzG,IAAI,sBAAsB,SAAS,UAAU;AAAA,IAC3C,UAAU;AAAA,IACV;AAAA,IACA,SAAS;AAAA,IACT,OAAO,QAAQ;AAAA,IACf,YAAY,QAAQ;AAAA,IACpB,sBAAsB,SAAS,wBAAwB,QAAQ;AAAA,IAC/D,eAAe,SAAS,iBAAiB,QAAQ;AAAA,EACnD,CAAC;AAEH,QAAM,WAA6B,CACjC,UAA2B,yBAC3B,aAC0B;AAC1B,QAAI,YAAY;AACd,YAAM,IAAI,MAAM,4DAA4D;AAAA,IAC9E;AAEA,WAAO,gBAAgB,SAAS,QAAQ;AAAA,EAC1C;AAEA,WAAS,uBAAuB;AAChC,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAEhB,WAAS,iBAAiB,CAAC,YAAoB;AAC7C,UAAM,IAAIC,kBAAiB,EAAE,SAAS,WAAW,iBAAiB,CAAC;AAAA,EACrE;AAEA,WAAS,aAAa,CAAC,YAAoB;AACzC,UAAM,IAAIA,kBAAiB,EAAE,SAAS,WAAW,aAAa,CAAC;AAAA,EACjE;AAEA,WAAS,iBAAiB,CAAC,YAAoB;AAC7C,UAAM,IAAIA,kBAAiB,EAAE,SAAS,WAAW,iBAAiB,CAAC;AAAA,EACrE;AAEA,SAAO;AACT;AA0BO,IAAM,WAAW,eAAe;","names":["z","kimiTools","UnsupportedFunctionalityError","UnsupportedFunctionalityError","z","kimiTools","toolCall","z","isImageMediaType","isVideoMediaType","isImageMediaType","isVideoMediaType","combineHeaders","createEventSourceResponseHandler","createJsonErrorResponseHandler","createJsonResponseHandler","generateId","parseProviderOptions","postJsonToApi","removeUndefinedEntries","z","UnsupportedFunctionalityError","convertToBase64","z","z","createJsonErrorResponseHandler","generateId","parseProviderOptions","removeUndefinedEntries","postJsonToApi","combineHeaders","createJsonResponseHandler","createEventSourceResponseHandler","NoSuchModelError","loadOptionalSetting","withUserAgentSuffix","withoutTrailingSlash","loadOptionalSetting","withoutTrailingSlash","withUserAgentSuffix","NoSuchModelError"]}
|
|
1
|
+
{"version":3,"sources":["../src/kimi-provider.ts","../src/chat/kimi-chat-language-model.ts","../src/core/errors.ts","../src/core/types.ts","../src/core/utils.ts","../src/tools/builtin-tools.ts","../src/tools/prepare-tools.ts","../src/chat/kimi-chat-messages.ts","../src/chat/kimi-chat-response.ts","../src/chat/kimi-chat-settings.ts","../src/files/file-cache.ts","../src/files/file-utils.ts","../src/files/kimi-file-client.ts","../src/files/attachment-processor.ts","../src/version.ts","../src/code/kimi-code-language-model.ts","../src/code/kimi-code-messages.ts","../src/code/kimi-code-settings.ts","../src/code/kimi-code-types.ts","../src/code/kimi-code-provider.ts"],"sourcesContent":["/**\n * Kimi provider factory.\n * @module\n */\n\nimport { type LanguageModelV3, NoSuchModelError, type ProviderV3 } from '@ai-sdk/provider';\nimport {\n type FetchFunction,\n loadApiKey,\n loadOptionalSetting,\n withUserAgentSuffix,\n withoutTrailingSlash\n} from '@ai-sdk/provider-utils';\nimport { KimiChatLanguageModel, type KimiChatModelId, type KimiChatSettings } from './chat';\nimport { KimiFileClient } from './files';\nimport { kimiTools } from './tools';\nimport { VERSION } from './version';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst GLOBAL_BASE_URL = 'https://api.moonshot.ai/v1';\nconst CN_BASE_URL = 'https://api.moonshot.cn/v1';\n\n// ============================================================================\n// Provider Settings\n// ============================================================================\n\n/**\n * Settings for creating a Kimi provider instance.\n */\nexport interface KimiProviderSettings {\n /**\n * Moonshot AI API key. Defaults to the MOONSHOT_API_KEY environment variable.\n */\n apiKey?: string;\n\n /**\n * Base URL override. Defaults to the global or China endpoint.\n */\n baseURL?: string;\n\n /**\n * Select the regional endpoint when baseURL is not provided.\n * - `global`: Use the global API endpoint (api.moonshot.ai)\n * - `cn`: Use the China API endpoint (api.moonshot.cn)\n *\n * @default 'global'\n */\n endpoint?: 'global' | 'cn';\n\n /**\n * Default headers for all requests.\n */\n headers?: Record<string, string | undefined>;\n\n /**\n * Custom fetch implementation.\n */\n fetch?: FetchFunction;\n\n /**\n * ID generator for tool call fallback IDs.\n */\n generateId?: () => string;\n\n /**\n * Enable JSON schema structured outputs by default.\n */\n supportsStructuredOutputs?: boolean;\n\n /**\n * Include usage details in streaming responses if supported.\n */\n includeUsageInStream?: boolean;\n\n /**\n * Override supported URL patterns for file parts.\n */\n supportedUrls?: LanguageModelV3['supportedUrls'];\n}\n\n// ============================================================================\n// Provider Interface\n// ============================================================================\n\n/**\n * The Kimi provider interface.\n */\nexport interface KimiProvider extends Omit<ProviderV3, 'specificationVersion'> {\n specificationVersion: 'v3';\n\n /**\n * Creates a chat language model.\n * @param modelId - The model identifier\n * @param settings - Optional model settings\n */\n (modelId: KimiChatModelId, settings?: KimiChatSettings): LanguageModelV3;\n\n /**\n * Creates a chat language model.\n * @param modelId - The model identifier\n * @param settings - Optional model settings\n */\n languageModel(modelId: KimiChatModelId, settings?: KimiChatSettings): LanguageModelV3;\n\n /**\n * Creates a chat language model (alias for languageModel).\n * @param modelId - The model identifier\n * @param settings - Optional model settings\n */\n chat(modelId: KimiChatModelId, settings?: KimiChatSettings): LanguageModelV3;\n\n /**\n * Built-in tools that can be used with Kimi models.\n */\n tools: typeof kimiTools;\n\n /**\n * File client for uploading and extracting content from files.\n * Pre-configured with the provider's API key and base URL.\n *\n * @example\n * ```ts\n * const kimi = createKimi();\n * const result = await kimi.files.uploadAndExtract({\n * data: pdfBuffer,\n * filename: 'document.pdf',\n * });\n * console.log(result.content);\n * ```\n */\n files: KimiFileClient;\n}\n\n// ============================================================================\n// Provider Factory\n// ============================================================================\n\n/**\n * Create a Kimi provider instance.\n *\n * @param options - Provider settings\n * @returns A configured Kimi provider\n *\n * @example\n * ```ts\n * import { createKimi } from 'kimi-vercel-ai-sdk-provider\n';\n *\n * const kimi = createKimi({\n * apiKey: process.env.MOONSHOT_API_KEY,\n * });\n *\n * const result = await generateText({\n * model: kimi('kimi-k2.5'),\n * prompt: 'Hello!',\n * });\n * ```\n *\n * @example\n * ```ts\n * // With web search enabled\n * const result = await generateText({\n * model: kimi('kimi-k2.5', { webSearch: true }),\n * prompt: 'What are the latest AI news?',\n * });\n * ```\n *\n * @example\n * ```ts\n * // With code interpreter\n * const result = await generateText({\n * model: kimi('kimi-k2.5', { codeInterpreter: true }),\n * prompt: 'Calculate the factorial of 20',\n * });\n * ```\n */\nexport function createKimi(options: KimiProviderSettings = {}): KimiProvider {\n const resolvedBaseURL =\n loadOptionalSetting({\n settingValue: options.baseURL,\n environmentVariableName: 'MOONSHOT_BASE_URL'\n }) ?? (options.endpoint === 'cn' ? CN_BASE_URL : GLOBAL_BASE_URL);\n\n const baseURL = withoutTrailingSlash(resolvedBaseURL) ?? GLOBAL_BASE_URL;\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'MOONSHOT_API_KEY',\n description: 'Moonshot'\n })}`,\n ...options.headers\n },\n `ai-sdk/kimi/${VERSION}`\n );\n\n const createChatModel = (modelId: KimiChatModelId, settings: KimiChatSettings = {}) =>\n new KimiChatLanguageModel(modelId, settings, {\n provider: 'kimi.chat',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n generateId: options.generateId,\n supportsStructuredOutputs: settings.supportsStructuredOutputs ?? options.supportsStructuredOutputs,\n includeUsageInStream: settings.includeUsageInStream ?? options.includeUsageInStream,\n supportedUrls: settings.supportedUrls ?? options.supportedUrls\n });\n\n const provider: KimiProvider = (modelId: KimiChatModelId, settings?: KimiChatSettings): KimiChatLanguageModel => {\n if (new.target) {\n throw new Error('The Kimi provider function cannot be called with new.');\n }\n\n return createChatModel(modelId, settings);\n };\n\n provider.specificationVersion = 'v3';\n provider.languageModel = createChatModel;\n provider.chat = createChatModel;\n provider.tools = kimiTools;\n provider.files = new KimiFileClient({\n baseURL,\n headers: getHeaders,\n fetch: options.fetch\n });\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n provider.rerankingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'rerankingModel' });\n };\n\n return provider;\n}\n\n/**\n * Default Kimi provider instance.\n *\n * Uses the MOONSHOT_API_KEY environment variable for authentication.\n *\n * @example\n * ```ts\n * import { kimi } from 'kimi-vercel-ai-sdk-provider\n';\n *\n * const result = await generateText({\n * model: kimi('kimi-k2.5'),\n * prompt: 'Hello!',\n * });\n * ```\n */\nexport const kimi = createKimi();\n","/**\n * Kimi chat language model implementation.\n * @module\n */\n\nimport {\n InvalidResponseDataError,\n type JSONValue,\n type LanguageModelV3,\n type LanguageModelV3CallOptions,\n type LanguageModelV3Content,\n type LanguageModelV3FinishReason,\n type LanguageModelV3GenerateResult,\n type LanguageModelV3StreamPart,\n type LanguageModelV3StreamResult,\n type SharedV3ProviderMetadata,\n type SharedV3Warning\n} from '@ai-sdk/provider';\nimport {\n type ParseResult,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonResponseHandler,\n generateId,\n isParsableJson,\n parseProviderOptions,\n postJsonToApi,\n removeUndefinedEntries\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { kimiErrorSchema, kimiFailedResponseHandler } from '../core';\nimport { type KimiCodeInterpreterToolOptions, type KimiWebSearchToolOptions, prepareKimiTools } from '../tools';\nimport { convertToKimiChatMessages } from './kimi-chat-messages';\nimport {\n convertKimiUsage,\n extractCodeInterpreterTokens,\n extractMessageContent,\n extractWebSearchTokens,\n getKimiRequestId,\n getResponseMetadata,\n mapKimiFinishReason\n} from './kimi-chat-response';\nimport {\n type KimiCachingConfig,\n type KimiChatConfig,\n type KimiChatModelId,\n type KimiChatSettings,\n type KimiProviderOptions,\n inferModelCapabilities,\n kimiProviderOptionsSchema\n} from './kimi-chat-settings';\n\n// ============================================================================\n// Language Model Implementation\n// ============================================================================\n\n/**\n * Kimi chat language model implementing LanguageModelV3.\n */\nexport class KimiChatLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3';\n readonly modelId: KimiChatModelId;\n\n private readonly config: KimiChatConfig;\n private readonly settings: KimiChatSettings;\n private readonly generateIdFn: () => string;\n private readonly supportsStructuredOutputs: boolean;\n\n constructor(modelId: KimiChatModelId, settings: KimiChatSettings, config: KimiChatConfig) {\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n this.generateIdFn = config.generateId ?? generateId;\n this.supportsStructuredOutputs = config.supportsStructuredOutputs ?? false;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get providerOptionsName(): string {\n return this.config.provider.split('.')[0].trim();\n }\n\n /**\n * Get the inferred or configured capabilities for this model.\n */\n get capabilities() {\n const inferred = inferModelCapabilities(this.modelId);\n return {\n ...inferred,\n ...this.settings.capabilities\n };\n }\n\n get supportedUrls() {\n const caps = this.capabilities;\n const patterns: Record<string, RegExp[]> = {\n 'image/*': [/^https?:\\/\\/.*$/i]\n };\n\n // Add video support for models that support it\n if (caps.videoInput) {\n patterns['video/*'] = [/^https?:\\/\\/.*$/i];\n }\n\n return this.settings.supportedUrls ?? this.config.supportedUrls ?? patterns;\n }\n\n private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n stopSequences,\n responseFormat,\n seed,\n providerOptions,\n tools,\n toolChoice\n }: LanguageModelV3CallOptions) {\n const warnings: SharedV3Warning[] = [];\n\n const deprecatedOptions = await parseProviderOptions({\n provider: 'moonshot',\n providerOptions,\n schema: kimiProviderOptionsSchema\n });\n\n if (deprecatedOptions != null) {\n warnings.push({\n type: 'other',\n message: \"The 'moonshot' key in providerOptions is deprecated. Use 'kimi' instead.\"\n });\n }\n\n const providerOptionsName = this.providerOptionsName;\n const kimiOptions = await parseProviderOptions({\n provider: providerOptionsName,\n providerOptions,\n schema: kimiProviderOptionsSchema\n });\n\n const options: KimiProviderOptions = {\n ...(deprecatedOptions ?? {}),\n ...(kimiOptions ?? {})\n };\n\n if (topK != null) {\n warnings.push({ type: 'unsupported', feature: 'topK' });\n }\n\n const strictJsonSchema = options.strictJsonSchema ?? true;\n\n if (responseFormat?.type === 'json' && responseFormat.schema != null && !this.supportsStructuredOutputs) {\n warnings.push({\n type: 'unsupported',\n feature: 'responseFormat',\n details: 'JSON schema response format requires structured outputs support.'\n });\n }\n\n // Resolve web search configuration from settings and provider options\n const webSearch = resolveBuiltinToolConfig(this.settings.webSearch, options.webSearch);\n\n // Resolve code interpreter configuration from settings and provider options\n const codeInterpreter = resolveBuiltinToolConfig(this.settings.codeInterpreter, options.codeInterpreter);\n\n // Resolve tool choice polyfill setting\n const toolChoicePolyfill = options.toolChoicePolyfill ?? this.settings.toolChoicePolyfill ?? true;\n\n const {\n tools: kimiTools,\n toolChoice: kimiToolChoice,\n toolWarnings,\n toolChoiceSystemMessage\n } = prepareKimiTools({\n tools,\n toolChoice,\n webSearch,\n codeInterpreter,\n toolChoicePolyfill\n });\n\n // Resolve caching configuration\n const caching = resolveCachingConfig(this.settings.caching, options.caching);\n\n // Build caching headers\n const cachingHeaders = buildCachingHeaders(caching);\n\n const passthroughOptions = getPassthroughOptions({\n providerOptions,\n providerOptionsName,\n deprecatedProviderOptionsName: 'moonshot',\n knownKeys: Object.keys(kimiProviderOptionsSchema.shape)\n });\n\n // Convert messages and optionally inject tool choice system message\n const messages = convertToKimiChatMessages(prompt);\n if (toolChoiceSystemMessage) {\n // Prepend the tool choice instruction as a system message\n messages.unshift({ role: 'system', content: toolChoiceSystemMessage });\n }\n\n // Apply model-specific defaults and constraints\n const caps = this.capabilities;\n\n // Resolve temperature: thinking models require locked temperature\n let resolvedTemperature = temperature;\n if (caps.temperatureLocked && caps.defaultTemperature !== undefined) {\n if (temperature !== undefined && temperature !== caps.defaultTemperature) {\n warnings.push({\n type: 'compatibility',\n feature: 'temperature',\n details: `Thinking models require temperature=${caps.defaultTemperature}. Your value (${temperature}) will be overridden.`\n });\n }\n resolvedTemperature = caps.defaultTemperature;\n }\n\n // Resolve max_tokens: use model default if not specified\n const resolvedMaxTokens = maxOutputTokens ?? caps.defaultMaxOutputTokens;\n\n const body = removeUndefinedEntries({\n model: this.modelId,\n messages,\n max_tokens: resolvedMaxTokens,\n temperature: resolvedTemperature,\n top_p: topP,\n frequency_penalty: frequencyPenalty,\n presence_penalty: presencePenalty,\n stop: stopSequences,\n seed,\n response_format:\n responseFormat?.type === 'json'\n ? this.supportsStructuredOutputs && responseFormat.schema != null\n ? {\n type: 'json_schema',\n json_schema: {\n schema: responseFormat.schema,\n strict: strictJsonSchema,\n name: responseFormat.name ?? 'response',\n description: responseFormat.description\n }\n }\n : { type: 'json_object' }\n : undefined,\n tools: kimiTools,\n tool_choice: kimiToolChoice,\n user: options.user,\n ...(kimiTools != null && options.parallelToolCalls != null\n ? { parallel_tool_calls: options.parallelToolCalls }\n : {}),\n ...passthroughOptions\n });\n\n const requestHeaders: Record<string, string | undefined> = {\n ...(options.requestId ? { 'X-Request-ID': options.requestId } : {}),\n ...(options.extraHeaders ?? {}),\n ...cachingHeaders\n };\n\n return {\n body,\n warnings: [...warnings, ...toolWarnings],\n requestHeaders\n };\n }\n\n async doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult> {\n const { body, warnings, requestHeaders } = await this.getArgs(options);\n\n const {\n responseHeaders,\n value: response,\n rawValue\n } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: combineHeaders(this.config.headers(), requestHeaders, options.headers),\n body,\n failedResponseHandler: kimiFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(kimiChatResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n\n const choice = response.choices[0];\n const content: Array<LanguageModelV3Content> = [];\n\n const { text, reasoning } = extractMessageContent(choice.message);\n\n if (reasoning.length > 0) {\n content.push({ type: 'reasoning', text: reasoning });\n }\n\n if (text.length > 0) {\n content.push({ type: 'text', text });\n }\n\n if (choice.message.tool_calls != null) {\n for (const toolCall of choice.message.tool_calls) {\n content.push({\n type: 'tool-call',\n toolCallId: toolCall.id ?? this.generateIdFn(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments ?? ''\n });\n }\n }\n\n // Extract built-in tool token usage from tool calls\n const webSearchTokens = extractWebSearchTokens(choice.message.tool_calls);\n const codeInterpreterTokens = extractCodeInterpreterTokens(choice.message.tool_calls);\n\n const providerMetadata = buildProviderMetadata({\n providerOptionsName: this.providerOptionsName,\n responseHeaders,\n webSearchTokens,\n codeInterpreterTokens\n });\n\n return {\n content,\n finishReason: {\n unified: mapKimiFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined\n },\n usage: convertKimiUsage(response.usage, webSearchTokens, codeInterpreterTokens),\n ...(providerMetadata ? { providerMetadata } : {}),\n request: { body },\n response: {\n ...getResponseMetadata(response),\n headers: responseHeaders,\n body: rawValue\n },\n warnings\n };\n }\n\n async doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult> {\n const { body, warnings, requestHeaders } = await this.getArgs(options);\n const streamBody = {\n ...body,\n stream: true,\n stream_options: this.config.includeUsageInStream ? { include_usage: true } : undefined\n };\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/chat/completions`,\n headers: combineHeaders(this.config.headers(), requestHeaders, options.headers),\n body: streamBody,\n failedResponseHandler: kimiFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(kimiChatChunkSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n\n const requestId = getKimiRequestId(responseHeaders);\n\n let finishReason: LanguageModelV3FinishReason = {\n unified: 'other',\n raw: undefined\n };\n let usage: z.infer<typeof kimiTokenUsageSchema> | undefined;\n\n let isFirstChunk = true;\n let isActiveText = false;\n let isActiveReasoning = false;\n\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n hasFinished: boolean;\n }> = [];\n\n const providerOptionsName = this.providerOptionsName;\n const _generateIdFn = this.generateIdFn;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<ParseResult<z.infer<typeof kimiChatChunkSchema>>, LanguageModelV3StreamPart>({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n if (!chunk.success) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n if ('error' in chunk.value) {\n finishReason = { unified: 'error', raw: undefined };\n const error = (chunk.value as { error?: { message?: string } }).error;\n controller.enqueue({\n type: 'error',\n error: error?.message ?? chunk.value\n });\n return;\n }\n\n const value = chunk.value as z.infer<typeof kimiChatChunkBaseSchema>;\n\n if (isFirstChunk) {\n isFirstChunk = false;\n controller.enqueue({\n type: 'response-metadata',\n ...getResponseMetadata(value)\n });\n }\n\n if (value.usage != null) {\n usage = value.usage;\n }\n\n const choice = value.choices[0];\n if (!choice) {\n return;\n }\n\n if (choice.finish_reason != null) {\n finishReason = {\n unified: mapKimiFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined\n };\n }\n\n const delta = choice.delta;\n if (!delta) {\n return;\n }\n\n const reasoningDelta = delta.reasoning_content ?? delta.reasoning;\n if (reasoningDelta) {\n if (!isActiveReasoning) {\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'text-0' });\n isActiveText = false;\n }\n controller.enqueue({\n type: 'reasoning-start',\n id: 'reasoning-0'\n });\n isActiveReasoning = true;\n }\n\n controller.enqueue({\n type: 'reasoning-delta',\n id: 'reasoning-0',\n delta: reasoningDelta\n });\n }\n\n if (delta.content) {\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n isActiveReasoning = false;\n }\n\n if (!isActiveText) {\n controller.enqueue({ type: 'text-start', id: 'text-0' });\n isActiveText = true;\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: 'text-0',\n delta: delta.content\n });\n }\n\n if (delta.tool_calls != null) {\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n isActiveReasoning = false;\n }\n\n for (const toolCallDelta of delta.tool_calls) {\n const index = toolCallDelta.index ?? toolCalls.length;\n\n if (toolCalls[index] == null) {\n if (toolCallDelta.id == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: \"Expected 'id' to be a string.\"\n });\n }\n\n if (toolCallDelta.function?.name == null) {\n throw new InvalidResponseDataError({\n data: toolCallDelta,\n message: \"Expected 'function.name' to be a string.\"\n });\n }\n\n controller.enqueue({\n type: 'tool-input-start',\n id: toolCallDelta.id,\n toolName: toolCallDelta.function.name\n });\n\n toolCalls[index] = {\n id: toolCallDelta.id,\n type: 'function',\n function: {\n name: toolCallDelta.function.name,\n arguments: toolCallDelta.function.arguments ?? ''\n },\n hasFinished: false\n };\n\n const toolCall = toolCalls[index];\n\n if (toolCall.function.arguments.length > 0) {\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCall.id,\n delta: toolCall.function.arguments\n });\n }\n\n if (isParsableJson(toolCall.function.arguments)) {\n controller.enqueue({ type: 'tool-input-end', id: toolCall.id });\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n input: toolCall.function.arguments\n });\n\n toolCall.hasFinished = true;\n }\n\n continue;\n }\n\n const toolCall = toolCalls[index];\n if (toolCall.hasFinished) {\n continue;\n }\n\n if (toolCallDelta.function?.arguments != null) {\n toolCall.function.arguments += toolCallDelta.function.arguments;\n }\n\n controller.enqueue({\n type: 'tool-input-delta',\n id: toolCall.id,\n delta: toolCallDelta.function?.arguments ?? ''\n });\n\n if (isParsableJson(toolCall.function.arguments)) {\n controller.enqueue({ type: 'tool-input-end', id: toolCall.id });\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n input: toolCall.function.arguments\n });\n\n toolCall.hasFinished = true;\n }\n }\n }\n },\n\n flush(controller) {\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n isActiveReasoning = false;\n }\n\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'text-0' });\n isActiveText = false;\n }\n\n for (const toolCall of toolCalls.filter((call) => !call.hasFinished)) {\n controller.enqueue({ type: 'tool-input-end', id: toolCall.id });\n controller.enqueue({\n type: 'tool-call',\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n input: toolCall.function.arguments\n });\n }\n\n // Extract built-in tool tokens from accumulated tool calls\n const webSearchTokens = extractWebSearchTokens(toolCalls);\n const codeInterpreterTokens = extractCodeInterpreterTokens(toolCalls);\n\n const providerMetadata: SharedV3ProviderMetadata | undefined =\n requestId || webSearchTokens != null || codeInterpreterTokens != null\n ? {\n [providerOptionsName]: {\n ...(requestId ? { requestId } : {}),\n ...(webSearchTokens != null ? { webSearchTokens } : {}),\n ...(codeInterpreterTokens != null ? { codeInterpreterTokens } : {})\n }\n }\n : undefined;\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertKimiUsage(usage, webSearchTokens, codeInterpreterTokens),\n ...(providerMetadata ? { providerMetadata } : {})\n });\n }\n })\n ),\n request: { body: streamBody },\n response: { headers: responseHeaders }\n };\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction buildProviderMetadata({\n providerOptionsName,\n responseHeaders,\n webSearchTokens,\n codeInterpreterTokens\n}: {\n providerOptionsName: string;\n responseHeaders?: Record<string, string>;\n webSearchTokens?: number;\n codeInterpreterTokens?: number;\n}): SharedV3ProviderMetadata | undefined {\n const requestId = getKimiRequestId(responseHeaders);\n\n if (!requestId && webSearchTokens == null && codeInterpreterTokens == null) {\n return undefined;\n }\n\n return {\n [providerOptionsName]: {\n ...(requestId ? { requestId } : {}),\n ...(webSearchTokens != null ? { webSearchTokens } : {}),\n ...(codeInterpreterTokens != null ? { codeInterpreterTokens } : {})\n }\n };\n}\n\nfunction getPassthroughOptions({\n providerOptions,\n providerOptionsName,\n deprecatedProviderOptionsName,\n knownKeys\n}: {\n providerOptions: LanguageModelV3CallOptions['providerOptions'];\n providerOptionsName: string;\n deprecatedProviderOptionsName: string;\n knownKeys: string[];\n}) {\n const rawOptions = [providerOptions?.[deprecatedProviderOptionsName], providerOptions?.[providerOptionsName]].filter(\n (entry): entry is Record<string, JSONValue | undefined> => entry != null && typeof entry === 'object'\n );\n\n const passthrough: Record<string, JSONValue | undefined> = {};\n\n for (const options of rawOptions) {\n for (const [key, value] of Object.entries(options ?? {})) {\n if (!knownKeys.includes(key)) {\n passthrough[key] = value;\n }\n }\n }\n\n return passthrough;\n}\n\ntype BuiltinToolOptions = boolean | KimiWebSearchToolOptions | KimiCodeInterpreterToolOptions | undefined;\n\nfunction resolveBuiltinToolConfig<T extends BuiltinToolOptions>(\n settingsConfig: T | undefined,\n optionsConfig: T | undefined\n): T | undefined {\n // Provider options take precedence\n if (optionsConfig != null) {\n if (typeof optionsConfig === 'boolean') {\n return optionsConfig ? ({ enabled: true } as T) : undefined;\n }\n const config = optionsConfig as { enabled: boolean };\n return config.enabled ? optionsConfig : undefined;\n }\n\n // Fall back to settings\n if (settingsConfig != null) {\n if (typeof settingsConfig === 'boolean') {\n return settingsConfig ? ({ enabled: true } as T) : undefined;\n }\n const config = settingsConfig as { enabled: boolean };\n return config.enabled ? settingsConfig : undefined;\n }\n\n return undefined;\n}\n\ntype CachingOptions = boolean | KimiCachingConfig | undefined;\n\n/**\n * Resolve caching configuration from settings and provider options.\n */\nfunction resolveCachingConfig(\n settingsConfig: CachingOptions,\n optionsConfig: CachingOptions\n): KimiCachingConfig | undefined {\n // Provider options take precedence\n const config = optionsConfig ?? settingsConfig;\n\n if (config == null) {\n return undefined;\n }\n\n if (typeof config === 'boolean') {\n return config ? { enabled: true } : undefined;\n }\n\n return config.enabled ? config : undefined;\n}\n\n/**\n * Build HTTP headers for context caching.\n * Kimi uses specific headers to control caching behavior.\n */\nfunction buildCachingHeaders(caching: KimiCachingConfig | undefined): Record<string, string> {\n if (!caching?.enabled) {\n return {};\n }\n\n const headers: Record<string, string> = {\n 'X-Kimi-Cache': 'enabled'\n };\n\n if (caching.cacheKey) {\n headers['X-Kimi-Cache-Key'] = caching.cacheKey;\n }\n\n if (caching.ttlSeconds) {\n headers['X-Kimi-Cache-TTL'] = String(caching.ttlSeconds);\n }\n\n if (caching.resetCache) {\n headers['X-Kimi-Cache-Reset'] = 'true';\n }\n\n return headers;\n}\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\nconst kimiTokenUsageSchema = z\n .object({\n prompt_tokens: z.number().nullish(),\n completion_tokens: z.number().nullish(),\n total_tokens: z.number().nullish(),\n prompt_tokens_details: z\n .object({\n cached_tokens: z.number().nullish()\n })\n .nullish(),\n completion_tokens_details: z\n .object({\n reasoning_tokens: z.number().nullish()\n })\n .nullish()\n })\n .nullish();\n\n/**\n * Schema for content parts in response messages.\n * Can be text, image, or other content types.\n */\nconst kimiContentPartSchema = z.union([\n z.object({\n type: z.literal('text'),\n text: z.string()\n }),\n z.object({\n type: z.literal('image_url'),\n image_url: z.object({\n url: z.string()\n })\n }),\n z.looseObject({\n type: z.string()\n })\n]);\n\nconst kimiChatResponseSchema = z.looseObject({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n message: z.object({\n role: z.string().nullish(),\n content: z.union([z.string(), z.array(kimiContentPartSchema)]).nullish(),\n reasoning_content: z.string().nullish(),\n reasoning: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n id: z.string().nullish(),\n function: z.object({\n name: z.string(),\n arguments: z.string().nullish()\n })\n })\n )\n .nullish()\n }),\n finish_reason: z.string().nullish()\n })\n ),\n usage: kimiTokenUsageSchema\n});\n\nconst kimiChatChunkBaseSchema = z.looseObject({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n choices: z.array(\n z.object({\n delta: z\n .object({\n role: z.enum(['assistant']).nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n reasoning: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n index: z.number().nullish(),\n id: z.string().nullish(),\n function: z.object({\n name: z.string().nullish(),\n arguments: z.string().nullish()\n })\n })\n )\n .nullish()\n })\n .nullish(),\n finish_reason: z.string().nullish()\n })\n ),\n usage: kimiTokenUsageSchema\n});\n\nconst kimiChatChunkSchema = z.union([kimiChatChunkBaseSchema, kimiErrorSchema]);\n","/**\n * Custom error classes for the Kimi provider.\n * @module\n */\n\nimport { createJsonErrorResponseHandler } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n// ============================================================================\n// Error Schema\n// ============================================================================\n\n/**\n * Zod schema for Kimi API error responses.\n * Handles both standard OpenAI-style errors and simple message errors.\n */\nexport const kimiErrorSchema = z.union([\n z.object({\n error: z.object({\n message: z.string(),\n type: z.string().nullish(),\n param: z.string().nullish(),\n code: z.union([z.string(), z.number()]).nullish(),\n request_id: z.string().nullish()\n })\n }),\n z.object({\n message: z.string()\n })\n]);\n\n/**\n * Type for Kimi API error data.\n */\nexport type KimiErrorData = z.infer<typeof kimiErrorSchema>;\n\n// ============================================================================\n// Error Handler\n// ============================================================================\n\n/**\n * Failed response handler for Kimi API errors.\n * Parses error responses and creates appropriate error objects.\n */\nexport const kimiFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: kimiErrorSchema,\n errorToMessage: (error: KimiErrorData) => {\n if ('error' in error) {\n return error.error.message;\n }\n return error.message;\n },\n isRetryable: (response) =>\n response.status === 408 || response.status === 409 || response.status === 429 || response.status >= 500\n});\n\n// ============================================================================\n// Custom Error Classes\n// ============================================================================\n\n/**\n * Base error class for Kimi provider errors.\n */\nexport class KimiError extends Error {\n readonly code: string;\n readonly statusCode?: number;\n\n constructor(message: string, code: string, statusCode?: number) {\n super(message);\n this.name = 'KimiError';\n this.code = code;\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Error thrown when authentication fails.\n */\nexport class KimiAuthenticationError extends KimiError {\n constructor(message: string = 'Invalid API key or authentication failed') {\n super(message, 'authentication_error', 401);\n this.name = 'KimiAuthenticationError';\n }\n}\n\n/**\n * Error thrown when rate limit is exceeded.\n */\nexport class KimiRateLimitError extends KimiError {\n readonly retryAfter?: number;\n\n constructor(message: string = 'Rate limit exceeded', retryAfter?: number) {\n super(message, 'rate_limit_error', 429);\n this.name = 'KimiRateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Error thrown when the request is invalid.\n */\nexport class KimiValidationError extends KimiError {\n constructor(message: string, param?: string) {\n super(param ? `${message} (param: ${param})` : message, 'validation_error', 400);\n this.name = 'KimiValidationError';\n }\n}\n\n/**\n * Error thrown when a model is not found.\n */\nexport class KimiModelNotFoundError extends KimiError {\n readonly modelId: string;\n\n constructor(modelId: string) {\n super(`Model '${modelId}' not found`, 'model_not_found', 404);\n this.name = 'KimiModelNotFoundError';\n this.modelId = modelId;\n }\n}\n\n/**\n * Error thrown when content is filtered.\n */\nexport class KimiContentFilterError extends KimiError {\n constructor(message: string = 'Content was filtered due to policy violation') {\n super(message, 'content_filter', 400);\n this.name = 'KimiContentFilterError';\n }\n}\n\n/**\n * Error thrown when context length is exceeded.\n */\nexport class KimiContextLengthError extends KimiError {\n constructor(message: string = 'Context length exceeded') {\n super(message, 'context_length_exceeded', 400);\n this.name = 'KimiContextLengthError';\n }\n}\n","/**\n * Core types for the Kimi provider.\n * @module\n */\n\nimport type { LanguageModelV3 } from '@ai-sdk/provider';\n\n// ============================================================================\n// Model IDs\n// ============================================================================\n\n/**\n * Available Kimi chat model IDs.\n *\n * @remarks\n * - `kimi-k2.5` - Latest flagship model with multimodal support\n * - `kimi-k2.5-thinking` - K2.5 with always-on deep reasoning\n * - `kimi-k2-turbo` - Fast, cost-effective model\n * - `kimi-k2-thinking` - K2 with always-on deep reasoning\n */\nexport type KimiChatModelId = 'kimi-k2.5' | 'kimi-k2.5-thinking' | 'kimi-k2-turbo' | 'kimi-k2-thinking' | (string & {});\n\n// ============================================================================\n// Model Capabilities\n// ============================================================================\n\n/**\n * Capabilities that can be detected from model ID patterns or explicitly set.\n */\nexport interface KimiModelCapabilities {\n /**\n * Whether the model supports thinking/reasoning mode.\n * Models with `-thinking` suffix have this enabled by default.\n */\n thinking?: boolean;\n\n /**\n * Whether the model always uses thinking mode (cannot be disabled).\n * Thinking models like `kimi-k2.5-thinking` have this set to true.\n */\n alwaysThinking?: boolean;\n\n /**\n * Whether the model supports image inputs.\n */\n imageInput?: boolean;\n\n /**\n * Whether the model supports video inputs.\n * Currently only kimi-k2.5 models support video.\n */\n videoInput?: boolean;\n\n /**\n * Maximum context window size in tokens.\n */\n maxContextSize?: number;\n\n /**\n * Whether the model supports tool/function calling.\n */\n toolCalling?: boolean;\n\n /**\n * Whether the model supports JSON mode.\n */\n jsonMode?: boolean;\n\n /**\n * Whether the model supports structured outputs.\n */\n structuredOutputs?: boolean;\n\n /**\n * Default temperature for the model.\n * Thinking models require temperature=1.0 for optimal reasoning.\n */\n defaultTemperature?: number;\n\n /**\n * Whether temperature is locked (cannot be changed).\n * Thinking models have this set to true.\n */\n temperatureLocked?: boolean;\n\n /**\n * Default max output tokens for the model.\n * Thinking models need higher limits to avoid truncated reasoning.\n */\n defaultMaxOutputTokens?: number;\n}\n\n/**\n * Default temperature for thinking models.\n * Kimi thinking models require temperature=1.0 for optimal reasoning quality.\n */\nexport const THINKING_MODEL_TEMPERATURE = 1.0;\n\n/**\n * Default max output tokens for thinking models.\n * Higher limit ensures reasoning traces aren't truncated.\n */\nexport const THINKING_MODEL_DEFAULT_MAX_TOKENS = 32768;\n\n/**\n * Default max output tokens for standard models.\n */\nexport const STANDARD_MODEL_DEFAULT_MAX_TOKENS = 4096;\n\n/**\n * Infer model capabilities from the model ID.\n *\n * @param modelId - The model identifier\n * @returns Inferred capabilities based on model name patterns\n *\n * @remarks\n * This function automatically detects model capabilities and sets\n * appropriate defaults:\n * - Thinking models (`-thinking` suffix) get temperature=1.0 locked\n * - Thinking models get 32k default max_tokens to avoid truncation\n * - K2.5 models get video input support\n *\n * @example\n * ```ts\n * const caps = inferModelCapabilities('kimi-k2.5-thinking');\n * // {\n * // thinking: true,\n * // alwaysThinking: true,\n * // videoInput: true,\n * // temperatureLocked: true,\n * // defaultTemperature: 1.0,\n * // defaultMaxOutputTokens: 32768,\n * // ...\n * // }\n * ```\n */\nexport function inferModelCapabilities(modelId: string): KimiModelCapabilities {\n const isThinkingModel = modelId.includes('-thinking');\n const isK25Model = modelId.includes('k2.5') || modelId.includes('k2-5');\n\n return {\n thinking: isThinkingModel,\n alwaysThinking: isThinkingModel,\n imageInput: true, // All Kimi models support images\n videoInput: isK25Model, // Only K2.5 models support video\n maxContextSize: 256_000, // 256k context window\n toolCalling: true,\n jsonMode: true,\n structuredOutputs: true,\n // Thinking models require temperature=1.0 for optimal reasoning\n defaultTemperature: isThinkingModel ? THINKING_MODEL_TEMPERATURE : undefined,\n temperatureLocked: isThinkingModel,\n // Thinking models need higher token limits to avoid truncated reasoning\n defaultMaxOutputTokens: isThinkingModel ? THINKING_MODEL_DEFAULT_MAX_TOKENS : STANDARD_MODEL_DEFAULT_MAX_TOKENS\n };\n}\n\n// ============================================================================\n// Provider Configuration\n// ============================================================================\n\n/**\n * Configuration for the chat language model.\n * @internal\n */\nexport interface KimiChatConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string | undefined>;\n fetch?: typeof globalThis.fetch;\n generateId?: () => string;\n supportsStructuredOutputs?: boolean;\n includeUsageInStream?: boolean;\n supportedUrls?: LanguageModelV3['supportedUrls'];\n}\n\n// ============================================================================\n// API Response Types\n// ============================================================================\n\n/**\n * Token usage information from Kimi API.\n */\nexport interface KimiTokenUsage {\n prompt_tokens?: number | null;\n completion_tokens?: number | null;\n total_tokens?: number | null;\n prompt_tokens_details?: {\n cached_tokens?: number | null;\n } | null;\n completion_tokens_details?: {\n reasoning_tokens?: number | null;\n } | null;\n}\n\n/**\n * Response metadata from Kimi API.\n */\nexport interface KimiResponseMetadata {\n id?: string | null;\n model?: string | null;\n created?: number | null;\n}\n","/**\n * Utility functions for the Kimi provider.\n * @module\n */\n\nimport type { JSONObject, LanguageModelV3FinishReason, LanguageModelV3Usage } from '@ai-sdk/provider';\nimport type { KimiResponseMetadata, KimiTokenUsage } from './types';\n\n// ============================================================================\n// Finish Reason Mapping\n// ============================================================================\n\n/**\n * Map Kimi finish reasons to standard AI SDK finish reasons.\n *\n * @param finishReason - The raw finish reason from Kimi API\n * @returns The mapped unified finish reason\n */\nexport function mapKimiFinishReason(finishReason: string | null | undefined): LanguageModelV3FinishReason['unified'] {\n switch (finishReason) {\n case 'stop':\n return 'stop';\n case 'length':\n return 'length';\n case 'content_filter':\n return 'content-filter';\n case 'tool_calls':\n case 'function_call':\n return 'tool-calls';\n default:\n return 'other';\n }\n}\n\n// ============================================================================\n// Usage Conversion\n// ============================================================================\n\n/**\n * Extended usage information including web search and code interpreter tokens.\n */\nexport interface KimiExtendedUsage extends LanguageModelV3Usage {\n /**\n * Tokens used by the built-in web search tool.\n */\n webSearchTokens?: number;\n\n /**\n * Tokens used by the built-in code interpreter.\n */\n codeInterpreterTokens?: number;\n}\n\n/**\n * Convert Kimi usage data to standard AI SDK usage format.\n *\n * @param usage - The raw usage data from Kimi API\n * @param webSearchTokens - Optional web search token count\n * @param codeInterpreterTokens - Optional code interpreter token count\n * @returns Standardized usage object\n */\nexport function convertKimiUsage(\n usage: KimiTokenUsage | null | undefined,\n webSearchTokens?: number,\n codeInterpreterTokens?: number\n): KimiExtendedUsage {\n if (usage == null) {\n return {\n inputTokens: {\n total: undefined,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined\n },\n outputTokens: {\n total: undefined,\n text: undefined,\n reasoning: undefined\n },\n raw: undefined,\n ...(webSearchTokens != null ? { webSearchTokens } : {}),\n ...(codeInterpreterTokens != null ? { codeInterpreterTokens } : {})\n };\n }\n\n const promptTokens = usage.prompt_tokens ?? 0;\n const completionTokens = usage.completion_tokens ?? 0;\n const cacheReadTokens = usage.prompt_tokens_details?.cached_tokens ?? 0;\n const reasoningTokens = usage.completion_tokens_details?.reasoning_tokens ?? 0;\n\n // Convert to JSONObject for the raw field\n const rawUsage: JSONObject = {\n prompt_tokens: usage.prompt_tokens ?? undefined,\n completion_tokens: usage.completion_tokens ?? undefined,\n total_tokens: usage.total_tokens ?? undefined,\n ...(usage.prompt_tokens_details\n ? {\n prompt_tokens_details: {\n cached_tokens: usage.prompt_tokens_details.cached_tokens ?? undefined\n }\n }\n : {}),\n ...(usage.completion_tokens_details\n ? {\n completion_tokens_details: {\n reasoning_tokens: usage.completion_tokens_details.reasoning_tokens ?? undefined\n }\n }\n : {})\n };\n\n return {\n inputTokens: {\n total: promptTokens,\n noCache: promptTokens - cacheReadTokens,\n cacheRead: cacheReadTokens,\n cacheWrite: undefined\n },\n outputTokens: {\n total: completionTokens,\n text: completionTokens - reasoningTokens,\n reasoning: reasoningTokens\n },\n raw: rawUsage,\n ...(webSearchTokens != null ? { webSearchTokens } : {}),\n ...(codeInterpreterTokens != null ? { codeInterpreterTokens } : {})\n };\n}\n\n// ============================================================================\n// Response Metadata\n// ============================================================================\n\n/**\n * Extract response metadata from Kimi API response.\n *\n * @param response - The raw response metadata\n * @returns Formatted response metadata\n */\nexport function getResponseMetadata(response: KimiResponseMetadata) {\n return {\n id: response.id ?? undefined,\n modelId: response.model ?? undefined,\n timestamp: response.created != null ? new Date(response.created * 1000) : undefined\n };\n}\n\n/**\n * Extract request ID from response headers.\n *\n * @param headers - Response headers\n * @returns The request ID if found\n */\nexport function getKimiRequestId(headers?: Record<string, string>): string | undefined {\n if (!headers) {\n return undefined;\n }\n\n const lowerHeaders = Object.fromEntries(Object.entries(headers).map(([key, value]) => [key.toLowerCase(), value]));\n\n return lowerHeaders['x-request-id'] || lowerHeaders['x-trace-id'] || lowerHeaders['x-moonshot-request-id'];\n}\n\n// ============================================================================\n// Message Content Extraction\n// ============================================================================\n\n/**\n * Extract text and reasoning content from a message.\n *\n * @param message - The message object from API response\n * @returns Extracted text and reasoning content\n */\nexport function extractMessageContent(message: {\n content?: unknown;\n reasoning_content?: string | null;\n reasoning?: string | null;\n}): { text: string; reasoning: string } {\n let text = '';\n let reasoning = '';\n\n if (typeof message.content === 'string') {\n text = message.content;\n } else if (Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part && typeof part === 'object') {\n const candidate = part as Record<string, unknown>;\n if (candidate.type === 'text' && typeof candidate.text === 'string') {\n text += candidate.text;\n }\n if (candidate.type === 'thinking' && typeof candidate.thinking === 'string') {\n reasoning += candidate.thinking;\n }\n if (candidate.type === 'reasoning' && typeof candidate.text === 'string') {\n reasoning += candidate.text;\n }\n }\n }\n }\n\n if (typeof message.reasoning_content === 'string') {\n reasoning += message.reasoning_content;\n }\n\n if (typeof message.reasoning === 'string') {\n reasoning += message.reasoning;\n }\n\n return { text, reasoning };\n}\n\n// ============================================================================\n// Multi-turn Reasoning Utilities\n// ============================================================================\n\n/**\n * Information about reasoning content in a conversation.\n */\nexport interface ReasoningAnalysis {\n /** Total number of messages with reasoning content */\n messagesWithReasoning: number;\n /** Total reasoning tokens (estimated by character count / 4) */\n estimatedReasoningTokens: number;\n /** Whether reasoning is properly preserved in the conversation */\n isPreserved: boolean;\n /** Messages that are missing expected reasoning content */\n missingReasoningIndices: number[];\n}\n\n/**\n * Analyze reasoning content preservation in a conversation.\n *\n * This utility helps verify that reasoning content is being properly\n * preserved across multi-turn conversations with thinking models.\n * Kimi requires reasoning content to be maintained in the message\n * history for logical continuity in agentic/tool-calling scenarios.\n *\n * @param messages - Array of messages to analyze\n * @returns Analysis of reasoning preservation\n *\n * @example\n * ```ts\n * const analysis = analyzeReasoningPreservation(messages);\n * if (!analysis.isPreserved) {\n * console.warn('Reasoning content missing from messages:', analysis.missingReasoningIndices);\n * }\n * ```\n */\nexport function analyzeReasoningPreservation(\n messages: Array<{\n role: string;\n content?: unknown;\n reasoning_content?: string | null;\n reasoning?: string | null;\n }>\n): ReasoningAnalysis {\n let messagesWithReasoning = 0;\n let totalReasoningChars = 0;\n const missingReasoningIndices: number[] = [];\n\n // Track whether we've seen a tool call that should have reasoning preserved\n let expectReasoningAfterToolCall = false;\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n\n if (message.role === 'assistant') {\n const { reasoning } = extractMessageContent(message);\n\n if (reasoning.length > 0) {\n messagesWithReasoning++;\n totalReasoningChars += reasoning.length;\n expectReasoningAfterToolCall = false;\n } else if (expectReasoningAfterToolCall) {\n // This assistant message should have reasoning from the previous turn\n missingReasoningIndices.push(i);\n }\n\n // Check if this message has tool calls\n if ('tool_calls' in message && Array.isArray(message.tool_calls) && message.tool_calls.length > 0) {\n expectReasoningAfterToolCall = true;\n }\n } else if (message.role === 'tool') {\n // After a tool response, we expect the next assistant message to potentially have reasoning\n expectReasoningAfterToolCall = true;\n }\n }\n\n return {\n messagesWithReasoning,\n estimatedReasoningTokens: Math.ceil(totalReasoningChars / 4),\n isPreserved: missingReasoningIndices.length === 0,\n missingReasoningIndices\n };\n}\n\n/**\n * Check if a conversation is suitable for thinking models.\n *\n * Thinking models work best with:\n * - Complex reasoning tasks\n * - Multi-step problem solving\n * - Tasks requiring chain-of-thought\n *\n * This helper provides guidance on whether a thinking model would benefit\n * the conversation.\n *\n * @param messageCount - Number of messages in the conversation\n * @param hasToolCalls - Whether the conversation includes tool calls\n * @param estimatedComplexity - Estimated task complexity (0-1)\n * @returns Recommendation on using thinking models\n */\nexport function recommendThinkingModel(\n messageCount: number,\n hasToolCalls: boolean,\n estimatedComplexity: number\n): { recommended: boolean; reason: string } {\n // Thinking models are recommended for:\n // 1. Complex tasks (complexity > 0.5)\n // 2. Agentic scenarios with tool calls\n // 3. Multi-turn conversations where reasoning continuity matters\n\n if (estimatedComplexity > 0.7) {\n return {\n recommended: true,\n reason: 'High complexity task benefits from extended reasoning'\n };\n }\n\n if (hasToolCalls && messageCount > 2) {\n return {\n recommended: true,\n reason: 'Multi-turn tool usage benefits from reasoning preservation'\n };\n }\n\n if (estimatedComplexity > 0.5) {\n return {\n recommended: true,\n reason: 'Moderate complexity may benefit from reasoning'\n };\n }\n\n return {\n recommended: false,\n reason: 'Standard model sufficient for this task'\n };\n}\n","/**\n * Built-in tools for Kimi API.\n *\n * Kimi provides server-side tools that can be invoked during chat completions:\n * - `$web_search`: Search the web for information\n * - `$code`: Execute code using Kimi's code interpreter\n *\n * @module\n */\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Kimi's built-in web search tool identifier.\n * This tool allows Kimi to search the web for up-to-date information.\n */\nexport const KIMI_WEB_SEARCH_TOOL_NAME = '$web_search';\n\n/**\n * Kimi's built-in code interpreter tool identifier.\n * This tool allows Kimi to execute code and return results.\n */\nexport const KIMI_CODE_INTERPRETER_TOOL_NAME = '$code';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Configuration for Kimi's built-in web search tool.\n */\nexport interface KimiWebSearchConfig {\n /**\n * Whether to include search results in the response.\n * When true, the search results will be included in the tool output.\n */\n search_result?: boolean;\n /**\n * Allow additional configuration options.\n */\n [key: string]: unknown;\n}\n\n/**\n * Configuration for Kimi's built-in code interpreter tool.\n */\nexport interface KimiCodeInterpreterConfig {\n /**\n * Maximum execution time in seconds.\n * Default varies by model and API tier.\n */\n timeout?: number;\n\n /**\n * Whether to return execution output.\n * When true, stdout/stderr will be included in results.\n */\n include_output?: boolean;\n\n /**\n * Allow additional configuration options.\n */\n [key: string]: unknown;\n}\n\n/**\n * A Kimi built-in tool definition.\n * These are handled server-side by Kimi's API.\n */\nexport interface KimiBuiltinTool {\n type: 'builtin_function';\n function: {\n name: string;\n config?: Record<string, unknown>;\n };\n}\n\n// ============================================================================\n// Web Search Tool\n// ============================================================================\n\n/**\n * Configuration options for the web search tool.\n */\nexport interface KimiWebSearchToolOptions {\n /**\n * Whether the web search tool is enabled.\n */\n enabled: boolean;\n\n /**\n * Optional configuration for the web search tool.\n */\n config?: KimiWebSearchConfig;\n}\n\nexport type KimiWebSearchToolConfig = KimiWebSearchToolOptions;\n\n/**\n * Create a Kimi built-in web search tool definition.\n *\n * @param config - Optional configuration for the web search tool\n * @returns A built-in tool definition for $web_search\n *\n * @example\n * ```ts\n * // Basic usage\n * const tool = createWebSearchTool();\n *\n * // With configuration\n * const tool = createWebSearchTool({ search_result: true });\n * ```\n */\nexport function createWebSearchTool(config?: KimiWebSearchConfig): KimiBuiltinTool {\n return {\n type: 'builtin_function',\n function: {\n name: KIMI_WEB_SEARCH_TOOL_NAME,\n ...(config ? { config } : {})\n }\n };\n}\n\nexport function createKimiWebSearchTool(config?: KimiWebSearchConfig): KimiBuiltinTool {\n return createWebSearchTool(config);\n}\n\n// ============================================================================\n// Code Interpreter Tool\n// ============================================================================\n\n/**\n * Configuration options for the code interpreter tool.\n */\nexport interface KimiCodeInterpreterToolOptions {\n /**\n * Whether the code interpreter tool is enabled.\n */\n enabled: boolean;\n\n /**\n * Optional configuration for the code interpreter tool.\n */\n config?: KimiCodeInterpreterConfig;\n}\n\n/**\n * Create a Kimi built-in code interpreter tool definition.\n *\n * @param config - Optional configuration for the code interpreter tool\n * @returns A built-in tool definition for $code\n *\n * @example\n * ```ts\n * // Basic usage\n * const tool = createCodeInterpreterTool();\n *\n * // With configuration\n * const tool = createCodeInterpreterTool({ timeout: 30, include_output: true });\n * ```\n */\nexport function createCodeInterpreterTool(config?: KimiCodeInterpreterConfig): KimiBuiltinTool {\n return {\n type: 'builtin_function',\n function: {\n name: KIMI_CODE_INTERPRETER_TOOL_NAME,\n ...(config ? { config } : {})\n }\n };\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Check if a tool name is a Kimi built-in tool.\n * Built-in tools are prefixed with '$'.\n *\n * @param toolName - The tool name to check\n * @returns True if the tool is a built-in tool\n */\nexport function isBuiltinToolName(toolName: string): boolean {\n return toolName.startsWith('$');\n}\n\n/**\n * Check if a tool name is the web search tool.\n *\n * @param toolName - The tool name to check\n * @returns True if the tool is the web search tool\n */\nexport function isWebSearchTool(toolName: string): boolean {\n return toolName === KIMI_WEB_SEARCH_TOOL_NAME;\n}\n\n/**\n * Check if a tool name is the code interpreter tool.\n *\n * @param toolName - The tool name to check\n * @returns True if the tool is the code interpreter tool\n */\nexport function isCodeInterpreterTool(toolName: string): boolean {\n return toolName === KIMI_CODE_INTERPRETER_TOOL_NAME;\n}\n\n// ============================================================================\n// Provider Tool Definitions\n// ============================================================================\n\n/**\n * Create provider-level tool definitions for use with the AI SDK.\n * These can be passed directly to the tools option.\n */\nexport const kimiTools = {\n /**\n * Create a web search tool for use with Kimi models.\n *\n * @param config - Optional configuration\n * @returns A provider tool definition\n *\n * @example\n * ```ts\n * import { kimi, kimiTools } from 'kimi-vercel-ai-sdk-provider\n';\n *\n * const result = await generateText({\n * model: kimi('kimi-k2.5'),\n * tools: {\n * webSearch: kimiTools.webSearch(),\n * },\n * prompt: 'What are the latest AI news?',\n * });\n * ```\n */\n webSearch: (config?: KimiWebSearchConfig) => {\n return {\n type: 'provider' as const,\n id: 'kimi.webSearch',\n args: createWebSearchTool(config)\n };\n },\n\n /**\n * Create a code interpreter tool for use with Kimi models.\n *\n * @param config - Optional configuration\n * @returns A provider tool definition\n *\n * @example\n * ```ts\n * import { kimi, kimiTools } from 'kimi-vercel-ai-sdk-provider\n';\n *\n * const result = await generateText({\n * model: kimi('kimi-k2.5'),\n * tools: {\n * codeInterpreter: kimiTools.codeInterpreter(),\n * },\n * prompt: 'Calculate the factorial of 10',\n * });\n * ```\n */\n codeInterpreter: (config?: KimiCodeInterpreterConfig) => {\n return {\n type: 'provider' as const,\n id: 'kimi.codeInterpreter',\n args: createCodeInterpreterTool(config)\n };\n }\n};\n","/**\n * Tool preparation utilities for Kimi API.\n * @module\n */\n\nimport {\n type LanguageModelV3CallOptions,\n type LanguageModelV3ProviderTool,\n type SharedV3Warning,\n UnsupportedFunctionalityError\n} from '@ai-sdk/provider';\nimport {\n type KimiBuiltinTool,\n type KimiCodeInterpreterToolOptions,\n type KimiWebSearchToolOptions,\n createCodeInterpreterTool,\n createWebSearchTool\n} from './builtin-tools';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A standard function tool for Kimi API.\n */\nexport interface KimiFunctionTool {\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n strict?: boolean;\n };\n}\n\n/**\n * Union of all tool types supported by Kimi API.\n */\nexport type KimiTool = KimiFunctionTool | KimiBuiltinTool;\n\n/**\n * Options for preparing tools.\n */\nexport interface PrepareToolsOptions {\n /**\n * The tools from the call options.\n */\n tools: LanguageModelV3CallOptions['tools'];\n\n /**\n * The tool choice from the call options.\n */\n toolChoice?: LanguageModelV3CallOptions['toolChoice'];\n\n /**\n * Web search configuration.\n */\n webSearch?: boolean | KimiWebSearchToolOptions;\n\n /**\n * Code interpreter configuration.\n */\n codeInterpreter?: boolean | KimiCodeInterpreterToolOptions;\n\n /**\n * Enable tool choice polyfill for unsupported modes.\n * When true, uses system message injection to simulate\n * `required` and `tool` choices.\n */\n toolChoicePolyfill?: boolean;\n}\n\n/**\n * Result of preparing tools.\n */\nexport interface PrepareToolsResult {\n /**\n * The prepared tools for the API request.\n */\n tools: KimiTool[] | undefined;\n\n /**\n * The tool choice setting for the API request.\n */\n toolChoice: 'auto' | 'none' | undefined;\n\n /**\n * Any warnings generated during tool preparation.\n */\n toolWarnings: SharedV3Warning[];\n\n /**\n * System message to inject for tool choice polyfill.\n * This should be prepended to the messages array.\n */\n toolChoiceSystemMessage?: string;\n}\n\n// ============================================================================\n// Main Function\n// ============================================================================\n\n/**\n * Prepare tools for a Kimi API request.\n *\n * This function processes user-defined tools and built-in tools,\n * converting them to the format expected by the Kimi API.\n *\n * When `toolChoicePolyfill` is enabled, the function will generate\n * system messages to simulate unsupported tool choice modes:\n * - `required`: Injects a message instructing the model to use a tool\n * - `tool`: Injects a message instructing the model to use a specific tool\n *\n * @param options - Tool preparation options\n * @returns Prepared tools, tool choice, warnings, and optional system message\n */\nexport function prepareKimiTools({\n tools,\n toolChoice,\n webSearch,\n codeInterpreter,\n toolChoicePolyfill = true\n}: PrepareToolsOptions): PrepareToolsResult {\n tools = tools?.length ? tools : undefined;\n\n const toolWarnings: SharedV3Warning[] = [];\n const kimiTools: KimiTool[] = [];\n\n // Add built-in web search tool if enabled\n if (webSearch) {\n const config = typeof webSearch === 'boolean' ? undefined : webSearch.config;\n kimiTools.push(createWebSearchTool(config));\n }\n\n // Add built-in code interpreter tool if enabled\n if (codeInterpreter) {\n const config = typeof codeInterpreter === 'boolean' ? undefined : codeInterpreter.config;\n kimiTools.push(createCodeInterpreterTool(config));\n }\n\n // Process user-defined tools\n if (tools != null) {\n for (const tool of tools) {\n if (tool.type === 'provider') {\n // Check if this is a Kimi built-in tool\n const builtinTool = tryConvertToKimiBuiltinTool(tool);\n if (builtinTool) {\n kimiTools.push(builtinTool);\n continue;\n }\n\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`\n });\n continue;\n }\n\n // Sanitize schema for Kimi compatibility\n const sanitizedSchema = sanitizeToolSchema(tool.inputSchema);\n\n kimiTools.push({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: sanitizedSchema\n // Don't pass strict mode to Kimi - it may cause issues\n // ...(tool.strict != null ? { strict: tool.strict } : {})\n }\n });\n }\n }\n\n // Return undefined if no tools\n if (kimiTools.length === 0) {\n return { tools: undefined, toolChoice: undefined, toolWarnings };\n }\n\n // Handle tool choice\n if (toolChoice == null) {\n return { tools: kimiTools, toolChoice: undefined, toolWarnings };\n }\n\n switch (toolChoice.type) {\n case 'auto':\n case 'none':\n return { tools: kimiTools, toolChoice: toolChoice.type, toolWarnings };\n\n case 'required': {\n if (toolChoicePolyfill) {\n // Generate system message to force tool usage\n const toolNames = kimiTools.map((t) => (t.type === 'function' ? t.function.name : t.function.name)).join(', ');\n const systemMessage = generateRequiredToolMessage(toolNames);\n\n toolWarnings.push({\n type: 'compatibility',\n feature: 'toolChoice.required',\n details: 'Using tool choice polyfill with system message injection.'\n });\n\n return {\n tools: kimiTools,\n toolChoice: 'auto',\n toolWarnings,\n toolChoiceSystemMessage: systemMessage\n };\n }\n\n toolWarnings.push({\n type: 'compatibility',\n feature: 'toolChoice.required',\n details: 'Moonshot does not support required tool choice. Falling back to auto.'\n });\n return { tools: kimiTools, toolChoice: 'auto', toolWarnings };\n }\n\n case 'tool': {\n if (toolChoicePolyfill) {\n // Generate system message to force specific tool\n const systemMessage = generateSpecificToolMessage(toolChoice.toolName);\n\n toolWarnings.push({\n type: 'compatibility',\n feature: `toolChoice.tool:${toolChoice.toolName}`,\n details: 'Using tool choice polyfill with system message injection.'\n });\n\n return {\n tools: kimiTools,\n toolChoice: 'auto',\n toolWarnings,\n toolChoiceSystemMessage: systemMessage\n };\n }\n\n toolWarnings.push({\n type: 'compatibility',\n feature: `toolChoice.tool:${toolChoice.toolName}`,\n details: 'Moonshot does not support forcing a specific tool. Falling back to auto.'\n });\n return { tools: kimiTools, toolChoice: 'auto', toolWarnings };\n }\n\n default: {\n const _exhaustiveCheck: never = toolChoice;\n throw new UnsupportedFunctionalityError({\n functionality: `tool choice type: ${_exhaustiveCheck}`\n });\n }\n }\n}\n\n// ============================================================================\n// Tool Choice Polyfill Messages\n// ============================================================================\n\n/**\n * Generate a system message to force the model to use a tool.\n */\nfunction generateRequiredToolMessage(toolNames: string): string {\n return `IMPORTANT INSTRUCTION: You MUST use one of the available tools (${toolNames}) to respond to the user's request. Do NOT provide a direct text response without first calling a tool. Always invoke a tool to complete this task.`;\n}\n\n/**\n * Generate a system message to force the model to use a specific tool.\n */\nfunction generateSpecificToolMessage(toolName: string): string {\n return `IMPORTANT INSTRUCTION: You MUST use the \"${toolName}\" tool to respond to this request. Do NOT use any other tool or provide a direct text response. Call the \"${toolName}\" tool with appropriate parameters.`;\n}\n\n// ============================================================================\n// Schema Sanitization\n// ============================================================================\n\n/**\n * JSON Schema keywords that may cause issues with Kimi's API.\n * These are removed during sanitization to improve compatibility.\n */\nconst UNSUPPORTED_SCHEMA_KEYWORDS = [\n '$schema',\n '$id',\n '$ref',\n '$defs',\n 'definitions',\n 'if',\n 'then',\n 'else',\n 'allOf',\n 'anyOf',\n 'oneOf',\n 'not',\n 'patternProperties',\n 'additionalItems',\n 'contains',\n 'propertyNames',\n 'const',\n 'contentMediaType',\n 'contentEncoding',\n 'examples',\n '$comment'\n] as const;\n\n/**\n * Sanitize a JSON Schema for better Kimi API compatibility.\n *\n * This function removes advanced schema keywords that Kimi may not\n * fully support, while preserving the essential structure for validation.\n *\n * @param schema - The original JSON Schema\n * @returns A sanitized schema safe for Kimi\n */\nfunction sanitizeToolSchema(schema: unknown): unknown {\n if (schema === null || schema === undefined) {\n return schema;\n }\n\n if (Array.isArray(schema)) {\n return schema.map(sanitizeToolSchema);\n }\n\n if (typeof schema !== 'object') {\n return schema;\n }\n\n const sanitized: Record<string, unknown> = {};\n const schemaObj = schema as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(schemaObj)) {\n // Skip unsupported keywords\n if (UNSUPPORTED_SCHEMA_KEYWORDS.includes(key as (typeof UNSUPPORTED_SCHEMA_KEYWORDS)[number])) {\n continue;\n }\n\n // Recursively sanitize nested objects\n if (key === 'properties' && typeof value === 'object' && value !== null) {\n const props: Record<string, unknown> = {};\n for (const [propKey, propValue] of Object.entries(value as Record<string, unknown>)) {\n props[propKey] = sanitizeToolSchema(propValue);\n }\n sanitized[key] = props;\n } else if (key === 'items' && typeof value === 'object') {\n sanitized[key] = sanitizeToolSchema(value);\n } else if (key === 'additionalProperties' && typeof value === 'object') {\n sanitized[key] = sanitizeToolSchema(value);\n } else {\n sanitized[key] = value;\n }\n }\n\n return sanitized;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Try to convert a provider-defined tool to a Kimi built-in tool.\n * Returns undefined if the tool is not a Kimi built-in tool.\n */\nfunction tryConvertToKimiBuiltinTool(tool: LanguageModelV3ProviderTool): KimiBuiltinTool | undefined {\n // Check if this is a Kimi provider tool (id starts with 'kimi.')\n if (!tool.id.startsWith('kimi.')) {\n return undefined;\n }\n\n // Check if the args indicate a builtin_function type\n const args = tool.args;\n if (\n args &&\n typeof args === 'object' &&\n 'type' in args &&\n args.type === 'builtin_function' &&\n 'function' in args &&\n typeof args.function === 'object'\n ) {\n const fn = args.function as { name?: string; config?: Record<string, unknown> };\n if (typeof fn.name === 'string') {\n return {\n type: 'builtin_function',\n function: {\n name: fn.name,\n ...(fn.config ? { config: fn.config } : {})\n }\n };\n }\n }\n\n return undefined;\n}\n","/**\n * Message conversion utilities for Kimi API.\n * @module\n */\n\nimport {\n type LanguageModelV3Prompt,\n type LanguageModelV3ToolResultPart,\n UnsupportedFunctionalityError\n} from '@ai-sdk/provider';\nimport { convertToBase64 } from '@ai-sdk/provider-utils';\nimport { isBuiltinToolName } from '../tools';\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/**\n * A Kimi chat message.\n */\nexport type KimiChatMessage =\n | {\n role: 'system';\n content: string;\n }\n | {\n role: 'user';\n content: string | Array<KimiChatContentPart>;\n }\n | {\n role: 'assistant';\n content: string | null;\n reasoning_content?: string;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }>;\n }\n | {\n role: 'tool';\n tool_call_id: string;\n content: string;\n };\n\n/**\n * A content part in a user message.\n */\nexport type KimiChatContentPart =\n | { type: 'text'; text: string }\n | { type: 'image_url'; image_url: { url: string } }\n | { type: 'video_url'; video_url: { url: string } };\n\n/**\n * A sequence of Kimi chat messages.\n */\nexport type KimiChatPrompt = Array<KimiChatMessage>;\n\n// ============================================================================\n// Supported Media Types\n// ============================================================================\n\nconst SUPPORTED_IMAGE_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/*'];\n\nconst SUPPORTED_VIDEO_TYPES = ['video/mp4', 'video/webm', 'video/ogg', 'video/*'];\n\n// ============================================================================\n// Message Conversion\n// ============================================================================\n\n/**\n * Convert AI SDK prompt format to Kimi chat messages.\n *\n * @param prompt - The AI SDK prompt\n * @returns Kimi chat messages\n */\nexport function convertToKimiChatMessages(prompt: LanguageModelV3Prompt): KimiChatPrompt {\n const messages: KimiChatPrompt = [];\n\n for (const { role, content } of prompt) {\n switch (role) {\n case 'system': {\n messages.push({ role: 'system', content });\n break;\n }\n case 'user': {\n if (content.length === 1 && content[0].type === 'text') {\n messages.push({ role: 'user', content: content[0].text });\n break;\n }\n\n messages.push({\n role: 'user',\n content: content.map((part) => {\n switch (part.type) {\n case 'text':\n return { type: 'text' as const, text: part.text };\n case 'file': {\n // Handle image files\n if (isImageMediaType(part.mediaType)) {\n return convertImagePart(part);\n }\n\n // Handle video files (Kimi K2.5 supports video)\n if (isVideoMediaType(part.mediaType)) {\n return convertVideoPart(part);\n }\n\n // Handle text files\n if (part.mediaType.startsWith('text/')) {\n const text =\n part.data instanceof URL\n ? part.data.toString()\n : typeof part.data === 'string'\n ? part.data\n : new TextDecoder().decode(part.data);\n\n return { type: 'text' as const, text };\n }\n\n throw new UnsupportedFunctionalityError({\n functionality: `file part media type ${part.mediaType}`\n });\n }\n default: {\n const _exhaustiveCheck: never = part;\n throw new Error(`Unsupported part type: ${_exhaustiveCheck}`);\n }\n }\n })\n });\n break;\n }\n case 'assistant': {\n let text = '';\n let reasoning = '';\n const toolCalls: Array<{\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n }> = [];\n\n for (const part of content) {\n switch (part.type) {\n case 'text': {\n text += part.text;\n break;\n }\n case 'reasoning': {\n reasoning += part.text;\n break;\n }\n case 'tool-call': {\n toolCalls.push({\n id: part.toolCallId,\n type: 'function',\n function: {\n name: part.toolName,\n arguments: JSON.stringify(part.input)\n }\n });\n break;\n }\n case 'file': {\n // Assistant file parts are not directly supported by Kimi API\n // We could convert images to text descriptions, but for now skip\n break;\n }\n case 'tool-result': {\n // Tool results in assistant messages are unusual but handle gracefully\n // These would typically be in a 'tool' role message\n break;\n }\n default: {\n const _exhaustiveCheck: never = part;\n throw new Error(`Unsupported assistant part: ${_exhaustiveCheck}`);\n }\n }\n }\n\n messages.push({\n role: 'assistant',\n content: text.length > 0 ? text : null,\n ...(reasoning.length > 0 ? { reasoning_content: reasoning } : {}),\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {})\n });\n break;\n }\n case 'tool': {\n for (const toolResponse of content) {\n if (toolResponse.type === 'tool-approval-response') {\n continue;\n }\n\n messages.push({\n role: 'tool',\n tool_call_id: toolResponse.toolCallId,\n content: serializeToolResult(toolResponse)\n });\n }\n break;\n }\n default: {\n const _exhaustiveCheck: never = role;\n throw new Error(`Unsupported role: ${_exhaustiveCheck}`);\n }\n }\n }\n\n return messages;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction isImageMediaType(mediaType: string): boolean {\n return mediaType.startsWith('image/') || SUPPORTED_IMAGE_TYPES.includes(mediaType);\n}\n\nfunction isVideoMediaType(mediaType: string): boolean {\n return mediaType.startsWith('video/') || SUPPORTED_VIDEO_TYPES.includes(mediaType);\n}\n\nfunction convertImagePart(part: { mediaType: string; data: URL | Uint8Array | string }): {\n type: 'image_url';\n image_url: { url: string };\n} {\n const mediaType = part.mediaType === 'image/*' ? 'image/jpeg' : part.mediaType;\n\n const url =\n part.data instanceof URL ? part.data.toString() : `data:${mediaType};base64,${convertToBase64(part.data)}`;\n\n return { type: 'image_url', image_url: { url } };\n}\n\nfunction convertVideoPart(part: { mediaType: string; data: URL | Uint8Array | string }): {\n type: 'video_url';\n video_url: { url: string };\n} {\n // Video must be provided as a URL - base64 inline video is not practical\n if (!(part.data instanceof URL)) {\n throw new UnsupportedFunctionalityError({\n functionality: 'inline video data (video must be provided as a URL)'\n });\n }\n\n return { type: 'video_url', video_url: { url: part.data.toString() } };\n}\n\nfunction serializeToolResult(toolResponse: LanguageModelV3ToolResultPart): string {\n const { toolName } = toolResponse;\n const output = toolResponse.output;\n\n // For built-in tools like $web_search, just pass through the arguments\n // The Kimi API expects the tool result to be the same as what was passed\n if (isBuiltinToolName(toolName)) {\n return serializeBuiltinToolResult(output);\n }\n\n // Standard tool result serialization\n switch (output.type) {\n case 'text':\n case 'error-text':\n return output.value;\n case 'execution-denied':\n return output.reason ?? 'Tool execution denied.';\n case 'json':\n case 'error-json':\n case 'content':\n return JSON.stringify(output.value);\n default: {\n const _exhaustiveCheck: never = output;\n return JSON.stringify(_exhaustiveCheck);\n }\n }\n}\n\nfunction serializeBuiltinToolResult(output: LanguageModelV3ToolResultPart['output']): string {\n // For built-in tools, we need to pass through the result as-is\n // The model expects the arguments it passed to be echoed back\n switch (output.type) {\n case 'text':\n case 'error-text':\n return output.value;\n case 'json':\n case 'error-json':\n case 'content':\n return JSON.stringify(output.value);\n case 'execution-denied':\n return output.reason ?? 'Tool execution denied.';\n default: {\n const _exhaustiveCheck: never = output;\n return JSON.stringify(_exhaustiveCheck);\n }\n }\n}\n","/**\n * Response processing utilities for Kimi API.\n * @module\n */\n\nimport { KIMI_CODE_INTERPRETER_TOOL_NAME, KIMI_WEB_SEARCH_TOOL_NAME } from '../tools';\n\nexport type { KimiExtendedUsage, KimiTokenUsage } from '../core';\nexport {\n convertKimiUsage,\n extractMessageContent,\n getKimiRequestId,\n getResponseMetadata,\n mapKimiFinishReason\n} from '../core';\n\n// ============================================================================\n// Built-in Tool Token Extraction\n// ============================================================================\n\n/**\n * Tool call structure for token extraction.\n */\ninterface ToolCallForTokens {\n function: { name: string; arguments?: string | null };\n}\n\n/**\n * Extract total_tokens from $web_search tool call arguments.\n * The Kimi API includes usage information in the tool call arguments.\n *\n * @param toolCalls - The tool calls from the response\n * @returns The total web search tokens, or undefined if no web search was used\n */\nexport function extractWebSearchTokens(toolCalls: Array<ToolCallForTokens> | null | undefined): number | undefined {\n return extractBuiltinToolTokens(toolCalls, KIMI_WEB_SEARCH_TOOL_NAME);\n}\n\n/**\n * Extract total_tokens from $code tool call arguments.\n * The Kimi API includes usage information in the tool call arguments.\n *\n * @param toolCalls - The tool calls from the response\n * @returns The total code interpreter tokens, or undefined if no code was executed\n */\nexport function extractCodeInterpreterTokens(\n toolCalls: Array<ToolCallForTokens> | null | undefined\n): number | undefined {\n return extractBuiltinToolTokens(toolCalls, KIMI_CODE_INTERPRETER_TOOL_NAME);\n}\n\n/**\n * Extract tokens from a specific built-in tool.\n */\nfunction extractBuiltinToolTokens(\n toolCalls: Array<ToolCallForTokens> | null | undefined,\n toolName: string\n): number | undefined {\n if (!toolCalls) {\n return undefined;\n }\n\n let totalTokens = 0;\n let foundTool = false;\n\n for (const toolCall of toolCalls) {\n if (toolCall.function.name === toolName) {\n foundTool = true;\n\n if (toolCall.function.arguments) {\n try {\n const args = JSON.parse(toolCall.function.arguments);\n if (typeof args.total_tokens === 'number') {\n totalTokens += args.total_tokens;\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n\n return foundTool ? totalTokens : undefined;\n}\n","/**\n * Chat model settings and provider options schema.\n * @module\n */\n\nimport type { LanguageModelV3 } from '@ai-sdk/provider';\nimport type { KimiModelCapabilities } from '../core';\nimport type { KimiCodeInterpreterToolOptions, KimiWebSearchToolOptions } from '../tools';\nimport { z } from 'zod/v4';\n\n// ============================================================================\n// Re-exports\n// ============================================================================\n\nexport type {\n KimiChatConfig,\n KimiChatModelId,\n KimiModelCapabilities\n} from '../core';\nexport { inferModelCapabilities } from '../core';\n\n// ============================================================================\n// Context Caching Types\n// ============================================================================\n\n/**\n * Configuration for context caching.\n * Enables cost reduction for long, repeated prompts.\n */\nexport interface KimiCachingConfig {\n /**\n * Enable context caching for this request.\n */\n enabled: boolean;\n\n /**\n * Optional cache key for identifying cached context.\n * Use the same key across requests to hit the same cache.\n */\n cacheKey?: string;\n\n /**\n * Time-to-live for the cache in seconds.\n * Defaults to API default (typically 3600 seconds / 1 hour).\n */\n ttlSeconds?: number;\n\n /**\n * Reset the cache even if a matching cache exists.\n */\n resetCache?: boolean;\n}\n\n// ============================================================================\n// Chat Settings\n// ============================================================================\n\n/**\n * Settings for creating a Kimi chat model instance.\n */\nexport interface KimiChatSettings {\n /**\n * Enable JSON schema structured outputs when a schema is provided.\n */\n supportsStructuredOutputs?: boolean;\n\n /**\n * Request usage metrics during streaming (if supported by the API).\n */\n includeUsageInStream?: boolean;\n\n /**\n * Override supported URL patterns for file parts.\n */\n supportedUrls?: LanguageModelV3['supportedUrls'];\n\n /**\n * Enable the built-in web search tool.\n * When true, Kimi can search the web to answer questions.\n * You can also pass a configuration object for more control.\n */\n webSearch?: boolean | KimiWebSearchToolOptions;\n\n /**\n * Enable the built-in code interpreter tool.\n * When true, Kimi can execute code to solve problems.\n * You can also pass a configuration object for more control.\n */\n codeInterpreter?: boolean | KimiCodeInterpreterToolOptions;\n\n /**\n * Override inferred model capabilities.\n */\n capabilities?: Partial<KimiModelCapabilities>;\n\n /**\n * Enable tool choice polyfill for unsupported tool choice modes.\n * When true (default), uses system message injection to simulate\n * `required` and `tool` choices that Kimi doesn't natively support.\n *\n * @default true\n */\n toolChoicePolyfill?: boolean;\n\n /**\n * Enable automatic file handling for experimental_attachments.\n * When true, PDFs and documents will be automatically uploaded\n * to Kimi's file API and their content injected into the context.\n *\n * @default false\n */\n autoFileUpload?: boolean;\n\n /**\n * Context caching configuration.\n * Reduces costs by up to 90% for repeated long prompts.\n */\n caching?: boolean | KimiCachingConfig;\n}\n\n// ============================================================================\n// Provider Options Schema\n// ============================================================================\n\n/**\n * Zod schema for caching configuration.\n */\nexport const kimiCachingConfigSchema = z.object({\n enabled: z.boolean(),\n cacheKey: z.string().optional(),\n ttlSeconds: z.number().optional(),\n resetCache: z.boolean().optional()\n});\n\n/**\n * Zod schema for validating provider options passed to individual calls.\n */\nexport const kimiProviderOptionsSchema = z.object({\n /**\n * A unique identifier representing your end-user.\n */\n user: z.string().optional(),\n\n /**\n * Whether to use strict JSON schema validation when supported.\n */\n strictJsonSchema: z.boolean().optional(),\n\n /**\n * Optional request ID to correlate logs.\n */\n requestId: z.string().optional(),\n\n /**\n * Optional extra headers for this call.\n */\n extraHeaders: z.record(z.string(), z.string()).optional(),\n\n /**\n * Whether the provider should allow parallel tool calls.\n */\n parallelToolCalls: z.boolean().optional(),\n\n /**\n * Enable or configure the built-in web search tool for this request.\n * This allows Kimi to search the web to help answer questions.\n */\n webSearch: z\n .union([\n z.boolean(),\n z.object({\n enabled: z.boolean(),\n config: z\n .object({\n search_result: z.boolean().optional()\n })\n .optional()\n })\n ])\n .optional(),\n\n /**\n * Enable or configure the built-in code interpreter tool for this request.\n * This allows Kimi to execute code to help solve problems.\n */\n codeInterpreter: z\n .union([\n z.boolean(),\n z.object({\n enabled: z.boolean(),\n config: z\n .object({\n timeout: z.number().optional(),\n include_output: z.boolean().optional()\n })\n .optional()\n })\n ])\n .optional(),\n\n /**\n * Enable or configure context caching for this request.\n * Reduces costs for repeated long prompts.\n */\n caching: z.union([z.boolean(), kimiCachingConfigSchema]).optional(),\n\n /**\n * Enable tool choice polyfill for this request.\n */\n toolChoicePolyfill: z.boolean().optional()\n});\n\n/**\n * Type for provider options passed to individual calls.\n */\nexport type KimiProviderOptions = z.infer<typeof kimiProviderOptionsSchema>;\n","/**\n * File content caching for efficient re-use of uploaded files.\n * @module\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Entry in the file cache.\n */\nexport interface FileCacheEntry {\n /** The Kimi file ID */\n fileId: string;\n /** Extracted text content (for documents) */\n content?: string;\n /** Unix timestamp of creation */\n createdAt: number;\n /** File purpose */\n purpose: 'file-extract' | 'image' | 'video';\n}\n\n/**\n * Options for configuring the file cache.\n */\nexport interface FileCacheOptions {\n /**\n * Maximum number of entries in the cache.\n * When exceeded, least recently used entries are evicted.\n * @default 100\n */\n maxSize?: number;\n\n /**\n * Time-to-live for cache entries in milliseconds.\n * Entries older than this are considered stale.\n * @default 3600000 (1 hour)\n */\n ttlMs?: number;\n}\n\n// ============================================================================\n// LRU Cache Implementation\n// ============================================================================\n\n/**\n * A simple LRU (Least Recently Used) cache for file content.\n *\n * This cache helps avoid re-uploading the same files multiple times\n * by storing the mapping between content hashes and Kimi file IDs.\n *\n * @example\n * ```ts\n * const cache = new FileCache({ maxSize: 50, ttlMs: 30 * 60 * 1000 });\n *\n * // Check if we have this file cached\n * const cached = cache.get(contentHash);\n * if (cached) {\n * console.log('Using cached file:', cached.fileId);\n * }\n *\n * // Store a new file\n * cache.set(contentHash, {\n * fileId: 'file_abc123',\n * content: 'extracted text...',\n * purpose: 'file-extract',\n * createdAt: Date.now()\n * });\n * ```\n */\nexport class FileCache {\n private readonly maxSize: number;\n private readonly ttlMs: number;\n private readonly cache: Map<string, FileCacheEntry>;\n\n constructor(options: FileCacheOptions = {}) {\n this.maxSize = options.maxSize ?? 100;\n this.ttlMs = options.ttlMs ?? 3600000; // 1 hour\n this.cache = new Map();\n }\n\n /**\n * Get a cached entry by content hash.\n * Returns undefined if not found or expired.\n * Moves the entry to the end (most recently used).\n */\n get(contentHash: string): FileCacheEntry | undefined {\n const entry = this.cache.get(contentHash);\n\n if (!entry) {\n return undefined;\n }\n\n // Check if entry has expired\n if (this.isExpired(entry)) {\n this.cache.delete(contentHash);\n return undefined;\n }\n\n // Move to end (most recently used)\n this.cache.delete(contentHash);\n this.cache.set(contentHash, entry);\n\n return entry;\n }\n\n /**\n * Set a cache entry.\n * Evicts the least recently used entry if cache is full.\n */\n set(contentHash: string, entry: FileCacheEntry): void {\n // Delete existing entry to update position\n this.cache.delete(contentHash);\n\n // Evict oldest entries if at capacity\n while (this.cache.size >= this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.cache.delete(oldestKey);\n } else {\n break;\n }\n }\n\n this.cache.set(contentHash, entry);\n }\n\n /**\n * Check if an entry exists and is not expired.\n */\n has(contentHash: string): boolean {\n return this.get(contentHash) !== undefined;\n }\n\n /**\n * Delete a specific entry.\n */\n delete(contentHash: string): boolean {\n return this.cache.delete(contentHash);\n }\n\n /**\n * Clear all entries.\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Get the current cache size.\n */\n get size(): number {\n return this.cache.size;\n }\n\n /**\n * Remove all expired entries.\n */\n prune(): number {\n let pruned = 0;\n for (const [key, entry] of this.cache) {\n if (this.isExpired(entry)) {\n this.cache.delete(key);\n pruned++;\n }\n }\n return pruned;\n }\n\n /**\n * Check if an entry is expired.\n */\n private isExpired(entry: FileCacheEntry): boolean {\n return Date.now() - entry.createdAt > this.ttlMs;\n }\n}\n\n// ============================================================================\n// Hash Utilities\n// ============================================================================\n\n/**\n * Generate a hash from file content for cache lookups.\n * Uses a simple but fast hash algorithm suitable for deduplication.\n *\n * @param data - The file content as Uint8Array or string\n * @returns A hex string hash\n */\nexport function generateContentHash(data: Uint8Array | string): string {\n const bytes = typeof data === 'string' ? new TextEncoder().encode(data) : data;\n\n // Simple FNV-1a hash (fast and good distribution for deduplication)\n let hash = 2166136261; // FNV offset basis\n\n for (let i = 0; i < bytes.length; i++) {\n hash ^= bytes[i];\n hash = Math.imul(hash, 16777619); // FNV prime\n }\n\n // Include length to differentiate files with same content hash but different lengths\n hash ^= bytes.length;\n\n // Convert to hex string\n return (hash >>> 0).toString(16).padStart(8, '0');\n}\n\n/**\n * Generate a more unique cache key that includes filename and size.\n * This helps differentiate files that might have similar beginnings.\n *\n * @param data - The file content\n * @param filename - The filename\n * @returns A cache key string\n */\nexport function generateCacheKey(data: Uint8Array | string, filename: string): string {\n const bytes = typeof data === 'string' ? new TextEncoder().encode(data) : data;\n const contentHash = generateContentHash(data);\n const normalizedFilename = filename.toLowerCase().replace(/[^a-z0-9.]/g, '_');\n\n return `${contentHash}_${bytes.length}_${normalizedFilename}`;\n}\n\n// ============================================================================\n// Global Cache Instance\n// ============================================================================\n\n/**\n * Default global file cache instance.\n * This is used by the attachment processor when caching is enabled.\n */\nlet defaultCache: FileCache | null = null;\n\n/**\n * Get the default global file cache.\n * Creates one if it doesn't exist.\n */\nexport function getDefaultFileCache(): FileCache {\n if (!defaultCache) {\n defaultCache = new FileCache();\n }\n return defaultCache;\n}\n\n/**\n * Set a custom default file cache.\n * Useful for testing or custom configurations.\n */\nexport function setDefaultFileCache(cache: FileCache | null): void {\n defaultCache = cache;\n}\n\n/**\n * Clear the default file cache.\n */\nexport function clearDefaultFileCache(): void {\n if (defaultCache) {\n defaultCache.clear();\n }\n}\n","/**\n * File utility functions for Kimi API.\n * @module\n */\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * File extensions supported by Kimi's file upload API.\n */\nexport const SUPPORTED_FILE_EXTENSIONS = [\n // Documents\n '.pdf',\n '.txt',\n '.csv',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.ppt',\n '.pptx',\n '.md',\n '.epub',\n '.mobi',\n '.html',\n '.json',\n '.log',\n '.dot',\n '.ini',\n '.conf',\n '.yaml',\n '.yml',\n // Images\n '.jpeg',\n '.jpg',\n '.png',\n '.bmp',\n '.gif',\n '.svg',\n '.svgz',\n '.webp',\n '.ico',\n '.xbm',\n '.dib',\n '.pjp',\n '.tif',\n '.tiff',\n '.pjpeg',\n '.avif',\n '.apng',\n '.jfif',\n // Code files\n '.go',\n '.h',\n '.c',\n '.cpp',\n '.cxx',\n '.cc',\n '.cs',\n '.java',\n '.js',\n '.css',\n '.jsp',\n '.php',\n '.py',\n '.py3',\n '.asp',\n '.ts',\n '.tsx'\n] as const;\n\n/**\n * MIME types supported by Kimi's file upload API.\n */\nexport const SUPPORTED_MIME_TYPES = {\n // Documents\n 'application/pdf': 'file-extract',\n 'text/plain': 'file-extract',\n 'text/csv': 'file-extract',\n 'application/msword': 'file-extract',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'file-extract',\n 'application/vnd.ms-excel': 'file-extract',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'file-extract',\n 'application/vnd.ms-powerpoint': 'file-extract',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'file-extract',\n 'text/markdown': 'file-extract',\n 'text/html': 'file-extract',\n 'application/json': 'file-extract',\n 'application/epub+zip': 'file-extract',\n 'text/yaml': 'file-extract',\n 'application/x-yaml': 'file-extract',\n // Code files (treated as text)\n 'text/javascript': 'file-extract',\n 'text/typescript': 'file-extract',\n 'text/x-python': 'file-extract',\n 'text/x-java': 'file-extract',\n 'text/x-c': 'file-extract',\n 'text/x-c++': 'file-extract',\n 'text/css': 'file-extract',\n // Images\n 'image/jpeg': 'image',\n 'image/png': 'image',\n 'image/gif': 'image',\n 'image/webp': 'image',\n 'image/svg+xml': 'image',\n 'image/bmp': 'image',\n 'image/tiff': 'image',\n 'image/avif': 'image',\n 'image/apng': 'image',\n 'image/x-icon': 'image',\n // Videos\n 'video/mp4': 'video',\n 'video/webm': 'video',\n 'video/ogg': 'video',\n 'video/quicktime': 'video'\n} as const;\n\nexport type SupportedMimeType = keyof typeof SUPPORTED_MIME_TYPES;\nexport type FilePurpose = 'file-extract' | 'image' | 'video';\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if a media type is for image files.\n */\nexport function isImageMediaType(mediaType: string): boolean {\n return mediaType.startsWith('image/');\n}\n\n/**\n * Check if a media type is for video files.\n */\nexport function isVideoMediaType(mediaType: string): boolean {\n return mediaType.startsWith('video/');\n}\n\n/**\n * Check if a media type should use file-extract purpose.\n */\nexport function isFileExtractMediaType(mediaType: string): boolean {\n // Check explicit types\n if (mediaType in SUPPORTED_MIME_TYPES) {\n return SUPPORTED_MIME_TYPES[mediaType as SupportedMimeType] === 'file-extract';\n }\n // Check text/* and application/* prefixes\n if (mediaType.startsWith('text/') || mediaType === 'application/pdf') {\n return true;\n }\n return false;\n}\n\n/**\n * Check if a media type is for document files (PDFs, Word, etc.).\n */\nexport function isDocumentMediaType(mediaType: string): boolean {\n const documentTypes = [\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/epub+zip'\n ];\n return documentTypes.includes(mediaType);\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get the file purpose based on media type.\n */\nexport function getPurposeFromMediaType(mediaType: string): FilePurpose {\n if (isImageMediaType(mediaType)) {\n return 'image';\n }\n if (isVideoMediaType(mediaType)) {\n return 'video';\n }\n return 'file-extract';\n}\n\n/**\n * Get MIME type from file extension.\n */\nexport function getMediaTypeFromExtension(extension: string): string {\n const ext = extension.toLowerCase().startsWith('.') ? extension.toLowerCase() : `.${extension.toLowerCase()}`;\n\n const extensionToMime: Record<string, string> = {\n // Documents\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.csv': 'text/csv',\n '.doc': 'application/msword',\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n '.ppt': 'application/vnd.ms-powerpoint',\n '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n '.md': 'text/markdown',\n '.html': 'text/html',\n '.json': 'application/json',\n '.epub': 'application/epub+zip',\n '.yaml': 'text/yaml',\n '.yml': 'text/yaml',\n '.log': 'text/plain',\n '.ini': 'text/plain',\n '.conf': 'text/plain',\n // Code\n '.js': 'text/javascript',\n '.ts': 'text/typescript',\n '.tsx': 'text/typescript',\n '.py': 'text/x-python',\n '.java': 'text/x-java',\n '.c': 'text/x-c',\n '.cpp': 'text/x-c++',\n '.h': 'text/x-c',\n '.css': 'text/css',\n '.go': 'text/plain',\n '.php': 'text/plain',\n // Images\n '.jpeg': 'image/jpeg',\n '.jpg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.bmp': 'image/bmp',\n '.tif': 'image/tiff',\n '.tiff': 'image/tiff',\n '.avif': 'image/avif',\n '.apng': 'image/apng',\n '.ico': 'image/x-icon',\n // Videos\n '.mp4': 'video/mp4',\n '.webm': 'video/webm',\n '.ogg': 'video/ogg',\n '.mov': 'video/quicktime'\n };\n\n return extensionToMime[ext] ?? 'application/octet-stream';\n}\n\n/**\n * Extract file extension from URL or filename.\n */\nexport function getExtensionFromPath(path: string): string | null {\n const match = path.match(/\\.([^./?#]+)(?:[?#]|$)/);\n return match ? `.${match[1].toLowerCase()}` : null;\n}\n","/**\n * Kimi File API client for uploading and managing files.\n * @module\n */\n\nimport type { FetchFunction } from '@ai-sdk/provider-utils';\nimport { getExtensionFromPath, getMediaTypeFromExtension, getPurposeFromMediaType } from './file-utils';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A file object returned by the Kimi File API.\n */\nexport interface KimiFile {\n /** Unique file identifier */\n id: string;\n /** File size in bytes */\n bytes: number;\n /** Unix timestamp of creation */\n created_at: number;\n /** Original filename */\n filename: string;\n /** Object type (always 'file') */\n object: 'file';\n /** File purpose (file-extract, image, video) */\n purpose: 'file-extract' | 'image' | 'video';\n /** Processing status */\n status: 'ok' | 'error' | 'processing';\n /** Status details if error */\n status_details?: string;\n}\n\n/**\n * Options for uploading a file.\n */\nexport interface FileUploadOptions {\n /** The file data as a Buffer, Uint8Array, or string (base64) */\n data: Uint8Array | string;\n /** The filename */\n filename: string;\n /** MIME type of the file */\n mediaType?: string;\n /** Purpose of the file (defaults based on mediaType) */\n purpose?: 'file-extract' | 'image' | 'video';\n}\n\n/**\n * Result of a file upload operation.\n */\nexport interface FileUploadResult {\n /** The uploaded file object */\n file: KimiFile;\n /** The extracted content (for file-extract purpose) */\n content?: string;\n}\n\n/**\n * Configuration for the file client.\n */\nexport interface KimiFileClientConfig {\n /** Base URL for the API */\n baseURL: string;\n /** Function to get authorization headers */\n headers: () => Record<string, string | undefined>;\n /** Custom fetch implementation */\n fetch?: FetchFunction;\n}\n\n// ============================================================================\n// File Client\n// ============================================================================\n\n/**\n * Client for interacting with Kimi's File API.\n *\n * Supports uploading files for content extraction, image understanding,\n * and video understanding.\n *\n * @example\n * ```ts\n * const client = new KimiFileClient({\n * baseURL: 'https://api.moonshot.ai/v1',\n * headers: () => ({\n * Authorization: `Bearer ${apiKey}`,\n * }),\n * });\n *\n * // Upload a PDF and extract content\n * const result = await client.uploadAndExtract({\n * data: pdfBuffer,\n * filename: 'document.pdf',\n * mediaType: 'application/pdf',\n * });\n *\n * console.log(result.content); // Extracted text content\n * ```\n */\nexport class KimiFileClient {\n private readonly config: KimiFileClientConfig;\n\n constructor(config: KimiFileClientConfig) {\n this.config = config;\n }\n\n /**\n * Upload a file to the Kimi API.\n */\n async upload(options: FileUploadOptions): Promise<KimiFile> {\n const { data, filename, mediaType, purpose } = options;\n\n // Determine MIME type\n const resolvedMediaType =\n mediaType ?? getMediaTypeFromExtension(getExtensionFromPath(filename) ?? '') ?? 'application/octet-stream';\n\n // Determine purpose\n const resolvedPurpose = purpose ?? getPurposeFromMediaType(resolvedMediaType);\n\n // Create form data\n const formData = new FormData();\n\n // Convert data to Blob\n const fileData = typeof data === 'string' ? base64ToUint8Array(data) : data;\n const blob = new Blob([new Uint8Array(fileData).buffer as ArrayBuffer], { type: resolvedMediaType });\n\n formData.append('file', blob, filename);\n formData.append('purpose', resolvedPurpose);\n\n const fetchFn = this.config.fetch ?? fetch;\n const headers = this.config.headers();\n\n const response = await fetchFn(`${this.config.baseURL}/files`, {\n method: 'POST',\n headers: {\n ...Object.fromEntries(\n Object.entries(headers).filter((entry): entry is [string, string] => entry[1] !== undefined)\n )\n // Don't set Content-Type - let the browser set it with boundary for FormData\n },\n body: formData\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`Failed to upload file: ${response.status} ${response.statusText} - ${errorBody}`);\n }\n\n return (await response.json()) as KimiFile;\n }\n\n /**\n * Get the content of an uploaded file (for file-extract purpose).\n */\n async getContent(fileId: string): Promise<string> {\n const fetchFn = this.config.fetch ?? fetch;\n const headers = this.config.headers();\n\n const response = await fetchFn(`${this.config.baseURL}/files/${fileId}/content`, {\n method: 'GET',\n headers: Object.fromEntries(\n Object.entries(headers).filter((entry): entry is [string, string] => entry[1] !== undefined)\n )\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`Failed to get file content: ${response.status} ${response.statusText} - ${errorBody}`);\n }\n\n return response.text();\n }\n\n /**\n * Upload a file and extract its content in one operation.\n * Only works for files with purpose=\"file-extract\".\n */\n async uploadAndExtract(options: FileUploadOptions): Promise<FileUploadResult> {\n const file = await this.upload({\n ...options,\n purpose: options.purpose ?? 'file-extract'\n });\n\n // Wait for processing if needed\n let currentFile = file;\n let attempts = 0;\n const maxAttempts = 30; // 30 seconds max wait\n const pollInterval = 1000; // 1 second\n\n while (currentFile.status === 'processing' && attempts < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n currentFile = await this.getFile(file.id);\n attempts++;\n }\n\n if (currentFile.status === 'error') {\n throw new Error(`File processing failed: ${currentFile.status_details ?? 'Unknown error'}`);\n }\n\n if (currentFile.status === 'processing') {\n throw new Error('File processing timed out');\n }\n\n // Get content for file-extract purpose\n let content: string | undefined;\n if (currentFile.purpose === 'file-extract') {\n content = await this.getContent(file.id);\n }\n\n return { file: currentFile, content };\n }\n\n /**\n * Get file information.\n */\n async getFile(fileId: string): Promise<KimiFile> {\n const fetchFn = this.config.fetch ?? fetch;\n const headers = this.config.headers();\n\n const response = await fetchFn(`${this.config.baseURL}/files/${fileId}`, {\n method: 'GET',\n headers: Object.fromEntries(\n Object.entries(headers).filter((entry): entry is [string, string] => entry[1] !== undefined)\n )\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`Failed to get file: ${response.status} ${response.statusText} - ${errorBody}`);\n }\n\n return (await response.json()) as KimiFile;\n }\n\n /**\n * List all uploaded files.\n */\n async listFiles(): Promise<KimiFile[]> {\n const fetchFn = this.config.fetch ?? fetch;\n const headers = this.config.headers();\n\n const response = await fetchFn(`${this.config.baseURL}/files`, {\n method: 'GET',\n headers: Object.fromEntries(\n Object.entries(headers).filter((entry): entry is [string, string] => entry[1] !== undefined)\n )\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`Failed to list files: ${response.status} ${response.statusText} - ${errorBody}`);\n }\n\n const result = (await response.json()) as { data: KimiFile[] };\n return result.data;\n }\n\n /**\n * Delete a file.\n */\n async deleteFile(fileId: string): Promise<void> {\n const fetchFn = this.config.fetch ?? fetch;\n const headers = this.config.headers();\n\n const response = await fetchFn(`${this.config.baseURL}/files/${fileId}`, {\n method: 'DELETE',\n headers: Object.fromEntries(\n Object.entries(headers).filter((entry): entry is [string, string] => entry[1] !== undefined)\n )\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new Error(`Failed to delete file: ${response.status} ${response.statusText} - ${errorBody}`);\n }\n }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction base64ToUint8Array(base64: string): Uint8Array {\n // Handle data URLs\n const base64Data = base64.includes(',') ? base64.split(',')[1] : base64;\n const binaryString = atob(base64Data);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n","/**\n * Attachment processor for experimental_attachments support.\n * Automatically uploads files to Kimi and injects content into prompts.\n * @module\n */\n\nimport { type FileCache, type FileCacheEntry, generateCacheKey, getDefaultFileCache } from './file-cache';\nimport {\n getExtensionFromPath,\n getMediaTypeFromExtension,\n isDocumentMediaType,\n isFileExtractMediaType,\n isImageMediaType,\n isVideoMediaType\n} from './file-utils';\nimport { KimiFileClient, type KimiFileClientConfig } from './kimi-file-client';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * An attachment from experimental_attachments.\n */\nexport interface Attachment {\n /** URL of the attachment */\n url?: string;\n /** Name of the attachment */\n name?: string;\n /** MIME type */\n contentType?: string;\n /** Raw content data */\n content?: Uint8Array | string;\n}\n\n/**\n * Processed attachment result.\n */\nexport interface ProcessedAttachment {\n /** Original attachment */\n original: Attachment;\n /** Processing type */\n type: 'text-inject' | 'image-url' | 'video-url' | 'skip';\n /** Extracted text content (for documents) */\n textContent?: string;\n /** URL to use in message (for images/videos) */\n mediaUrl?: string;\n /** Kimi file ID (if uploaded) */\n fileId?: string;\n /** Error if processing failed */\n error?: string;\n}\n\n/**\n * Options for processing attachments.\n */\nexport interface ProcessAttachmentsOptions {\n /** Attachments to process */\n attachments: Attachment[];\n /** File client configuration */\n clientConfig: KimiFileClientConfig;\n /** Whether to auto-upload documents for extraction */\n autoUploadDocuments?: boolean;\n /** Whether to upload images to Kimi's file API */\n uploadImages?: boolean;\n /** Whether to delete files after extraction (cleanup) */\n cleanupAfterExtract?: boolean;\n /**\n * Enable caching of uploaded files.\n * When true, uses the default global cache.\n * When a FileCache instance, uses that cache.\n * @default false\n */\n cache?: boolean | FileCache;\n}\n\n// ============================================================================\n// Main Function\n// ============================================================================\n\n/**\n * Process experimental_attachments for Kimi.\n *\n * This function handles different attachment types:\n * - Documents (PDF, DOC, etc.): Uploads to Kimi, extracts content, returns text to inject\n * - Images: Returns URL for vision input\n * - Videos: Returns URL for video input\n *\n * @example\n * ```ts\n * const processed = await processAttachments({\n * attachments: message.experimental_attachments ?? [],\n * clientConfig: {\n * baseURL: 'https://api.moonshot.ai/v1',\n * headers: () => ({ Authorization: `Bearer ${apiKey}` }),\n * },\n * });\n *\n * // Inject document content into system messages\n * const documentContent = processed\n * .filter(p => p.type === 'text-inject' && p.textContent)\n * .map(p => p.textContent)\n * .join('\\n');\n * ```\n */\nexport async function processAttachments(options: ProcessAttachmentsOptions): Promise<ProcessedAttachment[]> {\n const {\n attachments,\n clientConfig,\n autoUploadDocuments = true,\n uploadImages = false,\n cleanupAfterExtract = false,\n cache = false\n } = options;\n\n // Resolve cache instance\n const cacheInstance = cache === true ? getDefaultFileCache() : cache === false ? null : cache;\n\n const results: ProcessedAttachment[] = [];\n const client = new KimiFileClient(clientConfig);\n\n for (const attachment of attachments) {\n try {\n const processed = await processAttachment(attachment, client, {\n autoUploadDocuments,\n uploadImages,\n cleanupAfterExtract,\n cache: cacheInstance\n });\n results.push(processed);\n } catch (error) {\n results.push({\n original: attachment,\n type: 'skip',\n error: error instanceof Error ? error.message : String(error)\n });\n }\n }\n\n return results;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nasync function processAttachment(\n attachment: Attachment,\n client: KimiFileClient,\n options: {\n autoUploadDocuments: boolean;\n uploadImages: boolean;\n cleanupAfterExtract: boolean;\n cache: FileCache | null;\n }\n): Promise<ProcessedAttachment> {\n // Determine content type\n const contentType = resolveContentType(attachment);\n\n // Handle images - just return URL for vision\n if (isImageMediaType(contentType)) {\n if (options.uploadImages && attachment.content) {\n // Upload image if content is provided\n const result = await client.upload({\n data: attachment.content,\n filename: attachment.name ?? 'image.jpg',\n mediaType: contentType,\n purpose: 'image'\n });\n\n return {\n original: attachment,\n type: 'image-url',\n fileId: result.id,\n mediaUrl: attachment.url\n };\n }\n\n return {\n original: attachment,\n type: 'image-url',\n mediaUrl: attachment.url\n };\n }\n\n // Handle videos - just return URL for video understanding\n if (isVideoMediaType(contentType)) {\n return {\n original: attachment,\n type: 'video-url',\n mediaUrl: attachment.url\n };\n }\n\n // Handle documents that need extraction\n if (options.autoUploadDocuments && (isDocumentMediaType(contentType) || isFileExtractMediaType(contentType))) {\n // Need to fetch content if only URL is provided\n let data: Uint8Array | string;\n\n if (attachment.content) {\n data = attachment.content;\n } else if (attachment.url) {\n // Fetch the file from URL\n const response = await fetch(attachment.url);\n if (!response.ok) {\n throw new Error(`Failed to fetch attachment: ${response.status}`);\n }\n data = new Uint8Array(await response.arrayBuffer());\n } else {\n return {\n original: attachment,\n type: 'skip',\n error: 'No content or URL provided for document attachment'\n };\n }\n\n const filename = attachment.name ?? guessFilename(attachment, contentType);\n\n // Check cache if enabled\n if (options.cache) {\n const cacheKey = generateCacheKey(data, filename);\n const cached = options.cache.get(cacheKey);\n\n if (cached) {\n return {\n original: attachment,\n type: 'text-inject',\n textContent: cached.content,\n fileId: cached.fileId\n };\n }\n }\n\n // Upload and extract content\n const result = await client.uploadAndExtract({\n data,\n filename,\n mediaType: contentType,\n purpose: 'file-extract'\n });\n\n // Store in cache if enabled (before cleanup)\n if (options.cache && result.content) {\n const cacheKey = generateCacheKey(data, filename);\n const cacheEntry: FileCacheEntry = {\n fileId: result.file.id,\n content: result.content,\n createdAt: Date.now(),\n purpose: 'file-extract'\n };\n options.cache.set(cacheKey, cacheEntry);\n }\n\n // Cleanup if requested\n if (options.cleanupAfterExtract && result.file.id) {\n try {\n await client.deleteFile(result.file.id);\n } catch {\n // Ignore cleanup errors\n }\n }\n\n return {\n original: attachment,\n type: 'text-inject',\n textContent: result.content,\n fileId: result.file.id\n };\n }\n\n // Skip unsupported types\n return {\n original: attachment,\n type: 'skip',\n error: `Unsupported content type: ${contentType}`\n };\n}\n\nfunction resolveContentType(attachment: Attachment): string {\n // Use explicit content type if provided\n if (attachment.contentType) {\n return attachment.contentType;\n }\n\n // Try to infer from filename or URL\n const path = attachment.name ?? attachment.url;\n if (path) {\n const ext = getExtensionFromPath(path);\n if (ext) {\n return getMediaTypeFromExtension(ext);\n }\n }\n\n // Default to octet-stream\n return 'application/octet-stream';\n}\n\nfunction guessFilename(attachment: Attachment, contentType: string): string {\n if (attachment.name) {\n return attachment.name;\n }\n\n if (attachment.url) {\n const urlPath = attachment.url.split('?')[0];\n const segments = urlPath.split('/');\n const lastSegment = segments[segments.length - 1];\n\n if (lastSegment.includes('.')) {\n return lastSegment;\n }\n }\n\n // Generate filename from content type\n const extensionMap: Record<string, string> = {\n 'application/pdf': 'document.pdf',\n 'text/plain': 'document.txt',\n 'application/msword': 'document.doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'document.docx',\n 'image/jpeg': 'image.jpg',\n 'image/png': 'image.png'\n };\n\n return extensionMap[contentType] ?? 'file.bin';\n}\n","declare const __PACKAGE_VERSION__: string | undefined;\n\nexport const VERSION =\n typeof __PACKAGE_VERSION__ === 'string' && __PACKAGE_VERSION__.length > 0 ? __PACKAGE_VERSION__ : '0.0.0';\n","/**\n * Kimi Code language model implementation.\n * @module\n */\n\nimport type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3FunctionTool,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamPart,\n LanguageModelV3StreamResult,\n SharedV3ProviderMetadata,\n SharedV3Warning\n} from '@ai-sdk/provider';\nimport {\n type ParseResult,\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n generateId,\n parseProviderOptions,\n postJsonToApi,\n removeUndefinedEntries\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport { convertToKimiCodePrompt } from './kimi-code-messages';\nimport {\n type KimiCodeSettings,\n effortToBudgetTokens,\n kimiCodeProviderOptionsSchema,\n normalizeExtendedThinkingConfig\n} from './kimi-code-settings';\nimport {\n type KimiCodeCapabilities,\n type KimiCodeConfig,\n type KimiCodeModelId,\n inferKimiCodeCapabilities\n} from './kimi-code-types';\n\n// ============================================================================\n// Response Schemas\n// ============================================================================\n\nconst kimiCodeErrorSchema = z.union([\n z.object({\n error: z.object({\n message: z.string(),\n type: z.string().nullish(),\n code: z.union([z.string(), z.number()]).nullish()\n })\n }),\n z.object({\n message: z.string()\n })\n]);\n\ntype KimiCodeErrorData = z.infer<typeof kimiCodeErrorSchema>;\n\nconst kimiCodeTextContentSchema = z.object({\n type: z.literal('text'),\n text: z.string()\n});\n\nconst kimiCodeThinkingContentSchema = z.object({\n type: z.literal('thinking'),\n thinking: z.string()\n});\n\nconst kimiCodeToolUseContentSchema = z.object({\n type: z.literal('tool_use'),\n id: z.string(),\n name: z.string(),\n input: z.record(z.string(), z.unknown())\n});\n\nconst kimiCodeContentBlockSchema = z.union([\n kimiCodeTextContentSchema,\n kimiCodeThinkingContentSchema,\n kimiCodeToolUseContentSchema\n]);\n\nconst kimiCodeResponseSchema = z.object({\n id: z.string().optional(),\n type: z.string().optional(),\n model: z.string().optional(),\n stop_reason: z.string().nullish(),\n stop_sequence: z.string().nullish(),\n content: z.array(kimiCodeContentBlockSchema),\n usage: z\n .object({\n input_tokens: z.number().optional(),\n output_tokens: z.number().optional(),\n cache_read_input_tokens: z.number().optional(),\n cache_creation_input_tokens: z.number().optional()\n })\n .optional()\n});\n\nconst kimiCodeStreamChunkSchema = z.object({\n type: z.string(),\n index: z.number().optional(),\n message: z\n .object({\n id: z.string().optional(),\n type: z.string().optional(),\n model: z.string().optional(),\n content: z.array(z.unknown()).optional(),\n stop_reason: z.string().nullish(),\n stop_sequence: z.string().nullish(),\n usage: z\n .object({\n input_tokens: z.number().optional(),\n output_tokens: z.number().optional()\n })\n .optional()\n })\n .optional(),\n content_block: z\n .object({\n type: z.string(),\n text: z.string().optional(),\n thinking: z.string().optional(),\n id: z.string().optional(),\n name: z.string().optional(),\n input: z.record(z.string(), z.unknown()).optional()\n })\n .optional(),\n delta: z\n .object({\n type: z.string().optional(),\n text: z.string().optional(),\n thinking: z.string().optional(),\n partial_json: z.string().optional(),\n stop_reason: z.string().optional(),\n stop_sequence: z.string().optional()\n })\n .optional(),\n usage: z\n .object({\n input_tokens: z.number().optional(),\n output_tokens: z.number().optional()\n })\n .optional()\n});\n\ntype KimiCodeResponse = z.infer<typeof kimiCodeResponseSchema>;\ntype KimiCodeStreamChunk = z.infer<typeof kimiCodeStreamChunkSchema>;\n\n// ============================================================================\n// Error Handler\n// ============================================================================\n\nconst kimiCodeFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: kimiCodeErrorSchema,\n errorToMessage: (error: KimiCodeErrorData) => {\n if ('error' in error) {\n return error.error.message;\n }\n return error.message;\n },\n isRetryable: (response) =>\n response.status === 408 || response.status === 409 || response.status === 429 || response.status >= 500\n});\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Map Kimi Code stop reason to AI SDK finish reason.\n */\nfunction mapStopReason(stopReason: string | null | undefined): LanguageModelV3FinishReason {\n switch (stopReason) {\n case 'end_turn':\n case 'stop_sequence':\n return { unified: 'stop', raw: stopReason };\n case 'tool_use':\n return { unified: 'tool-calls', raw: stopReason };\n case 'max_tokens':\n return { unified: 'length', raw: stopReason };\n default:\n return { unified: 'other', raw: stopReason ?? undefined };\n }\n}\n\n/**\n * Convert Kimi Code usage to AI SDK usage format.\n */\nfunction convertUsage(usage?: {\n input_tokens?: number;\n output_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n}) {\n const inputTokens = usage?.input_tokens ?? 0;\n const outputTokens = usage?.output_tokens ?? 0;\n const cacheRead = usage?.cache_read_input_tokens ?? 0;\n\n return {\n inputTokens: {\n total: inputTokens,\n cacheRead,\n cacheWrite: usage?.cache_creation_input_tokens,\n noCache: inputTokens - cacheRead\n },\n outputTokens: {\n total: outputTokens,\n text: outputTokens,\n reasoning: 0\n },\n raw: usage\n };\n}\n\n/**\n * Convert tools to Kimi Code (Anthropic) format.\n */\nfunction convertTools(tools?: LanguageModelV3FunctionTool[]) {\n if (!tools || tools.length === 0) {\n return undefined;\n }\n\n return tools.map((tool) => {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema ?? { type: 'object', properties: {} }\n };\n });\n}\n\n// ============================================================================\n// Language Model Implementation\n// ============================================================================\n\n/**\n * Kimi Code language model implementing LanguageModelV3.\n */\nexport class KimiCodeLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3';\n readonly modelId: KimiCodeModelId;\n\n private readonly config: KimiCodeConfig;\n private readonly settings: KimiCodeSettings;\n private readonly generateIdFn: () => string;\n\n constructor(modelId: KimiCodeModelId, settings: KimiCodeSettings, config: KimiCodeConfig) {\n this.modelId = modelId;\n this.settings = settings;\n this.config = config;\n this.generateIdFn = config.generateId ?? generateId;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n private get providerOptionsName(): string {\n return 'kimiCode';\n }\n\n /**\n * Get the inferred or configured capabilities for this model.\n */\n get capabilities(): KimiCodeCapabilities {\n const inferred = inferKimiCodeCapabilities(this.modelId);\n return {\n ...inferred,\n ...this.settings.capabilities\n };\n }\n\n get supportedUrls() {\n const patterns: Record<string, RegExp[]> = {\n 'image/*': [/^https?:\\/\\/.*$/i]\n };\n return this.settings.supportedUrls ?? this.config.supportedUrls ?? patterns;\n }\n\n /**\n * Build request arguments.\n */\n private async getArgs(options: LanguageModelV3CallOptions) {\n const { prompt, maxOutputTokens, temperature, topP, topK, stopSequences, tools, toolChoice, providerOptions } =\n options;\n\n const warnings: SharedV3Warning[] = [];\n\n // Parse provider options\n const kimiCodeOptions = await parseProviderOptions({\n provider: this.providerOptionsName,\n providerOptions,\n schema: kimiCodeProviderOptionsSchema\n });\n\n // Merge extended thinking config from settings and provider options\n const extendedThinking =\n normalizeExtendedThinkingConfig(kimiCodeOptions?.extendedThinking) ??\n normalizeExtendedThinkingConfig(this.settings.extendedThinking);\n\n // Warn about unsupported options\n if (topK != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'topK'\n });\n }\n\n // Convert prompt to Kimi Code format\n const { system, messages } = await convertToKimiCodePrompt(prompt);\n\n // Prepare tool choice\n let toolChoiceParam: { type: string; name?: string } | undefined;\n if (toolChoice != null) {\n switch (toolChoice.type) {\n case 'auto':\n toolChoiceParam = { type: 'auto' };\n break;\n case 'none':\n toolChoiceParam = { type: 'none' };\n break;\n case 'required':\n toolChoiceParam = { type: 'any' };\n break;\n case 'tool':\n toolChoiceParam = { type: 'tool', name: toolChoice.toolName };\n break;\n }\n }\n\n // Filter to only function tools\n const functionTools = tools?.filter((t): t is LanguageModelV3FunctionTool => t.type === 'function');\n\n // Build request body\n const body = removeUndefinedEntries({\n model: this.modelId,\n system: kimiCodeOptions?.system ?? system,\n messages,\n max_tokens: maxOutputTokens ?? this.capabilities.maxOutputTokens ?? 32768,\n temperature,\n top_p: topP,\n stop_sequences: kimiCodeOptions?.stopSequences ?? stopSequences,\n tools: convertTools(functionTools),\n tool_choice: toolChoiceParam,\n // Extended thinking parameters\n ...(extendedThinking?.enabled && {\n thinking: {\n type: 'enabled',\n budget_tokens: extendedThinking.budgetTokens ?? effortToBudgetTokens(extendedThinking.effort ?? 'medium')\n }\n })\n });\n\n const requestHeaders: Record<string, string | undefined> = {\n ...(options.headers ?? {})\n };\n\n return {\n body,\n warnings,\n requestHeaders\n };\n }\n\n async doGenerate(options: LanguageModelV3CallOptions): Promise<LanguageModelV3GenerateResult> {\n const { body, warnings, requestHeaders } = await this.getArgs(options);\n\n const {\n responseHeaders,\n value: rawResponse,\n rawValue\n } = await postJsonToApi({\n url: `${this.config.baseURL}/messages`,\n headers: combineHeaders(this.config.headers(), requestHeaders, options.headers),\n body,\n failedResponseHandler: kimiCodeFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(kimiCodeResponseSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n\n // Parse and validate response\n const response = rawResponse as KimiCodeResponse;\n\n // Extract content from response\n const content: Array<LanguageModelV3Content> = [];\n\n for (const block of response.content) {\n switch (block.type) {\n case 'text':\n content.push({ type: 'text', text: block.text });\n break;\n\n case 'thinking':\n content.push({\n type: 'reasoning',\n text: block.thinking\n });\n break;\n\n case 'tool_use':\n content.push({\n type: 'tool-call',\n toolCallId: block.id,\n toolName: block.name,\n input: JSON.stringify(block.input)\n });\n break;\n }\n }\n\n const providerMetadata: SharedV3ProviderMetadata = {\n [this.providerOptionsName]: {\n requestId: responseHeaders?.['x-request-id'] ?? undefined,\n modelId: response.model,\n stopReason: response.stop_reason,\n stopSequence: response.stop_sequence\n }\n };\n\n return {\n content,\n finishReason: mapStopReason(response.stop_reason),\n usage: convertUsage(response.usage),\n providerMetadata,\n request: { body },\n response: {\n id: response.id,\n modelId: response.model,\n headers: responseHeaders,\n body: rawValue\n },\n warnings\n };\n }\n\n async doStream(options: LanguageModelV3CallOptions): Promise<LanguageModelV3StreamResult> {\n const { body, warnings, requestHeaders } = await this.getArgs(options);\n\n const streamBody = {\n ...body,\n stream: true\n };\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: `${this.config.baseURL}/messages`,\n headers: combineHeaders(this.config.headers(), requestHeaders, options.headers),\n body: streamBody,\n failedResponseHandler: kimiCodeFailedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(kimiCodeStreamChunkSchema),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch\n });\n\n const providerOptionsName = this.providerOptionsName;\n const generateIdFn = this.generateIdFn;\n const capturedResponseHeaders = responseHeaders;\n\n // Track state across stream\n let currentBlockType: string | undefined;\n let currentToolCallId: string | undefined;\n let currentToolName: string | undefined;\n let accumulatedToolInput = '';\n let finishReason: LanguageModelV3FinishReason = { unified: 'other', raw: undefined };\n let usage: ReturnType<typeof convertUsage> | undefined;\n let responseId: string | undefined;\n let responseModel: string | undefined;\n let isActiveText = false;\n let isActiveReasoning = false;\n let hasToolCallFinished = false;\n\n return {\n stream: response.pipeThrough(\n new TransformStream<ParseResult<KimiCodeStreamChunk>, LanguageModelV3StreamPart>({\n start(controller) {\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n if (!chunk.success) {\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n\n const data = chunk.value;\n\n switch (data.type) {\n case 'message_start':\n if (data.message) {\n responseId = data.message.id;\n responseModel = data.message.model;\n if (data.message.usage) {\n usage = convertUsage(data.message.usage);\n }\n // Emit response metadata\n controller.enqueue({\n type: 'response-metadata',\n id: responseId,\n modelId: responseModel\n });\n }\n break;\n\n case 'content_block_start':\n if (data.content_block) {\n currentBlockType = data.content_block.type;\n if (data.content_block.type === 'tool_use') {\n currentToolCallId = data.content_block.id ?? generateIdFn();\n currentToolName = data.content_block.name;\n accumulatedToolInput = '';\n hasToolCallFinished = false;\n\n // Close any active text/reasoning blocks\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'text-0' });\n isActiveText = false;\n }\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n isActiveReasoning = false;\n }\n\n controller.enqueue({\n type: 'tool-input-start',\n id: currentToolCallId,\n toolName: currentToolName ?? ''\n });\n } else if (data.content_block.type === 'text') {\n if (!isActiveText) {\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n isActiveReasoning = false;\n }\n controller.enqueue({ type: 'text-start', id: 'text-0' });\n isActiveText = true;\n }\n } else if (data.content_block.type === 'thinking') {\n if (!isActiveReasoning) {\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'text-0' });\n isActiveText = false;\n }\n controller.enqueue({ type: 'reasoning-start', id: 'reasoning-0' });\n isActiveReasoning = true;\n }\n }\n }\n break;\n\n case 'content_block_delta':\n if (data.delta) {\n if (data.delta.type === 'text_delta' && data.delta.text) {\n if (!isActiveText) {\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n isActiveReasoning = false;\n }\n controller.enqueue({ type: 'text-start', id: 'text-0' });\n isActiveText = true;\n }\n controller.enqueue({\n type: 'text-delta',\n id: 'text-0',\n delta: data.delta.text\n });\n } else if (data.delta.type === 'thinking_delta' && data.delta.thinking) {\n if (!isActiveReasoning) {\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'text-0' });\n isActiveText = false;\n }\n controller.enqueue({ type: 'reasoning-start', id: 'reasoning-0' });\n isActiveReasoning = true;\n }\n controller.enqueue({\n type: 'reasoning-delta',\n id: 'reasoning-0',\n delta: data.delta.thinking\n });\n } else if (data.delta.type === 'input_json_delta' && data.delta.partial_json) {\n accumulatedToolInput += data.delta.partial_json;\n controller.enqueue({\n type: 'tool-input-delta',\n id: currentToolCallId ?? '',\n delta: data.delta.partial_json\n });\n }\n }\n break;\n\n case 'content_block_stop':\n if (currentBlockType === 'tool_use' && currentToolCallId && !hasToolCallFinished) {\n // Parse accumulated input\n controller.enqueue({ type: 'tool-input-end', id: currentToolCallId });\n\n controller.enqueue({\n type: 'tool-call',\n toolCallId: currentToolCallId,\n toolName: currentToolName ?? '',\n input: accumulatedToolInput\n });\n hasToolCallFinished = true;\n } else if (currentBlockType === 'text' && isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'text-0' });\n isActiveText = false;\n } else if (currentBlockType === 'thinking' && isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n isActiveReasoning = false;\n }\n currentBlockType = undefined;\n currentToolCallId = undefined;\n currentToolName = undefined;\n accumulatedToolInput = '';\n break;\n\n case 'message_delta':\n if (data.delta?.stop_reason) {\n finishReason = mapStopReason(data.delta.stop_reason);\n }\n if (data.usage) {\n usage = convertUsage(data.usage);\n }\n break;\n\n case 'message_stop':\n // Close any remaining active blocks\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'text-0' });\n }\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n }\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: usage ?? convertUsage({}),\n providerMetadata: {\n [providerOptionsName]: {\n requestId: capturedResponseHeaders?.['x-request-id'] ?? undefined,\n modelId: responseModel\n }\n }\n });\n break;\n\n case 'error':\n controller.enqueue({\n type: 'error',\n error: new Error(\n (data as unknown as { error?: { message?: string } }).error?.message ?? 'Unknown streaming error'\n )\n });\n break;\n }\n }\n })\n ),\n request: { body: streamBody },\n response: {\n headers: responseHeaders\n }\n };\n }\n}\n","/**\n * Message conversion for Kimi Code API.\n * Converts AI SDK messages to Anthropic-compatible format used by Kimi Code.\n * @module\n */\n\nimport type { LanguageModelV3FilePart, LanguageModelV3Prompt } from '@ai-sdk/provider';\nimport { UnsupportedFunctionalityError } from '@ai-sdk/provider';\nimport { convertToBase64 } from '@ai-sdk/provider-utils';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Kimi Code message content part types.\n */\nexport type KimiCodeContentPart =\n | { type: 'text'; text: string }\n | { type: 'image'; source: { type: 'base64'; media_type: string; data: string } }\n | { type: 'image'; source: { type: 'url'; url: string } }\n | { type: 'tool_use'; id: string; name: string; input: Record<string, unknown> }\n | { type: 'tool_result'; tool_use_id: string; content: string | KimiCodeContentPart[]; is_error?: boolean };\n\n/**\n * Kimi Code message format (Anthropic-compatible).\n */\nexport interface KimiCodeMessage {\n role: 'user' | 'assistant';\n content: string | KimiCodeContentPart[];\n}\n\n/**\n * Kimi Code prompt structure.\n */\nexport interface KimiCodePrompt {\n system?: string;\n messages: KimiCodeMessage[];\n}\n\n// ============================================================================\n// Conversion Functions\n// ============================================================================\n\n/**\n * Convert AI SDK prompt to Kimi Code message format.\n *\n * @param prompt - AI SDK prompt\n * @returns Kimi Code formatted prompt with system and messages\n */\nexport async function convertToKimiCodePrompt(prompt: LanguageModelV3Prompt): Promise<KimiCodePrompt> {\n let systemMessage: string | undefined;\n const messages: KimiCodeMessage[] = [];\n\n for (const message of prompt) {\n switch (message.role) {\n case 'system': {\n // System messages have content as string in V3\n const systemText = typeof message.content === 'string' ? message.content : '';\n systemMessage = systemMessage ? `${systemMessage}\\n\\n${systemText}` : systemText;\n break;\n }\n\n case 'user': {\n const content: KimiCodeContentPart[] = [];\n\n for (const part of message.content) {\n switch (part.type) {\n case 'text':\n content.push({ type: 'text', text: part.text });\n break;\n\n case 'file':\n // Check if it's an image file\n if (part.mediaType?.startsWith('image/')) {\n content.push(await convertFilePart(part));\n } else {\n throw new UnsupportedFunctionalityError({\n functionality: `file type: ${part.mediaType}`\n });\n }\n break;\n\n default:\n throw new UnsupportedFunctionalityError({\n functionality: `user content part type: ${(part as { type: string }).type}`\n });\n }\n }\n\n messages.push({\n role: 'user',\n content: content.length === 1 && content[0].type === 'text' ? content[0].text : content\n });\n break;\n }\n\n case 'assistant': {\n const content: KimiCodeContentPart[] = [];\n\n for (const part of message.content) {\n switch (part.type) {\n case 'text':\n content.push({ type: 'text', text: part.text });\n break;\n\n case 'tool-call':\n content.push({\n type: 'tool_use',\n id: part.toolCallId,\n name: part.toolName,\n input: typeof part.input === 'string' ? JSON.parse(part.input) : (part.input as Record<string, unknown>)\n });\n break;\n\n case 'reasoning':\n // Include reasoning as text (Kimi Code handles thinking blocks)\n if (part.text) {\n content.push({ type: 'text', text: `<thinking>${part.text}</thinking>` });\n }\n break;\n\n default:\n throw new UnsupportedFunctionalityError({\n functionality: `assistant content part type: ${(part as { type: string }).type}`\n });\n }\n }\n\n if (content.length > 0) {\n messages.push({\n role: 'assistant',\n content: content.length === 1 && content[0].type === 'text' ? content[0].text : content\n });\n }\n break;\n }\n\n case 'tool': {\n // Tool results need to be part of a user message in Anthropic format\n const toolResults: KimiCodeContentPart[] = [];\n\n for (const part of message.content) {\n if (part.type === 'tool-result') {\n toolResults.push(convertToolResultPart(part));\n }\n }\n\n // If the last message is from the assistant, add tool results as user message\n if (messages.length > 0 && messages[messages.length - 1].role === 'assistant') {\n messages.push({\n role: 'user',\n content: toolResults\n });\n } else {\n // Merge with existing user message or create new one\n const lastMessage = messages[messages.length - 1];\n if (lastMessage?.role === 'user' && Array.isArray(lastMessage.content)) {\n lastMessage.content.push(...toolResults);\n } else {\n messages.push({\n role: 'user',\n content: toolResults\n });\n }\n }\n break;\n }\n\n default:\n throw new UnsupportedFunctionalityError({\n functionality: `message role: ${(message as { role: string }).role}`\n });\n }\n }\n\n return {\n system: systemMessage,\n messages\n };\n}\n\n/**\n * Convert a file part to Kimi Code format.\n */\nasync function convertFilePart(part: LanguageModelV3FilePart): Promise<KimiCodeContentPart> {\n const mediaType = part.mediaType ?? 'image/png';\n\n // Handle URL data\n if (part.data instanceof URL) {\n return {\n type: 'image',\n source: {\n type: 'url',\n url: part.data.toString()\n }\n };\n }\n\n // Handle string data\n if (typeof part.data === 'string') {\n // Check if it's a URL string\n if (part.data.startsWith('http://') || part.data.startsWith('https://')) {\n return {\n type: 'image',\n source: {\n type: 'url',\n url: part.data\n }\n };\n }\n\n // Check if it's a data URL\n if (part.data.startsWith('data:')) {\n const [header, data] = part.data.split(',');\n const extractedMimeType = header.match(/data:([^;]+)/)?.[1] ?? mediaType;\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: extractedMimeType,\n data\n }\n };\n }\n\n // Assume it's base64 encoded\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: mediaType,\n data: part.data\n }\n };\n }\n\n // Handle Uint8Array - convert to base64\n const base64 = convertToBase64(part.data);\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: mediaType,\n data: base64\n }\n };\n}\n\n/**\n * Tool result output type from LanguageModelV3.\n */\ninterface ToolResultOutput {\n type: 'text' | 'error-text' | 'json' | 'error-json' | 'content' | 'execution-denied';\n value?: unknown;\n reason?: string;\n}\n\n/**\n * Convert a tool result part to Kimi Code format.\n */\nfunction convertToolResultPart(part: {\n type: 'tool-result';\n toolCallId: string;\n toolName: string;\n output: ToolResultOutput;\n}): KimiCodeContentPart {\n // Handle different output types based on the discriminated union\n const output = part.output;\n let content: string;\n let isError = false;\n\n switch (output.type) {\n case 'text':\n content = String(output.value ?? '');\n break;\n case 'error-text':\n content = String(output.value ?? '');\n isError = true;\n break;\n case 'execution-denied':\n content = output.reason ?? 'Tool execution denied.';\n isError = true;\n break;\n case 'json':\n case 'content':\n content = JSON.stringify(output.value);\n break;\n case 'error-json':\n content = JSON.stringify(output.value);\n isError = true;\n break;\n default:\n content = JSON.stringify(output);\n }\n\n return {\n type: 'tool_result',\n tool_use_id: part.toolCallId,\n content,\n is_error: isError || undefined\n };\n}\n","/**\n * Settings for the Kimi Code provider.\n *\n * @remarks\n * Kimi Code is compatible with Claude Code and Roo Code agents.\n * Default settings are based on Roo Code documentation:\n * - Max Output Tokens: 32768\n * - Context Window Size: 262144\n * - Reasoning Effort: Medium\n *\n * @see https://www.kimi.com/code/docs/en/more/third-party-agents.html\n * @module\n */\n\nimport type { ExtendedThinkingConfig, KimiCodeCapabilities, ReasoningEffort } from './kimi-code-types';\nimport { z } from 'zod/v4';\n\n// ============================================================================\n// Settings Interface\n// ============================================================================\n\n/**\n * Settings for creating a Kimi Code model instance.\n */\nexport interface KimiCodeSettings {\n /**\n * Override inferred model capabilities.\n */\n capabilities?: KimiCodeCapabilities;\n\n /**\n * Extended thinking/reasoning configuration.\n * When enabled, the model will show its reasoning process.\n *\n * @example\n * ```ts\n * const model = kimiCode('kimi-for-coding', {\n * extendedThinking: {\n * enabled: true,\n * effort: 'high'\n * }\n * });\n * ```\n */\n extendedThinking?: ExtendedThinkingConfig | boolean;\n\n /**\n * Whether to include usage in streaming responses.\n */\n includeUsageInStream?: boolean;\n\n /**\n * Override supported URL patterns.\n */\n supportedUrls?: Record<string, RegExp[]>;\n}\n\n// ============================================================================\n// Provider Options Schema\n// ============================================================================\n\n/**\n * Schema for Kimi Code provider options passed via providerOptions.\n */\nexport const kimiCodeProviderOptionsSchema = z.object({\n /**\n * Extended thinking configuration.\n */\n extendedThinking: z\n .union([\n z.boolean(),\n z.object({\n enabled: z.boolean().optional(),\n effort: z.enum(['low', 'medium', 'high']).optional(),\n budgetTokens: z.number().optional()\n })\n ])\n .optional(),\n\n /**\n * System prompt to prepend.\n */\n system: z.string().optional(),\n\n /**\n * Custom stop sequences.\n */\n stopSequences: z.array(z.string()).optional()\n});\n\n/**\n * Inferred type from the provider options schema.\n */\nexport type KimiCodeProviderOptions = z.infer<typeof kimiCodeProviderOptionsSchema>;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Normalize extended thinking config to a consistent format.\n *\n * @param config - Boolean or config object\n * @returns Normalized config object\n */\nexport function normalizeExtendedThinkingConfig(\n config: ExtendedThinkingConfig | boolean | undefined\n): ExtendedThinkingConfig | undefined {\n if (config === undefined) {\n return undefined;\n }\n\n if (typeof config === 'boolean') {\n return config ? { enabled: true, effort: 'medium' } : { enabled: false };\n }\n\n return {\n enabled: config.enabled ?? true,\n effort: config.effort ?? 'medium',\n budgetTokens: config.budgetTokens\n };\n}\n\n/**\n * Convert reasoning effort to budget tokens.\n *\n * @param effort - Reasoning effort level\n * @returns Approximate budget tokens for the effort level\n */\nexport function effortToBudgetTokens(effort: ReasoningEffort): number {\n switch (effort) {\n case 'low':\n return 2048;\n case 'medium':\n return 8192;\n case 'high':\n return 16384;\n default:\n return 8192;\n }\n}\n\n// ============================================================================\n// Anthropic API Conversion Helpers\n// ============================================================================\n\n/**\n * Convert ExtendedThinkingConfig to Anthropic API thinking parameter format.\n *\n * @remarks\n * This converts our config to the Anthropic API format expected by Kimi Code:\n * - `{ type: 'enabled', budget_tokens: number }` when enabled\n * - `{ type: 'disabled' }` when disabled\n * - `undefined` when not configured\n *\n * @param config - Extended thinking configuration (boolean or object)\n * @returns Anthropic-compatible thinking parameter or undefined\n *\n * @example\n * ```ts\n * // From boolean\n * toAnthropicThinking(true)\n * // => { type: 'enabled', budget_tokens: 8192 }\n *\n * // From config object\n * toAnthropicThinking({ enabled: true, effort: 'high' })\n * // => { type: 'enabled', budget_tokens: 16384 }\n *\n * // With explicit budget\n * toAnthropicThinking({ enabled: true, budgetTokens: 10000 })\n * // => { type: 'enabled', budget_tokens: 10000 }\n * ```\n */\nexport function toAnthropicThinking(\n config: ExtendedThinkingConfig | boolean | undefined\n): { type: 'enabled'; budget_tokens: number } | { type: 'disabled' } | undefined {\n const normalized = normalizeExtendedThinkingConfig(config);\n\n if (normalized === undefined) {\n return undefined;\n }\n\n if (!normalized.enabled) {\n return { type: 'disabled' };\n }\n\n const budgetTokens = normalized.budgetTokens ?? effortToBudgetTokens(normalized.effort ?? 'medium');\n\n return {\n type: 'enabled',\n budget_tokens: budgetTokens\n };\n}\n","/**\n * Types for the Kimi Code provider.\n *\n * Kimi Code is a premium coding service within the Kimi ecosystem that provides:\n * - High-speed output (up to 100 tokens/s)\n * - Extended thinking/reasoning support\n * - Full compatibility with Claude Code and Roo Code\n * - Anthropic-compatible API format\n *\n * @see https://www.kimi.com/code/docs/en/\n * @module\n */\n\nimport type { LanguageModelV3 } from '@ai-sdk/provider';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default Kimi Code API endpoint (Anthropic-compatible).\n * Used with Claude Code - set as ANTHROPIC_BASE_URL\n */\nexport const KIMI_CODE_BASE_URL = 'https://api.kimi.com/coding/v1';\n\n/**\n * OpenAI-compatible API endpoint.\n * Used with Roo Code - set as OpenAI Compatible entrypoint\n */\nexport const KIMI_CODE_OPENAI_BASE_URL = 'https://api.kimi.com/coding/v1';\n\n/**\n * Default Kimi Code model ID.\n * Primary coding model optimized for development tasks.\n */\nexport const KIMI_CODE_DEFAULT_MODEL = 'kimi-for-coding';\n\n/**\n * Alternative model with enhanced thinking/reasoning.\n * Can be toggled with Tab key in Claude Code.\n */\nexport const KIMI_CODE_THINKING_MODEL = 'kimi-k2-thinking';\n\n/**\n * All available Kimi Code models.\n */\nexport const KIMI_CODE_MODELS = [KIMI_CODE_DEFAULT_MODEL, KIMI_CODE_THINKING_MODEL] as const;\n\n/**\n * Default max output tokens for Kimi Code (per Roo Code docs).\n */\nexport const KIMI_CODE_DEFAULT_MAX_TOKENS = 32768;\n\n/**\n * Default context window size (per Roo Code docs).\n */\nexport const KIMI_CODE_DEFAULT_CONTEXT_WINDOW = 262144;\n\n/**\n * Anthropic API version header value.\n */\nexport const KIMI_CODE_ANTHROPIC_VERSION = '2023-06-01';\n\n// ============================================================================\n// Model IDs\n// ============================================================================\n\n/**\n * Available Kimi Code model IDs.\n *\n * @remarks\n * - `kimi-for-coding` - Primary coding model optimized for development tasks\n * - `kimi-k2-thinking` - Model with extended thinking for complex reasoning (toggle with Tab in Claude Code)\n *\n * @example\n * ```ts\n * // Default model\n * const model = kimiCode('kimi-for-coding');\n *\n * // Thinking model\n * const thinkingModel = kimiCode('kimi-k2-thinking');\n * ```\n */\nexport type KimiCodeModelId = 'kimi-for-coding' | 'kimi-k2-thinking' | (string & {});\n\n// ============================================================================\n// Model Capabilities\n// ============================================================================\n\n/**\n * Capabilities specific to Kimi Code models.\n * Based on Roo Code configuration documentation.\n */\nexport interface KimiCodeCapabilities {\n /**\n * Whether the model supports extended thinking/reasoning.\n * When enabled, use `thinking.type: 'enabled'` with `budget_tokens`.\n */\n extendedThinking?: boolean;\n\n /**\n * Maximum output tokens.\n * Default: 32768 (per Roo Code docs)\n */\n maxOutputTokens?: number;\n\n /**\n * Maximum context window size.\n * Default: 262144 (per Roo Code docs)\n */\n maxContextSize?: number;\n\n /**\n * Whether the model supports streaming.\n * Always true for Kimi Code.\n */\n streaming?: boolean;\n\n /**\n * Whether the model supports tool/function calling.\n * Always true for Kimi Code.\n */\n toolCalling?: boolean;\n\n /**\n * Whether the model supports image inputs.\n */\n imageInput?: boolean;\n}\n\n/**\n * Infer model capabilities from the model ID.\n *\n * @param modelId - The model identifier\n * @returns Inferred capabilities based on model name patterns\n *\n * @example\n * ```ts\n * const caps = inferKimiCodeCapabilities('kimi-k2-thinking');\n * // caps.extendedThinking === true\n * ```\n */\nexport function inferKimiCodeCapabilities(modelId: string): KimiCodeCapabilities {\n const isThinkingModel = modelId.includes('-thinking') || modelId.includes('k2-thinking');\n\n return {\n extendedThinking: isThinkingModel,\n maxOutputTokens: KIMI_CODE_DEFAULT_MAX_TOKENS,\n maxContextSize: KIMI_CODE_DEFAULT_CONTEXT_WINDOW,\n streaming: true,\n toolCalling: true,\n imageInput: true\n };\n}\n\n// ============================================================================\n// Provider Configuration\n// ============================================================================\n\n/**\n * Configuration for the Kimi Code language model.\n * @internal\n */\nexport interface KimiCodeConfig {\n /**\n * Provider identifier.\n */\n provider: string;\n\n /**\n * Base URL for the API.\n */\n baseURL: string;\n\n /**\n * Function to get headers for requests.\n */\n headers: () => Record<string, string | undefined>;\n\n /**\n * Custom fetch implementation.\n */\n fetch?: typeof globalThis.fetch;\n\n /**\n * ID generator for tool call fallback IDs.\n */\n generateId?: () => string;\n\n /**\n * Whether to include usage in streaming responses.\n */\n includeUsageInStream?: boolean;\n\n /**\n * Override supported URL patterns.\n */\n supportedUrls?: LanguageModelV3['supportedUrls'];\n}\n\n// ============================================================================\n// Extended Thinking Configuration\n// ============================================================================\n\n/**\n * Reasoning effort levels for extended thinking.\n * Maps to budget_tokens for the thinking parameter.\n *\n * Per Roo Code docs: Enable Reasoning Effort: Medium\n */\nexport type ReasoningEffort = 'low' | 'medium' | 'high';\n\n/**\n * Configuration for extended thinking/reasoning.\n * Compatible with Anthropic's thinking parameter format.\n *\n * @example\n * ```ts\n * // Enable thinking with medium effort\n * const config: ExtendedThinkingConfig = {\n * enabled: true,\n * effort: 'medium'\n * };\n *\n * // Or specify exact budget tokens\n * const config: ExtendedThinkingConfig = {\n * enabled: true,\n * budgetTokens: 10000\n * };\n * ```\n */\nexport interface ExtendedThinkingConfig {\n /**\n * Enable extended thinking mode.\n * @default false\n */\n enabled?: boolean;\n\n /**\n * Reasoning effort level.\n * Controls how much computation is spent on reasoning.\n * - low: ~2048 tokens\n * - medium: ~8192 tokens (default, recommended by Roo Code)\n * - high: ~16384 tokens\n * @default 'medium'\n */\n effort?: ReasoningEffort;\n\n /**\n * Budget tokens for thinking (alternative to effort).\n * Higher values allow for more complex reasoning.\n * Takes precedence over effort if both are specified.\n */\n budgetTokens?: number;\n}\n\n// ============================================================================\n// API Response Types (Anthropic-compatible)\n// ============================================================================\n\n/**\n * Token usage from Kimi Code API.\n * Follows Anthropic's usage format.\n */\nexport interface KimiCodeTokenUsage {\n input_tokens?: number | null;\n output_tokens?: number | null;\n cache_read_input_tokens?: number | null;\n cache_creation_input_tokens?: number | null;\n}\n\n/**\n * Response metadata from Kimi Code API.\n * Follows Anthropic's message format.\n */\nexport interface KimiCodeResponseMetadata {\n id?: string | null;\n model?: string | null;\n type?: string | null;\n stop_reason?: string | null;\n stop_sequence?: string | null;\n}\n\n/**\n * Thinking block in response (for extended thinking).\n * Appears when thinking is enabled.\n */\nexport interface KimiCodeThinkingBlock {\n type: 'thinking';\n thinking: string;\n}\n\n/**\n * Text block in response.\n */\nexport interface KimiCodeTextBlock {\n type: 'text';\n text: string;\n}\n\n/**\n * Tool use block in response.\n * Follows Anthropic's tool_use format.\n */\nexport interface KimiCodeToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\n/**\n * Content block types in Kimi Code responses.\n */\nexport type KimiCodeContentBlock = KimiCodeThinkingBlock | KimiCodeTextBlock | KimiCodeToolUseBlock;\n\n// ============================================================================\n// Streaming Event Types (Anthropic SSE format)\n// ============================================================================\n\n/**\n * Streaming event types from Kimi Code API.\n * Follows Anthropic's SSE format.\n *\n * Event sequence:\n * 1. message_start - Contains message metadata and initial usage\n * 2. content_block_start - Start of a content block (text, thinking, tool_use)\n * 3. content_block_delta - Incremental content updates\n * 4. content_block_stop - End of a content block\n * 5. message_delta - Final message updates (stop_reason, usage)\n * 6. message_stop - End of message\n *\n * @see https://docs.anthropic.com/claude/reference/streaming\n */\nexport type KimiCodeStreamEventType =\n | 'message_start'\n | 'content_block_start'\n | 'content_block_delta'\n | 'content_block_stop'\n | 'message_delta'\n | 'message_stop'\n | 'ping'\n | 'error';\n\n/**\n * Delta types for content_block_delta events.\n */\nexport type KimiCodeDeltaType = 'text_delta' | 'thinking_delta' | 'input_json_delta';\n\n/**\n * Stop reasons from Kimi Code API.\n * Follows Anthropic's stop_reason format.\n */\nexport type KimiCodeStopReason = 'end_turn' | 'max_tokens' | 'stop_sequence' | 'tool_use' | null;\n","/**\n * Kimi Code provider factory.\n * @module\n */\n\nimport type { KimiCodeSettings } from './kimi-code-settings';\nimport { type LanguageModelV3, NoSuchModelError, type ProviderV3 } from '@ai-sdk/provider';\nimport {\n type FetchFunction,\n loadOptionalSetting,\n withUserAgentSuffix,\n withoutTrailingSlash\n} from '@ai-sdk/provider-utils';\nimport { VERSION } from '../version';\nimport { KimiCodeLanguageModel } from './kimi-code-language-model';\nimport { KIMI_CODE_BASE_URL, KIMI_CODE_DEFAULT_MODEL, type KimiCodeModelId } from './kimi-code-types';\n\n// ============================================================================\n// Provider Settings\n// ============================================================================\n\n/**\n * Settings for creating a Kimi Code provider instance.\n */\nexport interface KimiCodeProviderSettings {\n /**\n * Kimi Code API key. Defaults to the KIMI_CODE_API_KEY or KIMI_API_KEY environment variable.\n */\n apiKey?: string;\n\n /**\n * Base URL override. Defaults to https://api.kimi.com/coding/v1\n */\n baseURL?: string;\n\n /**\n * Default headers for all requests.\n */\n headers?: Record<string, string | undefined>;\n\n /**\n * Custom fetch implementation.\n */\n fetch?: FetchFunction;\n\n /**\n * ID generator for tool call fallback IDs.\n */\n generateId?: () => string;\n\n /**\n * Include usage details in streaming responses.\n */\n includeUsageInStream?: boolean;\n\n /**\n * Override supported URL patterns for file parts.\n */\n supportedUrls?: LanguageModelV3['supportedUrls'];\n}\n\n// ============================================================================\n// Provider Interface\n// ============================================================================\n\n/**\n * The Kimi Code provider interface.\n */\nexport interface KimiCodeProvider extends Omit<ProviderV3, 'specificationVersion'> {\n specificationVersion: 'v3';\n\n /**\n * Creates a Kimi Code language model.\n * @param modelId - The model identifier (defaults to 'kimi-for-coding')\n * @param settings - Optional model settings\n */\n (modelId?: KimiCodeModelId, settings?: KimiCodeSettings): LanguageModelV3;\n\n /**\n * Creates a Kimi Code language model.\n * @param modelId - The model identifier\n * @param settings - Optional model settings\n */\n languageModel(modelId: KimiCodeModelId, settings?: KimiCodeSettings): LanguageModelV3;\n\n /**\n * Creates a Kimi Code language model (alias for languageModel).\n * @param modelId - The model identifier\n * @param settings - Optional model settings\n */\n chat(modelId: KimiCodeModelId, settings?: KimiCodeSettings): LanguageModelV3;\n}\n\n// ============================================================================\n// Provider Factory\n// ============================================================================\n\n/**\n * Create a Kimi Code provider instance.\n *\n * @param options - Provider settings\n * @returns A configured Kimi Code provider\n *\n * @example\n * ```ts\n * import { createKimiCode } from 'kimi-vercel-ai-sdk-provider\n';\n *\n * const kimiCode = createKimiCode({\n * apiKey: process.env.KIMI_CODE_API_KEY,\n * });\n *\n * const result = await generateText({\n * model: kimiCode(), // Uses default 'kimi-for-coding' model\n * prompt: 'Write a TypeScript function to merge two sorted arrays',\n * });\n * ```\n *\n * @example\n * ```ts\n * // With extended thinking enabled\n * const result = await generateText({\n * model: kimiCode('kimi-for-coding', {\n * extendedThinking: {\n * enabled: true,\n * effort: 'high'\n * }\n * }),\n * prompt: 'Design a distributed cache system',\n * });\n * ```\n *\n * @example\n * ```ts\n * // Using with Claude Code compatible settings\n * const result = await generateText({\n * model: kimiCode('kimi-k2-thinking'),\n * prompt: 'Explain and fix this bug',\n * });\n * ```\n */\nexport function createKimiCode(options: KimiCodeProviderSettings = {}): KimiCodeProvider {\n const resolvedBaseURL =\n loadOptionalSetting({\n settingValue: options.baseURL,\n environmentVariableName: 'KIMI_CODE_BASE_URL'\n }) ?? KIMI_CODE_BASE_URL;\n\n const baseURL = withoutTrailingSlash(resolvedBaseURL) ?? KIMI_CODE_BASE_URL;\n\n const getHeaders = () => {\n // Try KIMI_CODE_API_KEY first, fall back to KIMI_API_KEY\n let apiKey = options.apiKey;\n if (!apiKey) {\n apiKey = process.env.KIMI_CODE_API_KEY ?? process.env.KIMI_API_KEY;\n }\n if (!apiKey) {\n throw new Error(\n 'Kimi Code API key is required. Set the KIMI_CODE_API_KEY or KIMI_API_KEY environment variable, or pass the apiKey option.'\n );\n }\n\n return withUserAgentSuffix(\n {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n ...options.headers\n },\n `ai-sdk/kimi-code/${VERSION}`\n );\n };\n\n const createCodeModel = (modelId: KimiCodeModelId = KIMI_CODE_DEFAULT_MODEL, settings: KimiCodeSettings = {}) =>\n new KimiCodeLanguageModel(modelId, settings, {\n provider: 'kimi.code',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n generateId: options.generateId,\n includeUsageInStream: settings.includeUsageInStream ?? options.includeUsageInStream,\n supportedUrls: settings.supportedUrls ?? options.supportedUrls\n });\n\n const provider: KimiCodeProvider = (\n modelId: KimiCodeModelId = KIMI_CODE_DEFAULT_MODEL,\n settings?: KimiCodeSettings\n ): KimiCodeLanguageModel => {\n if (new.target) {\n throw new Error('The Kimi Code provider function cannot be called with new.');\n }\n\n return createCodeModel(modelId, settings);\n };\n\n provider.specificationVersion = 'v3';\n provider.languageModel = createCodeModel;\n provider.chat = createCodeModel;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n provider.rerankingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'rerankingModel' });\n };\n\n return provider;\n}\n\n/**\n * Default Kimi Code provider instance.\n *\n * Uses the KIMI_CODE_API_KEY or KIMI_API_KEY environment variable for authentication.\n *\n * @example\n * ```ts\n * import { kimiCode } from 'kimi-vercel-ai-sdk-provider\n';\n *\n * const result = await generateText({\n * model: kimiCode(), // Uses default model\n * prompt: 'Implement a binary search tree',\n * });\n * ```\n *\n * @example\n * ```ts\n * // With extended thinking\n * const result = await generateText({\n * model: kimiCode('kimi-for-coding', { extendedThinking: true }),\n * prompt: 'Design a microservices architecture',\n * });\n * ```\n */\nexport const kimiCode = createKimiCode();\n"],"mappings":"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","names":["z","kimiTools","UnsupportedFunctionalityError","UnsupportedFunctionalityError","z","kimiTools","toolCall","z","isImageMediaType","isVideoMediaType","isImageMediaType","isVideoMediaType","combineHeaders","createEventSourceResponseHandler","createJsonErrorResponseHandler","createJsonResponseHandler","generateId","parseProviderOptions","postJsonToApi","removeUndefinedEntries","z","UnsupportedFunctionalityError","convertToBase64","z","z","createJsonErrorResponseHandler","generateId","parseProviderOptions","removeUndefinedEntries","postJsonToApi","combineHeaders","createJsonResponseHandler","createEventSourceResponseHandler","NoSuchModelError","loadOptionalSetting","withUserAgentSuffix","withoutTrailingSlash","loadOptionalSetting","withoutTrailingSlash","withUserAgentSuffix","NoSuchModelError"]}
|