@ai-sdk/deepseek 3.0.58 → 3.0.60

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/CHANGELOG.md CHANGED
@@ -1,5 +1,36 @@
1
1
  # @ai-sdk/deepseek
2
2
 
3
+ ## 3.0.60
4
+
5
+ ### Patch Changes
6
+
7
+ - 268225c: feat(provider): add a portable `max` reasoning level with native provider mappings, compatibility coercions, and budget-based fallback support.
8
+
9
+ Compatibility notes:
10
+
11
+ - **TypeScript source compatibility:** Adding `max` widens `LanguageModelV4CallOptions['reasoning']` and the derived `ReasoningLevel` type. Third-party providers and consumers with exhaustive switches or `Record<ReasoningLevel, ...>` mappings must handle `max` before upgrading. Ordinary calls using existing reasoning levels remain accepted.
12
+ - **Amazon Bedrock:** Existing Nova 2 calls using portable `reasoning: 'xhigh'` now send `maxReasoningEffort: 'high'` instead of the unsupported `'max'`, and return a compatibility warning. Anthropic and OpenAI Bedrock effort mappings retain their existing `xhigh` behavior. Partial Bedrock reasoning configurations continue to preserve explicit values and derive missing fields; explicit effort/budget overrides and disabled thinking no longer emit warnings for portable mappings that are not sent.
13
+ - **Fireworks:** Existing portable `minimal` and `xhigh` calls keep their request mappings to `low` and `high`, respectively, and now return compatibility warnings in generation and streaming results. Portable `max` maps to `high` with the same warning behavior.
14
+
15
+ **Release classification:** This remains a patch changeset under the repository's explicit release policy, which uses patch releases for both fixes and features. The TypeScript source-compatibility caveat for exhaustive consumers is disclosed above. Maintainers can override this classification with a `major` label if they decide to align the provider-spec addition with a future AI SDK major release.
16
+
17
+ - 0af2f7c: chore: upgrade to TypeScript 6
18
+ - Updated dependencies [fc1e19e]
19
+ - Updated dependencies [5094ebd]
20
+ - Updated dependencies [268225c]
21
+ - Updated dependencies [0af2f7c]
22
+ - @ai-sdk/provider-utils@5.0.55
23
+ - @ai-sdk/provider@4.0.23
24
+
25
+ ## 3.0.59
26
+
27
+ ### Patch Changes
28
+
29
+ - Updated dependencies [2959d35]
30
+ - Updated dependencies [59116e6]
31
+ - @ai-sdk/provider@4.0.22
32
+ - @ai-sdk/provider-utils@5.0.54
33
+
3
34
  ## 3.0.58
4
35
 
5
36
  ### Patch Changes
package/dist/index.js CHANGED
@@ -743,7 +743,8 @@ var DeepSeekChatLanguageModel = class DeepSeekChatLanguageModel {
743
743
  low: "low",
744
744
  medium: "high",
745
745
  high: "high",
746
- xhigh: "max"
746
+ xhigh: "max",
747
+ max: "max"
747
748
  },
748
749
  warnings: allWarnings
749
750
  }) : void 0;
@@ -1160,7 +1161,7 @@ function hasSupportedFilenameExtension(filename) {
1160
1161
  }
1161
1162
  //#endregion
1162
1163
  //#region src/version.ts
1163
- const VERSION = "3.0.58";
1164
+ const VERSION = "3.0.60";
1164
1165
  //#endregion
1165
1166
  //#region src/deepseek-provider.ts
