@hopemyl619/deepseek 0.3.3 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,39 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ DeepSeekChatLanguageModel: () => DeepSeekChatLanguageModel,
24
+ RequestTransformer: () => RequestTransformer,
25
+ ResponseTransformer: () => ResponseTransformer,
26
+ StreamParser: () => StreamParser,
27
+ VERSION: () => VERSION,
28
+ createDeepSeek: () => createDeepSeek,
29
+ createProvider: () => createProvider,
30
+ deepseek: () => deepseek,
31
+ validateChatSettings: () => validateChatSettings
32
+ });
33
+ module.exports = __toCommonJS(index_exports);
34
+
1
35
  // src/deepseek-provider.ts
2
- import { loadApiKey } from "@ai-sdk/provider-utils";
36
+ var import_provider_utils = require("@ai-sdk/provider-utils");
3
37
 
4
38
  // src/deepseek-chat-settings.ts
5
39
  function validateChatSettings(settings = {}) {
@@ -414,7 +448,7 @@ var DeepSeekChatLanguageModel = class {
414
448
 
415
449
  // src/deepseek-provider.ts
416
450
  async function createDeepSeek(options = {}) {
417
- const apiKey = await loadApiKey({
451
+ const apiKey = await (0, import_provider_utils.loadApiKey)({
418
452
  apiKey: options.apiKey,
419
453
  environmentVariableName: "DEEPSEEK_API_KEY",
420
454
  description: "DeepSeek API key"
@@ -456,7 +490,8 @@ var createProvider = createDeepSeek;
456
490
 
457
491
  // src/index.ts
458
492
  var VERSION = "0.2.0";
459
- export {
493
+ // Annotate the CommonJS export names for ESM import in node:
494
+ 0 && (module.exports = {
460
495
  DeepSeekChatLanguageModel,
461
496
  RequestTransformer,
462
497
  ResponseTransformer,
@@ -466,5 +501,5 @@ export {
466
501
  createProvider,
467
502
  deepseek,
468
503
  validateChatSettings
469
- };
504
+ });
470
505
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/deepseek-provider.ts","../src/deepseek-chat-settings.ts","../src/utils/request-transformer.ts","../src/utils/response-transformer.ts","../src/utils/stream-parser.ts","../src/deepseek-chat-language-model.ts","../src/index.ts"],"sourcesContent":["// DeepSeek Provider - 完全兼容官方 @ai-sdk/deepseek 接口\n\nimport { loadApiKey } from '@ai-sdk/provider-utils';\nimport type { DeepSeekProviderSettings, DeepSeekChatSettings } from './types';\nimport { DeepSeekChatLanguageModel } from './deepseek-chat-language-model';\n\n// Provider 接口定义(兼容官方)\nexport interface DeepSeekProvider {\n /**\n * 创建 DeepSeek 模型用于文本生成\n */\n (modelId: string, settings?: DeepSeekChatSettings): DeepSeekChatLanguageModel;\n\n /**\n * 创建 DeepSeek 模型用于文本生成\n */\n languageModel(modelId: string, settings?: DeepSeekChatSettings): DeepSeekChatLanguageModel;\n\n /**\n * 创建 DeepSeek 聊天模型用于文本生成\n */\n chat(modelId: string, settings?: DeepSeekChatSettings): DeepSeekChatLanguageModel;\n\n /**\n * 文本嵌入模型(暂不支持)\n * @deprecated\n */\n textEmbeddingModel(modelId: string): never;\n}\n\n/**\n * 创建 DeepSeek Provider\n * 完全兼容官方 @ai-sdk/deepseek 的 createDeepSeek 函数\n */\nexport async function createDeepSeek(\n options: DeepSeekProviderSettings = {}\n): Promise<DeepSeekProvider> {\n // 加载 API Key\n const apiKey = await loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'DEEPSEEK_API_KEY',\n description: 'DeepSeek API key',\n });\n\n const baseURL = options.baseURL || 'https://api.deepseek.com';\n\n // 创建 provider 函数\n const providerFunction = function(\n modelId: string,\n settings?: DeepSeekChatSettings\n ): DeepSeekChatLanguageModel {\n return new DeepSeekChatLanguageModel(\n modelId,\n settings,\n {\n baseURL,\n headers: () => ({\n Authorization: `Bearer ${apiKey}`,\n ...(options.headers || {}),\n }),\n }\n );\n } as DeepSeekProvider;\n\n // 添加方法到 provider 函数对象\n providerFunction.languageModel = providerFunction;\n providerFunction.chat = providerFunction;\n providerFunction.textEmbeddingModel = () => {\n throw new Error('Text embedding models are not supported for DeepSeek');\n };\n\n return providerFunction;\n}\n\n// 默认导出的 provider 实例(懒加载,避免在导入时立即检查 API key)\n// 使用包装函数延迟 API key 检查,直到实际使用时\nlet cachedProvider: DeepSeekProvider | null = null;\n\nexport const deepseek = function(modelId: string, settings?: DeepSeekChatSettings) {\n if (!cachedProvider) {\n // 延迟创建 provider,仅在首次使用时初始化\n cachedProvider = createDeepSeek() as unknown as DeepSeekProvider;\n }\n return cachedProvider(modelId, settings);\n} as DeepSeekProvider;\n\n// 添加方法到 provider\ndeepseek.languageModel = deepseek;\ndeepseek.chat = deepseek;\ndeepseek.textEmbeddingModel = () => {\n throw new Error('Text embedding models are not supported for DeepSeek');\n};\n\n// 为了向后兼容,保留 createProvider 作为别名\nexport const createProvider = createDeepSeek;\n","// DeepSeek Chat 模型配置\n\nimport type { DeepSeekChatSettings } from './types';\n\nexport function validateChatSettings(settings: DeepSeekChatSettings = {}): Required<DeepSeekChatSettings> {\n return {\n temperature: settings.temperature ?? 0.7,\n topP: settings.topP ?? 1.0,\n maxTokens: settings.maxTokens ?? 4096,\n presencePenalty: settings.presencePenalty ?? 0,\n frequencyPenalty: settings.frequencyPenalty ?? 0,\n };\n}","// 请求转换器\n\nimport type {\n LanguageModelV1CallOptions,\n LanguageModelV1Prompt,\n} from '@ai-sdk/provider';\nimport type { DeepSeekRequest } from '../types';\n\nexport class RequestTransformer {\n transform(modelId: string, options: LanguageModelV1CallOptions): DeepSeekRequest {\n const transformed: DeepSeekRequest = {\n model: modelId,\n messages: this.transformMessages(options.prompt),\n stream: false,\n };\n\n // 添加温度参数\n if (options.temperature !== undefined) {\n transformed.temperature = options.temperature;\n }\n\n // 添加 top_p 参数\n if (options.topP !== undefined) {\n transformed.top_p = options.topP;\n }\n\n // 添加 max_tokens 参数\n if (options.maxTokens !== undefined) {\n transformed.max_tokens = options.maxTokens;\n }\n\n // 添加 presence_penalty 参数\n if (options.presencePenalty !== undefined) {\n transformed.presence_penalty = options.presencePenalty;\n }\n\n // 添加 frequency_penalty 参数\n if (options.frequencyPenalty !== undefined) {\n transformed.frequency_penalty = options.frequencyPenalty;\n }\n\n // 添加工具配置\n const mode = options.mode;\n let toolsArray: Array<any> = [];\n let toolChoice: any;\n\n // 只有 'regular' 模式支持工具\n if (mode && mode.type === 'regular') {\n toolsArray = mode.tools ?? [];\n toolChoice = mode.toolChoice;\n }\n\n // 如果没有通过 mode 传递工具,检查直接传递的 tools 参数(向后兼容)\n if (toolsArray.length === 0 && options.tools && options.tools.length > 0) {\n toolsArray = options.tools;\n toolChoice = options.toolChoice;\n }\n\n if (toolsArray.length > 0) {\n transformed.tools = this.transformTools(toolsArray);\n transformed.tool_choice = this.transformToolChoice(toolChoice);\n }\n\n return transformed;\n }\n\n private transformMessages(messages: LanguageModelV1Prompt): Array<any> {\n return messages.map((msg) => {\n const transformed: any = {\n role: msg.role,\n };\n\n // 处理内容\n if (msg.content && Array.isArray(msg.content)) {\n const contentParts: Array<any> = [];\n let hasToolCalls = false;\n let toolCallsArray: Array<any> = [];\n\n for (const part of msg.content) {\n // 处理文本内容\n if (part.type === 'text') {\n contentParts.push({ type: 'text', text: part.text });\n }\n // 处理图像内容\n else if (part.type === 'image') {\n // V1 image part has 'image' property, convert to data for DeepSeek API\n const imageData = part.image;\n if (typeof imageData === 'string') {\n contentParts.push({ type: 'image_url', image_url: { url: imageData } });\n } else if (imageData instanceof URL) {\n contentParts.push({ type: 'image_url', image_url: { url: imageData.toString() } });\n }\n }\n // 处理工具调用 (V1 格式)\n else if (part.type === 'tool-call') {\n hasToolCalls = true;\n toolCallsArray.push({\n id: part.toolCallId,\n type: 'function',\n function: {\n name: part.toolName,\n arguments: typeof part.args === 'string' ? part.args : JSON.stringify(part.args),\n },\n });\n }\n // 处理工具结果 (V1 格式)\n else if (part.type === 'tool-result') {\n // Tool results in V1 don't get added to content directly\n // They are already part of the prompt structure\n }\n // 处理推理内容\n else if (part.type === 'reasoning' || part.type === 'redacted-reasoning') {\n // DeepSeek API doesn't support reasoning content directly\n // We'll add it as text if there's a text field\n if ('text' in part && part.text) {\n contentParts.push({ type: 'text', text: part.text });\n }\n }\n // 处理文件内容\n else if (part.type === 'file') {\n contentParts.push({\n type: 'text',\n text: `[File: ${part.filename || 'unnamed'}]`,\n });\n }\n // 其他未知类型\n else {\n contentParts.push(part);\n }\n }\n\n // 设置内容\n if (contentParts.length > 0) {\n transformed.content = contentParts;\n }\n\n // 添加工具调用\n if (hasToolCalls && toolCallsArray.length > 0) {\n transformed.tool_calls = toolCallsArray;\n }\n } else if (typeof msg.content === 'string') {\n // 系统消息等内容为字符串的情况\n transformed.content = msg.content;\n }\n\n return transformed;\n });\n }\n\n private transformTools(tools: Array<any>): Array<any> {\n return tools.map(tool => {\n // AI SDK V1 格式: { type: 'function', function: { name, description, parameters } }\n if (tool.type === 'function' && tool.function) {\n return {\n type: 'function',\n function: {\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters,\n },\n };\n }\n\n // 备用格式(向后兼容)\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n };\n });\n }\n\n private transformToolChoice(toolChoice: any): any {\n // undefined 或 auto -> 'auto'\n if (toolChoice === undefined || toolChoice === 'auto') {\n return 'auto';\n }\n\n // none -> 'none'\n if (toolChoice === 'none') {\n return 'none';\n }\n\n // required -> 'required' (强制调用至少一个工具)\n if (toolChoice === 'required' || (typeof toolChoice === 'object' && toolChoice.type === 'required')) {\n return 'required';\n }\n\n // 特定工具: { type: 'tool', toolName: 'function_name' }\n if (typeof toolChoice === 'object' && toolChoice.type === 'tool') {\n // DeepSeek API 可能支持的格式\n return {\n type: 'function',\n function: {\n name: toolChoice.toolName,\n },\n };\n }\n\n // 默认: auto\n return 'auto';\n }\n}","// 响应转换器 - 新 AI SDK 格式\n\nimport type {\n LanguageModelV1FinishReason,\n LanguageModelV1CallWarning,\n LanguageModelV1FunctionToolCall,\n LanguageModelV1ContentPart,\n} from '@ai-sdk/provider';\nimport type { DeepSeekResponse } from '../types';\n\n// 新 AI SDK 返回结果类型\nexport interface V1GenerateResult {\n content: LanguageModelV1ContentPart[];\n finishReason: LanguageModelV1FinishReason;\n usage: {\n promptTokens: number;\n completionTokens: number;\n };\n rawCall: {\n rawPrompt: unknown;\n rawSettings: Record<string, unknown>;\n };\n warnings?: LanguageModelV1CallWarning[];\n // 兼容旧格式的字段\n text?: string;\n toolCalls?: LanguageModelV1FunctionToolCall[];\n reasoning?: string;\n}\n\nexport class ResponseTransformer {\n transform(apiResponse: DeepSeekResponse): V1GenerateResult {\n const choice = apiResponse.choices?.[0];\n const message = choice?.message || {};\n\n // 修复 finish_reason\n const finishReason = this.fixFinishReason(\n choice?.finish_reason,\n message.tool_calls\n );\n\n // 转换工具调用\n const toolCalls = this.transformToolCalls(message.tool_calls);\n\n // 构建内容数组\n const content: LanguageModelV1ContentPart[] = [];\n\n // 添加文本内容\n if (message.content) {\n content.push({\n type: 'text',\n text: message.content,\n });\n }\n\n // 添加工具调用\n if (toolCalls.length > 0) {\n content.push(...toolCalls);\n }\n\n return {\n content,\n text: message.content || '', // 兼容旧格式\n finishReason: finishReason as LanguageModelV1FinishReason,\n usage: {\n promptTokens: apiResponse.usage?.prompt_tokens || 0,\n completionTokens: apiResponse.usage?.completion_tokens || 0,\n },\n rawCall: {\n rawPrompt: '',\n rawSettings: {},\n },\n toolCalls, // 兼容旧格式\n warnings: [],\n };\n }\n\n private fixFinishReason(\n originalFinishReason: string | undefined,\n toolCalls: any[] | undefined\n ): string {\n // 如果有 tool_calls 但 finish_reason 是 \"stop\",修复为 \"tool-calls\"\n if (toolCalls && toolCalls.length > 0 && originalFinishReason === 'stop') {\n return 'tool-calls';\n }\n\n // 映射其他 finish_reason 值\n const finishReasonMap: Record<string, string> = {\n 'stop': 'stop',\n 'length': 'length',\n 'content_filter': 'content-filter',\n 'tool_calls': 'tool-calls',\n 'function_call': 'tool-calls',\n };\n\n return finishReasonMap[originalFinishReason || ''] || 'stop';\n }\n\n private transformToolCalls(toolCalls: any[] | undefined): LanguageModelV1FunctionToolCall[] {\n if (!toolCalls || toolCalls.length === 0) {\n return [];\n }\n\n return toolCalls.map((tc: any) => ({\n type: 'tool-call' as const,\n toolCallType: 'function' as const,\n toolCallId: tc.id,\n toolName: tc.function.name,\n args: typeof tc.function.arguments === 'string'\n ? tc.function.arguments\n : JSON.stringify(tc.function.arguments),\n }));\n }\n}\n","// 流解析器\n\nimport type { LanguageModelV1StreamPart } from '@ai-sdk/provider';\nimport type { DeepSeekStreamResponse, DeepSeekUsage } from '../types';\n\ninterface DeepSeekStreamChunk {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n delta: {\n role?: string;\n content?: string;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n };\n finish_reason?: string;\n }>;\n usage?: DeepSeekUsage;\n}\n\nexport class StreamParser {\n private hasToolCalls: boolean = false;\n\n async *parse(body: ReadableStream<Uint8Array>): AsyncIterable<LanguageModelV1StreamPart> {\n const reader = body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n let partialJson = '';\n this.hasToolCalls = false; // 重置状态\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim() === '') continue;\n if (line.startsWith(':')) continue; // SSE 注释\n\n if (line.startsWith('data: ')) {\n const data = line.slice(6).trim();\n if (data === '[DONE]') {\n yield* this.processPartialJson(partialJson);\n partialJson = '';\n return;\n }\n\n try {\n // 尝试解析 JSON\n const parsed = JSON.parse(data);\n yield* this.processPartialJson(partialJson);\n partialJson = '';\n yield* this.processChunk(parsed);\n } catch (e) {\n // JSON 解析失败,可能是部分数据\n partialJson += data;\n }\n }\n }\n }\n\n // 处理剩余的部分 JSON\n yield* this.processPartialJson(partialJson);\n } finally {\n reader.releaseLock();\n }\n }\n\n private async *processPartialJson(partialJson: string): AsyncIterable<LanguageModelV1StreamPart> {\n if (!partialJson.trim()) return;\n\n try {\n const parsed = JSON.parse(partialJson);\n yield* this.processChunk(parsed);\n } catch (e) {\n // 仍然无法解析,跳过\n console.warn('Failed to parse partial JSON:', partialJson);\n }\n }\n\n private async *processChunk(chunk: DeepSeekStreamChunk): AsyncIterable<LanguageModelV1StreamPart> {\n const delta = chunk.choices?.[0]?.delta;\n\n // 工具调用增量 - JSON in content 格式\n if (delta?.content) {\n const toolCallData = this.tryParseToolCall(delta.content);\n if (toolCallData) {\n this.hasToolCalls = true; // 标记有工具调用\n yield {\n type: 'tool-call-delta',\n toolCallType: 'function',\n toolCallId: toolCallData.id || `tool-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n toolName: toolCallData.name,\n argsTextDelta: JSON.stringify(toolCallData.arguments || {}),\n } as LanguageModelV1StreamPart;\n } else {\n // 普通文本增量\n yield {\n type: 'text-delta',\n textDelta: delta.content,\n } as LanguageModelV1StreamPart;\n }\n }\n\n // 工具调用增量 - 标准 tool_calls 格式\n if (delta?.tool_calls && delta.tool_calls.length > 0) {\n this.hasToolCalls = true; // 标记有工具调用\n for (const toolCall of delta.tool_calls) {\n yield {\n type: 'tool-call-delta',\n toolCallType: 'function',\n toolCallId: toolCall.id,\n toolName: toolCall.function?.name || '',\n argsTextDelta: toolCall.function?.arguments || '',\n } as LanguageModelV1StreamPart;\n }\n }\n\n // 完成信号\n const finishReason = chunk.choices?.[0]?.finish_reason;\n if (finishReason) {\n // V1 API: usage 在 finish 类型的 part 中\n const usage = chunk.usage\n ? {\n promptTokens: chunk.usage.prompt_tokens,\n completionTokens: chunk.usage.completion_tokens,\n }\n : { promptTokens: 0, completionTokens: 0 };\n\n yield {\n type: 'finish',\n finishReason: this.mapFinishReason(finishReason),\n usage,\n } as LanguageModelV1StreamPart;\n }\n }\n\n private mapFinishReason(reason: string): 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other' | 'unknown' {\n // 修复:如果有工具调用但 finish_reason 是 \"stop\",改为 \"tool-calls\"\n if (reason === 'stop' && this.hasToolCalls) {\n return 'tool-calls';\n }\n\n const reasonMap: Record<string, 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other' | 'unknown'> = {\n 'stop': 'stop',\n 'length': 'length',\n 'content_filter': 'content-filter',\n 'tool_calls': 'tool-calls',\n 'function_call': 'tool-calls',\n 'error': 'error',\n };\n return reasonMap[reason] || 'unknown';\n }\n\n private tryParseToolCall(content: string): { id?: string; name: string; arguments: Record<string, unknown> } | null {\n try {\n const parsed = JSON.parse(content);\n // 检查是否是工具调用格式: { name: \"...\", arguments: {...} }\n if (parsed && typeof parsed.name === 'string' && (parsed.arguments === undefined || typeof parsed.arguments === 'object')) {\n return {\n id: parsed.id,\n name: parsed.name,\n arguments: parsed.arguments || {},\n };\n }\n } catch {\n // JSON 解析失败,不是工具调用\n }\n return null;\n }\n}\n\n\n","// DeepSeek Chat 模型实现\n\nimport type {\n LanguageModelV1,\n LanguageModelV1CallOptions,\n} from '@ai-sdk/provider';\nimport type { DeepSeekChatSettings, DeepSeekResponse } from './types';\nimport { validateChatSettings } from './deepseek-chat-settings';\nimport { RequestTransformer } from './utils/request-transformer';\nimport { ResponseTransformer } from './utils/response-transformer';\nimport { StreamParser } from './utils/stream-parser';\n\nexport class DeepSeekChatLanguageModel implements LanguageModelV1 {\n readonly specificationVersion = 'v1' as const;\n readonly provider = 'deepseek' as const;\n readonly modelId: string;\n readonly settings: Required<DeepSeekChatSettings>;\n readonly defaultObjectGenerationMode: 'json' | 'tool' | undefined = undefined;\n\n private baseURL: string;\n private headers: () => Record<string, string>;\n private requestTransformer: RequestTransformer;\n private responseTransformer: ResponseTransformer;\n private streamParser: StreamParser;\n\n constructor(\n modelId: string,\n settings: DeepSeekChatSettings = {},\n config: {\n baseURL: string;\n headers: () => Record<string, string>;\n }\n ) {\n this.modelId = modelId;\n this.settings = validateChatSettings(settings);\n this.baseURL = config.baseURL;\n this.headers = config.headers;\n this.requestTransformer = new RequestTransformer();\n this.responseTransformer = new ResponseTransformer();\n this.streamParser = new StreamParser();\n }\n\n async doGenerate(options: LanguageModelV1CallOptions) {\n const requestBody = this.requestTransformer.transform(this.modelId, options);\n\n const response = await fetch(`${this.baseURL}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.headers(),\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`DeepSeek API error: ${response.status} - ${error}`);\n }\n\n const apiResponse = (await response.json()) as DeepSeekResponse;\n return this.responseTransformer.transform(apiResponse);\n }\n\n async doStream(options: LanguageModelV1CallOptions) {\n const requestBody = {\n ...this.requestTransformer.transform(this.modelId, options),\n stream: true,\n };\n\n const response = await fetch(`${this.baseURL}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'text/event-stream',\n ...this.headers(),\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`DeepSeek API error: ${response.status} - ${error}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n return {\n stream: this.streamParser.parse(response.body) as any,\n rawCall: {\n rawPrompt: requestBody as unknown,\n rawSettings: {},\n },\n warnings: [],\n };\n }\n}","// 公开导出 - 完全兼容官方 @ai-sdk/deepseek\n\n// 主要导出(与官方一致)\nexport { createDeepSeek, deepseek, createProvider } from './deepseek-provider';\n\n// 内部类型和类的导出\nexport { DeepSeekChatLanguageModel } from './deepseek-chat-language-model';\nexport { validateChatSettings } from './deepseek-chat-settings';\n\n// 工具类导出\nexport { RequestTransformer } from './utils/request-transformer';\nexport { ResponseTransformer } from './utils/response-transformer';\nexport { StreamParser } from './utils/stream-parser';\n\n// 类型导出(与官方一致)\nexport type {\n DeepSeekProviderSettings,\n DeepSeekChatSettings,\n DeepSeekMessage,\n DeepSeekToolCall,\n DeepSeekTool,\n DeepSeekRequest,\n DeepSeekChoice,\n DeepSeekUsage,\n DeepSeekResponse,\n DeepSeekStreamChoice,\n DeepSeekStreamResponse,\n} from './types';\n\n// VERSION 常量(与官方一致)\nexport const VERSION = '0.2.0';\n\n// DeepSeekProvider 类型导出\nexport type { DeepSeekProvider } from './deepseek-provider';"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/deepseek-provider.ts","../src/deepseek-chat-settings.ts","../src/utils/request-transformer.ts","../src/utils/response-transformer.ts","../src/utils/stream-parser.ts","../src/deepseek-chat-language-model.ts"],"sourcesContent":["// 公开导出 - 完全兼容官方 @ai-sdk/deepseek\n\n// 主要导出(与官方一致)\nexport { createDeepSeek, deepseek, createProvider } from './deepseek-provider';\n\n// 内部类型和类的导出\nexport { DeepSeekChatLanguageModel } from './deepseek-chat-language-model';\nexport { validateChatSettings } from './deepseek-chat-settings';\n\n// 工具类导出\nexport { RequestTransformer } from './utils/request-transformer';\nexport { ResponseTransformer } from './utils/response-transformer';\nexport { StreamParser } from './utils/stream-parser';\n\n// 类型导出(与官方一致)\nexport type {\n DeepSeekProviderSettings,\n DeepSeekChatSettings,\n DeepSeekMessage,\n DeepSeekToolCall,\n DeepSeekTool,\n DeepSeekRequest,\n DeepSeekChoice,\n DeepSeekUsage,\n DeepSeekResponse,\n DeepSeekStreamChoice,\n DeepSeekStreamResponse,\n} from './types';\n\n// VERSION 常量(与官方一致)\nexport const VERSION = '0.2.0';\n\n// DeepSeekProvider 类型导出\nexport type { DeepSeekProvider } from './deepseek-provider';","// DeepSeek Provider - 完全兼容官方 @ai-sdk/deepseek 接口\n\nimport { loadApiKey } from '@ai-sdk/provider-utils';\nimport type { DeepSeekProviderSettings, DeepSeekChatSettings } from './types';\nimport { DeepSeekChatLanguageModel } from './deepseek-chat-language-model';\n\n// Provider 接口定义(兼容官方)\nexport interface DeepSeekProvider {\n /**\n * 创建 DeepSeek 模型用于文本生成\n */\n (modelId: string, settings?: DeepSeekChatSettings): DeepSeekChatLanguageModel;\n\n /**\n * 创建 DeepSeek 模型用于文本生成\n */\n languageModel(modelId: string, settings?: DeepSeekChatSettings): DeepSeekChatLanguageModel;\n\n /**\n * 创建 DeepSeek 聊天模型用于文本生成\n */\n chat(modelId: string, settings?: DeepSeekChatSettings): DeepSeekChatLanguageModel;\n\n /**\n * 文本嵌入模型(暂不支持)\n * @deprecated\n */\n textEmbeddingModel(modelId: string): never;\n}\n\n/**\n * 创建 DeepSeek Provider\n * 完全兼容官方 @ai-sdk/deepseek 的 createDeepSeek 函数\n */\nexport async function createDeepSeek(\n options: DeepSeekProviderSettings = {}\n): Promise<DeepSeekProvider> {\n // 加载 API Key\n const apiKey = await loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'DEEPSEEK_API_KEY',\n description: 'DeepSeek API key',\n });\n\n const baseURL = options.baseURL || 'https://api.deepseek.com';\n\n // 创建 provider 函数\n const providerFunction = function(\n modelId: string,\n settings?: DeepSeekChatSettings\n ): DeepSeekChatLanguageModel {\n return new DeepSeekChatLanguageModel(\n modelId,\n settings,\n {\n baseURL,\n headers: () => ({\n Authorization: `Bearer ${apiKey}`,\n ...(options.headers || {}),\n }),\n }\n );\n } as DeepSeekProvider;\n\n // 添加方法到 provider 函数对象\n providerFunction.languageModel = providerFunction;\n providerFunction.chat = providerFunction;\n providerFunction.textEmbeddingModel = () => {\n throw new Error('Text embedding models are not supported for DeepSeek');\n };\n\n return providerFunction;\n}\n\n// 默认导出的 provider 实例(懒加载,避免在导入时立即检查 API key)\n// 使用包装函数延迟 API key 检查,直到实际使用时\nlet cachedProvider: DeepSeekProvider | null = null;\n\nexport const deepseek = function(modelId: string, settings?: DeepSeekChatSettings) {\n if (!cachedProvider) {\n // 延迟创建 provider,仅在首次使用时初始化\n cachedProvider = createDeepSeek() as unknown as DeepSeekProvider;\n }\n return cachedProvider(modelId, settings);\n} as DeepSeekProvider;\n\n// 添加方法到 provider\ndeepseek.languageModel = deepseek;\ndeepseek.chat = deepseek;\ndeepseek.textEmbeddingModel = () => {\n throw new Error('Text embedding models are not supported for DeepSeek');\n};\n\n// 为了向后兼容,保留 createProvider 作为别名\nexport const createProvider = createDeepSeek;\n","// DeepSeek Chat 模型配置\n\nimport type { DeepSeekChatSettings } from './types';\n\nexport function validateChatSettings(settings: DeepSeekChatSettings = {}): Required<DeepSeekChatSettings> {\n return {\n temperature: settings.temperature ?? 0.7,\n topP: settings.topP ?? 1.0,\n maxTokens: settings.maxTokens ?? 4096,\n presencePenalty: settings.presencePenalty ?? 0,\n frequencyPenalty: settings.frequencyPenalty ?? 0,\n };\n}","// 请求转换器\n\nimport type {\n LanguageModelV1CallOptions,\n LanguageModelV1Prompt,\n} from '@ai-sdk/provider';\nimport type { DeepSeekRequest } from '../types';\n\nexport class RequestTransformer {\n transform(modelId: string, options: LanguageModelV1CallOptions): DeepSeekRequest {\n const transformed: DeepSeekRequest = {\n model: modelId,\n messages: this.transformMessages(options.prompt),\n stream: false,\n };\n\n // 添加温度参数\n if (options.temperature !== undefined) {\n transformed.temperature = options.temperature;\n }\n\n // 添加 top_p 参数\n if (options.topP !== undefined) {\n transformed.top_p = options.topP;\n }\n\n // 添加 max_tokens 参数\n if (options.maxTokens !== undefined) {\n transformed.max_tokens = options.maxTokens;\n }\n\n // 添加 presence_penalty 参数\n if (options.presencePenalty !== undefined) {\n transformed.presence_penalty = options.presencePenalty;\n }\n\n // 添加 frequency_penalty 参数\n if (options.frequencyPenalty !== undefined) {\n transformed.frequency_penalty = options.frequencyPenalty;\n }\n\n // 添加工具配置\n const mode = options.mode;\n let toolsArray: Array<any> = [];\n let toolChoice: any;\n\n // 只有 'regular' 模式支持工具\n if (mode && mode.type === 'regular') {\n toolsArray = mode.tools ?? [];\n toolChoice = mode.toolChoice;\n }\n\n // 如果没有通过 mode 传递工具,检查直接传递的 tools 参数(向后兼容)\n if (toolsArray.length === 0 && options.tools && options.tools.length > 0) {\n toolsArray = options.tools;\n toolChoice = options.toolChoice;\n }\n\n if (toolsArray.length > 0) {\n transformed.tools = this.transformTools(toolsArray);\n transformed.tool_choice = this.transformToolChoice(toolChoice);\n }\n\n return transformed;\n }\n\n private transformMessages(messages: LanguageModelV1Prompt): Array<any> {\n return messages.map((msg) => {\n const transformed: any = {\n role: msg.role,\n };\n\n // 处理内容\n if (msg.content && Array.isArray(msg.content)) {\n const contentParts: Array<any> = [];\n let hasToolCalls = false;\n let toolCallsArray: Array<any> = [];\n\n for (const part of msg.content) {\n // 处理文本内容\n if (part.type === 'text') {\n contentParts.push({ type: 'text', text: part.text });\n }\n // 处理图像内容\n else if (part.type === 'image') {\n // V1 image part has 'image' property, convert to data for DeepSeek API\n const imageData = part.image;\n if (typeof imageData === 'string') {\n contentParts.push({ type: 'image_url', image_url: { url: imageData } });\n } else if (imageData instanceof URL) {\n contentParts.push({ type: 'image_url', image_url: { url: imageData.toString() } });\n }\n }\n // 处理工具调用 (V1 格式)\n else if (part.type === 'tool-call') {\n hasToolCalls = true;\n toolCallsArray.push({\n id: part.toolCallId,\n type: 'function',\n function: {\n name: part.toolName,\n arguments: typeof part.args === 'string' ? part.args : JSON.stringify(part.args),\n },\n });\n }\n // 处理工具结果 (V1 格式)\n else if (part.type === 'tool-result') {\n // Tool results in V1 don't get added to content directly\n // They are already part of the prompt structure\n }\n // 处理推理内容\n else if (part.type === 'reasoning' || part.type === 'redacted-reasoning') {\n // DeepSeek API doesn't support reasoning content directly\n // We'll add it as text if there's a text field\n if ('text' in part && part.text) {\n contentParts.push({ type: 'text', text: part.text });\n }\n }\n // 处理文件内容\n else if (part.type === 'file') {\n contentParts.push({\n type: 'text',\n text: `[File: ${part.filename || 'unnamed'}]`,\n });\n }\n // 其他未知类型\n else {\n contentParts.push(part);\n }\n }\n\n // 设置内容\n if (contentParts.length > 0) {\n transformed.content = contentParts;\n }\n\n // 添加工具调用\n if (hasToolCalls && toolCallsArray.length > 0) {\n transformed.tool_calls = toolCallsArray;\n }\n } else if (typeof msg.content === 'string') {\n // 系统消息等内容为字符串的情况\n transformed.content = msg.content;\n }\n\n return transformed;\n });\n }\n\n private transformTools(tools: Array<any>): Array<any> {\n return tools.map(tool => {\n // AI SDK V1 格式: { type: 'function', function: { name, description, parameters } }\n if (tool.type === 'function' && tool.function) {\n return {\n type: 'function',\n function: {\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters,\n },\n };\n }\n\n // 备用格式(向后兼容)\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n };\n });\n }\n\n private transformToolChoice(toolChoice: any): any {\n // undefined 或 auto -> 'auto'\n if (toolChoice === undefined || toolChoice === 'auto') {\n return 'auto';\n }\n\n // none -> 'none'\n if (toolChoice === 'none') {\n return 'none';\n }\n\n // required -> 'required' (强制调用至少一个工具)\n if (toolChoice === 'required' || (typeof toolChoice === 'object' && toolChoice.type === 'required')) {\n return 'required';\n }\n\n // 特定工具: { type: 'tool', toolName: 'function_name' }\n if (typeof toolChoice === 'object' && toolChoice.type === 'tool') {\n // DeepSeek API 可能支持的格式\n return {\n type: 'function',\n function: {\n name: toolChoice.toolName,\n },\n };\n }\n\n // 默认: auto\n return 'auto';\n }\n}","// 响应转换器 - 新 AI SDK 格式\n\nimport type {\n LanguageModelV1FinishReason,\n LanguageModelV1CallWarning,\n LanguageModelV1FunctionToolCall,\n LanguageModelV1ContentPart,\n} from '@ai-sdk/provider';\nimport type { DeepSeekResponse } from '../types';\n\n// 新 AI SDK 返回结果类型\nexport interface V1GenerateResult {\n content: LanguageModelV1ContentPart[];\n finishReason: LanguageModelV1FinishReason;\n usage: {\n promptTokens: number;\n completionTokens: number;\n };\n rawCall: {\n rawPrompt: unknown;\n rawSettings: Record<string, unknown>;\n };\n warnings?: LanguageModelV1CallWarning[];\n // 兼容旧格式的字段\n text?: string;\n toolCalls?: LanguageModelV1FunctionToolCall[];\n reasoning?: string;\n}\n\nexport class ResponseTransformer {\n transform(apiResponse: DeepSeekResponse): V1GenerateResult {\n const choice = apiResponse.choices?.[0];\n const message = choice?.message || {};\n\n // 修复 finish_reason\n const finishReason = this.fixFinishReason(\n choice?.finish_reason,\n message.tool_calls\n );\n\n // 转换工具调用\n const toolCalls = this.transformToolCalls(message.tool_calls);\n\n // 构建内容数组\n const content: LanguageModelV1ContentPart[] = [];\n\n // 添加文本内容\n if (message.content) {\n content.push({\n type: 'text',\n text: message.content,\n });\n }\n\n // 添加工具调用\n if (toolCalls.length > 0) {\n content.push(...toolCalls);\n }\n\n return {\n content,\n text: message.content || '', // 兼容旧格式\n finishReason: finishReason as LanguageModelV1FinishReason,\n usage: {\n promptTokens: apiResponse.usage?.prompt_tokens || 0,\n completionTokens: apiResponse.usage?.completion_tokens || 0,\n },\n rawCall: {\n rawPrompt: '',\n rawSettings: {},\n },\n toolCalls, // 兼容旧格式\n warnings: [],\n };\n }\n\n private fixFinishReason(\n originalFinishReason: string | undefined,\n toolCalls: any[] | undefined\n ): string {\n // 如果有 tool_calls 但 finish_reason 是 \"stop\",修复为 \"tool-calls\"\n if (toolCalls && toolCalls.length > 0 && originalFinishReason === 'stop') {\n return 'tool-calls';\n }\n\n // 映射其他 finish_reason 值\n const finishReasonMap: Record<string, string> = {\n 'stop': 'stop',\n 'length': 'length',\n 'content_filter': 'content-filter',\n 'tool_calls': 'tool-calls',\n 'function_call': 'tool-calls',\n };\n\n return finishReasonMap[originalFinishReason || ''] || 'stop';\n }\n\n private transformToolCalls(toolCalls: any[] | undefined): LanguageModelV1FunctionToolCall[] {\n if (!toolCalls || toolCalls.length === 0) {\n return [];\n }\n\n return toolCalls.map((tc: any) => ({\n type: 'tool-call' as const,\n toolCallType: 'function' as const,\n toolCallId: tc.id,\n toolName: tc.function.name,\n args: typeof tc.function.arguments === 'string'\n ? tc.function.arguments\n : JSON.stringify(tc.function.arguments),\n }));\n }\n}\n","// 流解析器\n\nimport type { LanguageModelV1StreamPart } from '@ai-sdk/provider';\nimport type { DeepSeekStreamResponse, DeepSeekUsage } from '../types';\n\ninterface DeepSeekStreamChunk {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n delta: {\n role?: string;\n content?: string;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n };\n finish_reason?: string;\n }>;\n usage?: DeepSeekUsage;\n}\n\nexport class StreamParser {\n private hasToolCalls: boolean = false;\n\n async *parse(body: ReadableStream<Uint8Array>): AsyncIterable<LanguageModelV1StreamPart> {\n const reader = body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n let partialJson = '';\n this.hasToolCalls = false; // 重置状态\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim() === '') continue;\n if (line.startsWith(':')) continue; // SSE 注释\n\n if (line.startsWith('data: ')) {\n const data = line.slice(6).trim();\n if (data === '[DONE]') {\n yield* this.processPartialJson(partialJson);\n partialJson = '';\n return;\n }\n\n try {\n // 尝试解析 JSON\n const parsed = JSON.parse(data);\n yield* this.processPartialJson(partialJson);\n partialJson = '';\n yield* this.processChunk(parsed);\n } catch (e) {\n // JSON 解析失败,可能是部分数据\n partialJson += data;\n }\n }\n }\n }\n\n // 处理剩余的部分 JSON\n yield* this.processPartialJson(partialJson);\n } finally {\n reader.releaseLock();\n }\n }\n\n private async *processPartialJson(partialJson: string): AsyncIterable<LanguageModelV1StreamPart> {\n if (!partialJson.trim()) return;\n\n try {\n const parsed = JSON.parse(partialJson);\n yield* this.processChunk(parsed);\n } catch (e) {\n // 仍然无法解析,跳过\n console.warn('Failed to parse partial JSON:', partialJson);\n }\n }\n\n private async *processChunk(chunk: DeepSeekStreamChunk): AsyncIterable<LanguageModelV1StreamPart> {\n const delta = chunk.choices?.[0]?.delta;\n\n // 工具调用增量 - JSON in content 格式\n if (delta?.content) {\n const toolCallData = this.tryParseToolCall(delta.content);\n if (toolCallData) {\n this.hasToolCalls = true; // 标记有工具调用\n yield {\n type: 'tool-call-delta',\n toolCallType: 'function',\n toolCallId: toolCallData.id || `tool-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n toolName: toolCallData.name,\n argsTextDelta: JSON.stringify(toolCallData.arguments || {}),\n } as LanguageModelV1StreamPart;\n } else {\n // 普通文本增量\n yield {\n type: 'text-delta',\n textDelta: delta.content,\n } as LanguageModelV1StreamPart;\n }\n }\n\n // 工具调用增量 - 标准 tool_calls 格式\n if (delta?.tool_calls && delta.tool_calls.length > 0) {\n this.hasToolCalls = true; // 标记有工具调用\n for (const toolCall of delta.tool_calls) {\n yield {\n type: 'tool-call-delta',\n toolCallType: 'function',\n toolCallId: toolCall.id,\n toolName: toolCall.function?.name || '',\n argsTextDelta: toolCall.function?.arguments || '',\n } as LanguageModelV1StreamPart;\n }\n }\n\n // 完成信号\n const finishReason = chunk.choices?.[0]?.finish_reason;\n if (finishReason) {\n // V1 API: usage 在 finish 类型的 part 中\n const usage = chunk.usage\n ? {\n promptTokens: chunk.usage.prompt_tokens,\n completionTokens: chunk.usage.completion_tokens,\n }\n : { promptTokens: 0, completionTokens: 0 };\n\n yield {\n type: 'finish',\n finishReason: this.mapFinishReason(finishReason),\n usage,\n } as LanguageModelV1StreamPart;\n }\n }\n\n private mapFinishReason(reason: string): 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other' | 'unknown' {\n // 修复:如果有工具调用但 finish_reason 是 \"stop\",改为 \"tool-calls\"\n if (reason === 'stop' && this.hasToolCalls) {\n return 'tool-calls';\n }\n\n const reasonMap: Record<string, 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other' | 'unknown'> = {\n 'stop': 'stop',\n 'length': 'length',\n 'content_filter': 'content-filter',\n 'tool_calls': 'tool-calls',\n 'function_call': 'tool-calls',\n 'error': 'error',\n };\n return reasonMap[reason] || 'unknown';\n }\n\n private tryParseToolCall(content: string): { id?: string; name: string; arguments: Record<string, unknown> } | null {\n try {\n const parsed = JSON.parse(content);\n // 检查是否是工具调用格式: { name: \"...\", arguments: {...} }\n if (parsed && typeof parsed.name === 'string' && (parsed.arguments === undefined || typeof parsed.arguments === 'object')) {\n return {\n id: parsed.id,\n name: parsed.name,\n arguments: parsed.arguments || {},\n };\n }\n } catch {\n // JSON 解析失败,不是工具调用\n }\n return null;\n }\n}\n\n\n","// DeepSeek Chat 模型实现\n\nimport type {\n LanguageModelV1,\n LanguageModelV1CallOptions,\n} from '@ai-sdk/provider';\nimport type { DeepSeekChatSettings, DeepSeekResponse } from './types';\nimport { validateChatSettings } from './deepseek-chat-settings';\nimport { RequestTransformer } from './utils/request-transformer';\nimport { ResponseTransformer } from './utils/response-transformer';\nimport { StreamParser } from './utils/stream-parser';\n\nexport class DeepSeekChatLanguageModel implements LanguageModelV1 {\n readonly specificationVersion = 'v1' as const;\n readonly provider = 'deepseek' as const;\n readonly modelId: string;\n readonly settings: Required<DeepSeekChatSettings>;\n readonly defaultObjectGenerationMode: 'json' | 'tool' | undefined = undefined;\n\n private baseURL: string;\n private headers: () => Record<string, string>;\n private requestTransformer: RequestTransformer;\n private responseTransformer: ResponseTransformer;\n private streamParser: StreamParser;\n\n constructor(\n modelId: string,\n settings: DeepSeekChatSettings = {},\n config: {\n baseURL: string;\n headers: () => Record<string, string>;\n }\n ) {\n this.modelId = modelId;\n this.settings = validateChatSettings(settings);\n this.baseURL = config.baseURL;\n this.headers = config.headers;\n this.requestTransformer = new RequestTransformer();\n this.responseTransformer = new ResponseTransformer();\n this.streamParser = new StreamParser();\n }\n\n async doGenerate(options: LanguageModelV1CallOptions) {\n const requestBody = this.requestTransformer.transform(this.modelId, options);\n\n const response = await fetch(`${this.baseURL}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.headers(),\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`DeepSeek API error: ${response.status} - ${error}`);\n }\n\n const apiResponse = (await response.json()) as DeepSeekResponse;\n return this.responseTransformer.transform(apiResponse);\n }\n\n async doStream(options: LanguageModelV1CallOptions) {\n const requestBody = {\n ...this.requestTransformer.transform(this.modelId, options),\n stream: true,\n };\n\n const response = await fetch(`${this.baseURL}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'text/event-stream',\n ...this.headers(),\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`DeepSeek API error: ${response.status} - ${error}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n return {\n stream: this.streamParser.parse(response.body) as any,\n rawCall: {\n rawPrompt: requestBody as unknown,\n rawSettings: {},\n },\n warnings: [],\n };\n }\n}"],"mappings":"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","names":[]}
package/dist/index.mjs ADDED
@@ -0,0 +1,470 @@
1
+ // src/deepseek-provider.ts
2
+ import { loadApiKey } from "@ai-sdk/provider-utils";
3
+
4
+ // src/deepseek-chat-settings.ts
5
+ function validateChatSettings(settings = {}) {
6
+ return {
7
+ temperature: settings.temperature ?? 0.7,
8
+ topP: settings.topP ?? 1,
9
+ maxTokens: settings.maxTokens ?? 4096,
10
+ presencePenalty: settings.presencePenalty ?? 0,
11
+ frequencyPenalty: settings.frequencyPenalty ?? 0
12
+ };
13
+ }
14
+
15
+ // src/utils/request-transformer.ts
16
+ var RequestTransformer = class {
17
+ transform(modelId, options) {
18
+ const transformed = {
19
+ model: modelId,
20
+ messages: this.transformMessages(options.prompt),
21
+ stream: false
22
+ };
23
+ if (options.temperature !== void 0) {
24
+ transformed.temperature = options.temperature;
25
+ }
26
+ if (options.topP !== void 0) {
27
+ transformed.top_p = options.topP;
28
+ }
29
+ if (options.maxTokens !== void 0) {
30
+ transformed.max_tokens = options.maxTokens;
31
+ }
32
+ if (options.presencePenalty !== void 0) {
33
+ transformed.presence_penalty = options.presencePenalty;
34
+ }
35
+ if (options.frequencyPenalty !== void 0) {
36
+ transformed.frequency_penalty = options.frequencyPenalty;
37
+ }
38
+ const mode = options.mode;
39
+ let toolsArray = [];
40
+ let toolChoice;
41
+ if (mode && mode.type === "regular") {
42
+ toolsArray = mode.tools ?? [];
43
+ toolChoice = mode.toolChoice;
44
+ }
45
+ if (toolsArray.length === 0 && options.tools && options.tools.length > 0) {
46
+ toolsArray = options.tools;
47
+ toolChoice = options.toolChoice;
48
+ }
49
+ if (toolsArray.length > 0) {
50
+ transformed.tools = this.transformTools(toolsArray);
51
+ transformed.tool_choice = this.transformToolChoice(toolChoice);
52
+ }
53
+ return transformed;
54
+ }
55
+ transformMessages(messages) {
56
+ return messages.map((msg) => {
57
+ const transformed = {
58
+ role: msg.role
59
+ };
60
+ if (msg.content && Array.isArray(msg.content)) {
61
+ const contentParts = [];
62
+ let hasToolCalls = false;
63
+ let toolCallsArray = [];
64
+ for (const part of msg.content) {
65
+ if (part.type === "text") {
66
+ contentParts.push({ type: "text", text: part.text });
67
+ } else if (part.type === "image") {
68
+ const imageData = part.image;
69
+ if (typeof imageData === "string") {
70
+ contentParts.push({ type: "image_url", image_url: { url: imageData } });
71
+ } else if (imageData instanceof URL) {
72
+ contentParts.push({ type: "image_url", image_url: { url: imageData.toString() } });
73
+ }
74
+ } else if (part.type === "tool-call") {
75
+ hasToolCalls = true;
76
+ toolCallsArray.push({
77
+ id: part.toolCallId,
78
+ type: "function",
79
+ function: {
80
+ name: part.toolName,
81
+ arguments: typeof part.args === "string" ? part.args : JSON.stringify(part.args)
82
+ }
83
+ });
84
+ } else if (part.type === "tool-result") {
85
+ } else if (part.type === "reasoning" || part.type === "redacted-reasoning") {
86
+ if ("text" in part && part.text) {
87
+ contentParts.push({ type: "text", text: part.text });
88
+ }
89
+ } else if (part.type === "file") {
90
+ contentParts.push({
91
+ type: "text",
92
+ text: `[File: ${part.filename || "unnamed"}]`
93
+ });
94
+ } else {
95
+ contentParts.push(part);
96
+ }
97
+ }
98
+ if (contentParts.length > 0) {
99
+ transformed.content = contentParts;
100
+ }
101
+ if (hasToolCalls && toolCallsArray.length > 0) {
102
+ transformed.tool_calls = toolCallsArray;
103
+ }
104
+ } else if (typeof msg.content === "string") {
105
+ transformed.content = msg.content;
106
+ }
107
+ return transformed;
108
+ });
109
+ }
110
+ transformTools(tools) {
111
+ return tools.map((tool) => {
112
+ if (tool.type === "function" && tool.function) {
113
+ return {
114
+ type: "function",
115
+ function: {
116
+ name: tool.function.name,
117
+ description: tool.function.description,
118
+ parameters: tool.function.parameters
119
+ }
120
+ };
121
+ }
122
+ return {
123
+ type: "function",
124
+ function: {
125
+ name: tool.name,
126
+ description: tool.description,
127
+ parameters: tool.parameters
128
+ }
129
+ };
130
+ });
131
+ }
132
+ transformToolChoice(toolChoice) {
133
+ if (toolChoice === void 0 || toolChoice === "auto") {
134
+ return "auto";
135
+ }
136
+ if (toolChoice === "none") {
137
+ return "none";
138
+ }
139
+ if (toolChoice === "required" || typeof toolChoice === "object" && toolChoice.type === "required") {
140
+ return "required";
141
+ }
142
+ if (typeof toolChoice === "object" && toolChoice.type === "tool") {
143
+ return {
144
+ type: "function",
145
+ function: {
146
+ name: toolChoice.toolName
147
+ }
148
+ };
149
+ }
150
+ return "auto";
151
+ }
152
+ };
153
+
154
+ // src/utils/response-transformer.ts
155
+ var ResponseTransformer = class {
156
+ transform(apiResponse) {
157
+ const choice = apiResponse.choices?.[0];
158
+ const message = choice?.message || {};
159
+ const finishReason = this.fixFinishReason(
160
+ choice?.finish_reason,
161
+ message.tool_calls
162
+ );
163
+ const toolCalls = this.transformToolCalls(message.tool_calls);
164
+ const content = [];
165
+ if (message.content) {
166
+ content.push({
167
+ type: "text",
168
+ text: message.content
169
+ });
170
+ }
171
+ if (toolCalls.length > 0) {
172
+ content.push(...toolCalls);
173
+ }
174
+ return {
175
+ content,
176
+ text: message.content || "",
177
+ // 兼容旧格式
178
+ finishReason,
179
+ usage: {
180
+ promptTokens: apiResponse.usage?.prompt_tokens || 0,
181
+ completionTokens: apiResponse.usage?.completion_tokens || 0
182
+ },
183
+ rawCall: {
184
+ rawPrompt: "",
185
+ rawSettings: {}
186
+ },
187
+ toolCalls,
188
+ // 兼容旧格式
189
+ warnings: []
190
+ };
191
+ }
192
+ fixFinishReason(originalFinishReason, toolCalls) {
193
+ if (toolCalls && toolCalls.length > 0 && originalFinishReason === "stop") {
194
+ return "tool-calls";
195
+ }
196
+ const finishReasonMap = {
197
+ "stop": "stop",
198
+ "length": "length",
199
+ "content_filter": "content-filter",
200
+ "tool_calls": "tool-calls",
201
+ "function_call": "tool-calls"
202
+ };
203
+ return finishReasonMap[originalFinishReason || ""] || "stop";
204
+ }
205
+ transformToolCalls(toolCalls) {
206
+ if (!toolCalls || toolCalls.length === 0) {
207
+ return [];
208
+ }
209
+ return toolCalls.map((tc) => ({
210
+ type: "tool-call",
211
+ toolCallType: "function",
212
+ toolCallId: tc.id,
213
+ toolName: tc.function.name,
214
+ args: typeof tc.function.arguments === "string" ? tc.function.arguments : JSON.stringify(tc.function.arguments)
215
+ }));
216
+ }
217
+ };
218
+
219
+ // src/utils/stream-parser.ts
220
+ var StreamParser = class {
221
+ hasToolCalls = false;
222
+ async *parse(body) {
223
+ const reader = body.getReader();
224
+ const decoder = new TextDecoder("utf-8");
225
+ let buffer = "";
226
+ let partialJson = "";
227
+ this.hasToolCalls = false;
228
+ try {
229
+ while (true) {
230
+ const { done, value } = await reader.read();
231
+ if (done) break;
232
+ buffer += decoder.decode(value, { stream: true });
233
+ const lines = buffer.split("\n");
234
+ buffer = lines.pop() || "";
235
+ for (const line of lines) {
236
+ if (line.trim() === "") continue;
237
+ if (line.startsWith(":")) continue;
238
+ if (line.startsWith("data: ")) {
239
+ const data = line.slice(6).trim();
240
+ if (data === "[DONE]") {
241
+ yield* this.processPartialJson(partialJson);
242
+ partialJson = "";
243
+ return;
244
+ }
245
+ try {
246
+ const parsed = JSON.parse(data);
247
+ yield* this.processPartialJson(partialJson);
248
+ partialJson = "";
249
+ yield* this.processChunk(parsed);
250
+ } catch (e) {
251
+ partialJson += data;
252
+ }
253
+ }
254
+ }
255
+ }
256
+ yield* this.processPartialJson(partialJson);
257
+ } finally {
258
+ reader.releaseLock();
259
+ }
260
+ }
261
+ async *processPartialJson(partialJson) {
262
+ if (!partialJson.trim()) return;
263
+ try {
264
+ const parsed = JSON.parse(partialJson);
265
+ yield* this.processChunk(parsed);
266
+ } catch (e) {
267
+ console.warn("Failed to parse partial JSON:", partialJson);
268
+ }
269
+ }
270
+ async *processChunk(chunk) {
271
+ const delta = chunk.choices?.[0]?.delta;
272
+ if (delta?.content) {
273
+ const toolCallData = this.tryParseToolCall(delta.content);
274
+ if (toolCallData) {
275
+ this.hasToolCalls = true;
276
+ yield {
277
+ type: "tool-call-delta",
278
+ toolCallType: "function",
279
+ toolCallId: toolCallData.id || `tool-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
280
+ toolName: toolCallData.name,
281
+ argsTextDelta: JSON.stringify(toolCallData.arguments || {})
282
+ };
283
+ } else {
284
+ yield {
285
+ type: "text-delta",
286
+ textDelta: delta.content
287
+ };
288
+ }
289
+ }
290
+ if (delta?.tool_calls && delta.tool_calls.length > 0) {
291
+ this.hasToolCalls = true;
292
+ for (const toolCall of delta.tool_calls) {
293
+ yield {
294
+ type: "tool-call-delta",
295
+ toolCallType: "function",
296
+ toolCallId: toolCall.id,
297
+ toolName: toolCall.function?.name || "",
298
+ argsTextDelta: toolCall.function?.arguments || ""
299
+ };
300
+ }
301
+ }
302
+ const finishReason = chunk.choices?.[0]?.finish_reason;
303
+ if (finishReason) {
304
+ const usage = chunk.usage ? {
305
+ promptTokens: chunk.usage.prompt_tokens,
306
+ completionTokens: chunk.usage.completion_tokens
307
+ } : { promptTokens: 0, completionTokens: 0 };
308
+ yield {
309
+ type: "finish",
310
+ finishReason: this.mapFinishReason(finishReason),
311
+ usage
312
+ };
313
+ }
314
+ }
315
+ mapFinishReason(reason) {
316
+ if (reason === "stop" && this.hasToolCalls) {
317
+ return "tool-calls";
318
+ }
319
+ const reasonMap = {
320
+ "stop": "stop",
321
+ "length": "length",
322
+ "content_filter": "content-filter",
323
+ "tool_calls": "tool-calls",
324
+ "function_call": "tool-calls",
325
+ "error": "error"
326
+ };
327
+ return reasonMap[reason] || "unknown";
328
+ }
329
+ tryParseToolCall(content) {
330
+ try {
331
+ const parsed = JSON.parse(content);
332
+ if (parsed && typeof parsed.name === "string" && (parsed.arguments === void 0 || typeof parsed.arguments === "object")) {
333
+ return {
334
+ id: parsed.id,
335
+ name: parsed.name,
336
+ arguments: parsed.arguments || {}
337
+ };
338
+ }
339
+ } catch {
340
+ }
341
+ return null;
342
+ }
343
+ };
344
+
345
+ // src/deepseek-chat-language-model.ts
346
+ var DeepSeekChatLanguageModel = class {
347
+ specificationVersion = "v1";
348
+ provider = "deepseek";
349
+ modelId;
350
+ settings;
351
+ defaultObjectGenerationMode = void 0;
352
+ baseURL;
353
+ headers;
354
+ requestTransformer;
355
+ responseTransformer;
356
+ streamParser;
357
+ constructor(modelId, settings = {}, config) {
358
+ this.modelId = modelId;
359
+ this.settings = validateChatSettings(settings);
360
+ this.baseURL = config.baseURL;
361
+ this.headers = config.headers;
362
+ this.requestTransformer = new RequestTransformer();
363
+ this.responseTransformer = new ResponseTransformer();
364
+ this.streamParser = new StreamParser();
365
+ }
366
+ async doGenerate(options) {
367
+ const requestBody = this.requestTransformer.transform(this.modelId, options);
368
+ const response = await fetch(`${this.baseURL}/chat/completions`, {
369
+ method: "POST",
370
+ headers: {
371
+ "Content-Type": "application/json",
372
+ ...this.headers()
373
+ },
374
+ body: JSON.stringify(requestBody)
375
+ });
376
+ if (!response.ok) {
377
+ const error = await response.text();
378
+ throw new Error(`DeepSeek API error: ${response.status} - ${error}`);
379
+ }
380
+ const apiResponse = await response.json();
381
+ return this.responseTransformer.transform(apiResponse);
382
+ }
383
+ async doStream(options) {
384
+ const requestBody = {
385
+ ...this.requestTransformer.transform(this.modelId, options),
386
+ stream: true
387
+ };
388
+ const response = await fetch(`${this.baseURL}/chat/completions`, {
389
+ method: "POST",
390
+ headers: {
391
+ "Content-Type": "application/json",
392
+ "Accept": "text/event-stream",
393
+ ...this.headers()
394
+ },
395
+ body: JSON.stringify(requestBody)
396
+ });
397
+ if (!response.ok) {
398
+ const error = await response.text();
399
+ throw new Error(`DeepSeek API error: ${response.status} - ${error}`);
400
+ }
401
+ if (!response.body) {
402
+ throw new Error("Response body is null");
403
+ }
404
+ return {
405
+ stream: this.streamParser.parse(response.body),
406
+ rawCall: {
407
+ rawPrompt: requestBody,
408
+ rawSettings: {}
409
+ },
410
+ warnings: []
411
+ };
412
+ }
413
+ };
414
+
415
+ // src/deepseek-provider.ts
416
+ async function createDeepSeek(options = {}) {
417
+ const apiKey = await loadApiKey({
418
+ apiKey: options.apiKey,
419
+ environmentVariableName: "DEEPSEEK_API_KEY",
420
+ description: "DeepSeek API key"
421
+ });
422
+ const baseURL = options.baseURL || "https://api.deepseek.com";
423
+ const providerFunction = function(modelId, settings) {
424
+ return new DeepSeekChatLanguageModel(
425
+ modelId,
426
+ settings,
427
+ {
428
+ baseURL,
429
+ headers: () => ({
430
+ Authorization: `Bearer ${apiKey}`,
431
+ ...options.headers || {}
432
+ })
433
+ }
434
+ );
435
+ };
436
+ providerFunction.languageModel = providerFunction;
437
+ providerFunction.chat = providerFunction;
438
+ providerFunction.textEmbeddingModel = () => {
439
+ throw new Error("Text embedding models are not supported for DeepSeek");
440
+ };
441
+ return providerFunction;
442
+ }
443
+ var cachedProvider = null;
444
+ var deepseek = function(modelId, settings) {
445
+ if (!cachedProvider) {
446
+ cachedProvider = createDeepSeek();
447
+ }
448
+ return cachedProvider(modelId, settings);
449
+ };
450
+ deepseek.languageModel = deepseek;
451
+ deepseek.chat = deepseek;
452
+ deepseek.textEmbeddingModel = () => {
453
+ throw new Error("Text embedding models are not supported for DeepSeek");
454
+ };
455
+ var createProvider = createDeepSeek;
456
+
457
+ // src/index.ts
458
+ var VERSION = "0.2.0";
459
+ export {
460
+ DeepSeekChatLanguageModel,
461
+ RequestTransformer,
462
+ ResponseTransformer,
463
+ StreamParser,
464
+ VERSION,
465
+ createDeepSeek,
466
+ createProvider,
467
+ deepseek,
468
+ validateChatSettings
469
+ };
470
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/deepseek-provider.ts","../src/deepseek-chat-settings.ts","../src/utils/request-transformer.ts","../src/utils/response-transformer.ts","../src/utils/stream-parser.ts","../src/deepseek-chat-language-model.ts","../src/index.ts"],"sourcesContent":["// DeepSeek Provider - 完全兼容官方 @ai-sdk/deepseek 接口\n\nimport { loadApiKey } from '@ai-sdk/provider-utils';\nimport type { DeepSeekProviderSettings, DeepSeekChatSettings } from './types';\nimport { DeepSeekChatLanguageModel } from './deepseek-chat-language-model';\n\n// Provider 接口定义(兼容官方)\nexport interface DeepSeekProvider {\n /**\n * 创建 DeepSeek 模型用于文本生成\n */\n (modelId: string, settings?: DeepSeekChatSettings): DeepSeekChatLanguageModel;\n\n /**\n * 创建 DeepSeek 模型用于文本生成\n */\n languageModel(modelId: string, settings?: DeepSeekChatSettings): DeepSeekChatLanguageModel;\n\n /**\n * 创建 DeepSeek 聊天模型用于文本生成\n */\n chat(modelId: string, settings?: DeepSeekChatSettings): DeepSeekChatLanguageModel;\n\n /**\n * 文本嵌入模型(暂不支持)\n * @deprecated\n */\n textEmbeddingModel(modelId: string): never;\n}\n\n/**\n * 创建 DeepSeek Provider\n * 完全兼容官方 @ai-sdk/deepseek 的 createDeepSeek 函数\n */\nexport async function createDeepSeek(\n options: DeepSeekProviderSettings = {}\n): Promise<DeepSeekProvider> {\n // 加载 API Key\n const apiKey = await loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'DEEPSEEK_API_KEY',\n description: 'DeepSeek API key',\n });\n\n const baseURL = options.baseURL || 'https://api.deepseek.com';\n\n // 创建 provider 函数\n const providerFunction = function(\n modelId: string,\n settings?: DeepSeekChatSettings\n ): DeepSeekChatLanguageModel {\n return new DeepSeekChatLanguageModel(\n modelId,\n settings,\n {\n baseURL,\n headers: () => ({\n Authorization: `Bearer ${apiKey}`,\n ...(options.headers || {}),\n }),\n }\n );\n } as DeepSeekProvider;\n\n // 添加方法到 provider 函数对象\n providerFunction.languageModel = providerFunction;\n providerFunction.chat = providerFunction;\n providerFunction.textEmbeddingModel = () => {\n throw new Error('Text embedding models are not supported for DeepSeek');\n };\n\n return providerFunction;\n}\n\n// 默认导出的 provider 实例(懒加载,避免在导入时立即检查 API key)\n// 使用包装函数延迟 API key 检查,直到实际使用时\nlet cachedProvider: DeepSeekProvider | null = null;\n\nexport const deepseek = function(modelId: string, settings?: DeepSeekChatSettings) {\n if (!cachedProvider) {\n // 延迟创建 provider,仅在首次使用时初始化\n cachedProvider = createDeepSeek() as unknown as DeepSeekProvider;\n }\n return cachedProvider(modelId, settings);\n} as DeepSeekProvider;\n\n// 添加方法到 provider\ndeepseek.languageModel = deepseek;\ndeepseek.chat = deepseek;\ndeepseek.textEmbeddingModel = () => {\n throw new Error('Text embedding models are not supported for DeepSeek');\n};\n\n// 为了向后兼容,保留 createProvider 作为别名\nexport const createProvider = createDeepSeek;\n","// DeepSeek Chat 模型配置\n\nimport type { DeepSeekChatSettings } from './types';\n\nexport function validateChatSettings(settings: DeepSeekChatSettings = {}): Required<DeepSeekChatSettings> {\n return {\n temperature: settings.temperature ?? 0.7,\n topP: settings.topP ?? 1.0,\n maxTokens: settings.maxTokens ?? 4096,\n presencePenalty: settings.presencePenalty ?? 0,\n frequencyPenalty: settings.frequencyPenalty ?? 0,\n };\n}","// 请求转换器\n\nimport type {\n LanguageModelV1CallOptions,\n LanguageModelV1Prompt,\n} from '@ai-sdk/provider';\nimport type { DeepSeekRequest } from '../types';\n\nexport class RequestTransformer {\n transform(modelId: string, options: LanguageModelV1CallOptions): DeepSeekRequest {\n const transformed: DeepSeekRequest = {\n model: modelId,\n messages: this.transformMessages(options.prompt),\n stream: false,\n };\n\n // 添加温度参数\n if (options.temperature !== undefined) {\n transformed.temperature = options.temperature;\n }\n\n // 添加 top_p 参数\n if (options.topP !== undefined) {\n transformed.top_p = options.topP;\n }\n\n // 添加 max_tokens 参数\n if (options.maxTokens !== undefined) {\n transformed.max_tokens = options.maxTokens;\n }\n\n // 添加 presence_penalty 参数\n if (options.presencePenalty !== undefined) {\n transformed.presence_penalty = options.presencePenalty;\n }\n\n // 添加 frequency_penalty 参数\n if (options.frequencyPenalty !== undefined) {\n transformed.frequency_penalty = options.frequencyPenalty;\n }\n\n // 添加工具配置\n const mode = options.mode;\n let toolsArray: Array<any> = [];\n let toolChoice: any;\n\n // 只有 'regular' 模式支持工具\n if (mode && mode.type === 'regular') {\n toolsArray = mode.tools ?? [];\n toolChoice = mode.toolChoice;\n }\n\n // 如果没有通过 mode 传递工具,检查直接传递的 tools 参数(向后兼容)\n if (toolsArray.length === 0 && options.tools && options.tools.length > 0) {\n toolsArray = options.tools;\n toolChoice = options.toolChoice;\n }\n\n if (toolsArray.length > 0) {\n transformed.tools = this.transformTools(toolsArray);\n transformed.tool_choice = this.transformToolChoice(toolChoice);\n }\n\n return transformed;\n }\n\n private transformMessages(messages: LanguageModelV1Prompt): Array<any> {\n return messages.map((msg) => {\n const transformed: any = {\n role: msg.role,\n };\n\n // 处理内容\n if (msg.content && Array.isArray(msg.content)) {\n const contentParts: Array<any> = [];\n let hasToolCalls = false;\n let toolCallsArray: Array<any> = [];\n\n for (const part of msg.content) {\n // 处理文本内容\n if (part.type === 'text') {\n contentParts.push({ type: 'text', text: part.text });\n }\n // 处理图像内容\n else if (part.type === 'image') {\n // V1 image part has 'image' property, convert to data for DeepSeek API\n const imageData = part.image;\n if (typeof imageData === 'string') {\n contentParts.push({ type: 'image_url', image_url: { url: imageData } });\n } else if (imageData instanceof URL) {\n contentParts.push({ type: 'image_url', image_url: { url: imageData.toString() } });\n }\n }\n // 处理工具调用 (V1 格式)\n else if (part.type === 'tool-call') {\n hasToolCalls = true;\n toolCallsArray.push({\n id: part.toolCallId,\n type: 'function',\n function: {\n name: part.toolName,\n arguments: typeof part.args === 'string' ? part.args : JSON.stringify(part.args),\n },\n });\n }\n // 处理工具结果 (V1 格式)\n else if (part.type === 'tool-result') {\n // Tool results in V1 don't get added to content directly\n // They are already part of the prompt structure\n }\n // 处理推理内容\n else if (part.type === 'reasoning' || part.type === 'redacted-reasoning') {\n // DeepSeek API doesn't support reasoning content directly\n // We'll add it as text if there's a text field\n if ('text' in part && part.text) {\n contentParts.push({ type: 'text', text: part.text });\n }\n }\n // 处理文件内容\n else if (part.type === 'file') {\n contentParts.push({\n type: 'text',\n text: `[File: ${part.filename || 'unnamed'}]`,\n });\n }\n // 其他未知类型\n else {\n contentParts.push(part);\n }\n }\n\n // 设置内容\n if (contentParts.length > 0) {\n transformed.content = contentParts;\n }\n\n // 添加工具调用\n if (hasToolCalls && toolCallsArray.length > 0) {\n transformed.tool_calls = toolCallsArray;\n }\n } else if (typeof msg.content === 'string') {\n // 系统消息等内容为字符串的情况\n transformed.content = msg.content;\n }\n\n return transformed;\n });\n }\n\n private transformTools(tools: Array<any>): Array<any> {\n return tools.map(tool => {\n // AI SDK V1 格式: { type: 'function', function: { name, description, parameters } }\n if (tool.type === 'function' && tool.function) {\n return {\n type: 'function',\n function: {\n name: tool.function.name,\n description: tool.function.description,\n parameters: tool.function.parameters,\n },\n };\n }\n\n // 备用格式(向后兼容)\n return {\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n };\n });\n }\n\n private transformToolChoice(toolChoice: any): any {\n // undefined 或 auto -> 'auto'\n if (toolChoice === undefined || toolChoice === 'auto') {\n return 'auto';\n }\n\n // none -> 'none'\n if (toolChoice === 'none') {\n return 'none';\n }\n\n // required -> 'required' (强制调用至少一个工具)\n if (toolChoice === 'required' || (typeof toolChoice === 'object' && toolChoice.type === 'required')) {\n return 'required';\n }\n\n // 特定工具: { type: 'tool', toolName: 'function_name' }\n if (typeof toolChoice === 'object' && toolChoice.type === 'tool') {\n // DeepSeek API 可能支持的格式\n return {\n type: 'function',\n function: {\n name: toolChoice.toolName,\n },\n };\n }\n\n // 默认: auto\n return 'auto';\n }\n}","// 响应转换器 - 新 AI SDK 格式\n\nimport type {\n LanguageModelV1FinishReason,\n LanguageModelV1CallWarning,\n LanguageModelV1FunctionToolCall,\n LanguageModelV1ContentPart,\n} from '@ai-sdk/provider';\nimport type { DeepSeekResponse } from '../types';\n\n// 新 AI SDK 返回结果类型\nexport interface V1GenerateResult {\n content: LanguageModelV1ContentPart[];\n finishReason: LanguageModelV1FinishReason;\n usage: {\n promptTokens: number;\n completionTokens: number;\n };\n rawCall: {\n rawPrompt: unknown;\n rawSettings: Record<string, unknown>;\n };\n warnings?: LanguageModelV1CallWarning[];\n // 兼容旧格式的字段\n text?: string;\n toolCalls?: LanguageModelV1FunctionToolCall[];\n reasoning?: string;\n}\n\nexport class ResponseTransformer {\n transform(apiResponse: DeepSeekResponse): V1GenerateResult {\n const choice = apiResponse.choices?.[0];\n const message = choice?.message || {};\n\n // 修复 finish_reason\n const finishReason = this.fixFinishReason(\n choice?.finish_reason,\n message.tool_calls\n );\n\n // 转换工具调用\n const toolCalls = this.transformToolCalls(message.tool_calls);\n\n // 构建内容数组\n const content: LanguageModelV1ContentPart[] = [];\n\n // 添加文本内容\n if (message.content) {\n content.push({\n type: 'text',\n text: message.content,\n });\n }\n\n // 添加工具调用\n if (toolCalls.length > 0) {\n content.push(...toolCalls);\n }\n\n return {\n content,\n text: message.content || '', // 兼容旧格式\n finishReason: finishReason as LanguageModelV1FinishReason,\n usage: {\n promptTokens: apiResponse.usage?.prompt_tokens || 0,\n completionTokens: apiResponse.usage?.completion_tokens || 0,\n },\n rawCall: {\n rawPrompt: '',\n rawSettings: {},\n },\n toolCalls, // 兼容旧格式\n warnings: [],\n };\n }\n\n private fixFinishReason(\n originalFinishReason: string | undefined,\n toolCalls: any[] | undefined\n ): string {\n // 如果有 tool_calls 但 finish_reason 是 \"stop\",修复为 \"tool-calls\"\n if (toolCalls && toolCalls.length > 0 && originalFinishReason === 'stop') {\n return 'tool-calls';\n }\n\n // 映射其他 finish_reason 值\n const finishReasonMap: Record<string, string> = {\n 'stop': 'stop',\n 'length': 'length',\n 'content_filter': 'content-filter',\n 'tool_calls': 'tool-calls',\n 'function_call': 'tool-calls',\n };\n\n return finishReasonMap[originalFinishReason || ''] || 'stop';\n }\n\n private transformToolCalls(toolCalls: any[] | undefined): LanguageModelV1FunctionToolCall[] {\n if (!toolCalls || toolCalls.length === 0) {\n return [];\n }\n\n return toolCalls.map((tc: any) => ({\n type: 'tool-call' as const,\n toolCallType: 'function' as const,\n toolCallId: tc.id,\n toolName: tc.function.name,\n args: typeof tc.function.arguments === 'string'\n ? tc.function.arguments\n : JSON.stringify(tc.function.arguments),\n }));\n }\n}\n","// 流解析器\n\nimport type { LanguageModelV1StreamPart } from '@ai-sdk/provider';\nimport type { DeepSeekStreamResponse, DeepSeekUsage } from '../types';\n\ninterface DeepSeekStreamChunk {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: Array<{\n index: number;\n delta: {\n role?: string;\n content?: string;\n tool_calls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n };\n finish_reason?: string;\n }>;\n usage?: DeepSeekUsage;\n}\n\nexport class StreamParser {\n private hasToolCalls: boolean = false;\n\n async *parse(body: ReadableStream<Uint8Array>): AsyncIterable<LanguageModelV1StreamPart> {\n const reader = body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n let partialJson = '';\n this.hasToolCalls = false; // 重置状态\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.trim() === '') continue;\n if (line.startsWith(':')) continue; // SSE 注释\n\n if (line.startsWith('data: ')) {\n const data = line.slice(6).trim();\n if (data === '[DONE]') {\n yield* this.processPartialJson(partialJson);\n partialJson = '';\n return;\n }\n\n try {\n // 尝试解析 JSON\n const parsed = JSON.parse(data);\n yield* this.processPartialJson(partialJson);\n partialJson = '';\n yield* this.processChunk(parsed);\n } catch (e) {\n // JSON 解析失败,可能是部分数据\n partialJson += data;\n }\n }\n }\n }\n\n // 处理剩余的部分 JSON\n yield* this.processPartialJson(partialJson);\n } finally {\n reader.releaseLock();\n }\n }\n\n private async *processPartialJson(partialJson: string): AsyncIterable<LanguageModelV1StreamPart> {\n if (!partialJson.trim()) return;\n\n try {\n const parsed = JSON.parse(partialJson);\n yield* this.processChunk(parsed);\n } catch (e) {\n // 仍然无法解析,跳过\n console.warn('Failed to parse partial JSON:', partialJson);\n }\n }\n\n private async *processChunk(chunk: DeepSeekStreamChunk): AsyncIterable<LanguageModelV1StreamPart> {\n const delta = chunk.choices?.[0]?.delta;\n\n // 工具调用增量 - JSON in content 格式\n if (delta?.content) {\n const toolCallData = this.tryParseToolCall(delta.content);\n if (toolCallData) {\n this.hasToolCalls = true; // 标记有工具调用\n yield {\n type: 'tool-call-delta',\n toolCallType: 'function',\n toolCallId: toolCallData.id || `tool-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n toolName: toolCallData.name,\n argsTextDelta: JSON.stringify(toolCallData.arguments || {}),\n } as LanguageModelV1StreamPart;\n } else {\n // 普通文本增量\n yield {\n type: 'text-delta',\n textDelta: delta.content,\n } as LanguageModelV1StreamPart;\n }\n }\n\n // 工具调用增量 - 标准 tool_calls 格式\n if (delta?.tool_calls && delta.tool_calls.length > 0) {\n this.hasToolCalls = true; // 标记有工具调用\n for (const toolCall of delta.tool_calls) {\n yield {\n type: 'tool-call-delta',\n toolCallType: 'function',\n toolCallId: toolCall.id,\n toolName: toolCall.function?.name || '',\n argsTextDelta: toolCall.function?.arguments || '',\n } as LanguageModelV1StreamPart;\n }\n }\n\n // 完成信号\n const finishReason = chunk.choices?.[0]?.finish_reason;\n if (finishReason) {\n // V1 API: usage 在 finish 类型的 part 中\n const usage = chunk.usage\n ? {\n promptTokens: chunk.usage.prompt_tokens,\n completionTokens: chunk.usage.completion_tokens,\n }\n : { promptTokens: 0, completionTokens: 0 };\n\n yield {\n type: 'finish',\n finishReason: this.mapFinishReason(finishReason),\n usage,\n } as LanguageModelV1StreamPart;\n }\n }\n\n private mapFinishReason(reason: string): 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other' | 'unknown' {\n // 修复:如果有工具调用但 finish_reason 是 \"stop\",改为 \"tool-calls\"\n if (reason === 'stop' && this.hasToolCalls) {\n return 'tool-calls';\n }\n\n const reasonMap: Record<string, 'stop' | 'length' | 'content-filter' | 'tool-calls' | 'error' | 'other' | 'unknown'> = {\n 'stop': 'stop',\n 'length': 'length',\n 'content_filter': 'content-filter',\n 'tool_calls': 'tool-calls',\n 'function_call': 'tool-calls',\n 'error': 'error',\n };\n return reasonMap[reason] || 'unknown';\n }\n\n private tryParseToolCall(content: string): { id?: string; name: string; arguments: Record<string, unknown> } | null {\n try {\n const parsed = JSON.parse(content);\n // 检查是否是工具调用格式: { name: \"...\", arguments: {...} }\n if (parsed && typeof parsed.name === 'string' && (parsed.arguments === undefined || typeof parsed.arguments === 'object')) {\n return {\n id: parsed.id,\n name: parsed.name,\n arguments: parsed.arguments || {},\n };\n }\n } catch {\n // JSON 解析失败,不是工具调用\n }\n return null;\n }\n}\n\n\n","// DeepSeek Chat 模型实现\n\nimport type {\n LanguageModelV1,\n LanguageModelV1CallOptions,\n} from '@ai-sdk/provider';\nimport type { DeepSeekChatSettings, DeepSeekResponse } from './types';\nimport { validateChatSettings } from './deepseek-chat-settings';\nimport { RequestTransformer } from './utils/request-transformer';\nimport { ResponseTransformer } from './utils/response-transformer';\nimport { StreamParser } from './utils/stream-parser';\n\nexport class DeepSeekChatLanguageModel implements LanguageModelV1 {\n readonly specificationVersion = 'v1' as const;\n readonly provider = 'deepseek' as const;\n readonly modelId: string;\n readonly settings: Required<DeepSeekChatSettings>;\n readonly defaultObjectGenerationMode: 'json' | 'tool' | undefined = undefined;\n\n private baseURL: string;\n private headers: () => Record<string, string>;\n private requestTransformer: RequestTransformer;\n private responseTransformer: ResponseTransformer;\n private streamParser: StreamParser;\n\n constructor(\n modelId: string,\n settings: DeepSeekChatSettings = {},\n config: {\n baseURL: string;\n headers: () => Record<string, string>;\n }\n ) {\n this.modelId = modelId;\n this.settings = validateChatSettings(settings);\n this.baseURL = config.baseURL;\n this.headers = config.headers;\n this.requestTransformer = new RequestTransformer();\n this.responseTransformer = new ResponseTransformer();\n this.streamParser = new StreamParser();\n }\n\n async doGenerate(options: LanguageModelV1CallOptions) {\n const requestBody = this.requestTransformer.transform(this.modelId, options);\n\n const response = await fetch(`${this.baseURL}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.headers(),\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`DeepSeek API error: ${response.status} - ${error}`);\n }\n\n const apiResponse = (await response.json()) as DeepSeekResponse;\n return this.responseTransformer.transform(apiResponse);\n }\n\n async doStream(options: LanguageModelV1CallOptions) {\n const requestBody = {\n ...this.requestTransformer.transform(this.modelId, options),\n stream: true,\n };\n\n const response = await fetch(`${this.baseURL}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'text/event-stream',\n ...this.headers(),\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`DeepSeek API error: ${response.status} - ${error}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n return {\n stream: this.streamParser.parse(response.body) as any,\n rawCall: {\n rawPrompt: requestBody as unknown,\n rawSettings: {},\n },\n warnings: [],\n };\n }\n}","// 公开导出 - 完全兼容官方 @ai-sdk/deepseek\n\n// 主要导出(与官方一致)\nexport { createDeepSeek, deepseek, createProvider } from './deepseek-provider';\n\n// 内部类型和类的导出\nexport { DeepSeekChatLanguageModel } from './deepseek-chat-language-model';\nexport { validateChatSettings } from './deepseek-chat-settings';\n\n// 工具类导出\nexport { RequestTransformer } from './utils/request-transformer';\nexport { ResponseTransformer } from './utils/response-transformer';\nexport { StreamParser } from './utils/stream-parser';\n\n// 类型导出(与官方一致)\nexport type {\n DeepSeekProviderSettings,\n DeepSeekChatSettings,\n DeepSeekMessage,\n DeepSeekToolCall,\n DeepSeekTool,\n DeepSeekRequest,\n DeepSeekChoice,\n DeepSeekUsage,\n DeepSeekResponse,\n DeepSeekStreamChoice,\n DeepSeekStreamResponse,\n} from './types';\n\n// VERSION 常量(与官方一致)\nexport const VERSION = '0.2.0';\n\n// DeepSeekProvider 类型导出\nexport type { DeepSeekProvider } from './deepseek-provider';"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,26 +1,28 @@
1
1
  {
2
2
  "name": "@hopemyl619/deepseek",
3
- "version": "0.3.3",
3
+ "version": "0.3.4",
4
4
  "description": "DeepSeek provider for the Vercel AI SDK with automatic finish_reason fix for tool calls",
5
- "type": "module",
6
5
  "exports": {
6
+ "./package.json": "./package.json",
7
7
  ".": {
8
- "types": "./dist/index.d.ts",
9
- "import": "./dist/index.js"
8
+ "import": "./dist/index.mjs",
9
+ "require": "./dist/index.js"
10
10
  }
11
11
  },
12
- "types": "./dist/index.d.ts",
12
+ "main": "./dist/index.js",
13
+ "module": "./dist/index.mjs",
13
14
  "files": [
14
15
  "dist",
15
16
  "src"
16
17
  ],
17
18
  "scripts": {
18
- "build": "tsup --no-dts",
19
+ "build": "tsup",
19
20
  "dev": "tsup --watch",
20
21
  "test": "vitest",
22
+ "test:package": "node test-package-loading.mjs",
21
23
  "typecheck": "tsc --noEmit",
22
24
  "lint": "eslint src",
23
- "prepublishOnly": "npm run build && npm run test",
25
+ "prepublishOnly": "npm run build && npm run test:package",
24
26
  "version": "node -p \"require('./package.json').version\"",
25
27
  "version:patch": "npm version patch && git push origin main && git push origin $(git describe --tags --abbrev=0)",
26
28
  "version:minor": "npm version minor && git push origin main && git push origin $(git describe --tags --abbrev=0)",
@@ -30,7 +32,6 @@
30
32
  "release:major": "npm run version:major"
31
33
  },
32
34
  "dependencies": {
33
- "@ai-sdk/deepseek": "^2.0.11",
34
35
  "@ai-sdk/provider": "^1.0.2",
35
36
  "@ai-sdk/provider-utils": "^2.0.4"
36
37
  },