@aalis/plugin-llm-deepseek 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ace Nyan <ace@acenyan.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # @aalis/plugin-llm-deepseek
2
+
3
+ DeepSeek LLM 提供者(深度思考 + 工具调用)
4
+ ## 角色
5
+
6
+ 运行时插件
7
+
8
+ ## 安装
9
+
10
+ ```bash
11
+ pnpm add @aalis/plugin-llm-deepseek
12
+ ```
13
+
14
+ ## 文档
15
+
16
+ 详见 [docs/plugins/plugin-llm-deepseek.md](../../docs/plugins/plugin-llm-deepseek.md)。
17
+
18
+ ## 许可
19
+
20
+ 见仓库根目录 LICENSE。
@@ -0,0 +1,14 @@
1
+ import type { ToolCall } from '@aalis/schema-message';
2
+ /**
3
+ * 解析 DSML 文本块为 ToolCall 数组。
4
+ *
5
+ * @param text 包含 DSML 文本的字符串(可以是 content 全文,也可以是 DSML 块本身)
6
+ * @returns 解析出的 ToolCall 数组(可能为空数组,表示未识别到任何完整 invoke)
7
+ *
8
+ * 设计原则:
9
+ * - **best-effort**:不抛错。任何无法识别的片段静默跳过。
10
+ * - **宽松**:兼容单/双/任意数量竖线、全角/半角竖线、name 内的空白。
11
+ * - **去重**:同名同参的 invoke 只保留一次(避免重复触发)。
12
+ */
13
+ export declare function parseDsmlToolCalls(text: string): ToolCall[];
14
+ //# sourceMappingURL=dsml-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsml-parser.d.ts","sourceRoot":"","sources":["../src/dsml-parser.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAiD3D"}
@@ -0,0 +1,81 @@
1
+ // DSML (DeepSeek Markup Language) → ToolCall best-effort 解析器
2
+ //
3
+ // 背景:DeepSeek V3.2 / V4 服务端使用基于特殊 token 的 tool_call 协议
4
+ // (DSML),正常情况下服务端会把 <|DSML|...> 块解析为 chat.completion 的
5
+ // `tool_calls` 字段,content 字段不含 DSML 文本。
6
+ //
7
+ // 已观察到的服务端 bug:当模型输出 **双竖线** 变体
8
+ // `<||DSML||tool_calls>...` 时(推测是 prompt 注入/上下文污染/小模型
9
+ // 失稳所致),服务端严格匹配 `|DSML|` 失败,DSML 文本原样 fallthrough
10
+ // 到 content 字段,且 tool_calls 字段为空。
11
+ //
12
+ // 本模块的职责:在客户端把这种泄漏的 DSML 文本重新解析为 ToolCall[],
13
+ // 让 agent 走正常工具调用循环,而不是把它当垃圾文本剥掉导致空回复。
14
+ //
15
+ // 已知 DSML 块结构(基于真实样本):
16
+ // <|DSML|tool_calls>
17
+ // <|DSML|invoke name="X">
18
+ // <|DSML|parameter name="Y" string="true">VALUE</|DSML|parameter>
19
+ // ...
20
+ // </|DSML|invoke>
21
+ // ...
22
+ // </|DSML|tool_calls>
23
+ //
24
+ // 兼容变体:[||]+ 任意数量的全角/半角竖线。
25
+ /**
26
+ * 解析 DSML 文本块为 ToolCall 数组。
27
+ *
28
+ * @param text 包含 DSML 文本的字符串(可以是 content 全文,也可以是 DSML 块本身)
29
+ * @returns 解析出的 ToolCall 数组(可能为空数组,表示未识别到任何完整 invoke)
30
+ *
31
+ * 设计原则:
32
+ * - **best-effort**:不抛错。任何无法识别的片段静默跳过。
33
+ * - **宽松**:兼容单/双/任意数量竖线、全角/半角竖线、name 内的空白。
34
+ * - **去重**:同名同参的 invoke 只保留一次(避免重复触发)。
35
+ */
36
+ export function parseDsmlToolCalls(text) {
37
+ if (!text?.includes('DSML'))
38
+ return [];
39
+ // 匹配每个 invoke 块。竖线类用 [||]+ 兼容变体。
40
+ // [\s\S] 非贪婪匹配任意字符(包括换行)。
41
+ const invokeRe = /<[||]+\s*DSML[||]+\s*invoke\s+name=(["'])([^"']+?)\1\s*>([\s\S]*?)<\/[||]+\s*DSML[||]+\s*invoke\s*>/g;
42
+ const paramRe = /<[||]+\s*DSML[||]+\s*parameter\s+name=(["'])([^"']+?)\1(?:\s+string=(["'])(?:true|false)\3)?\s*>([\s\S]*?)<\/[||]+\s*DSML[||]+\s*parameter\s*>/g;
43
+ const calls = [];
44
+ const seen = new Set();
45
+ let invokeMatch;
46
+ let idx = 0;
47
+ invokeRe.lastIndex = 0;
48
+ // biome-ignore lint/suspicious/noAssignInExpressions: 标准的 exec-while 循环
49
+ while ((invokeMatch = invokeRe.exec(text)) !== null) {
50
+ const name = invokeMatch[2]?.trim();
51
+ const body = invokeMatch[3] ?? '';
52
+ if (!name)
53
+ continue;
54
+ const args = {};
55
+ paramRe.lastIndex = 0;
56
+ let paramMatch;
57
+ // biome-ignore lint/suspicious/noAssignInExpressions: 标准的 exec-while 循环
58
+ while ((paramMatch = paramRe.exec(body)) !== null) {
59
+ const pName = paramMatch[2]?.trim();
60
+ const pValue = paramMatch[4] ?? '';
61
+ if (pName)
62
+ args[pName] = pValue;
63
+ }
64
+ // 即使没有任何 parameter 也保留 invoke(无参工具是合法的)
65
+ const argsJson = JSON.stringify(args);
66
+ const dedupKey = `${name}\u0000${argsJson}`;
67
+ if (seen.has(dedupKey))
68
+ continue;
69
+ seen.add(dedupKey);
70
+ calls.push({
71
+ // 服务端 tool_call id 通常是 `call_xxxxx`;leak 场景下我们没有真实 id,
72
+ // 自己生成一个稳定 id 让 agent / OneBot 适配器能区分。
73
+ id: `call_dsml_${Date.now().toString(36)}_${idx}`,
74
+ type: 'function',
75
+ function: { name, arguments: argsJson },
76
+ });
77
+ idx++;
78
+ }
79
+ return calls;
80
+ }
81
+ //# sourceMappingURL=dsml-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsml-parser.js","sourceRoot":"","sources":["../src/dsml-parser.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,EAAE;AACF,uDAAuD;AACvD,uDAAuD;AACvD,wCAAwC;AACxC,EAAE;AACF,gCAAgC;AAChC,sDAAsD;AACtD,kDAAkD;AAClD,kCAAkC;AAClC,EAAE;AACF,6CAA6C;AAC7C,uCAAuC;AACvC,EAAE;AACF,uBAAuB;AACvB,uBAAuB;AACvB,8BAA8B;AAC9B,wEAAwE;AACxE,YAAY;AACZ,sBAAsB;AACtB,UAAU;AACV,wBAAwB;AACxB,EAAE;AACF,2BAA2B;AAI3B;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,iCAAiC;IACjC,0BAA0B;IAC1B,MAAM,QAAQ,GACZ,sGAAsG,CAAC;IACzG,MAAM,OAAO,GACX,iJAAiJ,CAAC;IAEpJ,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,WAAmC,CAAC;IACxC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC;IAEvB,wEAAwE;IACxE,OAAO,CAAC,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,IAAI,GAA2B,EAAE,CAAC;QACxC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACtB,IAAI,UAAkC,CAAC;QACvC,wEAAwE;QACxE,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,KAAK;gBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;QAClC,CAAC;QAED,wCAAwC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,GAAG,IAAI,SAAS,QAAQ,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,SAAS;QACjC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEnB,KAAK,CAAC,IAAI,CAAC;YACT,uDAAuD;YACvD,uCAAuC;YACvC,EAAE,EAAE,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE;YACjD,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE;SACxC,CAAC,CAAC;QACH,GAAG,EAAE,CAAC;IACR,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Context } from '@aalis/core';
2
+ import type { ConfigSchema } from '@aalis/schema-config';
3
+ export declare const name = "@aalis/plugin-llm-deepseek";
4
+ export declare const displayName = "DeepSeek";
5
+ export declare const subsystem = "llm";
6
+ export declare const provides: string[];
7
+ export declare const reusable = true;
8
+ export declare const configSchema: ConfigSchema;
9
+ export declare const defaultConfig: {
10
+ baseUrl: string;
11
+ customModels: string;
12
+ modelCapabilities: string;
13
+ providerCapabilities: string;
14
+ timeout: number;
15
+ temperature: number;
16
+ maxTokens: number;
17
+ contextLength: number;
18
+ };
19
+ export declare function apply(ctx: Context, config: Record<string, unknown>): Promise<void>;
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AA0BzD,eAAO,MAAM,IAAI,+BAA+B,CAAC;AACjD,eAAO,MAAM,WAAW,aAAa,CAAC;AACtC,eAAO,MAAM,SAAS,QAAQ,CAAC;AAC/B,eAAO,MAAM,QAAQ,UAAU,CAAC;AAChC,eAAO,MAAM,QAAQ,OAAO,CAAC;AAE7B,eAAO,MAAM,YAAY,EAAE,YA2E1B,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;CASzB,CAAC;AAkqBF,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ExF"}
package/dist/index.js ADDED
@@ -0,0 +1,726 @@
1
+ import { LLMCapabilities } from '@aalis/api-llm';
2
+ import { prepareLLMMessages, toLLMRole } from '@aalis/schema-message';
3
+ import { stripLeakedSpecialTokens } from '@aalis/util-text-normalize';
4
+ import { parseDsmlToolCalls } from './dsml-parser.js';
5
+ // ===== 插件元数据 =====
6
+ /** 已知的内容审查错误关键词 */
7
+ const CONTENT_FILTER_PATTERNS = [
8
+ 'content exists risk',
9
+ 'content_filter',
10
+ 'content_policy',
11
+ 'sensitive content',
12
+ 'risk control',
13
+ ];
14
+ /** 解析 API 错误,对内容审查类错误返回友好提示 */
15
+ function parseApiError(provider, status, body) {
16
+ const lower = body.toLowerCase();
17
+ if (status === 400 && CONTENT_FILTER_PATTERNS.some(p => lower.includes(p))) {
18
+ return `${provider} 拒绝了此次请求(内容安全策略),请尝试换一个话题或缩短上下文`;
19
+ }
20
+ return `${provider} API 错误 (${status}): ${body}`;
21
+ }
22
+ export const name = '@aalis/plugin-llm-deepseek';
23
+ export const displayName = 'DeepSeek';
24
+ export const subsystem = 'llm';
25
+ export const provides = ['llm'];
26
+ export const reusable = true;
27
+ export const configSchema = {
28
+ apiKey: { type: 'string', label: 'API Key', required: true, secret: true, description: 'DeepSeek API 密钥' },
29
+ baseUrl: {
30
+ type: 'string',
31
+ label: 'API 地址',
32
+ default: 'https://api.deepseek.com',
33
+ description: 'API 端点地址,可替换为兼容的第三方服务',
34
+ },
35
+ customModels: {
36
+ type: 'textarea',
37
+ label: '自定义模型',
38
+ default: '',
39
+ description: '手动添加的模型名称(每行一个或逗号分隔)。用于补充自动发现列表中未出现的模型。与自动发现重复时会提示去重。',
40
+ },
41
+ modelCapabilities: {
42
+ type: 'textarea',
43
+ label: '单模型能力覆盖',
44
+ default: '',
45
+ description: '按行指定某个模型的能力集。有该模型的表项时**覆盖**插件启发式推断,与 adapter 默认能力仍取并集。\n格式:`<modelId>: <cap1>,<cap2>,...`,每行一条。如:deepseek-chat: chat,tool_calling,streaming',
46
+ },
47
+ providerCapabilities: {
48
+ type: 'string',
49
+ label: '适配器默认能力(逗号分隔)',
50
+ default: '',
51
+ description: '为本适配器下所有模型额外补充的能力。最终某模型的能力 = 此处能力 ∪ 模型级别能力。例:chat,tool_calling,streaming',
52
+ },
53
+ timeout: {
54
+ type: 'number',
55
+ label: '请求超时 (秒)',
56
+ default: 120,
57
+ description: 'LLM 请求超时时间(秒)。思考模式下建议 180-300 秒。0 = 不限制。',
58
+ },
59
+ temperature: { type: 'number', label: '温度', default: 0.7, description: '0-2,越高越随机' },
60
+ maxTokens: { type: 'number', label: '最大 Token', default: 8192, description: '单次回复最大生成 token 数' },
61
+ contextLength: { type: 'number', label: '上下文长度', default: 131072, description: '模型上下文窗口大小' },
62
+ strictToolCalls: {
63
+ type: 'boolean',
64
+ label: 'Strict 工具调用',
65
+ default: false,
66
+ description: '启用后所有工具调用将使用 strict 模式,模型输出严格遵循 JSON Schema(参考 api-docs.deepseek.com)',
67
+ },
68
+ forceJsonOutput: {
69
+ type: 'boolean',
70
+ label: '强制 JSON 输出',
71
+ default: false,
72
+ description: '启用后所有最终回复请求将携带 response_format: {type:"json_object"},配合角色卡 outputFormat 使用可提升格式遵循率。工具调用阶段不受影响(工具响应走 tool_calls 字段)。需确保 system prompt 中含有 json 字样(启用 outputFormat 的角色卡会自动满足此条件)。',
73
+ },
74
+ thinkingMode: {
75
+ type: 'select',
76
+ label: '思考模式',
77
+ default: 'auto',
78
+ options: [
79
+ { label: '自动(按模型推断,仅 thinking-capable 模型启用)', value: 'auto' },
80
+ { label: '强制启用所有模型', value: 'enabled' },
81
+ { label: '强制关闭所有模型', value: 'disabled' },
82
+ ],
83
+ description: '控制深度思考。auto 模式下,仅 thinking-capable 模型(v4 / reasoner 等)默认启用思考。enabled/disabled 会覆盖所有模型。',
84
+ },
85
+ reasoningEffort: {
86
+ type: 'select',
87
+ label: '推理强度',
88
+ default: 'auto',
89
+ options: [
90
+ { label: '自动(由 API 按场景选 high/max)', value: 'auto' },
91
+ { label: '高', value: 'high' },
92
+ { label: '最大', value: 'max' },
93
+ ],
94
+ description: '思考模式下的推理强度(v4 模型)。「自动」不发送参数,API 会为普通请求选 high、为 Agent 复杂场景选 max,推荐。',
95
+ },
96
+ };
97
+ export const defaultConfig = {
98
+ baseUrl: 'https://api.deepseek.com',
99
+ customModels: '',
100
+ modelCapabilities: '',
101
+ providerCapabilities: '',
102
+ timeout: 120,
103
+ temperature: 0.7,
104
+ maxTokens: 8192,
105
+ contextLength: 131072,
106
+ };
107
+ // ===== DeepSeek 客户端(共享底层 fetch 封装,多个 ModelHandle 复用) =====
108
+ class DeepSeekClient {
109
+ apiKey;
110
+ baseUrl;
111
+ timeout;
112
+ temperature;
113
+ maxTokens;
114
+ reasoningEffort;
115
+ strictToolCalls;
116
+ forceJsonOutput;
117
+ logger;
118
+ constructor(config, logger) {
119
+ this.apiKey = config.apiKey;
120
+ this.baseUrl = config.baseUrl.replace(/\/$/, '');
121
+ // schema 中 timeout 单位为「秒」,存储为毫秒;0 视为不限制 → 用一个非常大的值
122
+ this.timeout = config.timeout && config.timeout > 0 ? config.timeout * 1000 : 2_147_483_647;
123
+ this.temperature = config.temperature;
124
+ this.maxTokens = config.maxTokens;
125
+ this.reasoningEffort = config.reasoningEffort;
126
+ this.strictToolCalls = config.strictToolCalls;
127
+ this.forceJsonOutput = config.forceJsonOutput;
128
+ this.logger = logger;
129
+ }
130
+ /** 发现远端模型 id 列表 */
131
+ async fetchRemoteModelIds() {
132
+ const url = `${this.baseUrl}/models`;
133
+ try {
134
+ const res = await fetch(url, {
135
+ headers: { Authorization: `Bearer ${this.apiKey}` },
136
+ });
137
+ if (!res.ok) {
138
+ const body = await res.text().catch(() => '');
139
+ this.logger.warn(`fetchRemoteModelIds 失败 ${url}: HTTP ${res.status} ${res.statusText} - ${body}`);
140
+ return [];
141
+ }
142
+ const data = (await res.json());
143
+ return data.data.map(m => m.id);
144
+ }
145
+ catch (err) {
146
+ this.logger.warn(`fetchRemoteModelIds 异常 ${url}: ${err.message}`);
147
+ return [];
148
+ }
149
+ }
150
+ async chat(model, request, enableThinking) {
151
+ const messages = prepareLLMMessages(request.messages).map(m => this.toAPIMessage(m));
152
+ const tools = request.tools?.map(t => this.toAPITool(t));
153
+ const body = {
154
+ model,
155
+ messages,
156
+ max_tokens: request.maxTokens ?? this.maxTokens,
157
+ };
158
+ const shouldThink = request.think !== undefined ? request.think : enableThinking;
159
+ if (shouldThink) {
160
+ body.thinking = { type: 'enabled' };
161
+ if (this.reasoningEffort !== 'auto')
162
+ body.reasoning_effort = this.reasoningEffort;
163
+ // 思考模式下 temperature 等参数不生效
164
+ }
165
+ else {
166
+ // 显式关闭:v4 系列 API 默认 enabled,不发送字段会保持开启
167
+ body.thinking = { type: 'disabled' };
168
+ body.temperature = request.temperature ?? this.temperature;
169
+ }
170
+ if (tools && tools.length > 0) {
171
+ body.tools = tools;
172
+ }
173
+ // 强制 JSON 输出。带 tools 时必须不加 response_format:json_object 与 tool_calls 互斥会破坏工具循环,
174
+ // 兑现配置文案"工具调用阶段不受影响"的承诺。
175
+ if (this.forceJsonOutput && !(tools && tools.length > 0)) {
176
+ body.response_format = { type: 'json_object' };
177
+ }
178
+ this.logger.debug(`请求 DeepSeek${shouldThink ? ` (思考 effort=${this.reasoningEffort})` : ' (思考已关闭)'}: ${body.model}, ${messages.length} 条消息, ${tools?.length ?? 0} 个工具`);
179
+ const signals = [AbortSignal.timeout(this.timeout)];
180
+ if (request.signal)
181
+ signals.push(request.signal);
182
+ const response = await fetch(`${this.baseUrl}/v1/chat/completions`, {
183
+ method: 'POST',
184
+ headers: {
185
+ 'Content-Type': 'application/json',
186
+ Authorization: `Bearer ${this.apiKey}`,
187
+ },
188
+ body: JSON.stringify(body),
189
+ signal: AbortSignal.any(signals),
190
+ });
191
+ if (!response.ok) {
192
+ const errorText = await response.text();
193
+ throw new Error(parseApiError('DeepSeek', response.status, errorText));
194
+ }
195
+ const data = (await response.json());
196
+ const choice = data.choices[0];
197
+ if (!choice) {
198
+ throw new Error('DeepSeek 返回了空的 choices');
199
+ }
200
+ // DSML 泄漏处理(与流式分支对齐):
201
+ // 1) 用统一的 stripLeakedSpecialTokens 检测+剥离 DSML 文本(覆盖单/双竖线变体)
202
+ // 2) 若服务端 tool_calls 为空但 content 含 DSML,调 parseDsmlToolCalls 本地恢复
203
+ // 避免非流式路径下工具调用信息无声丢失
204
+ let cleanContent = choice.message.content;
205
+ let recoveredToolCalls;
206
+ if (cleanContent) {
207
+ const { sanitized, hadLeak } = stripLeakedSpecialTokens(cleanContent);
208
+ if (hadLeak) {
209
+ const hasServerToolCalls = !!(choice.message.tool_calls && choice.message.tool_calls.length > 0);
210
+ if (!hasServerToolCalls) {
211
+ const dsmlCalls = parseDsmlToolCalls(cleanContent);
212
+ if (dsmlCalls.length > 0) {
213
+ this.logger.info(`DeepSeek DSML 本地解析成功(非流式),恢复 ${dsmlCalls.length} 个 tool_call:${dsmlCalls.map(c => c.function.name).join(', ')}`);
214
+ recoveredToolCalls = dsmlCalls;
215
+ }
216
+ else {
217
+ this.logger.warn(`DeepSeek DSML 本地解析未识别出完整 invoke 块(非流式),content 长度=${cleanContent.length}`);
218
+ }
219
+ }
220
+ else {
221
+ this.logger.warn(`DeepSeek content 检测到 DSML 泄漏但服务端已返回 tool_calls,仅剥离文本(原长=${cleanContent.length} 净化后=${sanitized.length})`);
222
+ }
223
+ }
224
+ cleanContent = sanitized;
225
+ }
226
+ const result = {
227
+ content: cleanContent,
228
+ reasoningContent: choice.message.reasoning_content ?? undefined,
229
+ };
230
+ if (choice.message.tool_calls && choice.message.tool_calls.length > 0) {
231
+ result.toolCalls = choice.message.tool_calls.map(tc => ({
232
+ id: tc.id,
233
+ type: 'function',
234
+ function: {
235
+ name: tc.function.name,
236
+ arguments: tc.function.arguments,
237
+ },
238
+ }));
239
+ }
240
+ else if (recoveredToolCalls) {
241
+ result.toolCalls = recoveredToolCalls;
242
+ }
243
+ if (data.usage) {
244
+ result.usage = {
245
+ promptTokens: data.usage.prompt_tokens,
246
+ completionTokens: data.usage.completion_tokens,
247
+ totalTokens: data.usage.prompt_tokens + data.usage.completion_tokens,
248
+ cachedPromptTokens: data.usage.prompt_cache_hit_tokens,
249
+ };
250
+ }
251
+ return result;
252
+ }
253
+ async *chatStream(model, request, enableThinking) {
254
+ const messages = prepareLLMMessages(request.messages).map(m => this.toAPIMessage(m));
255
+ const tools = request.tools?.map(t => this.toAPITool(t));
256
+ const body = {
257
+ model,
258
+ messages,
259
+ max_tokens: request.maxTokens ?? this.maxTokens,
260
+ stream: true,
261
+ };
262
+ const shouldThink = request.think !== undefined ? request.think : enableThinking;
263
+ if (shouldThink) {
264
+ body.thinking = { type: 'enabled' };
265
+ if (this.reasoningEffort !== 'auto')
266
+ body.reasoning_effort = this.reasoningEffort;
267
+ }
268
+ else {
269
+ body.thinking = { type: 'disabled' };
270
+ body.temperature = request.temperature ?? this.temperature;
271
+ }
272
+ if (tools && tools.length > 0) {
273
+ body.tools = tools;
274
+ }
275
+ // 强制 JSON 输出。带 tools 时必须不加 response_format:json_object 与 tool_calls 互斥会破坏工具循环,
276
+ // 兑现配置文案"工具调用阶段不受影响"的承诺。
277
+ if (this.forceJsonOutput && !(tools && tools.length > 0)) {
278
+ body.response_format = { type: 'json_object' };
279
+ }
280
+ this.logger.debug(`流式请求 DeepSeek${shouldThink ? ` (思考 effort=${this.reasoningEffort})` : ' (思考已关闭)'}: ${body.model}, ${messages.length} 条消息`);
281
+ const signals = [AbortSignal.timeout(this.timeout)];
282
+ if (request.signal)
283
+ signals.push(request.signal);
284
+ const reqStart = Date.now();
285
+ // 守护:超过 15 秒还没拿到响应头,提示可能是网络/上游慢
286
+ const slowConnectTimer = setTimeout(() => {
287
+ this.logger.warn(`DeepSeek 连接慢:已等待 15s 仍未收到响应头 (url=${this.baseUrl}/v1/chat/completions)`);
288
+ }, 15_000);
289
+ let response;
290
+ try {
291
+ response = await fetch(`${this.baseUrl}/v1/chat/completions`, {
292
+ method: 'POST',
293
+ headers: {
294
+ 'Content-Type': 'application/json',
295
+ Authorization: `Bearer ${this.apiKey}`,
296
+ },
297
+ body: JSON.stringify(body),
298
+ signal: AbortSignal.any(signals),
299
+ });
300
+ }
301
+ catch (err) {
302
+ clearTimeout(slowConnectTimer);
303
+ const elapsed = Date.now() - reqStart;
304
+ const msg = err instanceof Error ? err.message : String(err);
305
+ this.logger.warn(`DeepSeek fetch 失败 (耗时 ${elapsed}ms): ${msg}`);
306
+ throw err;
307
+ }
308
+ clearTimeout(slowConnectTimer);
309
+ this.logger.debug(`DeepSeek 响应头到达: status=${response.status}, 耗时 ${Date.now() - reqStart}ms`);
310
+ if (!response.ok) {
311
+ const errorText = await response.text();
312
+ throw new Error(parseApiError('DeepSeek', response.status, errorText));
313
+ }
314
+ const toolCallBuffers = new Map();
315
+ /** 流式累积内容,用于检测 DSML 泄漏 */
316
+ let accContent = '';
317
+ let dsmlDetected = false;
318
+ /**
319
+ * 跨 chunk 尾缓冲:当当前 delta 末尾形如未闭合的 special token 起始片段
320
+ * (`<` 或 `<|...` 等),暂存到下一帧再判定,避免半截 DSML 起始已经
321
+ * emit 给下游、等下一帧匹配上完整 DSML 时已经收不回来。
322
+ */
323
+ let pendingTail = '';
324
+ if (!response.body) {
325
+ throw new Error('DeepSeek API 返回了空的响应体,无法进行流式读取');
326
+ }
327
+ const reader = response.body.getReader();
328
+ const decoder = new TextDecoder();
329
+ let buffer = '';
330
+ let firstChunkLogged = false;
331
+ const streamStart = Date.now();
332
+ // 守护:拿到响应头后 30 秒还没第一帧 SSE 数据,提示流停滞
333
+ const streamStallTimer = setTimeout(() => {
334
+ if (!firstChunkLogged) {
335
+ this.logger.warn(`DeepSeek 流停滞:响应头已到但 30s 仍未收到首帧 SSE`);
336
+ }
337
+ }, 30_000);
338
+ try {
339
+ while (true) {
340
+ const { done, value } = await reader.read();
341
+ if (done)
342
+ break;
343
+ if (!firstChunkLogged) {
344
+ firstChunkLogged = true;
345
+ clearTimeout(streamStallTimer);
346
+ this.logger.debug(`DeepSeek 首帧到达: 耗时 ${Date.now() - streamStart}ms (从响应头算起)`);
347
+ }
348
+ buffer += decoder.decode(value, { stream: true });
349
+ const lines = buffer.split('\n');
350
+ buffer = lines.pop();
351
+ for (const line of lines) {
352
+ const trimmed = line.trim();
353
+ if (!trimmed?.startsWith('data: '))
354
+ continue;
355
+ const payload = trimmed.slice(6);
356
+ if (payload === '[DONE]') {
357
+ // Flush 残留尾缓冲:流结束后 pendingTail 已不可能是 DSML 起始
358
+ // (DSML 都没等到下一帧),按合法字符 emit 出去
359
+ if (pendingTail && !dsmlDetected) {
360
+ yield { contentDelta: pendingTail };
361
+ pendingTail = '';
362
+ }
363
+ const toolCalls = [];
364
+ for (const [, tc] of [...toolCallBuffers.entries()].sort((a, b) => a[0] - b[0])) {
365
+ toolCalls.push({ id: tc.id, type: 'function', function: { name: tc.name, arguments: tc.args } });
366
+ }
367
+ // DSML 泄漏 best-effort 恢复:如果服务端未返回 tool_calls(解析失败)但
368
+ // accContent 里有 DSML 文本,本地解析补上,让 agent 走正常工具调用流程
369
+ if (dsmlDetected && toolCalls.length === 0) {
370
+ const dsmlCalls = parseDsmlToolCalls(accContent);
371
+ if (dsmlCalls.length > 0) {
372
+ this.logger.info(`DeepSeek DSML 本地解析成功,恢复 ${dsmlCalls.length} 个 tool_call:${dsmlCalls.map(c => c.function.name).join(', ')}`);
373
+ toolCalls.push(...dsmlCalls);
374
+ }
375
+ else {
376
+ this.logger.warn(`DeepSeek DSML 本地解析未识别出完整 invoke 块,accContent 长度=${accContent.length},上游将收到空回复`);
377
+ }
378
+ }
379
+ yield { done: true, toolCalls: toolCalls.length > 0 ? toolCalls : undefined };
380
+ return;
381
+ }
382
+ try {
383
+ const data = JSON.parse(payload);
384
+ const chunk = {};
385
+ // usage 必须在 delta 守卫**之前**取:兼容端点可能把 usage 挂在
386
+ // `choices: []` 的收尾帧上,等到守卫之后再取整帧已被跳过。
387
+ // (DeepSeek 自身把 usage 挂在带 delta 的帧上,本重排对它是无害冗余。)
388
+ if (data.usage) {
389
+ chunk.usage = {
390
+ promptTokens: data.usage.prompt_tokens,
391
+ completionTokens: data.usage.completion_tokens,
392
+ totalTokens: data.usage.prompt_tokens + data.usage.completion_tokens,
393
+ cachedPromptTokens: data.usage.prompt_cache_hit_tokens,
394
+ };
395
+ }
396
+ const delta = data.choices?.[0]?.delta;
397
+ if (!delta) {
398
+ if (chunk.usage)
399
+ yield chunk; // 纯 usage 收尾帧照样上报
400
+ continue;
401
+ }
402
+ if (delta.content) {
403
+ // 无论是否检测到 DSML,都要累积原始 content:
404
+ // - 未检测时:用于 DSML 起始位置定位
405
+ // - 已检测后:DSML 主体 + 闭合标记累积完成,[DONE] 时用于 best-effort 解析为 tool_calls
406
+ accContent += delta.content;
407
+ if (!dsmlDetected) {
408
+ // 合并尾缓冲 + 本次 delta 作为本帧候选 emit 内容
409
+ const candidate = pendingTail + delta.content;
410
+ // 检测 DSML 起始标记。已知变体:
411
+ // - 单竖线(标准):<|DSML|tool_calls>
412
+ // - 双竖线(畸形泄漏):<||DSML||tool_calls>
413
+ // - 半角变体:<|DSML|...>
414
+ // 使用 [||]+ 兼容任意数量的竖线
415
+ const dsmlIdx = accContent.search(/<[||]+\s*DSML/);
416
+ if (dsmlIdx !== -1) {
417
+ dsmlDetected = true;
418
+ this.logger.warn(`DeepSeek 检测到 DSML 标记泄漏,模型 ${model} 输出原生 tool_call 标记到 content(服务端解析失败),将在流结束后尝试本地解析`);
419
+ // 输出 DSML 之前的部分(如果有)
420
+ const cleanPart = accContent.slice(0, dsmlIdx);
421
+ // 已发字节数 = accContent.length - candidate.length(candidate 即"本帧合并后待 emit")
422
+ const prevEmitted = accContent.length - candidate.length;
423
+ const cleanDelta = cleanPart.slice(prevEmitted);
424
+ if (cleanDelta)
425
+ chunk.contentDelta = cleanDelta;
426
+ pendingTail = '';
427
+ }
428
+ else {
429
+ // 未检测到完整 DSML:识别 candidate 尾部是否是"可能的 special token 起始"
430
+ // - 形如 `<` 单独
431
+ // - 形如 `<|...` 或 `<|...`(即 special token 前缀,还未闭合 `>`)
432
+ // 命中则把这段尾部留到下一帧再判,避免漏出半截 `<||DS` 这种碎片
433
+ const tailMatch = candidate.match(/<$|<[||]+[^<>]{0,20}$/);
434
+ if (tailMatch) {
435
+ pendingTail = tailMatch[0];
436
+ const emitPart = candidate.slice(0, candidate.length - pendingTail.length);
437
+ if (emitPart)
438
+ chunk.contentDelta = emitPart;
439
+ }
440
+ else {
441
+ pendingTail = '';
442
+ chunk.contentDelta = candidate;
443
+ }
444
+ }
445
+ }
446
+ // dsmlDetected = true 时不再 emit content,但 accContent 继续累积供后续解析
447
+ }
448
+ if (delta.reasoning_content)
449
+ chunk.reasoningDelta = delta.reasoning_content;
450
+ // 累积工具调用
451
+ if (delta.tool_calls) {
452
+ for (const tc of delta.tool_calls) {
453
+ const idx = tc.index ?? 0;
454
+ if (tc.id) {
455
+ toolCallBuffers.set(idx, { id: tc.id, name: tc.function?.name ?? '', args: '' });
456
+ }
457
+ const entry = toolCallBuffers.get(idx);
458
+ if (entry) {
459
+ if (tc.function?.name)
460
+ entry.name = tc.function.name;
461
+ if (tc.function?.arguments)
462
+ entry.args += tc.function.arguments;
463
+ chunk.toolCallProgress = {
464
+ index: idx,
465
+ name: entry.name,
466
+ charsAccumulated: entry.args.length,
467
+ };
468
+ }
469
+ }
470
+ }
471
+ if (chunk.contentDelta || chunk.reasoningDelta || chunk.usage || chunk.toolCallProgress) {
472
+ yield chunk;
473
+ }
474
+ }
475
+ catch {
476
+ /* skip malformed JSON */
477
+ }
478
+ }
479
+ }
480
+ }
481
+ finally {
482
+ clearTimeout(streamStallTimer);
483
+ reader.releaseLock();
484
+ }
485
+ // 流意外结束(未见 [DONE])也要 flush 尾缓冲
486
+ if (pendingTail && !dsmlDetected) {
487
+ yield { contentDelta: pendingTail };
488
+ pendingTail = '';
489
+ }
490
+ const toolCalls = [];
491
+ for (const [, tc] of [...toolCallBuffers.entries()].sort((a, b) => a[0] - b[0])) {
492
+ toolCalls.push({ id: tc.id, type: 'function', function: { name: tc.name, arguments: tc.args } });
493
+ }
494
+ // 同 [DONE] 分支:DSML 泄漏 best-effort 恢复
495
+ if (dsmlDetected && toolCalls.length === 0) {
496
+ const dsmlCalls = parseDsmlToolCalls(accContent);
497
+ if (dsmlCalls.length > 0) {
498
+ this.logger.info(`DeepSeek DSML 本地解析成功(流意外结束分支),恢复 ${dsmlCalls.length} 个 tool_call`);
499
+ toolCalls.push(...dsmlCalls);
500
+ }
501
+ }
502
+ yield { done: true, toolCalls: toolCalls.length > 0 ? toolCalls : undefined };
503
+ }
504
+ /**
505
+ * 转换为 DeepSeek API 消息格式
506
+ * 关键:在工具调用循环中保留 reasoning_content,
507
+ * 但历史消息(从 memory 加载)不含 reasoning_content
508
+ */
509
+ toAPIMessage(msg) {
510
+ // 调用方已经 prepareLLMMessages 处理过:role 已是 WellKnownRole,自定义 role / kind
511
+ // 对应的前缀已拼接进 content。这里只需透传。
512
+ const apiMsg = {
513
+ role: toLLMRole(msg.role),
514
+ content: msg.content ?? null,
515
+ };
516
+ // DeepSeek API 不支持 image_url content 类型
517
+ // 图片应由 plugin-media 预处理为文本描述,不传递给 API
518
+ // 传递思考内容给 API(工具调用循环中需要)
519
+ if (msg.reasoningContent) {
520
+ apiMsg.reasoning_content = msg.reasoningContent;
521
+ }
522
+ if (msg.toolCalls && msg.toolCalls.length > 0) {
523
+ apiMsg.tool_calls = msg.toolCalls.map(tc => ({
524
+ id: tc.id,
525
+ type: 'function',
526
+ function: {
527
+ name: tc.function.name,
528
+ arguments: tc.function.arguments,
529
+ },
530
+ }));
531
+ }
532
+ if (msg.toolCallId) {
533
+ apiMsg.tool_call_id = msg.toolCallId;
534
+ }
535
+ if (msg.name) {
536
+ apiMsg.name = msg.name;
537
+ }
538
+ return apiMsg;
539
+ }
540
+ toAPITool(tool) {
541
+ return {
542
+ type: 'function',
543
+ function: {
544
+ name: tool.function.name,
545
+ strict: this.strictToolCalls || tool.function.strict,
546
+ description: tool.function.description,
547
+ parameters: tool.function.parameters,
548
+ },
549
+ };
550
+ }
551
+ }
552
+ // ===== 模型能力映射 =====
553
+ const { Chat, ToolCalling, Streaming, Thinking } = LLMCapabilities;
554
+ const MODEL_CAPABILITIES = {
555
+ // 当前 v4 系列(默认启用思考,可通过 thinking.type=disabled 关闭)
556
+ 'deepseek-v4-flash': [Chat, ToolCalling, Streaming, Thinking],
557
+ 'deepseek-v4-pro': [Chat, ToolCalling, Streaming, Thinking],
558
+ // 独立推理模型
559
+ 'deepseek-reasoner': [Chat, ToolCalling, Streaming, Thinking],
560
+ };
561
+ const DEFAULT_CAPABILITIES = [Chat];
562
+ function resolveCapabilities(model, userOverride, providerCaps) {
563
+ const out = new Set(providerCaps ?? []);
564
+ // 用户显式声明优先(覆盖启发式)
565
+ if (Array.isArray(userOverride) && userOverride.length > 0) {
566
+ for (const c of userOverride)
567
+ out.add(c);
568
+ return [...out];
569
+ }
570
+ // 精确匹配
571
+ if (MODEL_CAPABILITIES[model]) {
572
+ for (const c of MODEL_CAPABILITIES[model])
573
+ out.add(c);
574
+ return [...out];
575
+ }
576
+ // 模糊匹配:模型名包含关键词
577
+ const lower = model.toLowerCase();
578
+ if (lower.includes('reasoner')) {
579
+ for (const c of [Chat, ToolCalling, Streaming, Thinking])
580
+ out.add(c);
581
+ return [...out];
582
+ }
583
+ // v4 及后续主线模型默认启用思考
584
+ if (/\bv[4-9]\b/.test(lower) || lower.includes('-pro') || lower.includes('-flash')) {
585
+ for (const c of [Chat, ToolCalling, Streaming, Thinking])
586
+ out.add(c);
587
+ return [...out];
588
+ }
589
+ if (lower.includes('chat')) {
590
+ for (const c of [Chat, ToolCalling, Streaming])
591
+ out.add(c);
592
+ return [...out];
593
+ }
594
+ for (const c of DEFAULT_CAPABILITIES)
595
+ out.add(c);
596
+ return [...out];
597
+ }
598
+ // ===== 插件入口 =====
599
+ /** 解析自定义模型列表:支持逗号分隔和换行分隔 */
600
+ function parseCustomModels(raw) {
601
+ if (!raw || typeof raw !== 'string')
602
+ return [];
603
+ return raw
604
+ .split(/[,\n]/)
605
+ .map(s => s.trim())
606
+ .filter(Boolean);
607
+ }
608
+ /** 解析能力覆盖 textarea:每行 `<modelId>: cap1,cap2,...` */
609
+ function parseModelCapabilities(raw) {
610
+ const out = new Map();
611
+ if (!raw || typeof raw !== 'string')
612
+ return out;
613
+ for (const line of raw.split(/\r?\n/)) {
614
+ const trimmed = line.trim();
615
+ if (!trimmed || trimmed.startsWith('#'))
616
+ continue;
617
+ const colonIdx = trimmed.indexOf(':');
618
+ if (colonIdx < 0)
619
+ continue;
620
+ const modelId = trimmed.slice(0, colonIdx).trim();
621
+ const caps = trimmed
622
+ .slice(colonIdx + 1)
623
+ .split(',')
624
+ .map(s => s.trim())
625
+ .filter(Boolean);
626
+ if (modelId && caps.length > 0)
627
+ out.set(modelId, caps);
628
+ }
629
+ return out;
630
+ }
631
+ /** 解析适配器级别默认能力(逗号/空格/换行分隔) */
632
+ function parseProviderCapabilities(raw) {
633
+ if (!raw || typeof raw !== 'string')
634
+ return [];
635
+ return raw
636
+ .split(/[,\s\n]/)
637
+ .map(s => s.trim())
638
+ .filter(Boolean);
639
+ }
640
+ // ===== Per-model handle:每个 model 独立的 LLMModel entry =====
641
+ class DeepSeekModelHandle {
642
+ client;
643
+ id;
644
+ providerId;
645
+ contextLength;
646
+ maxOutputTokens;
647
+ enableThinking;
648
+ capabilities;
649
+ constructor(client, id, providerId, contextLength, maxOutputTokens, enableThinking,
650
+ /** 该 model 的能力元数据(供 media 发现/下拉展示读取,非 DI 选择机制)。 */
651
+ capabilities) {
652
+ this.client = client;
653
+ this.id = id;
654
+ this.providerId = providerId;
655
+ this.contextLength = contextLength;
656
+ this.maxOutputTokens = maxOutputTokens;
657
+ this.enableThinking = enableThinking;
658
+ this.capabilities = capabilities;
659
+ }
660
+ chat(request) {
661
+ return this.client.chat(this.id, request, this.enableThinking);
662
+ }
663
+ chatStream(request) {
664
+ return this.client.chatStream(this.id, request, this.enableThinking);
665
+ }
666
+ }
667
+ export async function apply(ctx, config) {
668
+ const deepseekConfig = {
669
+ apiKey: config.apiKey ?? '',
670
+ baseUrl: config.baseUrl ?? 'https://api.deepseek.com',
671
+ customModels: parseCustomModels(config.customModels),
672
+ modelCapabilities: parseModelCapabilities(config.modelCapabilities),
673
+ providerCapabilities: parseProviderCapabilities(config.providerCapabilities),
674
+ timeout: config.timeout ?? 120,
675
+ temperature: config.temperature ?? 0.7,
676
+ maxTokens: config.maxTokens ?? 8192,
677
+ contextLength: config.contextLength ?? 131072,
678
+ strictToolCalls: config.strictToolCalls ?? false,
679
+ forceJsonOutput: config.forceJsonOutput ?? false,
680
+ reasoningEffort: (() => {
681
+ const v = config.reasoningEffort;
682
+ return v === 'high' || v === 'max' ? v : 'auto';
683
+ })(),
684
+ };
685
+ if (!deepseekConfig.apiKey) {
686
+ throw new Error('未配置 apiKey,DeepSeek 插件无法启动');
687
+ }
688
+ const thinkingMode = config.thinkingMode ?? 'auto';
689
+ const client = new DeepSeekClient(deepseekConfig, ctx.logger);
690
+ // 探测远端 + 合并自定义模型
691
+ const remoteIds = await client.fetchRemoteModelIds();
692
+ const remoteSet = new Set(remoteIds);
693
+ for (const cm of deepseekConfig.customModels) {
694
+ if (remoteSet.has(cm)) {
695
+ ctx.logger.warn(`自定义模型 "${cm}" 与自动发现的模型重复,请在配置中去重`);
696
+ }
697
+ }
698
+ const allModelIds = [...remoteIds, ...deepseekConfig.customModels.filter(id => !remoteSet.has(id))];
699
+ if (allModelIds.length === 0) {
700
+ ctx.logger.warn(`已连接: ${deepseekConfig.baseUrl},但未发现任何可用模型;不注册任何 LLM entry`);
701
+ return;
702
+ }
703
+ const baseLabel = `DeepSeek (${deepseekConfig.baseUrl.replace(/^https?:\/\//, '')})`;
704
+ // 为每个 model 注册独立的 LLMModel entry
705
+ for (const modelId of allModelIds) {
706
+ const capabilities = resolveCapabilities(modelId, deepseekConfig.modelCapabilities.get(modelId), deepseekConfig.providerCapabilities);
707
+ // 思考开关:auto → 由模型 capability 决定;enabled/disabled → 强制覆盖
708
+ let enableThinking;
709
+ if (thinkingMode === 'enabled') {
710
+ enableThinking = true;
711
+ }
712
+ else if (thinkingMode === 'disabled') {
713
+ enableThinking = false;
714
+ }
715
+ else {
716
+ enableThinking = capabilities.includes(Thinking);
717
+ }
718
+ const handle = new DeepSeekModelHandle(client, modelId, ctx.id, deepseekConfig.contextLength, deepseekConfig.maxTokens, enableThinking, capabilities);
719
+ ctx.provide('llm', handle, {
720
+ label: `${baseLabel} / ${modelId}${enableThinking ? ' (thinking)' : ''}`,
721
+ entryId: `${ctx.id}/${modelId}`,
722
+ });
723
+ }
724
+ ctx.logger.info(`已连接: ${deepseekConfig.baseUrl},注册 ${allModelIds.length} 个 model entry (thinkingMode=${thinkingMode})`);
725
+ }
726
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@aalis/plugin-llm-deepseek",
3
+ "version": "0.9.0",
4
+ "license": "MIT",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/AalisLabs/Aalis.git",
8
+ "directory": "packages/plugin-llm-deepseek"
9
+ },
10
+ "author": "Ace Nyan <ace@acenyan.com>",
11
+ "bugs": {
12
+ "url": "https://github.com/AalisLabs/Aalis/issues"
13
+ },
14
+ "homepage": "https://github.com/AalisLabs/Aalis#readme",
15
+ "description": "DeepSeek LLM 提供者(深度思考 + 工具调用)",
16
+ "type": "module",
17
+ "keywords": [
18
+ "aalis",
19
+ "aalis-plugin"
20
+ ],
21
+ "main": "dist/index.js",
22
+ "types": "dist/index.d.ts",
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "dependencies": {
27
+ "@aalis/schema-config": ">=0.9.0 <1.0.0",
28
+ "@aalis/api-llm": ">=0.9.0 <1.0.0",
29
+ "@aalis/schema-message": ">=0.5.1 <1.0.0",
30
+ "@aalis/util-text-normalize": ">=0.5.1 <1.0.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^22.0.0",
34
+ "typescript": "^5.7.0",
35
+ "@aalis/api-webui": "0.9.0",
36
+ "@aalis/core": "0.10.0",
37
+ "@aalis/api-tools": "0.5.1"
38
+ },
39
+ "peerDependencies": {
40
+ "@aalis/core": ">=0.2.0 <1.0.0"
41
+ },
42
+ "aalis": {
43
+ "service": {
44
+ "provides": [
45
+ "llm"
46
+ ]
47
+ }
48
+ },
49
+ "scripts": {
50
+ "build": "tsc",
51
+ "dev": "tsc --watch"
52
+ }
53
+ }