1166
1167
  function createDeepSeek(options = {}) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../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-chat-messages.ts","../src/chat/convert-to-deepseek-usage.ts","../src/chat/deepseek-chat-api-types.ts","../src/chat/deepseek-prepare-tools.ts","../src/chat/map-deepseek-finish-reason.ts","../src/chat/deepseek-chat-language-model.ts","../src/files/deepseek-files-api.ts","../src/files/deepseek-files-options.ts","../src/files/deepseek-files.ts","../src/version.ts","../src/deepseek-provider.ts"],"sourcesContent":["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 {\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 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 prompt_tokens_details?:\n | {\n cached_tokens?: number | null | undefined;\n }\n | null\n | 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 =\n usage.prompt_cache_hit_tokens ??\n usage.prompt_tokens_details?.cached_tokens ??\n 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","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 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 { 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","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","// 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","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"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../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-chat-messages.ts","../src/chat/convert-to-deepseek-usage.ts","../src/chat/deepseek-chat-api-types.ts","../src/chat/deepseek-prepare-tools.ts","../src/chat/map-deepseek-finish-reason.ts","../src/chat/deepseek-chat-language-model.ts","../src/files/deepseek-files-api.ts","../src/files/deepseek-files-options.ts","../src/files/deepseek-files.ts","../src/version.ts","../src/deepseek-provider.ts"],"sourcesContent":["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 {\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 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 prompt_tokens_details?:\n | {\n cached_tokens?: number | null | undefined;\n }\n | null\n | 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 =\n usage.prompt_cache_hit_tokens ??\n usage.prompt_tokens_details?.cached_tokens ??\n 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","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 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 max: '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 { 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","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 as Uint8Array<ArrayBuffer>], {\n type: mediaType,\n });\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","// 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","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"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/chat/deepseek-chat-language-model-options.ts","../../src/chat/deepseek-chat-language-model.ts"],"mappings":";;;;YAGY;qBASC,kCAAgC,EAAA;;;;;;;;;;;;;;;;;;;GAoD3C,EAAA,KAAA;YAEU;;;;EAIV;;;;;;EAOA;;;;;;;;EASA;;;;EAKA;IACE;;;;;EAMF;;;;;;EAOA;;qBAGW,gCAA8B,EAAA;;GAOzC,EAAA,KAAA;YAEU,iCAAiC,EAAE,aACtC;qBAGI,yCAAuC,EAAA;;;GAQhD,EAAA,KAAA;YAEQ,0CAA0C,EAAE,aAC/C;;;YClFG;EACV;EACA,gBAAgB;EAChB,MAAM;IAAW;IAAiB;;EAClC,QAAQ;EACR;EACA;EACA;EACA;EACA;;qBA2HW,qCAAqC;WACvC;WAEA,SAAS;WAET;;;mBAIQ;mBACA;UAET,oBAAoB,OAAO;;;;UAO3B,sBAAsB;IAC5B,SAAS;IACT,QAAQ;MACT;EAIW,YAAA,SAAS,qBAAqB,QAAQ;MAW9C;cAIQ;UAIE;EAyLR,WACJ,SAAS,6BACR,QAAQ;EAkGL,SACJ,SAAS,6BACR,QAAQ"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/chat/deepseek-chat-language-model-options.ts","../../src/chat/deepseek-chat-language-model.ts"],"mappings":";;;;YAGY;qBASC,kCAAgC,EAAA;;;;;;;;;;;;;;;;;;;GAoD3C,EAAA,KAAA;YAEU;;;;EAIV;;;;;;EAOA;;;;;;;;EASA;;;;EAKA;IACE;;;;;EAMF;;;;;;EAOA;;qBAGW,gCAA8B,EAAA;;GAOzC,EAAA,KAAA;YAEU,iCAAiC,EAAE,aACtC;qBAGI,yCAAuC,EAAA;;;GAQhD,EAAA,KAAA;YAEQ,0CAA0C,EAAE,aAC/C;;;YClFG;EACV;EACA,gBAAgB;EAChB,MAAM;IAAW;IAAiB;;EAClC,QAAQ;EACR;EACA;EACA;EACA;EACA;;qBA2HW,qCAAqC;WACvC;WAEA,SAAS;WAET;;;mBAIQ;mBACA;UAET,oBAAoB,OAAO;;;;UAO3B,sBAAsB;IAC5B,SAAS;IACT,QAAQ;MACT;EAIW,YAAA,SAAS,qBAAqB,QAAQ;MAW9C;cAIQ;UAIE;EA0LR,WACJ,SAAS,6BACR,QAAQ;EAkGL,SACJ,SAAS,6BACR,QAAQ"}
@@ -744,7 +744,8 @@ var DeepSeekChatLanguageModel = class DeepSeekChatLanguageModel {
744
744
  low: "low",
745
745
  medium: "high",
746
746
  high: "high",
747
- xhigh: "max"
747
+ xhigh: "max",
748
+ max: "max"
748
749
  },
749
750
  warnings: allWarnings
750
751
  }) : void 0;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../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-chat-messages.ts","../../src/chat/convert-to-deepseek-usage.ts","../../src/chat/deepseek-chat-api-types.ts","../../src/chat/deepseek-prepare-tools.ts","../../src/chat/map-deepseek-finish-reason.ts","../../src/chat/deepseek-chat-language-model.ts"],"sourcesContent":["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 {\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 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 prompt_tokens_details?:\n | {\n cached_tokens?: number | null | undefined;\n }\n | null\n | 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 =\n usage.prompt_cache_hit_tokens ??\n usage.prompt_tokens_details?.cached_tokens ??\n 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","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 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"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../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-chat-messages.ts","../../src/chat/convert-to-deepseek-usage.ts","../../src/chat/deepseek-chat-api-types.ts","../../src/chat/deepseek-prepare-tools.ts","../../src/chat/map-deepseek-finish-reason.ts","../../src/chat/deepseek-chat-language-model.ts"],"sourcesContent":["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 {\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 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 prompt_tokens_details?:\n | {\n cached_tokens?: number | null | undefined;\n }\n | null\n | 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 =\n usage.prompt_cache_hit_tokens ??\n usage.prompt_tokens_details?.cached_tokens ??\n 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","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 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 max: '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"],"mappings":"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"}
