@ai-sdk/deepseek 3.0.49 → 3.0.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/deepseek-provider.ts","../src/chat/deepseek-chat-language-model.ts","../src/chat/convert-to-deepseek-chat-messages.ts","../src/chat/deepseek-file-part-options.ts","../src/chat/deepseek-chat-language-model-options.ts","../src/chat/is-deepseek-v4-model.ts","../src/chat/convert-to-deepseek-usage.ts","../src/chat/deepseek-chat-api-types.ts","../src/chat/deepseek-prepare-tools.ts","../src/chat/get-response-metadata.ts","../src/chat/map-deepseek-finish-reason.ts","../src/files/deepseek-files.ts","../src/files/deepseek-files-api.ts","../src/files/deepseek-files-options.ts","../src/version.ts"],"sourcesContent":["import {\n type FilesV4,\n NoSuchModelError,\n type LanguageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport type { DeepSeekChatModelId } from './chat/deepseek-chat-language-model-options';\nimport { DeepSeekChatLanguageModel } from './chat/deepseek-chat-language-model';\nimport { DeepSeekFiles } from './files/deepseek-files';\nimport { VERSION } from './version';\n\nexport interface DeepSeekProviderSettings {\n /**\n * DeepSeek API key.\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface DeepSeekProvider extends ProviderV4 {\n /**\n * Creates a DeepSeek model for text generation.\n */\n (modelId: DeepSeekChatModelId): LanguageModelV4;\n\n /**\n * Creates a DeepSeek model for text generation.\n */\n languageModel(modelId: DeepSeekChatModelId): LanguageModelV4;\n\n /**\n * Creates a DeepSeek chat model for text generation.\n */\n chat(modelId: DeepSeekChatModelId): LanguageModelV4;\n\n /**\n * Creates a DeepSeek files interface for uploading images.\n */\n files(): FilesV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport function createDeepSeek(\n options: DeepSeekProviderSettings = {},\n): DeepSeekProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL ?? 'https://api.deepseek.com') ??\n 'https://api.deepseek.com';\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'DEEPSEEK_API_KEY',\n description: 'DeepSeek API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk/deepseek/${VERSION}`,\n );\n\n const createLanguageModel = (modelId: DeepSeekChatModelId) => {\n return new DeepSeekChatLanguageModel(modelId, {\n provider: `deepseek.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n supportsAssistantPrefixCompletion: baseURL.endsWith('/beta'),\n supportsStrictToolCalls: baseURL.endsWith('/beta'),\n });\n };\n\n const createFiles = () =>\n new DeepSeekFiles({\n provider: 'deepseek.files',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = (modelId: DeepSeekChatModelId) =>\n createLanguageModel(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.files = createFiles;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n\nexport const deepSeek = createDeepSeek();\n","import {\n InvalidResponseDataError,\n type APICallError,\n type LanguageModelV4,\n type LanguageModelV4CallOptions,\n type LanguageModelV4Content,\n type LanguageModelV4FinishReason,\n type LanguageModelV4GenerateResult,\n type LanguageModelV4StreamPart,\n type LanguageModelV4StreamResult,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n createProviderStreamError,\n generateId,\n isCustomReasoning,\n mapReasoningToProviderEffort,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n StreamingToolCallTracker,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n type InferSchema,\n type ParseResult,\n type ResponseHandler,\n} from '@ai-sdk/provider-utils';\nimport { convertToDeepSeekChatMessages } from './convert-to-deepseek-chat-messages';\nimport { convertDeepSeekUsage } from './convert-to-deepseek-usage';\nimport {\n deepseekChatChunkSchema,\n deepseekChatResponseSchema,\n deepSeekErrorSchema,\n type DeepSeekChatLogprob,\n type DeepSeekChatTokenUsage,\n} from './deepseek-chat-api-types';\nimport {\n deepseekLanguageModelChatOptions,\n type DeepSeekChatModelId,\n} from './deepseek-chat-language-model-options';\nimport { prepareTools } from './deepseek-prepare-tools';\nimport { getResponseMetadata } from './get-response-metadata';\nimport { isDeepSeekV4Model } from './is-deepseek-v4-model';\nimport { mapDeepSeekFinishReason } from './map-deepseek-finish-reason';\n\nexport type DeepSeekChatConfig = {\n provider: string;\n headers?: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n supportsAssistantPrefixCompletion?: boolean;\n supportsStrictToolCalls?: boolean;\n supportsPenaltySampling?: boolean;\n supportsThinking?: boolean;\n supportsStructuredOutputs?: boolean;\n};\n\nfunction createDeepSeekStreamError(\n error: {\n message: string;\n type?: string | null;\n code?: string | number | null;\n },\n data: unknown,\n) {\n const metadata = getDeepSeekStreamErrorMetadata(error);\n\n return createProviderStreamError({\n message: error.message,\n type: error.type ?? undefined,\n code: error.code ?? undefined,\n ...metadata,\n data,\n });\n}\n\nfunction getDeepSeekStreamErrorMetadata(error: {\n type?: string | null;\n code?: string | number | null;\n}): {\n statusCode?: number;\n isRetryable?: boolean;\n} {\n if (\n error.code === 'insufficient_quota' ||\n error.type === 'insufficient_quota'\n ) {\n return { statusCode: 429, isRetryable: false };\n }\n\n const explicitStatusCode = getHttpStatusCode(error.code);\n if (explicitStatusCode != null) {\n return {\n statusCode: explicitStatusCode,\n isRetryable: isRetryableStatusCode(explicitStatusCode),\n };\n }\n\n for (const discriminator of [error.code, error.type]) {\n switch (discriminator) {\n case 'rate_limit_exceeded':\n case 'rate_limit_error':\n return { statusCode: 429, isRetryable: true };\n case 'server_error':\n case 'api_error':\n case 'internal_server_error':\n return { statusCode: 500, isRetryable: true };\n case 'overloaded_error':\n case 'service_unavailable':\n return { statusCode: 503, isRetryable: true };\n case 'timeout':\n case 'timeout_error':\n return { statusCode: 504, isRetryable: true };\n case 'authentication_error':\n case 'invalid_api_key':\n return { statusCode: 401, isRetryable: false };\n case 'permission_error':\n return { statusCode: 403, isRetryable: false };\n case 'not_found_error':\n case 'model_not_found':\n return { statusCode: 404, isRetryable: false };\n case 'bad_request':\n case 'context_length_exceeded':\n case 'invalid_request_error':\n return { statusCode: 400, isRetryable: false };\n }\n }\n\n return {};\n}\n\nfunction getHttpStatusCode(value: unknown): number | undefined {\n const statusCode =\n typeof value === 'string' && /^\\d{3}$/.test(value) ? Number(value) : value;\n\n return typeof statusCode === 'number' &&\n Number.isInteger(statusCode) &&\n statusCode >= 400 &&\n statusCode <= 599\n ? statusCode\n : undefined;\n}\n\nfunction isRetryableStatusCode(statusCode: number): boolean {\n return (\n statusCode === 408 ||\n statusCode === 409 ||\n statusCode === 429 ||\n statusCode >= 500\n );\n}\n\nfunction mapDeepSeekProviderReasoningEffort({\n reasoningEffort,\n warnings,\n}: {\n reasoningEffort: 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n warnings: SharedV4Warning[];\n}): 'low' | 'high' | 'max' {\n const mapped =\n reasoningEffort === 'medium'\n ? 'high'\n : reasoningEffort === 'xhigh'\n ? 'max'\n : reasoningEffort;\n\n if (mapped !== reasoningEffort) {\n warnings.push({\n type: 'compatibility',\n feature: 'reasoningEffort',\n details: `reasoningEffort \"${reasoningEffort}\" is not a canonical DeepSeek value. mapped to \"${mapped}\".`,\n });\n }\n\n return mapped;\n}\n\nexport class DeepSeekChatLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n\n readonly modelId: DeepSeekChatModelId;\n\n readonly supportedUrls = {\n 'image/*': [/^https?:\\/\\/.*$/],\n };\n\n private readonly config: DeepSeekChatConfig;\n private readonly failedResponseHandler: ResponseHandler<APICallError>;\n\n static [WORKFLOW_SERIALIZE](model: DeepSeekChatLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: DeepSeekChatModelId;\n config: DeepSeekChatConfig;\n }) {\n return new DeepSeekChatLanguageModel(options.modelId, options.config);\n }\n\n constructor(modelId: DeepSeekChatModelId, config: DeepSeekChatConfig) {\n this.modelId = modelId;\n this.config = config;\n\n this.failedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: deepSeekErrorSchema,\n errorToMessage: (error: InferSchema<typeof deepSeekErrorSchema>) =>\n error.error.message,\n });\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 private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n reasoning,\n providerOptions,\n stopSequences,\n responseFormat,\n seed,\n toolChoice,\n tools,\n }: LanguageModelV4CallOptions) {\n const deepseekOptions =\n (await parseProviderOptions({\n provider: this.providerOptionsName,\n providerOptions,\n schema: deepseekLanguageModelChatOptions,\n })) ?? {};\n\n const supportsStructuredOutputs =\n this.config.supportsStructuredOutputs === true;\n const supportsPenaltySampling =\n this.config.supportsPenaltySampling === true;\n\n const { messages, warnings } = await convertToDeepSeekChatMessages({\n prompt,\n responseFormat,\n modelId: this.modelId,\n providerOptionsName: this.providerOptionsName,\n supportsAssistantPrefixCompletion:\n this.config.supportsAssistantPrefixCompletion,\n supportsStructuredOutputs,\n });\n const allWarnings: SharedV4Warning[] = [...warnings];\n\n if (topK != null) {\n allWarnings.push({ type: 'unsupported', feature: 'topK' });\n }\n\n if (seed != null) {\n allWarnings.push({ type: 'unsupported', feature: 'seed' });\n }\n\n if (!supportsPenaltySampling && frequencyPenalty != null) {\n allWarnings.push({\n type: 'deprecated',\n setting: 'frequencyPenalty',\n message:\n 'frequencyPenalty is deprecated by DeepSeek and has been omitted. Remove frequencyPenalty from the request.',\n });\n }\n\n if (!supportsPenaltySampling && presencePenalty != null) {\n allWarnings.push({\n type: 'deprecated',\n setting: 'presencePenalty',\n message:\n 'presencePenalty is deprecated by DeepSeek and has been omitted. Remove presencePenalty from the request.',\n });\n }\n\n const {\n tools: deepseekTools,\n toolChoice: deepseekToolChoices,\n toolWarnings,\n } = prepareTools({\n tools,\n toolChoice,\n supportsStrictToolCalls: this.config.supportsStrictToolCalls,\n });\n\n const thinkingType = deepseekOptions.thinking?.type;\n if (thinkingType === 'adaptive') {\n allWarnings.push({\n type: 'compatibility',\n feature: 'thinking.type',\n details:\n 'thinking.type \"adaptive\" is not a canonical DeepSeek value. mapped to \"enabled\".',\n });\n }\n\n const thinking =\n this.config.supportsThinking === false\n ? undefined\n : thinkingType != null\n ? { type: thinkingType === 'adaptive' ? 'enabled' : thinkingType }\n : isCustomReasoning(reasoning)\n ? { type: reasoning === 'none' ? 'disabled' : 'enabled' }\n : undefined;\n\n const isThinkingEnabled =\n this.config.supportsThinking !== false &&\n thinking?.type !== 'disabled' &&\n (thinking != null ||\n this.modelId === 'deepseek-reasoner' ||\n isDeepSeekV4Model(this.modelId));\n\n if (isThinkingEnabled && temperature != null) {\n allWarnings.push({\n type: 'unsupported',\n feature: 'temperature',\n details:\n \"temperature has no effect when DeepSeek thinking is enabled. Set providerOptions.deepseek.thinking.type to 'disabled' to use temperature.\",\n });\n }\n\n if (isThinkingEnabled && topP != null) {\n allWarnings.push({\n type: 'unsupported',\n feature: 'topP',\n details:\n \"topP has no effect when DeepSeek thinking is enabled. Set providerOptions.deepseek.thinking.type to 'disabled' to use topP.\",\n });\n }\n\n const reasoningEffort =\n deepseekOptions.reasoningEffort != null\n ? mapDeepSeekProviderReasoningEffort({\n reasoningEffort: deepseekOptions.reasoningEffort,\n warnings: allWarnings,\n })\n : isCustomReasoning(reasoning) && reasoning !== 'none'\n ? mapReasoningToProviderEffort({\n reasoning,\n effortMap: {\n minimal: 'low',\n low: 'low',\n medium: 'high',\n high: 'high',\n xhigh: 'max',\n },\n warnings: allWarnings,\n })\n : undefined;\n\n return {\n args: {\n model: this.modelId,\n ...((deepseekOptions.logprobs === true ||\n deepseekOptions.topLogprobs != null) && { logprobs: true }),\n ...(deepseekOptions.topLogprobs != null && {\n top_logprobs: deepseekOptions.topLogprobs,\n }),\n max_tokens: maxOutputTokens,\n temperature: isThinkingEnabled ? undefined : temperature,\n top_p: isThinkingEnabled ? undefined : topP,\n frequency_penalty: supportsPenaltySampling\n ? frequencyPenalty\n : undefined,\n presence_penalty: supportsPenaltySampling ? presencePenalty : undefined,\n response_format:\n responseFormat?.type === 'json'\n ? supportsStructuredOutputs && responseFormat.schema != null\n ? {\n type: 'json_schema',\n json_schema: {\n schema: responseFormat.schema,\n strict: deepseekOptions.strictJsonSchema ?? true,\n name: responseFormat.name ?? 'response',\n description: responseFormat.description,\n },\n }\n : { type: 'json_object' }\n : undefined,\n stop: stopSequences,\n messages,\n tools: deepseekTools,\n tool_choice: deepseekToolChoices,\n thinking,\n ...(deepseekOptions.userId != null && {\n user_id: deepseekOptions.userId,\n }),\n ...(thinking?.type !== 'disabled' &&\n reasoningEffort != null && {\n reasoning_effort: reasoningEffort,\n }),\n },\n warnings: [...allWarnings, ...toolWarnings],\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args, warnings } = await this.getArgs({ ...options });\n\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body: args,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n deepseekChatResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = responseBody.choices[0];\n if (choice == null) {\n throw new InvalidResponseDataError({\n data: rawResponse,\n message: 'Response did not contain any choices.',\n });\n }\n\n const content: Array<LanguageModelV4Content> = [];\n\n // reasoning content (before text):\n const reasoning = choice.message.reasoning_content;\n if (reasoning != null && reasoning.length > 0) {\n content.push({\n type: 'reasoning',\n text: reasoning,\n });\n }\n\n // tool calls:\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 || generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments!,\n });\n }\n }\n\n // text content:\n const text = choice.message.content;\n if (text != null && text.length > 0) {\n content.push({ type: 'text', text });\n }\n\n return {\n content,\n finishReason: {\n unified: mapDeepSeekFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n },\n usage: convertDeepSeekUsage(responseBody.usage),\n providerMetadata: {\n [this.providerOptionsName]: {\n promptCacheHitTokens: responseBody.usage?.prompt_cache_hit_tokens,\n promptCacheMissTokens: responseBody.usage?.prompt_cache_miss_tokens,\n ...(responseBody.object != null && {\n responseObject: responseBody.object,\n }),\n ...(choice.index != null && { choiceIndex: choice.index }),\n ...(choice.message.role != null && {\n messageRole: choice.message.role,\n }),\n ...(choice.message.tool_calls != null && {\n toolCallTypes: choice.message.tool_calls\n .map(toolCall => toolCall.type)\n .filter(type => type != null),\n }),\n ...(choice.logprobs != null && { logprobs: choice.logprobs }),\n ...(responseBody.system_fingerprint != null && {\n systemFingerprint: responseBody.system_fingerprint,\n }),\n },\n },\n request: { body: args },\n response: {\n ...getResponseMetadata(responseBody),\n headers: responseHeaders,\n body: rawResponse,\n },\n warnings,\n };\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const { args, warnings } = await this.getArgs({ ...options });\n\n const body = {\n ...args,\n stream: true,\n stream_options: { include_usage: true },\n };\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n deepseekChatChunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n let toolCallTracker: StreamingToolCallTracker;\n\n let finishReason: LanguageModelV4FinishReason = {\n unified: 'other',\n raw: undefined,\n };\n let usage: DeepSeekChatTokenUsage | undefined = undefined;\n let systemFingerprint: string | undefined = undefined;\n let isFirstChunk = true;\n const providerOptionsName = this.providerOptionsName;\n let isActiveReasoning = false;\n let isActiveText = false;\n let responseObject: 'chat.completion.chunk' | undefined;\n let choiceIndex: number | undefined;\n let messageRole: 'assistant' | undefined;\n const toolCallTypes = new Map<number, 'function'>();\n const contentLogprobs: DeepSeekChatLogprob[] = [];\n const reasoningLogprobs: DeepSeekChatLogprob[] = [];\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<InferSchema<typeof deepseekChatChunkSchema>>,\n LanguageModelV4StreamPart\n >({\n start(controller) {\n toolCallTracker = new StreamingToolCallTracker(controller, {\n generateId,\n });\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n // Emit raw chunk if requested (before anything else)\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n const value = chunk.value;\n\n // handle error chunks:\n if ('error' in value) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({\n type: 'error',\n error: createDeepSeekStreamError(value.error, value),\n });\n return;\n }\n\n if (isFirstChunk) {\n isFirstChunk = false;\n\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 if (value.object != null) {\n responseObject = value.object;\n }\n\n // The fingerprint is repeated on stream chunks; keep the latest\n // non-null value in case it changes during the response.\n if (value.system_fingerprint != null) {\n systemFingerprint = value.system_fingerprint;\n }\n\n const choice = value.choices[0];\n\n if (choice?.index != null) {\n choiceIndex = choice.index;\n }\n\n if (choice?.finish_reason != null) {\n finishReason = {\n unified: mapDeepSeekFinishReason(choice.finish_reason),\n raw: choice.finish_reason,\n };\n }\n\n if (choice?.logprobs?.content != null) {\n contentLogprobs.push(...choice.logprobs.content);\n }\n\n if (choice?.logprobs?.reasoning_content != null) {\n reasoningLogprobs.push(...choice.logprobs.reasoning_content);\n }\n\n if (choice?.delta == null) {\n return;\n }\n\n const delta = choice.delta;\n\n if (delta.role != null) {\n messageRole = delta.role;\n }\n\n // enqueue reasoning before text deltas:\n const reasoningContent = delta.reasoning_content;\n if (reasoningContent) {\n if (!isActiveReasoning) {\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: reasoningContent,\n });\n }\n\n if (delta.content) {\n if (!isActiveText) {\n controller.enqueue({ type: 'text-start', id: 'txt-0' });\n isActiveText = true;\n }\n\n // end reasoning when text starts:\n if (isActiveReasoning) {\n controller.enqueue({\n type: 'reasoning-end',\n id: 'reasoning-0',\n });\n isActiveReasoning = false;\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: 'txt-0',\n delta: delta.content,\n });\n }\n\n if (delta.tool_calls != null && delta.tool_calls.length > 0) {\n // end reasoning when tool calls start:\n if (isActiveReasoning) {\n controller.enqueue({\n type: 'reasoning-end',\n id: 'reasoning-0',\n });\n isActiveReasoning = false;\n }\n\n for (const toolCallDelta of delta.tool_calls) {\n if (toolCallDelta.type != null) {\n toolCallTypes.set(toolCallDelta.index, toolCallDelta.type);\n }\n toolCallTracker.processDelta(toolCallDelta);\n }\n }\n },\n\n flush(controller) {\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n }\n\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'txt-0' });\n }\n\n toolCallTracker.flush();\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertDeepSeekUsage(usage),\n providerMetadata: {\n [providerOptionsName]: {\n promptCacheHitTokens:\n usage?.prompt_cache_hit_tokens ?? undefined,\n promptCacheMissTokens:\n usage?.prompt_cache_miss_tokens ?? undefined,\n ...(responseObject != null && { responseObject }),\n ...(choiceIndex != null && { choiceIndex }),\n ...(messageRole != null && { messageRole }),\n ...(toolCallTypes.size > 0 && {\n toolCallTypes: [...toolCallTypes.entries()]\n .sort(([left], [right]) => left - right)\n .map(([, type]) => type),\n }),\n ...((contentLogprobs.length > 0 ||\n reasoningLogprobs.length > 0) && {\n logprobs: {\n ...(contentLogprobs.length > 0 && {\n content: contentLogprobs,\n }),\n ...(reasoningLogprobs.length > 0 && {\n reasoning_content: reasoningLogprobs,\n }),\n },\n }),\n ...(systemFingerprint != null && { systemFingerprint }),\n },\n },\n });\n },\n }),\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n}\n","import {\n InvalidPromptError,\n UnsupportedFunctionalityError,\n type LanguageModelV4CallOptions,\n type LanguageModelV4Prompt,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n convertToBase64,\n getTopLevelMediaType,\n parseProviderOptions,\n resolveFullMediaType,\n resolveProviderReference,\n} from '@ai-sdk/provider-utils';\nimport type {\n DeepSeekChatPrompt,\n DeepSeekContentPart,\n} from './deepseek-chat-api-types';\nimport { deepseekFilePartProviderOptions } from './deepseek-file-part-options';\nimport { deepseekAssistantMessageProviderOptions } from './deepseek-chat-language-model-options';\nimport { isDeepSeekV4Model } from './is-deepseek-v4-model';\n\nconst supportedImageMediaTypes = new Set([\n 'image/gif',\n 'image/jpeg',\n 'image/jpg',\n 'image/png',\n 'image/webp',\n]);\n\nexport async function convertToDeepSeekChatMessages({\n prompt,\n responseFormat,\n modelId,\n providerOptionsName = 'deepseek',\n supportsAssistantPrefixCompletion = false,\n supportsStructuredOutputs = false,\n}: {\n prompt: LanguageModelV4Prompt;\n responseFormat: LanguageModelV4CallOptions['responseFormat'];\n modelId: string;\n providerOptionsName?: string;\n supportsAssistantPrefixCompletion?: boolean;\n supportsStructuredOutputs?: boolean;\n}): Promise<{\n messages: DeepSeekChatPrompt;\n warnings: Array<SharedV4Warning>;\n}> {\n const isDeepSeekV4 = isDeepSeekV4Model(modelId);\n const messages: DeepSeekChatPrompt = [];\n const warnings: Array<SharedV4Warning> = [];\n\n // Inject system message if response format is JSON\n if (responseFormat?.type === 'json') {\n if (responseFormat.schema == null) {\n messages.push({\n role: 'system',\n content: 'Return JSON.',\n });\n } else if (!supportsStructuredOutputs) {\n messages.push({\n role: 'system',\n content:\n 'Return JSON that conforms to the following schema: ' +\n JSON.stringify(responseFormat.schema),\n });\n warnings.push({\n type: 'compatibility',\n feature: 'responseFormat JSON schema',\n details: 'JSON response schema is injected into the system message.',\n });\n }\n }\n\n // TODO use findLastIndex once we use ES2023\n let lastUserMessageIndex = -1;\n for (let i = prompt.length - 1; i >= 0; i--) {\n if (prompt[i].role === 'user') {\n lastUserMessageIndex = i;\n break;\n }\n }\n\n let index = -1;\n for (const { role, content, providerOptions } of prompt) {\n index++;\n\n // The assistant schema extends the common message schema, so one parse\n // validates names for every role and the assistant-only prefix option.\n const deepseekMessageOptions = await parseProviderOptions({\n provider: providerOptionsName,\n providerOptions,\n schema: deepseekAssistantMessageProviderOptions,\n });\n\n if (deepseekMessageOptions?.prefix === true && role !== 'assistant') {\n throw new InvalidPromptError({\n prompt,\n message:\n 'DeepSeek assistant prefix completion requires `prefix: true` on an assistant message.',\n });\n }\n\n switch (role) {\n case 'system': {\n messages.push({\n role: 'system',\n content,\n ...(deepseekMessageOptions?.name != null && {\n name: deepseekMessageOptions.name,\n }),\n });\n break;\n }\n\n case 'user': {\n const hasImagePart = content.some(\n part =>\n part.type === 'file' &&\n (part.data.type === 'reference' ||\n part.data.type === 'url' ||\n part.data.type === 'data') &&\n getTopLevelMediaType(part.mediaType) === 'image',\n );\n\n if (!hasImagePart) {\n let userContent = '';\n for (const part of content) {\n if (part.type === 'text') {\n userContent += part.text;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: `user message part type: ${part.type}`,\n });\n }\n }\n\n messages.push({\n role: 'user',\n content: userContent,\n ...(deepseekMessageOptions?.name != null && {\n name: deepseekMessageOptions.name,\n }),\n });\n break;\n }\n\n const userContent: Array<DeepSeekContentPart> = [];\n for (const part of content) {\n if (part.type === 'text') {\n userContent.push({ type: 'text', text: part.text });\n } else if (\n part.type === 'file' &&\n getTopLevelMediaType(part.mediaType) === 'image'\n ) {\n const filePartOptions = await parseProviderOptions({\n provider: providerOptionsName,\n providerOptions: part.providerOptions,\n schema: deepseekFilePartProviderOptions,\n });\n\n if (part.data.type === 'reference') {\n userContent.push({\n type: 'file',\n file_id: resolveProviderReference({\n reference: part.data.reference,\n provider: 'deepseek',\n }),\n });\n } else if (part.data.type === 'url' || part.data.type === 'data') {\n const resolvedMediaType = resolveFullMediaType({ part });\n\n if (!supportedImageMediaTypes.has(resolvedMediaType)) {\n throw new UnsupportedFunctionalityError({\n functionality: `DeepSeek image media type ${resolvedMediaType}`,\n message:\n 'DeepSeek supports JPEG, PNG, GIF, and WebP image inputs.',\n });\n }\n\n if (part.data.type === 'url') {\n const url = part.data.url.toString();\n\n if (url.length > 8192) {\n throw new InvalidPromptError({\n prompt,\n message:\n 'DeepSeek image URLs must not exceed 8192 characters.',\n });\n }\n\n if (filePartOptions?.fileData === true) {\n throw new InvalidPromptError({\n prompt,\n message:\n 'DeepSeek `fileData` image parts require inline data, not a URL.',\n });\n }\n\n userContent.push({\n type: 'image_url',\n image_url: {\n url,\n ...(filePartOptions?.imageDetail != null && {\n detail: filePartOptions.imageDetail,\n }),\n },\n });\n } else {\n const dataUrl = `data:${\n resolvedMediaType === 'image/jpg'\n ? 'image/jpeg'\n : resolvedMediaType\n };base64,${convertToBase64(part.data.data)}`;\n\n if (filePartOptions?.fileData === true) {\n if (filePartOptions.imageDetail != null) {\n throw new InvalidPromptError({\n prompt,\n message:\n 'DeepSeek `imageDetail` cannot be combined with `fileData`.',\n });\n }\n\n userContent.push({\n type: 'file',\n file_data: dataUrl,\n ...(part.filename != null && { filename: part.filename }),\n });\n } else {\n userContent.push({\n type: 'image_url',\n image_url: {\n url: dataUrl,\n ...(filePartOptions?.imageDetail != null && {\n detail: filePartOptions.imageDetail,\n }),\n },\n });\n }\n }\n } else {\n warnings.push({\n type: 'unsupported',\n feature: `user message part type: ${part.type}`,\n });\n }\n } else {\n warnings.push({\n type: 'unsupported',\n feature: `user message part type: ${part.type}`,\n });\n }\n }\n\n messages.push({\n role: 'user',\n content: userContent,\n ...(deepseekMessageOptions?.name != null && {\n name: deepseekMessageOptions.name,\n }),\n });\n\n break;\n }\n case 'assistant': {\n if (deepseekMessageOptions?.prefix === true) {\n if (index !== prompt.length - 1) {\n throw new InvalidPromptError({\n prompt,\n message:\n 'DeepSeek assistant prefix completion requires the prefixed assistant message to be the final message.',\n });\n }\n\n if (!supportsAssistantPrefixCompletion) {\n throw new UnsupportedFunctionalityError({\n functionality: 'DeepSeek assistant prefix completion',\n message:\n 'DeepSeek assistant prefix completion requires a beta base URL ending in `/beta`.',\n });\n }\n }\n\n let text = '';\n let reasoning: string | undefined;\n\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 // R1 must not receive prior reasoning; V4 requires it.\n if (index <= lastUserMessageIndex && !isDeepSeekV4) {\n break;\n }\n\n if (reasoning == null) {\n reasoning = part.text;\n } else {\n reasoning += part.text;\n }\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 }\n }\n\n // V4 demands the field on every assistant turn — back-fill an empty\n // string when the source message had no reasoning part at all.\n messages.push({\n role: 'assistant',\n content: text,\n ...(deepseekMessageOptions?.name != null && {\n name: deepseekMessageOptions.name,\n }),\n ...(deepseekMessageOptions?.prefix === true && {\n prefix: true,\n }),\n reasoning_content: reasoning ?? (isDeepSeekV4 ? '' : undefined),\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n });\n\n break;\n }\n\n case 'tool': {\n if (deepseekMessageOptions?.name != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'message name on tool messages',\n });\n }\n\n for (const toolResponse of content) {\n if (toolResponse.type === 'tool-approval-response') {\n continue;\n }\n const output = toolResponse.output;\n\n let contentValue: string;\n switch (output.type) {\n case 'text':\n case 'error-text':\n contentValue = output.value;\n break;\n case 'execution-denied':\n contentValue = output.reason ?? 'Tool call execution denied.';\n break;\n case 'content':\n case 'json':\n case 'error-json':\n contentValue = JSON.stringify(output.value);\n break;\n }\n\n messages.push({\n role: 'tool',\n tool_call_id: toolResponse.toolCallId,\n content: contentValue,\n });\n }\n break;\n }\n\n default: {\n warnings.push({\n type: 'unsupported',\n feature: `message role: ${role}`,\n });\n break;\n }\n }\n }\n\n return { messages, warnings };\n}\n","import { z } from 'zod/v4';\n\nexport const deepseekFilePartProviderOptions = z.object({\n /**\n * Controls how DeepSeek processes an image sent as an `image_url` part.\n *\n * @see https://api-docs.deepseek.com/api/create-chat-completion/\n */\n imageDetail: z.enum(['low', 'high', 'original', 'auto']).optional(),\n\n /**\n * Sends inline image data as a DeepSeek `file` part using `file_data`\n * instead of an `image_url` data URL. When set, the file part's filename\n * is preserved.\n *\n * This option only applies to inline image data. It cannot be combined\n * with `imageDetail`.\n */\n fileData: z.literal(true).optional(),\n});\n\nexport type DeepSeekFilePartProviderOptions = z.infer<\n typeof deepseekFilePartProviderOptions\n>;\n","import { z } from 'zod/v4';\n\n// https://api-docs.deepseek.com/quick_start/pricing\nexport type DeepSeekChatModelId =\n | 'deepseek-flash'\n | 'deepseek-v4-flash'\n | 'deepseek-v4-pro'\n | 'deepseek-v4-flash-vision-exp'\n // Retired aliases remain assignable through the string escape hatch, but are\n // intentionally omitted from first-class editor suggestions.\n | (string & {});\n\nexport const deepseekLanguageModelChatOptions = z.object({\n /**\n * Whether to return log probabilities for generated tokens.\n */\n logprobs: z.boolean().optional(),\n\n /**\n * Number of most likely tokens to return at each token position.\n *\n * Setting this option automatically enables `logprobs`.\n */\n topLogprobs: z.number().int().min(0).max(20).optional(),\n\n /**\n * An opaque identifier for the end user. DeepSeek uses this identifier for\n * content-safety tracing and request isolation.\n *\n * Must contain only ASCII letters, numbers, underscores, and hyphens, and\n * must be at most 512 characters long.\n */\n userId: z\n .string()\n .regex(/^[a-zA-Z0-9_-]+$/, 'userId must match /^[a-zA-Z0-9_-]+$/')\n .max(512, 'userId must be at most 512 characters long')\n .optional(),\n\n /**\n * Type of thinking to use. Defaults to `enabled`.\n */\n thinking: z\n .object({\n // `adaptive` is accepted at runtime for backwards compatibility and\n // mapped to `enabled`, but is intentionally excluded from the exported\n // provider options type.\n type: z.enum(['adaptive', 'enabled', 'disabled']).optional(),\n })\n .optional(),\n\n /**\n * Controls the thinking strength for DeepSeek V4 reasoning models.\n */\n // `medium` and `xhigh` are accepted at runtime for backwards compatibility\n // and mapped to canonical DeepSeek values, but are intentionally excluded\n // from the exported provider options type.\n reasoningEffort: z.enum(['low', 'medium', 'high', 'xhigh', 'max']).optional(),\n\n /**\n * Whether to use strict JSON schema validation for structured outputs.\n * Only applies when the serving endpoint supports JSON schema response\n * formats (e.g. Azure). Defaults to `true`.\n */\n strictJsonSchema: z.boolean().optional(),\n});\n\nexport type DeepSeekLanguageModelChatOptions = {\n /**\n * Whether to return log probabilities for generated tokens.\n */\n logprobs?: boolean;\n\n /**\n * Number of most likely tokens to return at each token position.\n *\n * Setting this option automatically enables `logprobs`.\n */\n topLogprobs?: number;\n\n /**\n * An opaque identifier for the end user. DeepSeek uses this identifier for\n * content-safety tracing and request isolation.\n *\n * Must contain only ASCII letters, numbers, underscores, and hyphens, and\n * must be at most 512 characters long.\n */\n userId?: string;\n\n /**\n * Controls whether thinking mode is enabled. Defaults to `enabled`.\n */\n thinking?: {\n type?: 'enabled' | 'disabled';\n };\n\n /**\n * Controls the thinking strength for DeepSeek V4 reasoning models.\n */\n reasoningEffort?: 'low' | 'high' | 'max';\n\n /**\n * Whether to use strict JSON schema validation for structured outputs.\n * Only applies when the serving endpoint supports JSON schema response\n * formats (e.g. Azure). Defaults to `true`.\n */\n strictJsonSchema?: boolean;\n};\n\nexport const deepseekMessageProviderOptions = z.object({\n /**\n * The name of the participant represented by the message.\n *\n * Supported on system, user, and assistant messages.\n */\n name: z.string().optional(),\n});\n\nexport type DeepSeekMessageProviderOptions = z.infer<\n typeof deepseekMessageProviderOptions\n>;\n\nexport const deepseekAssistantMessageProviderOptions =\n deepseekMessageProviderOptions.extend({\n /**\n * Whether the assistant message content is a prefix that DeepSeek should\n * continue. This beta feature is only supported on the final assistant\n * message when using a beta base URL.\n */\n prefix: z.literal(true).optional(),\n });\n\nexport type DeepSeekAssistantMessageProviderOptions = z.infer<\n typeof deepseekAssistantMessageProviderOptions\n>;\n","/**\n * Whether a model id is a DeepSeek V4-generation model (thinking mode on by\n * default, `reasoning_content` required on every assistant turn).\n *\n * DeepSeek publishes V4 models under both versioned ids (`deepseek-v4-pro`,\n * `deepseek-v4-flash-*`) and unversioned aliases (`deepseek-flash`, currently\n * serving V4.1 Flash). Only the legacy `deepseek-chat` / `deepseek-reasoner`\n * ids predate V4.\n */\nexport function isDeepSeekV4Model(modelId: string): boolean {\n return (\n modelId.includes('deepseek-v4') ||\n modelId.startsWith('deepseek-flash') ||\n modelId.startsWith('deepseek-pro')\n );\n}\n","import type { LanguageModelV4Usage } from '@ai-sdk/provider';\nimport { createNullLanguageModelUsage } from '@ai-sdk/provider-utils';\n\nexport function convertDeepSeekUsage(\n usage:\n | {\n prompt_tokens?: number | null | undefined;\n completion_tokens?: number | null | undefined;\n prompt_cache_hit_tokens?: number | null | undefined;\n completion_tokens_details?:\n | {\n reasoning_tokens?: number | null | undefined;\n }\n | null\n | undefined;\n }\n | undefined\n | null,\n): LanguageModelV4Usage {\n if (usage == null) {\n return createNullLanguageModelUsage();\n }\n\n const promptTokens = usage.prompt_tokens ?? 0;\n const completionTokens = usage.completion_tokens ?? 0;\n const cacheReadTokens = usage.prompt_cache_hit_tokens ?? 0;\n const reasoningTokens =\n usage.completion_tokens_details?.reasoning_tokens ?? 0;\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: Math.max(0, completionTokens - reasoningTokens),\n reasoning: reasoningTokens,\n },\n raw: usage,\n };\n}\n","import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type DeepSeekChatPrompt = Array<DeepSeekMessage>;\n\nexport type DeepSeekMessage =\n | DeepSeekSystemMessage\n | DeepSeekUserMessage\n | DeepSeekAssistantMessage\n | DeepSeekToolMessage;\n\nexport interface DeepSeekSystemMessage {\n role: 'system';\n content: string;\n name?: string;\n}\n\nexport interface DeepSeekUserMessage {\n role: 'user';\n content: string | Array<DeepSeekContentPart>;\n name?: string;\n}\n\nexport type DeepSeekContentPart =\n | DeepSeekContentPartText\n | DeepSeekContentPartImage\n | DeepSeekContentPartFile;\n\nexport interface DeepSeekContentPartText {\n type: 'text';\n text: string;\n}\n\nexport interface DeepSeekContentPartImage {\n type: 'image_url';\n image_url: {\n url: string;\n detail?: 'low' | 'high' | 'original' | 'auto';\n };\n}\n\nexport type DeepSeekContentPartFile =\n | {\n type: 'file';\n file_id: string;\n }\n | {\n type: 'file';\n file_data: string;\n filename?: string;\n };\n\nexport interface DeepSeekAssistantMessage {\n role: 'assistant';\n content?: string | null;\n name?: string;\n prefix?: true;\n reasoning_content?: string;\n tool_calls?: Array<DeepSeekMessageToolCall>;\n}\n\nexport interface DeepSeekMessageToolCall {\n type: 'function';\n id: string;\n function: {\n arguments: string;\n name: string;\n };\n}\n\nexport interface DeepSeekToolMessage {\n role: 'tool';\n content: string;\n tool_call_id: string;\n}\n\nexport interface DeepSeekFunctionTool {\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n strict?: boolean;\n };\n}\n\nexport type DeepSeekToolChoice =\n | { type: 'function'; function: { name: string } }\n | 'auto'\n | 'none'\n | 'required'\n | undefined;\n\n// Loose, nested objects included: the parsed value is returned as `usage.raw`.\nconst tokenUsageSchema = z\n .looseObject({\n prompt_tokens: z.number().nullish(),\n completion_tokens: z.number().nullish(),\n prompt_cache_hit_tokens: z.number().nullish(),\n prompt_cache_miss_tokens: z.number().nullish(),\n total_tokens: z.number().nullish(),\n prompt_tokens_details: z\n .looseObject({\n cached_tokens: z.number().nullish(),\n })\n .nullish(),\n completion_tokens_details: z\n .looseObject({\n reasoning_tokens: z.number().nullish(),\n })\n .nullish(),\n })\n .nullish();\n\nexport type DeepSeekChatTokenUsage = z.infer<typeof tokenUsageSchema>;\n\nexport const deepSeekErrorSchema = 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 }),\n});\n\nexport type DeepSeekErrorData = z.infer<typeof deepSeekErrorSchema>;\n\nconst deepseekChatLogprobSchema = z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n});\n\nconst deepseekChatLogprobsSchema = z\n .object({\n content: z.array(deepseekChatLogprobSchema).nullish(),\n reasoning_content: z.array(deepseekChatLogprobSchema).nullish(),\n })\n .nullish();\n\nexport type DeepSeekChatLogprob = z.infer<typeof deepseekChatLogprobSchema>;\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nexport const deepseekChatResponseSchema = z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n object: z.literal('chat.completion').nullish(),\n system_fingerprint: z.string().nullish(),\n choices: z.array(\n z.object({\n index: z.number().nullish(),\n message: z.object({\n role: z.literal('assistant').nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n id: z.string().nullish(),\n type: z.literal('function').nullish(),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .nullish(),\n }),\n logprobs: deepseekChatLogprobsSchema,\n finish_reason: z.string().nullish(),\n }),\n ),\n usage: tokenUsageSchema,\n});\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nexport const deepseekChatChunkSchema = lazySchema(() =>\n zodSchema(\n z.union([\n z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n object: z.literal('chat.completion.chunk').nullish(),\n system_fingerprint: z.string().nullish(),\n choices: z.array(\n z.object({\n index: z.number().nullish(),\n delta: z\n .object({\n role: z.enum(['assistant']).nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().nullish(),\n type: z.literal('function').nullish(),\n function: z.object({\n name: z.string().nullish(),\n arguments: z.string().nullish(),\n }),\n }),\n )\n .nullish(),\n })\n .nullish(),\n logprobs: deepseekChatLogprobsSchema,\n finish_reason: z.string().nullish(),\n }),\n ),\n usage: tokenUsageSchema,\n }),\n deepSeekErrorSchema,\n ]),\n ),\n);\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4CallOptions,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport type {\n DeepSeekFunctionTool,\n DeepSeekToolChoice,\n} from './deepseek-chat-api-types';\n\nexport function prepareTools({\n tools,\n toolChoice,\n supportsStrictToolCalls,\n}: {\n tools: LanguageModelV4CallOptions['tools'];\n toolChoice?: LanguageModelV4CallOptions['toolChoice'];\n supportsStrictToolCalls?: boolean;\n}): {\n tools: undefined | Array<DeepSeekFunctionTool>;\n toolChoice: DeepSeekToolChoice;\n toolWarnings: SharedV4Warning[];\n} {\n // when the tools array is empty, change it to undefined to prevent errors:\n tools = tools?.length ? tools : undefined;\n\n const toolWarnings: SharedV4Warning[] = [];\n\n if (tools == null) {\n return { tools: undefined, toolChoice: undefined, toolWarnings };\n }\n\n const functionTools = tools.filter(tool => tool.type === 'function');\n const hasStrictTool = functionTools.some(tool => tool.strict === true);\n\n if (hasStrictTool && supportsStrictToolCalls === false) {\n throw new UnsupportedFunctionalityError({\n functionality: 'DeepSeek strict tool calls',\n message:\n 'DeepSeek strict tool calls require a beta base URL ending in `/beta`.',\n });\n }\n\n if (\n hasStrictTool &&\n supportsStrictToolCalls === true &&\n functionTools.some(tool => tool.strict !== true)\n ) {\n throw new UnsupportedFunctionalityError({\n functionality: 'mixed DeepSeek strict and non-strict tool calls',\n message:\n 'DeepSeek strict mode requires every function tool in the request to set `strict: true`.',\n });\n }\n\n const deepseekTools: Array<DeepSeekFunctionTool> = [];\n\n for (const tool of tools) {\n if (tool.type === 'provider') {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n });\n } else {\n deepseekTools.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 if (toolChoice == null) {\n return { tools: deepseekTools, toolChoice: undefined, toolWarnings };\n }\n\n const type = toolChoice?.type;\n\n switch (type) {\n case 'auto':\n case 'none':\n case 'required':\n return { tools: deepseekTools, toolChoice: type, toolWarnings };\n case 'tool':\n return {\n tools: deepseekTools,\n toolChoice: {\n type: 'function',\n function: { name: toolChoice.toolName },\n },\n toolWarnings,\n };\n default: {\n return {\n tools: deepseekTools,\n toolChoice: undefined,\n toolWarnings: [\n ...toolWarnings,\n {\n type: 'unsupported',\n feature: `tool choice type: ${type}`,\n },\n ],\n };\n }\n }\n}\n","export { createLanguageModelResponseMetadata as getResponseMetadata } from '@ai-sdk/provider-utils';\n","import type { LanguageModelV4FinishReason } from '@ai-sdk/provider';\n\nexport function mapDeepSeekFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV4FinishReason['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 return 'tool-calls';\n case 'insufficient_system_resource':\n return 'error';\n default:\n return 'other';\n }\n}\n","import {\n InvalidArgumentError,\n type FilesV4,\n type FilesV4UploadFileCallOptions,\n type FilesV4UploadFileResult,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertInlineFileDataToUint8Array,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n detectMediaType,\n parseProviderOptions,\n postFormDataToApi,\n type FetchFunction,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { deepSeekErrorSchema } from '../chat/deepseek-chat-api-types';\nimport { deepSeekFilesResponseSchema } from './deepseek-files-api';\nimport {\n deepSeekFilesOptionsSchema,\n type DeepSeekFilesOptions,\n} from './deepseek-files-options';\n\ninterface DeepSeekFilesConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n}\n\nconst deepSeekFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: deepSeekErrorSchema,\n errorToMessage: (error: InferSchema<typeof deepSeekErrorSchema>) =>\n error.error.message,\n});\n\nconst MAX_FILE_SIZE_BYTES = 64 * 1024 * 1024;\nconst MAX_FILENAME_LENGTH = 512;\n\nconst supportedMediaTypes = new Set([\n 'image/gif',\n 'image/jpeg',\n 'image/jpg',\n 'image/png',\n 'image/webp',\n]);\n\nconst genericMediaTypes = new Set([\n '',\n 'application/binary',\n 'application/octet-stream',\n 'binary/octet-stream',\n 'image',\n 'image/*',\n]);\n\nconst supportedFilenameExtensions = new Set([\n 'gif',\n 'jpeg',\n 'jpg',\n 'png',\n 'webp',\n]);\n\nexport class DeepSeekFiles implements FilesV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(private readonly config: DeepSeekFilesConfig) {}\n\n async uploadFile({\n data,\n mediaType,\n filename,\n abortSignal,\n headers,\n providerOptions,\n }: FilesV4UploadFileCallOptions): Promise<FilesV4UploadFileResult> {\n const deepSeekOptions = (await parseProviderOptions({\n provider: 'deepseek',\n providerOptions,\n schema: deepSeekFilesOptionsSchema,\n })) as DeepSeekFilesOptions | undefined;\n\n const fileBytes = convertInlineFileDataToUint8Array(data);\n validateFileUpload({ fileBytes, mediaType, filename });\n\n const blob = new Blob([fileBytes], { type: mediaType });\n\n const formData = new FormData();\n if (filename != null) {\n formData.append('file', blob, filename);\n } else {\n formData.append('file', blob);\n }\n formData.append('purpose', 'user_data');\n\n if (deepSeekOptions?.expiresAfter != null) {\n formData.append('expires_after[anchor]', 'created_at');\n formData.append(\n 'expires_after[seconds]',\n String(deepSeekOptions.expiresAfter),\n );\n }\n\n const { value: response } = await postFormDataToApi({\n url: `${this.config.baseURL}/files`,\n headers: combineHeaders(this.config.headers(), headers),\n formData,\n failedResponseHandler: deepSeekFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n deepSeekFilesResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n warnings: [],\n providerReference: { deepseek: response.id },\n ...((response.filename ?? filename)\n ? { filename: response.filename ?? filename }\n : {}),\n ...(mediaType != null ? { mediaType } : {}),\n providerMetadata: {\n deepseek: {\n ...(response.object != null ? { object: response.object } : {}),\n ...(response.filename != null ? { filename: response.filename } : {}),\n ...(response.purpose != null ? { purpose: response.purpose } : {}),\n ...(response.bytes != null ? { bytes: response.bytes } : {}),\n ...(response.created_at != null\n ? { createdAt: response.created_at }\n : {}),\n ...(response.expires_at != null\n ? { expiresAt: response.expires_at }\n : {}),\n },\n },\n };\n }\n}\n\nfunction validateFileUpload({\n fileBytes,\n mediaType,\n filename,\n}: {\n fileBytes: Uint8Array;\n mediaType: string;\n filename: string | undefined;\n}) {\n if (fileBytes.length > MAX_FILE_SIZE_BYTES) {\n throw new InvalidArgumentError({\n argument: 'data',\n message:\n `DeepSeek file uploads must not exceed 64 MiB ` +\n `(${MAX_FILE_SIZE_BYTES.toLocaleString('en-US')} bytes). ` +\n `Received ${fileBytes.length.toLocaleString('en-US')} bytes.`,\n });\n }\n\n if (filename != null) {\n const filenameLength = Array.from(filename).length;\n\n if (filenameLength > MAX_FILENAME_LENGTH) {\n throw new InvalidArgumentError({\n argument: 'filename',\n message:\n `DeepSeek filenames must not exceed ${MAX_FILENAME_LENGTH} characters. ` +\n `Received ${filenameLength} characters.`,\n });\n }\n }\n\n const normalizedMediaType = normalizeMediaType(mediaType);\n const detectedMediaType = detectMediaType({ data: fileBytes });\n\n if (\n detectedMediaType != null &&\n !supportedMediaTypes.has(detectedMediaType)\n ) {\n throw new InvalidArgumentError({\n argument: 'data',\n message:\n `DeepSeek file uploads support JPEG, PNG, GIF, and WebP images. ` +\n `Detected unsupported file content type \"${detectedMediaType}\".`,\n });\n }\n\n if (supportedMediaTypes.has(normalizedMediaType)) {\n return;\n }\n\n if (!genericMediaTypes.has(normalizedMediaType)) {\n throw new InvalidArgumentError({\n argument: 'mediaType',\n message:\n `DeepSeek file uploads support JPEG, PNG, GIF, and WebP images. ` +\n `Received unsupported media type \"${mediaType}\".`,\n });\n }\n\n if (detectedMediaType != null || hasSupportedFilenameExtension(filename)) {\n return;\n }\n\n throw new InvalidArgumentError({\n argument: 'mediaType',\n message:\n `DeepSeek file uploads support JPEG, PNG, GIF, and WebP images. ` +\n `Provide a supported media type or a filename ending in ` +\n `.jpg, .jpeg, .png, .gif, or .webp. Received \"${mediaType}\".`,\n });\n}\n\nfunction normalizeMediaType(mediaType: string): string {\n return mediaType.split(';', 1)[0].trim().toLowerCase();\n}\n\nfunction hasSupportedFilenameExtension(filename: string | undefined): boolean {\n if (filename == null) {\n return false;\n }\n\n const extensionSeparatorIndex = filename.lastIndexOf('.');\n\n return (\n extensionSeparatorIndex !== -1 &&\n supportedFilenameExtensions.has(\n filename.slice(extensionSeparatorIndex + 1).toLowerCase(),\n )\n );\n}\n","import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const deepSeekFilesResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n id: z.string(),\n // These fields are required by DeepSeek's OpenAPI schema, but they are\n // not needed to construct the provider reference. Keep them nullish so\n // uploads remain resilient to incomplete responses while validating any\n // returned values precisely enough to avoid misleading metadata.\n object: z.literal('file').nullish(),\n bytes: z.number().int().nonnegative().nullish(),\n created_at: z.number().int().nonnegative().nullish(),\n filename: z.string().nullish(),\n purpose: z.literal('user_data').nullish(),\n expires_at: z.number().int().nonnegative().nullish(),\n }),\n ),\n);\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const deepSeekFilesOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * Number of seconds after creation before the file expires.\n * Must be between 1 hour and 30 days.\n */\n expiresAfter: z.number().int().min(3600).max(2592000).optional(),\n }),\n ),\n);\n\nexport type DeepSeekFilesOptions = InferSchema<\n typeof deepSeekFilesOptionsSchema\n>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["parseProviderOptions","z","userContent","z","UnsupportedFunctionalityError","parseProviderOptions","_a","_b","combineHeaders","createJsonErrorResponseHandler","createJsonResponseHandler","parseProviderOptions","lazySchema","zodSchema","z","lazySchema","zodSchema","z","createJsonErrorResponseHandler","parseProviderOptions","combineHeaders","createJsonResponseHandler"]}
1
+ {"version":3,"sources":["../src/deepseek-provider.ts","../src/chat/deepseek-chat-language-model.ts","../src/chat/convert-to-deepseek-chat-messages.ts","../src/chat/deepseek-file-part-options.ts","../src/chat/deepseek-chat-language-model-options.ts","../src/chat/is-deepseek-v4-model.ts","../src/chat/convert-to-deepseek-usage.ts","../src/chat/deepseek-chat-api-types.ts","../src/chat/deepseek-prepare-tools.ts","../src/chat/get-response-metadata.ts","../src/chat/map-deepseek-finish-reason.ts","../src/files/deepseek-files.ts","../src/files/deepseek-files-api.ts","../src/files/deepseek-files-options.ts","../src/version.ts"],"sourcesContent":["import {\n type FilesV4,\n NoSuchModelError,\n type LanguageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport type { DeepSeekChatModelId } from './chat/deepseek-chat-language-model-options';\nimport { DeepSeekChatLanguageModel } from './chat/deepseek-chat-language-model';\nimport { DeepSeekFiles } from './files/deepseek-files';\nimport { VERSION } from './version';\n\nexport interface DeepSeekProviderSettings {\n /**\n * DeepSeek API key.\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface DeepSeekProvider extends ProviderV4 {\n /**\n * Creates a DeepSeek model for text generation.\n */\n (modelId: DeepSeekChatModelId): LanguageModelV4;\n\n /**\n * Creates a DeepSeek model for text generation.\n */\n languageModel(modelId: DeepSeekChatModelId): LanguageModelV4;\n\n /**\n * Creates a DeepSeek chat model for text generation.\n */\n chat(modelId: DeepSeekChatModelId): LanguageModelV4;\n\n /**\n * Creates a DeepSeek files interface for uploading images.\n */\n files(): FilesV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nexport function createDeepSeek(\n options: DeepSeekProviderSettings = {},\n): DeepSeekProvider {\n const baseURL =\n withoutTrailingSlash(options.baseURL ?? 'https://api.deepseek.com') ??\n 'https://api.deepseek.com';\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'DEEPSEEK_API_KEY',\n description: 'DeepSeek API key',\n })}`,\n ...options.headers,\n },\n `ai-sdk/deepseek/${VERSION}`,\n );\n\n const createLanguageModel = (modelId: DeepSeekChatModelId) => {\n return new DeepSeekChatLanguageModel(modelId, {\n provider: `deepseek.chat`,\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n supportsAssistantPrefixCompletion: baseURL.endsWith('/beta'),\n supportsStrictToolCalls: baseURL.endsWith('/beta'),\n });\n };\n\n const createFiles = () =>\n new DeepSeekFiles({\n provider: 'deepseek.files',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const provider = (modelId: DeepSeekChatModelId) =>\n createLanguageModel(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.files = createFiles;\n\n provider.embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'embeddingModel' });\n };\n provider.textEmbeddingModel = provider.embeddingModel;\n provider.imageModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'imageModel' });\n };\n\n return provider;\n}\n\nexport const deepSeek = createDeepSeek();\n","import {\n InvalidResponseDataError,\n type APICallError,\n type LanguageModelV4,\n type LanguageModelV4CallOptions,\n type LanguageModelV4Content,\n type LanguageModelV4FinishReason,\n type LanguageModelV4GenerateResult,\n type LanguageModelV4StreamPart,\n type LanguageModelV4StreamResult,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createEventSourceResponseHandler,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n createProviderStreamError,\n generateId,\n isCustomReasoning,\n mapReasoningToProviderEffort,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n StreamingToolCallTracker,\n WORKFLOW_SERIALIZE,\n WORKFLOW_DESERIALIZE,\n type FetchFunction,\n type InferSchema,\n type ParseResult,\n type ResponseHandler,\n} from '@ai-sdk/provider-utils';\nimport { convertToDeepSeekChatMessages } from './convert-to-deepseek-chat-messages';\nimport { convertDeepSeekUsage } from './convert-to-deepseek-usage';\nimport {\n deepseekChatChunkSchema,\n deepseekChatResponseSchema,\n deepSeekErrorSchema,\n type DeepSeekChatLogprob,\n type DeepSeekChatTokenUsage,\n} from './deepseek-chat-api-types';\nimport {\n deepseekLanguageModelChatOptions,\n type DeepSeekChatModelId,\n} from './deepseek-chat-language-model-options';\nimport { prepareTools } from './deepseek-prepare-tools';\nimport { getResponseMetadata } from './get-response-metadata';\nimport { isDeepSeekV4Model } from './is-deepseek-v4-model';\nimport { mapDeepSeekFinishReason } from './map-deepseek-finish-reason';\n\nexport type DeepSeekChatConfig = {\n provider: string;\n headers?: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n supportsAssistantPrefixCompletion?: boolean;\n supportsStrictToolCalls?: boolean;\n supportsPenaltySampling?: boolean;\n supportsThinking?: boolean;\n supportsStructuredOutputs?: boolean;\n};\n\nfunction createDeepSeekStreamError(\n error: {\n message: string;\n type?: string | null;\n code?: string | number | null;\n },\n data: unknown,\n) {\n const metadata = getDeepSeekStreamErrorMetadata(error);\n\n return createProviderStreamError({\n message: error.message,\n type: error.type ?? undefined,\n code: error.code ?? undefined,\n ...metadata,\n data,\n });\n}\n\nfunction getDeepSeekStreamErrorMetadata(error: {\n type?: string | null;\n code?: string | number | null;\n}): {\n statusCode?: number;\n isRetryable?: boolean;\n} {\n if (\n error.code === 'insufficient_quota' ||\n error.type === 'insufficient_quota'\n ) {\n return { statusCode: 429, isRetryable: false };\n }\n\n const explicitStatusCode = getHttpStatusCode(error.code);\n if (explicitStatusCode != null) {\n return {\n statusCode: explicitStatusCode,\n isRetryable: isRetryableStatusCode(explicitStatusCode),\n };\n }\n\n for (const discriminator of [error.code, error.type]) {\n switch (discriminator) {\n case 'rate_limit_exceeded':\n case 'rate_limit_error':\n return { statusCode: 429, isRetryable: true };\n case 'server_error':\n case 'api_error':\n case 'internal_server_error':\n return { statusCode: 500, isRetryable: true };\n case 'overloaded_error':\n case 'service_unavailable':\n return { statusCode: 503, isRetryable: true };\n case 'timeout':\n case 'timeout_error':\n return { statusCode: 504, isRetryable: true };\n case 'authentication_error':\n case 'invalid_api_key':\n return { statusCode: 401, isRetryable: false };\n case 'permission_error':\n return { statusCode: 403, isRetryable: false };\n case 'not_found_error':\n case 'model_not_found':\n return { statusCode: 404, isRetryable: false };\n case 'bad_request':\n case 'context_length_exceeded':\n case 'invalid_request_error':\n return { statusCode: 400, isRetryable: false };\n }\n }\n\n return {};\n}\n\nfunction getHttpStatusCode(value: unknown): number | undefined {\n const statusCode =\n typeof value === 'string' && /^\\d{3}$/.test(value) ? Number(value) : value;\n\n return typeof statusCode === 'number' &&\n Number.isInteger(statusCode) &&\n statusCode >= 400 &&\n statusCode <= 599\n ? statusCode\n : undefined;\n}\n\nfunction isRetryableStatusCode(statusCode: number): boolean {\n return (\n statusCode === 408 ||\n statusCode === 409 ||\n statusCode === 429 ||\n statusCode >= 500\n );\n}\n\nfunction mapDeepSeekProviderReasoningEffort({\n reasoningEffort,\n warnings,\n}: {\n reasoningEffort: 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n warnings: SharedV4Warning[];\n}): 'low' | 'high' | 'max' {\n const mapped =\n reasoningEffort === 'medium'\n ? 'high'\n : reasoningEffort === 'xhigh'\n ? 'max'\n : reasoningEffort;\n\n if (mapped !== reasoningEffort) {\n warnings.push({\n type: 'compatibility',\n feature: 'reasoningEffort',\n details: `reasoningEffort \"${reasoningEffort}\" is not a canonical DeepSeek value. mapped to \"${mapped}\".`,\n });\n }\n\n return mapped;\n}\n\nexport class DeepSeekChatLanguageModel implements LanguageModelV4 {\n readonly specificationVersion = 'v4';\n\n readonly modelId: DeepSeekChatModelId;\n\n readonly supportedUrls = {\n 'image/*': [/^https?:\\/\\/.*$/],\n };\n\n private readonly config: DeepSeekChatConfig;\n private readonly failedResponseHandler: ResponseHandler<APICallError>;\n\n static [WORKFLOW_SERIALIZE](model: DeepSeekChatLanguageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: DeepSeekChatModelId;\n config: DeepSeekChatConfig;\n }) {\n return new DeepSeekChatLanguageModel(options.modelId, options.config);\n }\n\n constructor(modelId: DeepSeekChatModelId, config: DeepSeekChatConfig) {\n this.modelId = modelId;\n this.config = config;\n\n this.failedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: deepSeekErrorSchema,\n errorToMessage: (error: InferSchema<typeof deepSeekErrorSchema>) =>\n error.error.message,\n });\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 private async getArgs({\n prompt,\n maxOutputTokens,\n temperature,\n topP,\n topK,\n frequencyPenalty,\n presencePenalty,\n reasoning,\n providerOptions,\n stopSequences,\n responseFormat,\n seed,\n toolChoice,\n tools,\n }: LanguageModelV4CallOptions) {\n const deepseekOptions =\n (await parseProviderOptions({\n provider: this.providerOptionsName,\n providerOptions,\n schema: deepseekLanguageModelChatOptions,\n })) ?? {};\n\n const supportsStructuredOutputs =\n this.config.supportsStructuredOutputs === true;\n const supportsPenaltySampling =\n this.config.supportsPenaltySampling === true;\n\n const { messages, warnings } = await convertToDeepSeekChatMessages({\n prompt,\n responseFormat,\n modelId: this.modelId,\n providerOptionsName: this.providerOptionsName,\n supportsAssistantPrefixCompletion:\n this.config.supportsAssistantPrefixCompletion,\n supportsStructuredOutputs,\n });\n const allWarnings: SharedV4Warning[] = [...warnings];\n\n if (topK != null) {\n allWarnings.push({ type: 'unsupported', feature: 'topK' });\n }\n\n if (seed != null) {\n allWarnings.push({ type: 'unsupported', feature: 'seed' });\n }\n\n if (!supportsPenaltySampling && frequencyPenalty != null) {\n allWarnings.push({\n type: 'deprecated',\n setting: 'frequencyPenalty',\n message:\n 'frequencyPenalty is deprecated by DeepSeek and has been omitted. Remove frequencyPenalty from the request.',\n });\n }\n\n if (!supportsPenaltySampling && presencePenalty != null) {\n allWarnings.push({\n type: 'deprecated',\n setting: 'presencePenalty',\n message:\n 'presencePenalty is deprecated by DeepSeek and has been omitted. Remove presencePenalty from the request.',\n });\n }\n\n const {\n tools: deepseekTools,\n toolChoice: deepseekToolChoices,\n toolWarnings,\n } = prepareTools({\n tools,\n toolChoice,\n supportsStrictToolCalls: this.config.supportsStrictToolCalls,\n });\n\n const thinkingType = deepseekOptions.thinking?.type;\n if (thinkingType === 'adaptive') {\n allWarnings.push({\n type: 'compatibility',\n feature: 'thinking.type',\n details:\n 'thinking.type \"adaptive\" is not a canonical DeepSeek value. mapped to \"enabled\".',\n });\n }\n\n const thinking =\n this.config.supportsThinking === false\n ? undefined\n : thinkingType != null\n ? { type: thinkingType === 'adaptive' ? 'enabled' : thinkingType }\n : isCustomReasoning(reasoning)\n ? { type: reasoning === 'none' ? 'disabled' : 'enabled' }\n : undefined;\n\n const isThinkingEnabled =\n this.config.supportsThinking !== false &&\n thinking?.type !== 'disabled' &&\n (thinking != null ||\n this.modelId === 'deepseek-reasoner' ||\n isDeepSeekV4Model(this.modelId));\n\n if (isThinkingEnabled && temperature != null) {\n allWarnings.push({\n type: 'unsupported',\n feature: 'temperature',\n details:\n \"temperature has no effect when DeepSeek thinking is enabled. Set providerOptions.deepseek.thinking.type to 'disabled' to use temperature.\",\n });\n }\n\n if (isThinkingEnabled && topP != null) {\n allWarnings.push({\n type: 'unsupported',\n feature: 'topP',\n details:\n \"topP has no effect when DeepSeek thinking is enabled. Set providerOptions.deepseek.thinking.type to 'disabled' to use topP.\",\n });\n }\n\n const reasoningEffort =\n deepseekOptions.reasoningEffort != null\n ? mapDeepSeekProviderReasoningEffort({\n reasoningEffort: deepseekOptions.reasoningEffort,\n warnings: allWarnings,\n })\n : isCustomReasoning(reasoning) && reasoning !== 'none'\n ? mapReasoningToProviderEffort({\n reasoning,\n effortMap: {\n minimal: 'low',\n low: 'low',\n medium: 'high',\n high: 'high',\n xhigh: 'max',\n },\n warnings: allWarnings,\n })\n : undefined;\n\n return {\n args: {\n model: this.modelId,\n ...((deepseekOptions.logprobs === true ||\n deepseekOptions.topLogprobs != null) && { logprobs: true }),\n ...(deepseekOptions.topLogprobs != null && {\n top_logprobs: deepseekOptions.topLogprobs,\n }),\n max_tokens: maxOutputTokens,\n temperature: isThinkingEnabled ? undefined : temperature,\n top_p: isThinkingEnabled ? undefined : topP,\n frequency_penalty: supportsPenaltySampling\n ? frequencyPenalty\n : undefined,\n presence_penalty: supportsPenaltySampling ? presencePenalty : undefined,\n response_format:\n responseFormat?.type === 'json'\n ? supportsStructuredOutputs && responseFormat.schema != null\n ? {\n type: 'json_schema',\n json_schema: {\n schema: responseFormat.schema,\n strict: deepseekOptions.strictJsonSchema ?? true,\n name: responseFormat.name ?? 'response',\n description: responseFormat.description,\n },\n }\n : { type: 'json_object' }\n : undefined,\n stop: stopSequences,\n messages,\n tools: deepseekTools,\n tool_choice: deepseekToolChoices,\n thinking,\n ...(deepseekOptions.userId != null && {\n user_id: deepseekOptions.userId,\n }),\n ...(thinking?.type !== 'disabled' &&\n reasoningEffort != null && {\n reasoning_effort: reasoningEffort,\n }),\n },\n warnings: [...allWarnings, ...toolWarnings],\n };\n }\n\n async doGenerate(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4GenerateResult> {\n const { args, warnings } = await this.getArgs({ ...options });\n\n const {\n responseHeaders,\n value: responseBody,\n rawValue: rawResponse,\n } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body: args,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n deepseekChatResponseSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n const choice = responseBody.choices[0];\n if (choice == null) {\n throw new InvalidResponseDataError({\n data: rawResponse,\n message: 'Response did not contain any choices.',\n });\n }\n\n const content: Array<LanguageModelV4Content> = [];\n\n // reasoning content (before text):\n const reasoning = choice.message.reasoning_content;\n if (reasoning != null && reasoning.length > 0) {\n content.push({\n type: 'reasoning',\n text: reasoning,\n });\n }\n\n // tool calls:\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 || generateId(),\n toolName: toolCall.function.name,\n input: toolCall.function.arguments!,\n });\n }\n }\n\n // text content:\n const text = choice.message.content;\n if (text != null && text.length > 0) {\n content.push({ type: 'text', text });\n }\n\n return {\n content,\n finishReason: {\n unified: mapDeepSeekFinishReason(choice.finish_reason),\n raw: choice.finish_reason ?? undefined,\n },\n usage: convertDeepSeekUsage(responseBody.usage),\n providerMetadata: {\n [this.providerOptionsName]: {\n promptCacheHitTokens: responseBody.usage?.prompt_cache_hit_tokens,\n promptCacheMissTokens: responseBody.usage?.prompt_cache_miss_tokens,\n ...(responseBody.object != null && {\n responseObject: responseBody.object,\n }),\n ...(choice.index != null && { choiceIndex: choice.index }),\n ...(choice.message.role != null && {\n messageRole: choice.message.role,\n }),\n ...(choice.message.tool_calls != null && {\n toolCallTypes: choice.message.tool_calls\n .map(toolCall => toolCall.type)\n .filter(type => type != null),\n }),\n ...(choice.logprobs != null && { logprobs: choice.logprobs }),\n ...(responseBody.system_fingerprint != null && {\n systemFingerprint: responseBody.system_fingerprint,\n }),\n },\n },\n request: { body: args },\n response: {\n ...getResponseMetadata(responseBody),\n headers: responseHeaders,\n body: rawResponse,\n },\n warnings,\n };\n }\n\n async doStream(\n options: LanguageModelV4CallOptions,\n ): Promise<LanguageModelV4StreamResult> {\n const { args, warnings } = await this.getArgs({ ...options });\n\n const body = {\n ...args,\n stream: true,\n stream_options: { include_usage: true },\n };\n\n const { responseHeaders, value: response } = await postJsonToApi({\n url: this.config.url({\n path: '/chat/completions',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers?.(), options.headers),\n body,\n failedResponseHandler: this.failedResponseHandler,\n successfulResponseHandler: createEventSourceResponseHandler(\n deepseekChatChunkSchema,\n ),\n abortSignal: options.abortSignal,\n fetch: this.config.fetch,\n });\n\n let toolCallTracker: StreamingToolCallTracker;\n\n let finishReason: LanguageModelV4FinishReason = {\n unified: 'other',\n raw: undefined,\n };\n let usage: DeepSeekChatTokenUsage | undefined = undefined;\n let systemFingerprint: string | undefined = undefined;\n let isFirstChunk = true;\n const providerOptionsName = this.providerOptionsName;\n let isActiveReasoning = false;\n let isActiveText = false;\n let responseObject: 'chat.completion.chunk' | undefined;\n let choiceIndex: number | undefined;\n let messageRole: 'assistant' | undefined;\n const toolCallTypes = new Map<number, 'function'>();\n const contentLogprobs: DeepSeekChatLogprob[] = [];\n const reasoningLogprobs: DeepSeekChatLogprob[] = [];\n\n return {\n stream: response.pipeThrough(\n new TransformStream<\n ParseResult<InferSchema<typeof deepseekChatChunkSchema>>,\n LanguageModelV4StreamPart\n >({\n start(controller) {\n toolCallTracker = new StreamingToolCallTracker(controller, {\n generateId,\n });\n controller.enqueue({ type: 'stream-start', warnings });\n },\n\n transform(chunk, controller) {\n // Emit raw chunk if requested (before anything else)\n if (options.includeRawChunks) {\n controller.enqueue({ type: 'raw', rawValue: chunk.rawValue });\n }\n\n // handle failed chunk parsing / validation:\n if (!chunk.success) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({ type: 'error', error: chunk.error });\n return;\n }\n const value = chunk.value;\n\n // handle error chunks:\n if ('error' in value) {\n finishReason = { unified: 'error', raw: undefined };\n controller.enqueue({\n type: 'error',\n error: createDeepSeekStreamError(value.error, value),\n });\n return;\n }\n\n if (isFirstChunk) {\n isFirstChunk = false;\n\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 if (value.object != null) {\n responseObject = value.object;\n }\n\n // The fingerprint is repeated on stream chunks; keep the latest\n // non-null value in case it changes during the response.\n if (value.system_fingerprint != null) {\n systemFingerprint = value.system_fingerprint;\n }\n\n const choice = value.choices[0];\n\n if (choice?.index != null) {\n choiceIndex = choice.index;\n }\n\n if (choice?.finish_reason != null) {\n finishReason = {\n unified: mapDeepSeekFinishReason(choice.finish_reason),\n raw: choice.finish_reason,\n };\n }\n\n if (choice?.logprobs?.content != null) {\n contentLogprobs.push(...choice.logprobs.content);\n }\n\n if (choice?.logprobs?.reasoning_content != null) {\n reasoningLogprobs.push(...choice.logprobs.reasoning_content);\n }\n\n if (choice?.delta == null) {\n return;\n }\n\n const delta = choice.delta;\n\n if (delta.role != null) {\n messageRole = delta.role;\n }\n\n // enqueue reasoning before text deltas:\n const reasoningContent = delta.reasoning_content;\n if (reasoningContent) {\n if (!isActiveReasoning) {\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: reasoningContent,\n });\n }\n\n if (delta.content) {\n if (!isActiveText) {\n controller.enqueue({ type: 'text-start', id: 'txt-0' });\n isActiveText = true;\n }\n\n // end reasoning when text starts:\n if (isActiveReasoning) {\n controller.enqueue({\n type: 'reasoning-end',\n id: 'reasoning-0',\n });\n isActiveReasoning = false;\n }\n\n controller.enqueue({\n type: 'text-delta',\n id: 'txt-0',\n delta: delta.content,\n });\n }\n\n if (delta.tool_calls != null && delta.tool_calls.length > 0) {\n // end reasoning when tool calls start:\n if (isActiveReasoning) {\n controller.enqueue({\n type: 'reasoning-end',\n id: 'reasoning-0',\n });\n isActiveReasoning = false;\n }\n\n for (const toolCallDelta of delta.tool_calls) {\n if (toolCallDelta.type != null) {\n toolCallTypes.set(toolCallDelta.index, toolCallDelta.type);\n }\n toolCallTracker.processDelta(toolCallDelta);\n }\n }\n },\n\n flush(controller) {\n if (isActiveReasoning) {\n controller.enqueue({ type: 'reasoning-end', id: 'reasoning-0' });\n }\n\n if (isActiveText) {\n controller.enqueue({ type: 'text-end', id: 'txt-0' });\n }\n\n toolCallTracker.flush();\n\n controller.enqueue({\n type: 'finish',\n finishReason,\n usage: convertDeepSeekUsage(usage),\n providerMetadata: {\n [providerOptionsName]: {\n promptCacheHitTokens:\n usage?.prompt_cache_hit_tokens ?? undefined,\n promptCacheMissTokens:\n usage?.prompt_cache_miss_tokens ?? undefined,\n ...(responseObject != null && { responseObject }),\n ...(choiceIndex != null && { choiceIndex }),\n ...(messageRole != null && { messageRole }),\n ...(toolCallTypes.size > 0 && {\n toolCallTypes: [...toolCallTypes.entries()]\n .sort(([left], [right]) => left - right)\n .map(([, type]) => type),\n }),\n ...((contentLogprobs.length > 0 ||\n reasoningLogprobs.length > 0) && {\n logprobs: {\n ...(contentLogprobs.length > 0 && {\n content: contentLogprobs,\n }),\n ...(reasoningLogprobs.length > 0 && {\n reasoning_content: reasoningLogprobs,\n }),\n },\n }),\n ...(systemFingerprint != null && { systemFingerprint }),\n },\n },\n });\n },\n }),\n ),\n request: { body },\n response: { headers: responseHeaders },\n };\n }\n}\n","import {\n InvalidPromptError,\n UnsupportedFunctionalityError,\n type LanguageModelV4CallOptions,\n type LanguageModelV4FilePart,\n type LanguageModelV4Prompt,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n convertToBase64,\n getTopLevelMediaType,\n parseProviderOptions,\n resolveFullMediaType,\n resolveProviderReference,\n} from '@ai-sdk/provider-utils';\nimport type {\n DeepSeekChatPrompt,\n DeepSeekContentPart,\n DeepSeekToolMessage,\n} from './deepseek-chat-api-types';\nimport { deepseekFilePartProviderOptions } from './deepseek-file-part-options';\nimport { deepseekAssistantMessageProviderOptions } from './deepseek-chat-language-model-options';\nimport { isDeepSeekV4Model } from './is-deepseek-v4-model';\n\nconst supportedImageMediaTypes = new Set([\n 'image/gif',\n 'image/jpeg',\n 'image/jpg',\n 'image/png',\n 'image/webp',\n]);\n\nfunction resolveDeepSeekImageMediaType(part: LanguageModelV4FilePart): string {\n const resolvedMediaType = resolveFullMediaType({ part });\n\n if (!supportedImageMediaTypes.has(resolvedMediaType)) {\n throw new UnsupportedFunctionalityError({\n functionality: `DeepSeek image media type ${resolvedMediaType}`,\n message: 'DeepSeek supports JPEG, PNG, GIF, and WebP image inputs.',\n });\n }\n\n return resolvedMediaType;\n}\n\nfunction validateDeepSeekImageUrl({\n url,\n prompt,\n}: {\n url: string;\n prompt: LanguageModelV4Prompt;\n}): void {\n if (url.length > 8192) {\n throw new InvalidPromptError({\n prompt,\n message: 'DeepSeek image URLs must not exceed 8192 characters.',\n });\n }\n}\n\nexport async function convertToDeepSeekChatMessages({\n prompt,\n responseFormat,\n modelId,\n providerOptionsName = 'deepseek',\n supportsAssistantPrefixCompletion = false,\n supportsStructuredOutputs = false,\n}: {\n prompt: LanguageModelV4Prompt;\n responseFormat: LanguageModelV4CallOptions['responseFormat'];\n modelId: string;\n providerOptionsName?: string;\n supportsAssistantPrefixCompletion?: boolean;\n supportsStructuredOutputs?: boolean;\n}): Promise<{\n messages: DeepSeekChatPrompt;\n warnings: Array<SharedV4Warning>;\n}> {\n const isDeepSeekV4 = isDeepSeekV4Model(modelId);\n const messages: DeepSeekChatPrompt = [];\n const warnings: Array<SharedV4Warning> = [];\n\n // Inject system message if response format is JSON\n if (responseFormat?.type === 'json') {\n if (responseFormat.schema == null) {\n messages.push({\n role: 'system',\n content: 'Return JSON.',\n });\n } else if (!supportsStructuredOutputs) {\n messages.push({\n role: 'system',\n content:\n 'Return JSON that conforms to the following schema: ' +\n JSON.stringify(responseFormat.schema),\n });\n warnings.push({\n type: 'compatibility',\n feature: 'responseFormat JSON schema',\n details: 'JSON response schema is injected into the system message.',\n });\n }\n }\n\n // TODO use findLastIndex once we use ES2023\n let lastUserMessageIndex = -1;\n for (let i = prompt.length - 1; i >= 0; i--) {\n if (prompt[i].role === 'user') {\n lastUserMessageIndex = i;\n break;\n }\n }\n\n let index = -1;\n for (const { role, content, providerOptions } of prompt) {\n index++;\n\n // The assistant schema extends the common message schema, so one parse\n // validates names for every role and the assistant-only prefix option.\n const deepseekMessageOptions = await parseProviderOptions({\n provider: providerOptionsName,\n providerOptions,\n schema: deepseekAssistantMessageProviderOptions,\n });\n\n if (deepseekMessageOptions?.prefix === true && role !== 'assistant') {\n throw new InvalidPromptError({\n prompt,\n message:\n 'DeepSeek assistant prefix completion requires `prefix: true` on an assistant message.',\n });\n }\n\n switch (role) {\n case 'system': {\n messages.push({\n role: 'system',\n content,\n ...(deepseekMessageOptions?.name != null && {\n name: deepseekMessageOptions.name,\n }),\n });\n break;\n }\n\n case 'user': {\n const hasImagePart = content.some(\n part =>\n part.type === 'file' &&\n (part.data.type === 'reference' ||\n part.data.type === 'url' ||\n part.data.type === 'data') &&\n getTopLevelMediaType(part.mediaType) === 'image',\n );\n\n if (!hasImagePart) {\n let userContent = '';\n for (const part of content) {\n if (part.type === 'text') {\n userContent += part.text;\n } else {\n warnings.push({\n type: 'unsupported',\n feature: `user message part type: ${part.type}`,\n });\n }\n }\n\n messages.push({\n role: 'user',\n content: userContent,\n ...(deepseekMessageOptions?.name != null && {\n name: deepseekMessageOptions.name,\n }),\n });\n break;\n }\n\n const userContent: Array<DeepSeekContentPart> = [];\n for (const part of content) {\n if (part.type === 'text') {\n userContent.push({ type: 'text', text: part.text });\n } else if (\n part.type === 'file' &&\n getTopLevelMediaType(part.mediaType) === 'image'\n ) {\n const filePartOptions = await parseProviderOptions({\n provider: providerOptionsName,\n providerOptions: part.providerOptions,\n schema: deepseekFilePartProviderOptions,\n });\n\n if (part.data.type === 'reference') {\n userContent.push({\n type: 'file',\n file_id: resolveProviderReference({\n reference: part.data.reference,\n provider: 'deepseek',\n }),\n });\n } else if (part.data.type === 'url' || part.data.type === 'data') {\n const resolvedMediaType = resolveDeepSeekImageMediaType(part);\n\n if (part.data.type === 'url') {\n const url = part.data.url.toString();\n\n validateDeepSeekImageUrl({ url, prompt });\n\n if (filePartOptions?.fileData === true) {\n throw new InvalidPromptError({\n prompt,\n message:\n 'DeepSeek `fileData` image parts require inline data, not a URL.',\n });\n }\n\n userContent.push({\n type: 'image_url',\n image_url: {\n url,\n ...(filePartOptions?.imageDetail != null && {\n detail: filePartOptions.imageDetail,\n }),\n },\n });\n } else {\n const dataUrl = `data:${\n resolvedMediaType === 'image/jpg'\n ? 'image/jpeg'\n : resolvedMediaType\n };base64,${convertToBase64(part.data.data)}`;\n\n if (filePartOptions?.fileData === true) {\n if (filePartOptions.imageDetail != null) {\n throw new InvalidPromptError({\n prompt,\n message:\n 'DeepSeek `imageDetail` cannot be combined with `fileData`.',\n });\n }\n\n userContent.push({\n type: 'file',\n file_data: dataUrl,\n ...(part.filename != null && { filename: part.filename }),\n });\n } else {\n userContent.push({\n type: 'image_url',\n image_url: {\n url: dataUrl,\n ...(filePartOptions?.imageDetail != null && {\n detail: filePartOptions.imageDetail,\n }),\n },\n });\n }\n }\n } else {\n warnings.push({\n type: 'unsupported',\n feature: `user message part type: ${part.type}`,\n });\n }\n } else {\n warnings.push({\n type: 'unsupported',\n feature: `user message part type: ${part.type}`,\n });\n }\n }\n\n messages.push({\n role: 'user',\n content: userContent,\n ...(deepseekMessageOptions?.name != null && {\n name: deepseekMessageOptions.name,\n }),\n });\n\n break;\n }\n case 'assistant': {\n if (deepseekMessageOptions?.prefix === true) {\n if (index !== prompt.length - 1) {\n throw new InvalidPromptError({\n prompt,\n message:\n 'DeepSeek assistant prefix completion requires the prefixed assistant message to be the final message.',\n });\n }\n\n if (!supportsAssistantPrefixCompletion) {\n throw new UnsupportedFunctionalityError({\n functionality: 'DeepSeek assistant prefix completion',\n message:\n 'DeepSeek assistant prefix completion requires a beta base URL ending in `/beta`.',\n });\n }\n }\n\n let text = '';\n let reasoning: string | undefined;\n\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 // R1 must not receive prior reasoning; V4 requires it.\n if (index <= lastUserMessageIndex && !isDeepSeekV4) {\n break;\n }\n\n if (reasoning == null) {\n reasoning = part.text;\n } else {\n reasoning += part.text;\n }\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 }\n }\n\n // V4 demands the field on every assistant turn — back-fill an empty\n // string when the source message had no reasoning part at all.\n messages.push({\n role: 'assistant',\n content: text,\n ...(deepseekMessageOptions?.name != null && {\n name: deepseekMessageOptions.name,\n }),\n ...(deepseekMessageOptions?.prefix === true && {\n prefix: true,\n }),\n reasoning_content: reasoning ?? (isDeepSeekV4 ? '' : undefined),\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n });\n\n break;\n }\n\n case 'tool': {\n if (deepseekMessageOptions?.name != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'message name on tool messages',\n });\n }\n\n for (const toolResponse of content) {\n if (toolResponse.type === 'tool-approval-response') {\n continue;\n }\n const output = toolResponse.output;\n\n let contentValue: DeepSeekToolMessage['content'];\n switch (output.type) {\n case 'text':\n case 'error-text':\n contentValue = output.value;\n break;\n case 'execution-denied':\n contentValue = output.reason ?? 'Tool call execution denied.';\n break;\n case 'json':\n case 'error-json':\n contentValue = JSON.stringify(output.value);\n break;\n case 'content': {\n const hasImagePart = output.value.some(\n part =>\n part.type === 'file' &&\n (part.data.type === 'reference' ||\n part.data.type === 'url' ||\n part.data.type === 'data') &&\n getTopLevelMediaType(part.mediaType) === 'image',\n );\n\n if (!hasImagePart) {\n contentValue = JSON.stringify(output.value);\n break;\n }\n\n contentValue = [];\n for (const part of output.value) {\n if (part.type === 'text') {\n contentValue.push({ type: 'text', text: part.text });\n } else if (\n part.type === 'file' &&\n (part.data.type === 'reference' ||\n part.data.type === 'url' ||\n part.data.type === 'data') &&\n getTopLevelMediaType(part.mediaType) === 'image'\n ) {\n if (part.data.type === 'reference') {\n contentValue.push({\n type: 'file',\n file_id: resolveProviderReference({\n reference: part.data.reference,\n provider: 'deepseek',\n }),\n });\n continue;\n }\n\n const filePartOptions = await parseProviderOptions({\n provider: providerOptionsName,\n providerOptions: part.providerOptions,\n schema: deepseekFilePartProviderOptions,\n });\n const resolvedMediaType = resolveDeepSeekImageMediaType(part);\n let url: string;\n\n if (part.data.type === 'url') {\n url = part.data.url.toString();\n validateDeepSeekImageUrl({ url, prompt });\n } else {\n url = `data:${\n resolvedMediaType === 'image/jpg'\n ? 'image/jpeg'\n : resolvedMediaType\n };base64,${convertToBase64(part.data.data)}`;\n }\n\n contentValue.push({\n type: 'image_url',\n image_url: {\n url,\n ...(filePartOptions?.imageDetail != null && {\n detail: filePartOptions.imageDetail,\n }),\n },\n });\n } else {\n warnings.push({\n type: 'unsupported',\n feature: `tool result content part type: ${part.type}`,\n });\n }\n }\n break;\n }\n }\n\n messages.push({\n role: 'tool',\n tool_call_id: toolResponse.toolCallId,\n content: contentValue,\n });\n }\n break;\n }\n\n default: {\n warnings.push({\n type: 'unsupported',\n feature: `message role: ${role}`,\n });\n break;\n }\n }\n }\n\n return { messages, warnings };\n}\n","import { z } from 'zod/v4';\n\nexport const deepseekFilePartProviderOptions = z.object({\n /**\n * Controls how DeepSeek processes an image sent as an `image_url` part.\n *\n * @see https://api-docs.deepseek.com/api/create-chat-completion/\n */\n imageDetail: z.enum(['low', 'high', 'original', 'auto']).optional(),\n\n /**\n * Sends inline image data as a DeepSeek `file` part using `file_data`\n * instead of an `image_url` data URL. When set, the file part's filename\n * is preserved.\n *\n * This option only applies to inline image data. It cannot be combined\n * with `imageDetail`.\n */\n fileData: z.literal(true).optional(),\n});\n\nexport type DeepSeekFilePartProviderOptions = z.infer<\n typeof deepseekFilePartProviderOptions\n>;\n","import { z } from 'zod/v4';\n\n// https://api-docs.deepseek.com/quick_start/pricing\nexport type DeepSeekChatModelId =\n | 'deepseek-flash'\n | 'deepseek-v4-flash'\n | 'deepseek-v4-pro'\n | 'deepseek-v4-flash-vision-exp'\n // Retired aliases remain assignable through the string escape hatch, but are\n // intentionally omitted from first-class editor suggestions.\n | (string & {});\n\nexport const deepseekLanguageModelChatOptions = z.object({\n /**\n * Whether to return log probabilities for generated tokens.\n */\n logprobs: z.boolean().optional(),\n\n /**\n * Number of most likely tokens to return at each token position.\n *\n * Setting this option automatically enables `logprobs`.\n */\n topLogprobs: z.number().int().min(0).max(20).optional(),\n\n /**\n * An opaque identifier for the end user. DeepSeek uses this identifier for\n * content-safety tracing and request isolation.\n *\n * Must contain only ASCII letters, numbers, underscores, and hyphens, and\n * must be at most 512 characters long.\n */\n userId: z\n .string()\n .regex(/^[a-zA-Z0-9_-]+$/, 'userId must match /^[a-zA-Z0-9_-]+$/')\n .max(512, 'userId must be at most 512 characters long')\n .optional(),\n\n /**\n * Type of thinking to use. Defaults to `enabled`.\n */\n thinking: z\n .object({\n // `adaptive` is accepted at runtime for backwards compatibility and\n // mapped to `enabled`, but is intentionally excluded from the exported\n // provider options type.\n type: z.enum(['adaptive', 'enabled', 'disabled']).optional(),\n })\n .optional(),\n\n /**\n * Controls the thinking strength for DeepSeek V4 reasoning models.\n */\n // `medium` and `xhigh` are accepted at runtime for backwards compatibility\n // and mapped to canonical DeepSeek values, but are intentionally excluded\n // from the exported provider options type.\n reasoningEffort: z.enum(['low', 'medium', 'high', 'xhigh', 'max']).optional(),\n\n /**\n * Whether to use strict JSON schema validation for structured outputs.\n * Only applies when the serving endpoint supports JSON schema response\n * formats (e.g. Azure). Defaults to `true`.\n */\n strictJsonSchema: z.boolean().optional(),\n});\n\nexport type DeepSeekLanguageModelChatOptions = {\n /**\n * Whether to return log probabilities for generated tokens.\n */\n logprobs?: boolean;\n\n /**\n * Number of most likely tokens to return at each token position.\n *\n * Setting this option automatically enables `logprobs`.\n */\n topLogprobs?: number;\n\n /**\n * An opaque identifier for the end user. DeepSeek uses this identifier for\n * content-safety tracing and request isolation.\n *\n * Must contain only ASCII letters, numbers, underscores, and hyphens, and\n * must be at most 512 characters long.\n */\n userId?: string;\n\n /**\n * Controls whether thinking mode is enabled. Defaults to `enabled`.\n */\n thinking?: {\n type?: 'enabled' | 'disabled';\n };\n\n /**\n * Controls the thinking strength for DeepSeek V4 reasoning models.\n */\n reasoningEffort?: 'low' | 'high' | 'max';\n\n /**\n * Whether to use strict JSON schema validation for structured outputs.\n * Only applies when the serving endpoint supports JSON schema response\n * formats (e.g. Azure). Defaults to `true`.\n */\n strictJsonSchema?: boolean;\n};\n\nexport const deepseekMessageProviderOptions = z.object({\n /**\n * The name of the participant represented by the message.\n *\n * Supported on system, user, and assistant messages.\n */\n name: z.string().optional(),\n});\n\nexport type DeepSeekMessageProviderOptions = z.infer<\n typeof deepseekMessageProviderOptions\n>;\n\nexport const deepseekAssistantMessageProviderOptions =\n deepseekMessageProviderOptions.extend({\n /**\n * Whether the assistant message content is a prefix that DeepSeek should\n * continue. This beta feature is only supported on the final assistant\n * message when using a beta base URL.\n */\n prefix: z.literal(true).optional(),\n });\n\nexport type DeepSeekAssistantMessageProviderOptions = z.infer<\n typeof deepseekAssistantMessageProviderOptions\n>;\n","/**\n * Whether a model id is a DeepSeek V4-generation model (thinking mode on by\n * default, `reasoning_content` required on every assistant turn).\n *\n * DeepSeek publishes V4 models under both versioned ids (`deepseek-v4-pro`,\n * `deepseek-v4-flash-*`) and unversioned aliases (`deepseek-flash`, currently\n * serving V4.1 Flash). Only the legacy `deepseek-chat` / `deepseek-reasoner`\n * ids predate V4.\n */\nexport function isDeepSeekV4Model(modelId: string): boolean {\n return (\n modelId.includes('deepseek-v4') ||\n modelId.startsWith('deepseek-flash') ||\n modelId.startsWith('deepseek-pro')\n );\n}\n","import type { LanguageModelV4Usage } from '@ai-sdk/provider';\nimport { createNullLanguageModelUsage } from '@ai-sdk/provider-utils';\n\nexport function convertDeepSeekUsage(\n usage:\n | {\n prompt_tokens?: number | null | undefined;\n completion_tokens?: number | null | undefined;\n prompt_cache_hit_tokens?: number | null | undefined;\n completion_tokens_details?:\n | {\n reasoning_tokens?: number | null | undefined;\n }\n | null\n | undefined;\n }\n | undefined\n | null,\n): LanguageModelV4Usage {\n if (usage == null) {\n return createNullLanguageModelUsage();\n }\n\n const promptTokens = usage.prompt_tokens ?? 0;\n const completionTokens = usage.completion_tokens ?? 0;\n const cacheReadTokens = usage.prompt_cache_hit_tokens ?? 0;\n const reasoningTokens =\n usage.completion_tokens_details?.reasoning_tokens ?? 0;\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: Math.max(0, completionTokens - reasoningTokens),\n reasoning: reasoningTokens,\n },\n raw: usage,\n };\n}\n","import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport type DeepSeekChatPrompt = Array<DeepSeekMessage>;\n\nexport type DeepSeekMessage =\n | DeepSeekSystemMessage\n | DeepSeekUserMessage\n | DeepSeekAssistantMessage\n | DeepSeekToolMessage;\n\nexport interface DeepSeekSystemMessage {\n role: 'system';\n content: string;\n name?: string;\n}\n\nexport interface DeepSeekUserMessage {\n role: 'user';\n content: string | Array<DeepSeekContentPart>;\n name?: string;\n}\n\nexport type DeepSeekContentPart =\n | DeepSeekContentPartText\n | DeepSeekContentPartImage\n | DeepSeekContentPartFile;\n\nexport interface DeepSeekContentPartText {\n type: 'text';\n text: string;\n}\n\nexport interface DeepSeekContentPartImage {\n type: 'image_url';\n image_url: {\n url: string;\n detail?: 'low' | 'high' | 'original' | 'auto';\n };\n}\n\nexport type DeepSeekContentPartFile =\n | {\n type: 'file';\n file_id: string;\n }\n | {\n type: 'file';\n file_data: string;\n filename?: string;\n };\n\nexport interface DeepSeekAssistantMessage {\n role: 'assistant';\n content?: string | null;\n name?: string;\n prefix?: true;\n reasoning_content?: string;\n tool_calls?: Array<DeepSeekMessageToolCall>;\n}\n\nexport interface DeepSeekMessageToolCall {\n type: 'function';\n id: string;\n function: {\n arguments: string;\n name: string;\n };\n}\n\nexport interface DeepSeekToolMessage {\n role: 'tool';\n content: string | Array<DeepSeekContentPart>;\n tool_call_id: string;\n}\n\nexport interface DeepSeekFunctionTool {\n type: 'function';\n function: {\n name: string;\n description: string | undefined;\n parameters: unknown;\n strict?: boolean;\n };\n}\n\nexport type DeepSeekToolChoice =\n | { type: 'function'; function: { name: string } }\n | 'auto'\n | 'none'\n | 'required'\n | undefined;\n\n// Loose, nested objects included: the parsed value is returned as `usage.raw`.\nconst tokenUsageSchema = z\n .looseObject({\n prompt_tokens: z.number().nullish(),\n completion_tokens: z.number().nullish(),\n prompt_cache_hit_tokens: z.number().nullish(),\n prompt_cache_miss_tokens: z.number().nullish(),\n total_tokens: z.number().nullish(),\n prompt_tokens_details: z\n .looseObject({\n cached_tokens: z.number().nullish(),\n })\n .nullish(),\n completion_tokens_details: z\n .looseObject({\n reasoning_tokens: z.number().nullish(),\n })\n .nullish(),\n })\n .nullish();\n\nexport type DeepSeekChatTokenUsage = z.infer<typeof tokenUsageSchema>;\n\nexport const deepSeekErrorSchema = 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 }),\n});\n\nexport type DeepSeekErrorData = z.infer<typeof deepSeekErrorSchema>;\n\nconst deepseekChatLogprobSchema = z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n top_logprobs: z.array(\n z.object({\n token: z.string(),\n logprob: z.number(),\n bytes: z.array(z.number()).nullable(),\n }),\n ),\n});\n\nconst deepseekChatLogprobsSchema = z\n .object({\n content: z.array(deepseekChatLogprobSchema).nullish(),\n reasoning_content: z.array(deepseekChatLogprobSchema).nullish(),\n })\n .nullish();\n\nexport type DeepSeekChatLogprob = z.infer<typeof deepseekChatLogprobSchema>;\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nexport const deepseekChatResponseSchema = z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n object: z.literal('chat.completion').nullish(),\n system_fingerprint: z.string().nullish(),\n choices: z.array(\n z.object({\n index: z.number().nullish(),\n message: z.object({\n role: z.literal('assistant').nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n id: z.string().nullish(),\n type: z.literal('function').nullish(),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n }),\n )\n .nullish(),\n }),\n logprobs: deepseekChatLogprobsSchema,\n finish_reason: z.string().nullish(),\n }),\n ),\n usage: tokenUsageSchema,\n});\n\n// limited version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nexport const deepseekChatChunkSchema = lazySchema(() =>\n zodSchema(\n z.union([\n z.object({\n id: z.string().nullish(),\n created: z.number().nullish(),\n model: z.string().nullish(),\n object: z.literal('chat.completion.chunk').nullish(),\n system_fingerprint: z.string().nullish(),\n choices: z.array(\n z.object({\n index: z.number().nullish(),\n delta: z\n .object({\n role: z.enum(['assistant']).nullish(),\n content: z.string().nullish(),\n reasoning_content: z.string().nullish(),\n tool_calls: z\n .array(\n z.object({\n index: z.number(),\n id: z.string().nullish(),\n type: z.literal('function').nullish(),\n function: z.object({\n name: z.string().nullish(),\n arguments: z.string().nullish(),\n }),\n }),\n )\n .nullish(),\n })\n .nullish(),\n logprobs: deepseekChatLogprobsSchema,\n finish_reason: z.string().nullish(),\n }),\n ),\n usage: tokenUsageSchema,\n }),\n deepSeekErrorSchema,\n ]),\n ),\n);\n","import {\n UnsupportedFunctionalityError,\n type LanguageModelV4CallOptions,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport type {\n DeepSeekFunctionTool,\n DeepSeekToolChoice,\n} from './deepseek-chat-api-types';\n\nexport function prepareTools({\n tools,\n toolChoice,\n supportsStrictToolCalls,\n}: {\n tools: LanguageModelV4CallOptions['tools'];\n toolChoice?: LanguageModelV4CallOptions['toolChoice'];\n supportsStrictToolCalls?: boolean;\n}): {\n tools: undefined | Array<DeepSeekFunctionTool>;\n toolChoice: DeepSeekToolChoice;\n toolWarnings: SharedV4Warning[];\n} {\n // when the tools array is empty, change it to undefined to prevent errors:\n tools = tools?.length ? tools : undefined;\n\n const toolWarnings: SharedV4Warning[] = [];\n\n if (tools == null) {\n return { tools: undefined, toolChoice: undefined, toolWarnings };\n }\n\n const functionTools = tools.filter(tool => tool.type === 'function');\n const hasStrictTool = functionTools.some(tool => tool.strict === true);\n\n if (hasStrictTool && supportsStrictToolCalls === false) {\n throw new UnsupportedFunctionalityError({\n functionality: 'DeepSeek strict tool calls',\n message:\n 'DeepSeek strict tool calls require a beta base URL ending in `/beta`.',\n });\n }\n\n if (\n hasStrictTool &&\n supportsStrictToolCalls === true &&\n functionTools.some(tool => tool.strict !== true)\n ) {\n throw new UnsupportedFunctionalityError({\n functionality: 'mixed DeepSeek strict and non-strict tool calls',\n message:\n 'DeepSeek strict mode requires every function tool in the request to set `strict: true`.',\n });\n }\n\n const deepseekTools: Array<DeepSeekFunctionTool> = [];\n\n for (const tool of tools) {\n if (tool.type === 'provider') {\n toolWarnings.push({\n type: 'unsupported',\n feature: `provider-defined tool ${tool.id}`,\n });\n } else {\n deepseekTools.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 if (toolChoice == null) {\n return { tools: deepseekTools, toolChoice: undefined, toolWarnings };\n }\n\n const type = toolChoice?.type;\n\n switch (type) {\n case 'auto':\n case 'none':\n case 'required':\n return { tools: deepseekTools, toolChoice: type, toolWarnings };\n case 'tool':\n return {\n tools: deepseekTools,\n toolChoice: {\n type: 'function',\n function: { name: toolChoice.toolName },\n },\n toolWarnings,\n };\n default: {\n return {\n tools: deepseekTools,\n toolChoice: undefined,\n toolWarnings: [\n ...toolWarnings,\n {\n type: 'unsupported',\n feature: `tool choice type: ${type}`,\n },\n ],\n };\n }\n }\n}\n","export { createLanguageModelResponseMetadata as getResponseMetadata } from '@ai-sdk/provider-utils';\n","import type { LanguageModelV4FinishReason } from '@ai-sdk/provider';\n\nexport function mapDeepSeekFinishReason(\n finishReason: string | null | undefined,\n): LanguageModelV4FinishReason['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 return 'tool-calls';\n case 'insufficient_system_resource':\n return 'error';\n default:\n return 'other';\n }\n}\n","import {\n InvalidArgumentError,\n type FilesV4,\n type FilesV4UploadFileCallOptions,\n type FilesV4UploadFileResult,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertInlineFileDataToUint8Array,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n detectMediaType,\n parseProviderOptions,\n postFormDataToApi,\n type FetchFunction,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { deepSeekErrorSchema } from '../chat/deepseek-chat-api-types';\nimport { deepSeekFilesResponseSchema } from './deepseek-files-api';\nimport {\n deepSeekFilesOptionsSchema,\n type DeepSeekFilesOptions,\n} from './deepseek-files-options';\n\ninterface DeepSeekFilesConfig {\n provider: string;\n baseURL: string;\n headers: () => Record<string, string | undefined>;\n fetch?: FetchFunction;\n}\n\nconst deepSeekFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: deepSeekErrorSchema,\n errorToMessage: (error: InferSchema<typeof deepSeekErrorSchema>) =>\n error.error.message,\n});\n\nconst MAX_FILE_SIZE_BYTES = 64 * 1024 * 1024;\nconst MAX_FILENAME_LENGTH = 512;\n\nconst supportedMediaTypes = new Set([\n 'image/gif',\n 'image/jpeg',\n 'image/jpg',\n 'image/png',\n 'image/webp',\n]);\n\nconst genericMediaTypes = new Set([\n '',\n 'application/binary',\n 'application/octet-stream',\n 'binary/octet-stream',\n 'image',\n 'image/*',\n]);\n\nconst supportedFilenameExtensions = new Set([\n 'gif',\n 'jpeg',\n 'jpg',\n 'png',\n 'webp',\n]);\n\nexport class DeepSeekFiles implements FilesV4 {\n readonly specificationVersion = 'v4';\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(private readonly config: DeepSeekFilesConfig) {}\n\n async uploadFile({\n data,\n mediaType,\n filename,\n abortSignal,\n headers,\n providerOptions,\n }: FilesV4UploadFileCallOptions): Promise<FilesV4UploadFileResult> {\n const deepSeekOptions = (await parseProviderOptions({\n provider: 'deepseek',\n providerOptions,\n schema: deepSeekFilesOptionsSchema,\n })) as DeepSeekFilesOptions | undefined;\n\n const fileBytes = convertInlineFileDataToUint8Array(data);\n validateFileUpload({ fileBytes, mediaType, filename });\n\n const blob = new Blob([fileBytes], { type: mediaType });\n\n const formData = new FormData();\n if (filename != null) {\n formData.append('file', blob, filename);\n } else {\n formData.append('file', blob);\n }\n formData.append('purpose', 'user_data');\n\n if (deepSeekOptions?.expiresAfter != null) {\n formData.append('expires_after[anchor]', 'created_at');\n formData.append(\n 'expires_after[seconds]',\n String(deepSeekOptions.expiresAfter),\n );\n }\n\n const { value: response } = await postFormDataToApi({\n url: `${this.config.baseURL}/files`,\n headers: combineHeaders(this.config.headers(), headers),\n formData,\n failedResponseHandler: deepSeekFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n deepSeekFilesResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n warnings: [],\n providerReference: { deepseek: response.id },\n ...((response.filename ?? filename)\n ? { filename: response.filename ?? filename }\n : {}),\n ...(mediaType != null ? { mediaType } : {}),\n providerMetadata: {\n deepseek: {\n ...(response.object != null ? { object: response.object } : {}),\n ...(response.filename != null ? { filename: response.filename } : {}),\n ...(response.purpose != null ? { purpose: response.purpose } : {}),\n ...(response.bytes != null ? { bytes: response.bytes } : {}),\n ...(response.created_at != null\n ? { createdAt: response.created_at }\n : {}),\n ...(response.expires_at != null\n ? { expiresAt: response.expires_at }\n : {}),\n },\n },\n };\n }\n}\n\nfunction validateFileUpload({\n fileBytes,\n mediaType,\n filename,\n}: {\n fileBytes: Uint8Array;\n mediaType: string;\n filename: string | undefined;\n}) {\n if (fileBytes.length > MAX_FILE_SIZE_BYTES) {\n throw new InvalidArgumentError({\n argument: 'data',\n message:\n `DeepSeek file uploads must not exceed 64 MiB ` +\n `(${MAX_FILE_SIZE_BYTES.toLocaleString('en-US')} bytes). ` +\n `Received ${fileBytes.length.toLocaleString('en-US')} bytes.`,\n });\n }\n\n if (filename != null) {\n const filenameLength = Array.from(filename).length;\n\n if (filenameLength > MAX_FILENAME_LENGTH) {\n throw new InvalidArgumentError({\n argument: 'filename',\n message:\n `DeepSeek filenames must not exceed ${MAX_FILENAME_LENGTH} characters. ` +\n `Received ${filenameLength} characters.`,\n });\n }\n }\n\n const normalizedMediaType = normalizeMediaType(mediaType);\n const detectedMediaType = detectMediaType({ data: fileBytes });\n\n if (\n detectedMediaType != null &&\n !supportedMediaTypes.has(detectedMediaType)\n ) {\n throw new InvalidArgumentError({\n argument: 'data',\n message:\n `DeepSeek file uploads support JPEG, PNG, GIF, and WebP images. ` +\n `Detected unsupported file content type \"${detectedMediaType}\".`,\n });\n }\n\n if (supportedMediaTypes.has(normalizedMediaType)) {\n return;\n }\n\n if (!genericMediaTypes.has(normalizedMediaType)) {\n throw new InvalidArgumentError({\n argument: 'mediaType',\n message:\n `DeepSeek file uploads support JPEG, PNG, GIF, and WebP images. ` +\n `Received unsupported media type \"${mediaType}\".`,\n });\n }\n\n if (detectedMediaType != null || hasSupportedFilenameExtension(filename)) {\n return;\n }\n\n throw new InvalidArgumentError({\n argument: 'mediaType',\n message:\n `DeepSeek file uploads support JPEG, PNG, GIF, and WebP images. ` +\n `Provide a supported media type or a filename ending in ` +\n `.jpg, .jpeg, .png, .gif, or .webp. Received \"${mediaType}\".`,\n });\n}\n\nfunction normalizeMediaType(mediaType: string): string {\n return mediaType.split(';', 1)[0].trim().toLowerCase();\n}\n\nfunction hasSupportedFilenameExtension(filename: string | undefined): boolean {\n if (filename == null) {\n return false;\n }\n\n const extensionSeparatorIndex = filename.lastIndexOf('.');\n\n return (\n extensionSeparatorIndex !== -1 &&\n supportedFilenameExtensions.has(\n filename.slice(extensionSeparatorIndex + 1).toLowerCase(),\n )\n );\n}\n","import { lazySchema, zodSchema } from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const deepSeekFilesResponseSchema = lazySchema(() =>\n zodSchema(\n z.object({\n id: z.string(),\n // These fields are required by DeepSeek's OpenAPI schema, but they are\n // not needed to construct the provider reference. Keep them nullish so\n // uploads remain resilient to incomplete responses while validating any\n // returned values precisely enough to avoid misleading metadata.\n object: z.literal('file').nullish(),\n bytes: z.number().int().nonnegative().nullish(),\n created_at: z.number().int().nonnegative().nullish(),\n filename: z.string().nullish(),\n purpose: z.literal('user_data').nullish(),\n expires_at: z.number().int().nonnegative().nullish(),\n }),\n ),\n);\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\nexport const deepSeekFilesOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * Number of seconds after creation before the file expires.\n * Must be between 1 hour and 30 days.\n */\n expiresAfter: z.number().int().min(3600).max(2592000).optional(),\n }),\n ),\n);\n\nexport type DeepSeekFilesOptions = InferSchema<\n typeof deepSeekFilesOptionsSchema\n>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["parseProviderOptions","z","userContent","z","UnsupportedFunctionalityError","parseProviderOptions","_a","_b","combineHeaders","createJsonErrorResponseHandler","createJsonResponseHandler","parseProviderOptions","lazySchema","zodSchema","z","lazySchema","zodSchema","z","createJsonErrorResponseHandler","parseProviderOptions","combineHeaders","createJsonResponseHandler"]}
@@ -126,6 +126,27 @@ var supportedImageMediaTypes = /* @__PURE__ */ new Set([
126
126
  "image/png",
127
127
  "image/webp"
128
128
  ]);
129
+ function resolveDeepSeekImageMediaType(part) {
130
+ const resolvedMediaType = resolveFullMediaType({ part });
131
+ if (!supportedImageMediaTypes.has(resolvedMediaType)) {
132
+ throw new UnsupportedFunctionalityError({
133
+ functionality: `DeepSeek image media type ${resolvedMediaType}`,
134
+ message: "DeepSeek supports JPEG, PNG, GIF, and WebP image inputs."
135
+ });
136
+ }
137
+ return resolvedMediaType;
138
+ }
139
+ function validateDeepSeekImageUrl({
140
+ url,
141
+ prompt
142
+ }) {
143
+ if (url.length > 8192) {
144
+ throw new InvalidPromptError({
145
+ prompt,
146
+ message: "DeepSeek image URLs must not exceed 8192 characters."
147
+ });
148
+ }
149
+ }
129
150
  async function convertToDeepSeekChatMessages({
130
151
  prompt,
131
152
  responseFormat,
@@ -232,21 +253,10 @@ async function convertToDeepSeekChatMessages({
232
253
  })
233
254
  });
234
255
  } else if (part.data.type === "url" || part.data.type === "data") {
235
- const resolvedMediaType = resolveFullMediaType({ part });
236
- if (!supportedImageMediaTypes.has(resolvedMediaType)) {
237
- throw new UnsupportedFunctionalityError({
238
- functionality: `DeepSeek image media type ${resolvedMediaType}`,
239
- message: "DeepSeek supports JPEG, PNG, GIF, and WebP image inputs."
240
- });
241
- }
256
+ const resolvedMediaType = resolveDeepSeekImageMediaType(part);
242
257
  if (part.data.type === "url") {
243
258
  const url = part.data.url.toString();
244
- if (url.length > 8192) {
245
- throw new InvalidPromptError({
246
- prompt,
247
- message: "DeepSeek image URLs must not exceed 8192 characters."
248
- });
249
- }
259
+ validateDeepSeekImageUrl({ url, prompt });
250
260
  if ((filePartOptions == null ? void 0 : filePartOptions.fileData) === true) {
251
261
  throw new InvalidPromptError({
252
262
  prompt,
@@ -393,11 +403,64 @@ async function convertToDeepSeekChatMessages({
393
403
  case "execution-denied":
394
404
  contentValue = (_a = output.reason) != null ? _a : "Tool call execution denied.";
395
405
  break;
396
- case "content":
397
406
  case "json":
398
407
  case "error-json":
399
408
  contentValue = JSON.stringify(output.value);
400
409
  break;
410
+ case "content": {
411
+ const hasImagePart = output.value.some(
412
+ (part) => part.type === "file" && (part.data.type === "reference" || part.data.type === "url" || part.data.type === "data") && getTopLevelMediaType(part.mediaType) === "image"
413
+ );
414
+ if (!hasImagePart) {
415
+ contentValue = JSON.stringify(output.value);
416
+ break;
417
+ }
418
+ contentValue = [];
419
+ for (const part of output.value) {
420
+ if (part.type === "text") {
421
+ contentValue.push({ type: "text", text: part.text });
422
+ } else if (part.type === "file" && (part.data.type === "reference" || part.data.type === "url" || part.data.type === "data") && getTopLevelMediaType(part.mediaType) === "image") {
423
+ if (part.data.type === "reference") {
424
+ contentValue.push({
425
+ type: "file",
426
+ file_id: resolveProviderReference({
427
+ reference: part.data.reference,
428
+ provider: "deepseek"
429
+ })
430
+ });
431
+ continue;
432
+ }
433
+ const filePartOptions = await parseProviderOptions({
434
+ provider: providerOptionsName,
435
+ providerOptions: part.providerOptions,
436
+ schema: deepseekFilePartProviderOptions
437
+ });
438
+ const resolvedMediaType = resolveDeepSeekImageMediaType(part);
439
+ let url;
440
+ if (part.data.type === "url") {
441
+ url = part.data.url.toString();
442
+ validateDeepSeekImageUrl({ url, prompt });
443
+ } else {
444
+ url = `data:${resolvedMediaType === "image/jpg" ? "image/jpeg" : resolvedMediaType};base64,${convertToBase64(part.data.data)}`;
445
+ }
446
+ contentValue.push({
447
+ type: "image_url",
448
+ image_url: {
449
+ url,
450
+ ...(filePartOptions == null ? void 0 : filePartOptions.imageDetail) != null && {
451
+ detail: filePartOptions.imageDetail
452
+ }
453
+ }
454
+ });
455
+ } else {
456
+ warnings.push({
457
+ type: "unsupported",
458
+ feature: `tool result content part type: ${part.type}`
459
+ });
460
+ }
461
+ }
462
+ break;
463
+ }
401
464
  }
402
465
  messages.push({
403
466
  role: "tool",