@@ -111,8 +111,9 @@ The following optional provider options are available for DeepSeek models:
111
111
 
112
112
  Optional. Controls thinking strength for DeepSeek V4 reasoning models. When
113
113
  using the top-level `reasoning` setting, `minimal` is sent as `low`,
114
- `medium` is sent as `high`, and `xhigh` is sent as `max`. A compatibility
115
- warning is returned whenever the requested value is mapped.
114
+ `medium` is sent as `high`, `xhigh` is sent as `max`, and `max` is sent
115
+ directly. A compatibility warning is returned whenever the requested value
116
+ is mapped.
116
117
 
117
118
  For backwards compatibility, legacy provider options supplied at runtime are
118
119
  also mapped to documented values: `thinking.type: 'adaptive'` becomes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/deepseek",
3
- "version": "3.0.58",
3
+ "version": "3.0.60",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "sideEffects": false,
@@ -35,15 +35,15 @@
35
35
  }
36
36
  },
37
37
  "dependencies": {
38
- "@ai-sdk/provider": "4.0.21",
39
- "@ai-sdk/provider-utils": "5.0.53"
38
+ "@ai-sdk/provider": "4.0.23",
39
+ "@ai-sdk/provider-utils": "5.0.55"
40
40
  },
41
41
  "devDependencies": {
42
- "@ai-sdk/test-server": "2.0.3",
42
+ "@ai-sdk/test-server": "2.0.4",
43
43
  "@types/node": "22.19.19",
44
44
  "@vercel/ai-tsconfig": "0.0.0",
45
45
  "tsdown": "^0.23.0",
46
- "typescript": "5.8.3",
46
+ "typescript": "6.0.3",
47
47
  "zod": "3.25.76"
48
48
  },
49
49
  "peerDependencies": {
@@ -359,6 +359,7 @@ export class DeepSeekChatLanguageModel implements LanguageModelV4 {
359
359
  medium: 'high',
360
360
  high: 'high',
361
361
  xhigh: 'max',
362
+ max: 'max',
362
363
  },
363
364
  warnings: allWarnings,
364
365
  })
@@ -89,7 +89,9 @@ export class DeepSeekFiles implements FilesV4 {
89
89
  const fileBytes = convertInlineFileDataToUint8Array(data);
90
90
  validateFileUpload({ fileBytes, mediaType, filename });
91
91
 
92
- const blob = new Blob([fileBytes], { type: mediaType });
92
+ const blob = new Blob([fileBytes as Uint8Array<ArrayBuffer>], {
93
+ type: mediaType,
94
+ });
93
95
 
94
96
  const formData = new FormData();
95
97
  if (filename != null) {