@tachu/extensions 1.0.0-alpha.1

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.
Files changed (210) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/LICENSE +201 -0
  3. package/README.md +1104 -0
  4. package/README_ZH.md +1082 -0
  5. package/dist/backends/file.d.ts +18 -0
  6. package/dist/backends/file.d.ts.map +1 -0
  7. package/dist/backends/file.js +85 -0
  8. package/dist/backends/file.js.map +1 -0
  9. package/dist/backends/index.d.ts +4 -0
  10. package/dist/backends/index.d.ts.map +1 -0
  11. package/dist/backends/index.js +4 -0
  12. package/dist/backends/index.js.map +1 -0
  13. package/dist/backends/terminal.d.ts +18 -0
  14. package/dist/backends/terminal.d.ts.map +1 -0
  15. package/dist/backends/terminal.js +81 -0
  16. package/dist/backends/terminal.js.map +1 -0
  17. package/dist/backends/web.d.ts +18 -0
  18. package/dist/backends/web.d.ts.map +1 -0
  19. package/dist/backends/web.js +55 -0
  20. package/dist/backends/web.js.map +1 -0
  21. package/dist/common/net.d.ts +39 -0
  22. package/dist/common/net.d.ts.map +1 -0
  23. package/dist/common/net.js +177 -0
  24. package/dist/common/net.js.map +1 -0
  25. package/dist/common/path.d.ts +51 -0
  26. package/dist/common/path.d.ts.map +1 -0
  27. package/dist/common/path.js +76 -0
  28. package/dist/common/path.js.map +1 -0
  29. package/dist/common/process.d.ts +19 -0
  30. package/dist/common/process.d.ts.map +1 -0
  31. package/dist/common/process.js +67 -0
  32. package/dist/common/process.js.map +1 -0
  33. package/dist/index.d.ts +13 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +13 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/mcp/index.d.ts +3 -0
  38. package/dist/mcp/index.d.ts.map +1 -0
  39. package/dist/mcp/index.js +3 -0
  40. package/dist/mcp/index.js.map +1 -0
  41. package/dist/mcp/sse-adapter.d.ts +82 -0
  42. package/dist/mcp/sse-adapter.d.ts.map +1 -0
  43. package/dist/mcp/sse-adapter.js +201 -0
  44. package/dist/mcp/sse-adapter.js.map +1 -0
  45. package/dist/mcp/stdio-adapter.d.ts +85 -0
  46. package/dist/mcp/stdio-adapter.d.ts.map +1 -0
  47. package/dist/mcp/stdio-adapter.js +203 -0
  48. package/dist/mcp/stdio-adapter.js.map +1 -0
  49. package/dist/memory/fs-memory-system.d.ts +147 -0
  50. package/dist/memory/fs-memory-system.d.ts.map +1 -0
  51. package/dist/memory/fs-memory-system.js +266 -0
  52. package/dist/memory/fs-memory-system.js.map +1 -0
  53. package/dist/memory/index.d.ts +2 -0
  54. package/dist/memory/index.d.ts.map +1 -0
  55. package/dist/memory/index.js +2 -0
  56. package/dist/memory/index.js.map +1 -0
  57. package/dist/observability/index.d.ts +3 -0
  58. package/dist/observability/index.d.ts.map +1 -0
  59. package/dist/observability/index.js +3 -0
  60. package/dist/observability/index.js.map +1 -0
  61. package/dist/observability/jsonl-emitter.d.ts +58 -0
  62. package/dist/observability/jsonl-emitter.d.ts.map +1 -0
  63. package/dist/observability/jsonl-emitter.js +96 -0
  64. package/dist/observability/jsonl-emitter.js.map +1 -0
  65. package/dist/observability/otel-emitter.d.ts +52 -0
  66. package/dist/observability/otel-emitter.d.ts.map +1 -0
  67. package/dist/observability/otel-emitter.js +143 -0
  68. package/dist/observability/otel-emitter.js.map +1 -0
  69. package/dist/providers/anthropic.d.ts +73 -0
  70. package/dist/providers/anthropic.d.ts.map +1 -0
  71. package/dist/providers/anthropic.js +521 -0
  72. package/dist/providers/anthropic.js.map +1 -0
  73. package/dist/providers/index.d.ts +5 -0
  74. package/dist/providers/index.d.ts.map +1 -0
  75. package/dist/providers/index.js +5 -0
  76. package/dist/providers/index.js.map +1 -0
  77. package/dist/providers/mock.d.ts +81 -0
  78. package/dist/providers/mock.d.ts.map +1 -0
  79. package/dist/providers/mock.js +160 -0
  80. package/dist/providers/mock.js.map +1 -0
  81. package/dist/providers/openai.d.ts +95 -0
  82. package/dist/providers/openai.d.ts.map +1 -0
  83. package/dist/providers/openai.js +529 -0
  84. package/dist/providers/openai.js.map +1 -0
  85. package/dist/providers/qwen.d.ts +145 -0
  86. package/dist/providers/qwen.d.ts.map +1 -0
  87. package/dist/providers/qwen.js +669 -0
  88. package/dist/providers/qwen.js.map +1 -0
  89. package/dist/rules/index.d.ts +9 -0
  90. package/dist/rules/index.d.ts.map +1 -0
  91. package/dist/rules/index.js +15 -0
  92. package/dist/rules/index.js.map +1 -0
  93. package/dist/rules/no-hallucination.md +11 -0
  94. package/dist/rules/no-sensitive-output.md +11 -0
  95. package/dist/rules/prefer-concise-response.md +11 -0
  96. package/dist/rules/require-tool-verification.md +11 -0
  97. package/dist/safety/default-gate.d.ts +112 -0
  98. package/dist/safety/default-gate.d.ts.map +1 -0
  99. package/dist/safety/default-gate.js +188 -0
  100. package/dist/safety/default-gate.js.map +1 -0
  101. package/dist/safety/index.d.ts +2 -0
  102. package/dist/safety/index.d.ts.map +1 -0
  103. package/dist/safety/index.js +2 -0
  104. package/dist/safety/index.js.map +1 -0
  105. package/dist/tools/_shared/web-client.d.ts +18 -0
  106. package/dist/tools/_shared/web-client.d.ts.map +1 -0
  107. package/dist/tools/_shared/web-client.js +46 -0
  108. package/dist/tools/_shared/web-client.js.map +1 -0
  109. package/dist/tools/apply-patch/descriptor.md +27 -0
  110. package/dist/tools/apply-patch/executor.d.ts +19 -0
  111. package/dist/tools/apply-patch/executor.d.ts.map +1 -0
  112. package/dist/tools/apply-patch/executor.js +193 -0
  113. package/dist/tools/apply-patch/executor.js.map +1 -0
  114. package/dist/tools/fetch-url/descriptor.md +44 -0
  115. package/dist/tools/fetch-url/executor.d.ts +28 -0
  116. package/dist/tools/fetch-url/executor.d.ts.map +1 -0
  117. package/dist/tools/fetch-url/executor.js +115 -0
  118. package/dist/tools/fetch-url/executor.js.map +1 -0
  119. package/dist/tools/index.d.ts +12 -0
  120. package/dist/tools/index.d.ts.map +1 -0
  121. package/dist/tools/index.js +286 -0
  122. package/dist/tools/index.js.map +1 -0
  123. package/dist/tools/list-dir/descriptor.md +29 -0
  124. package/dist/tools/list-dir/executor.d.ts +22 -0
  125. package/dist/tools/list-dir/executor.d.ts.map +1 -0
  126. package/dist/tools/list-dir/executor.js +48 -0
  127. package/dist/tools/list-dir/executor.js.map +1 -0
  128. package/dist/tools/read-file/descriptor.md +28 -0
  129. package/dist/tools/read-file/executor.d.ts +15 -0
  130. package/dist/tools/read-file/executor.d.ts.map +1 -0
  131. package/dist/tools/read-file/executor.js +22 -0
  132. package/dist/tools/read-file/executor.js.map +1 -0
  133. package/dist/tools/run-shell/descriptor.md +39 -0
  134. package/dist/tools/run-shell/executor.d.ts +20 -0
  135. package/dist/tools/run-shell/executor.d.ts.map +1 -0
  136. package/dist/tools/run-shell/executor.js +76 -0
  137. package/dist/tools/run-shell/executor.js.map +1 -0
  138. package/dist/tools/search-code/descriptor.md +31 -0
  139. package/dist/tools/search-code/executor.d.ts +23 -0
  140. package/dist/tools/search-code/executor.d.ts.map +1 -0
  141. package/dist/tools/search-code/executor.js +122 -0
  142. package/dist/tools/search-code/executor.js.map +1 -0
  143. package/dist/tools/shared.d.ts +47 -0
  144. package/dist/tools/shared.d.ts.map +1 -0
  145. package/dist/tools/shared.js +27 -0
  146. package/dist/tools/shared.js.map +1 -0
  147. package/dist/tools/web-fetch/descriptor.md +198 -0
  148. package/dist/tools/web-fetch/errors.d.ts +32 -0
  149. package/dist/tools/web-fetch/errors.d.ts.map +1 -0
  150. package/dist/tools/web-fetch/errors.js +91 -0
  151. package/dist/tools/web-fetch/errors.js.map +1 -0
  152. package/dist/tools/web-fetch/executor.d.ts +10 -0
  153. package/dist/tools/web-fetch/executor.d.ts.map +1 -0
  154. package/dist/tools/web-fetch/executor.js +191 -0
  155. package/dist/tools/web-fetch/executor.js.map +1 -0
  156. package/dist/tools/web-fetch/index.d.ts +4 -0
  157. package/dist/tools/web-fetch/index.d.ts.map +1 -0
  158. package/dist/tools/web-fetch/index.js +3 -0
  159. package/dist/tools/web-fetch/index.js.map +1 -0
  160. package/dist/tools/web-fetch/types.d.ts +157 -0
  161. package/dist/tools/web-fetch/types.d.ts.map +1 -0
  162. package/dist/tools/web-fetch/types.js +7 -0
  163. package/dist/tools/web-fetch/types.js.map +1 -0
  164. package/dist/tools/web-search/descriptor.md +89 -0
  165. package/dist/tools/web-search/errors.d.ts +33 -0
  166. package/dist/tools/web-search/errors.d.ts.map +1 -0
  167. package/dist/tools/web-search/errors.js +45 -0
  168. package/dist/tools/web-search/errors.js.map +1 -0
  169. package/dist/tools/web-search/executor.d.ts +10 -0
  170. package/dist/tools/web-search/executor.d.ts.map +1 -0
  171. package/dist/tools/web-search/executor.js +185 -0
  172. package/dist/tools/web-search/executor.js.map +1 -0
  173. package/dist/tools/web-search/index.d.ts +4 -0
  174. package/dist/tools/web-search/index.d.ts.map +1 -0
  175. package/dist/tools/web-search/index.js +3 -0
  176. package/dist/tools/web-search/index.js.map +1 -0
  177. package/dist/tools/web-search/types.d.ts +86 -0
  178. package/dist/tools/web-search/types.d.ts.map +1 -0
  179. package/dist/tools/web-search/types.js +7 -0
  180. package/dist/tools/web-search/types.js.map +1 -0
  181. package/dist/tools/write-file/descriptor.md +30 -0
  182. package/dist/tools/write-file/executor.d.ts +16 -0
  183. package/dist/tools/write-file/executor.d.ts.map +1 -0
  184. package/dist/tools/write-file/executor.js +18 -0
  185. package/dist/tools/write-file/executor.js.map +1 -0
  186. package/dist/transformers/document-to-text.d.ts +23 -0
  187. package/dist/transformers/document-to-text.d.ts.map +1 -0
  188. package/dist/transformers/document-to-text.js +69 -0
  189. package/dist/transformers/document-to-text.js.map +1 -0
  190. package/dist/transformers/image-to-text.d.ts +38 -0
  191. package/dist/transformers/image-to-text.d.ts.map +1 -0
  192. package/dist/transformers/image-to-text.js +82 -0
  193. package/dist/transformers/image-to-text.js.map +1 -0
  194. package/dist/transformers/index.d.ts +3 -0
  195. package/dist/transformers/index.d.ts.map +1 -0
  196. package/dist/transformers/index.js +3 -0
  197. package/dist/transformers/index.js.map +1 -0
  198. package/dist/vector/index.d.ts +3 -0
  199. package/dist/vector/index.d.ts.map +1 -0
  200. package/dist/vector/index.js +3 -0
  201. package/dist/vector/index.js.map +1 -0
  202. package/dist/vector/local-fs.d.ts +76 -0
  203. package/dist/vector/local-fs.d.ts.map +1 -0
  204. package/dist/vector/local-fs.js +153 -0
  205. package/dist/vector/local-fs.js.map +1 -0
  206. package/dist/vector/qdrant.d.ts +85 -0
  207. package/dist/vector/qdrant.d.ts.map +1 -0
  208. package/dist/vector/qdrant.js +208 -0
  209. package/dist/vector/qdrant.js.map +1 -0
  210. package/package.json +74 -0
@@ -0,0 +1,529 @@
1
+ import OpenAI from "openai";
2
+ import { createTiktokenTokenizer } from "@tachu/core";
3
+ import { ProviderError, TimeoutError, } from "@tachu/core";
4
+ import { withAbortTimeout } from "../common/net";
5
+ const DEFAULT_TIMEOUT_MS = 60_000;
6
+ const inferModelCapabilities = (modelName) => {
7
+ const lowered = modelName.toLowerCase();
8
+ const vision = lowered.includes("gpt-4o") ||
9
+ lowered.includes("o1") ||
10
+ lowered.includes("o3") ||
11
+ lowered.includes("vision") ||
12
+ /** Gemini 系与显式带 image 的生图/多模态模型名(如 geekai 上的 gemini flash image) */
13
+ lowered.includes("gemini") ||
14
+ lowered.includes("image-preview") ||
15
+ lowered.includes("flash-image");
16
+ const longContext = lowered.includes("128k") || lowered.includes("200k");
17
+ return {
18
+ supportedModalities: vision ? ["text", "image"] : ["text"],
19
+ maxContextTokens: longContext ? 200_000 : 128_000,
20
+ supportsStreaming: true,
21
+ supportsFunctionCalling: true,
22
+ };
23
+ };
24
+ const toOpenAiTools = (tools) => {
25
+ if (!tools || tools.length === 0) {
26
+ return undefined;
27
+ }
28
+ return tools.map((tool) => ({
29
+ type: "function",
30
+ function: {
31
+ name: tool.name,
32
+ description: tool.description,
33
+ parameters: tool.inputSchema,
34
+ },
35
+ }));
36
+ };
37
+ const mapMessageContent = (content) => {
38
+ if (typeof content === "string") {
39
+ return content;
40
+ }
41
+ return content.map((part) => {
42
+ if (part.type === "text") {
43
+ return { type: "text", text: part.text };
44
+ }
45
+ return {
46
+ type: "image_url",
47
+ image_url: part.image_url,
48
+ };
49
+ });
50
+ };
51
+ const mapMessage = (message) => {
52
+ if (message.role === "tool") {
53
+ return {
54
+ role: "tool",
55
+ content: typeof message.content === "string"
56
+ ? message.content
57
+ : message.content
58
+ .map((part) => (part.type === "text" ? part.text : ""))
59
+ .join(""),
60
+ tool_call_id: message.toolCallId ?? message.name ?? "tool-call",
61
+ };
62
+ }
63
+ if (message.role === "assistant" && message.toolCalls && message.toolCalls.length > 0) {
64
+ // ADR-0002:回灌 Agentic Loop 历史时,assistant 消息可能伴随结构化 tool_calls。
65
+ // OpenAI 协议:`message.tool_calls: [{ id, type: "function", function: { name, arguments } }]`。
66
+ // `arguments` 必须是 JSON 字符串(OpenAI SDK 的类型约束),此处对 object 做 stringify。
67
+ const textContent = typeof message.content === "string"
68
+ ? message.content
69
+ : message.content
70
+ .map((part) => (part.type === "text" ? part.text : ""))
71
+ .join("");
72
+ return {
73
+ role: "assistant",
74
+ content: textContent.length > 0 ? textContent : null,
75
+ tool_calls: message.toolCalls.map((call) => ({
76
+ id: call.id,
77
+ type: "function",
78
+ function: {
79
+ name: call.name,
80
+ arguments: JSON.stringify(call.arguments ?? {}),
81
+ },
82
+ })),
83
+ ...(message.name ? { name: message.name } : {}),
84
+ };
85
+ }
86
+ return {
87
+ role: message.role,
88
+ content: mapMessageContent(message.content),
89
+ ...(message.name ? { name: message.name } : {}),
90
+ };
91
+ };
92
+ /**
93
+ * 把 OpenAI 原生响应里的 `tool_calls` 数组解析为结构化 `ToolCallRequest[]`。
94
+ *
95
+ * - `arguments` 是官方 SDK 类型规定的 JSON 字符串;解析失败意味着模型返回了非法
96
+ * JSON,抛 `PROVIDER_TOOL_ARGUMENTS_INVALID` 让上游 Agentic Loop 决定如何处置。
97
+ * - 空参数字符串(LLM 偶尔会发 `""`)统一视为 `{}`,与 Claude / OpenAI 官方示例一致。
98
+ */
99
+ const parseOpenAiToolCalls = (raw) => {
100
+ if (!Array.isArray(raw) || raw.length === 0) {
101
+ return undefined;
102
+ }
103
+ const out = [];
104
+ for (const entry of raw) {
105
+ if (!entry || typeof entry !== "object")
106
+ continue;
107
+ const obj = entry;
108
+ const id = typeof obj.id === "string" && obj.id.length > 0 ? obj.id : `call-${out.length}`;
109
+ const name = typeof obj.function?.name === "string" ? obj.function.name : "";
110
+ if (name.length === 0)
111
+ continue;
112
+ const rawArgs = obj.function?.arguments;
113
+ let parsedArgs = {};
114
+ if (typeof rawArgs === "string" && rawArgs.trim().length > 0) {
115
+ try {
116
+ const parsed = JSON.parse(rawArgs);
117
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
118
+ parsedArgs = parsed;
119
+ }
120
+ else {
121
+ throw new Error("tool arguments must be a JSON object");
122
+ }
123
+ }
124
+ catch (err) {
125
+ throw new ProviderError("PROVIDER_TOOL_ARGUMENTS_INVALID", `OpenAI 返回的工具调用 ${name} 参数不是合法 JSON`, { cause: err, retryable: true });
126
+ }
127
+ }
128
+ else if (rawArgs && typeof rawArgs === "object" && !Array.isArray(rawArgs)) {
129
+ // 兼容:部分 SDK 直接返回对象。
130
+ parsedArgs = rawArgs;
131
+ }
132
+ out.push({ id, name, arguments: parsedArgs });
133
+ }
134
+ return out.length > 0 ? out : undefined;
135
+ };
136
+ /**
137
+ * OpenAI `finish_reason` → 统一 `ChatFinishReason` 映射。
138
+ */
139
+ const mapOpenAiFinishReason = (raw) => {
140
+ if (raw === "stop")
141
+ return "stop";
142
+ if (raw === "tool_calls" || raw === "function_call")
143
+ return "tool_calls";
144
+ if (raw === "length")
145
+ return "length";
146
+ if (raw === "content_filter")
147
+ return "content_filter";
148
+ if (raw === null || raw === undefined)
149
+ return "unknown";
150
+ return "unknown";
151
+ };
152
+ const extractContent = (content) => {
153
+ if (typeof content === "string") {
154
+ return content;
155
+ }
156
+ if (Array.isArray(content)) {
157
+ return content
158
+ .map((item) => {
159
+ if (typeof item === "string") {
160
+ return item;
161
+ }
162
+ if (item && typeof item === "object" && "text" in item) {
163
+ const text = item.text;
164
+ return typeof text === "string" ? text : "";
165
+ }
166
+ return "";
167
+ })
168
+ .join("");
169
+ }
170
+ return "";
171
+ };
172
+ const mapProviderError = (error) => {
173
+ if (error instanceof TimeoutError) {
174
+ return error;
175
+ }
176
+ if (error instanceof ProviderError) {
177
+ return error;
178
+ }
179
+ const candidate = error;
180
+ const message = candidate.message ?? "OpenAI 调用失败";
181
+ if (candidate.status === 401) {
182
+ return new ProviderError("PROVIDER_AUTH_FAILED", message, { cause: error });
183
+ }
184
+ if (candidate.status === 429) {
185
+ return new ProviderError("PROVIDER_RATE_LIMITED", message, {
186
+ cause: error,
187
+ retryable: true,
188
+ });
189
+ }
190
+ if ((candidate.status ?? 0) >= 500) {
191
+ return new ProviderError("PROVIDER_UPSTREAM_ERROR", message, {
192
+ cause: error,
193
+ retryable: true,
194
+ });
195
+ }
196
+ if (candidate.code === "ETIMEDOUT" || candidate.code === "ECONNABORTED") {
197
+ return new TimeoutError("TIMEOUT_PROVIDER_REQUEST", message, {
198
+ cause: error,
199
+ retryable: true,
200
+ });
201
+ }
202
+ return new ProviderError("PROVIDER_CALL_FAILED", message, {
203
+ cause: error,
204
+ retryable: true,
205
+ });
206
+ };
207
+ /**
208
+ * OpenAI 官方 Provider Adapter。
209
+ */
210
+ export class OpenAIProviderAdapter {
211
+ id = "openai";
212
+ name = "OpenAI";
213
+ client;
214
+ /** 用于识别百炼 OpenAI 兼容端点(`compatible-mode/v1`),以便修正 SSE 请求头。 */
215
+ resolvedBaseURL;
216
+ timeoutMs;
217
+ tokenizerCache = new Map();
218
+ /**
219
+ * `listAvailableModels` 的 TTL 缓存(D1-LOW-22)。
220
+ * 避免在 `checkCapabilities` / CLI `--verbose` 等高频路径下反复拉取远端模型列表。
221
+ * 默认 TTL 60s,可通过 `OpenAIProviderOptions.modelListCacheTtlMs` 覆盖(0 / 负值关闭缓存)。
222
+ */
223
+ modelListCache = null;
224
+ modelListCacheTtlMs;
225
+ /**
226
+ * 创建 OpenAI Provider。
227
+ *
228
+ * @param options Provider 配置
229
+ * @throws ProviderError 当缺失凭据时抛出
230
+ */
231
+ constructor(options = {}) {
232
+ const apiKey = options.apiKey ?? process.env.OPENAI_API_KEY;
233
+ if (!apiKey) {
234
+ throw new ProviderError("PROVIDER_MISSING_CREDENTIALS", "缺少 OPENAI_API_KEY 或 options.apiKey");
235
+ }
236
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
237
+ this.modelListCacheTtlMs = options.modelListCacheTtlMs ?? 60_000;
238
+ this.resolvedBaseURL = options.baseURL;
239
+ this.client = new OpenAI({
240
+ ...(options.extra ?? {}),
241
+ apiKey,
242
+ baseURL: options.baseURL,
243
+ organization: options.organization,
244
+ project: options.project,
245
+ });
246
+ }
247
+ /**
248
+ * 百炼要求:`X-DashScope-SSE=enable` 仅与 `stream=true` 同发;非流式须 `disable`。
249
+ * 流式请求在兼容端点上显式带 `enable`,避免构造器里误配 `disable` 时与 `stream=true` 冲突。
250
+ */
251
+ isDashScopeCompatibleBaseUrl() {
252
+ const u = this.resolvedBaseURL ?? "";
253
+ return u.toLowerCase().includes("dashscope");
254
+ }
255
+ /**
256
+ * 非流式请求需覆盖构造器里可能存在的 `X-DashScope-SSE=enable`(与 `stream=false` 互斥)。
257
+ * `baseURL` 为空时使用 SDK 默认官方端点,不附加百炼头。
258
+ */
259
+ dashScopeSseDisableHeaderForNonStream() {
260
+ const u = (this.resolvedBaseURL ?? "").trim().toLowerCase();
261
+ if (u.length === 0 || u.includes("api.openai.com")) {
262
+ return undefined;
263
+ }
264
+ return { "X-DashScope-SSE": "disable" };
265
+ }
266
+ /**
267
+ * 真实查询 OpenAI 可用模型列表。
268
+ *
269
+ * 带 TTL 缓存;默认 60s,可通过构造选项 `modelListCacheTtlMs` 调整,<=0 关闭缓存。
270
+ *
271
+ * @returns 模型能力列表
272
+ */
273
+ async listAvailableModels() {
274
+ const ttl = this.modelListCacheTtlMs;
275
+ if (ttl > 0 && this.modelListCache && Date.now() - this.modelListCache.at < ttl) {
276
+ return this.modelListCache.value;
277
+ }
278
+ try {
279
+ const response = await this.client.models.list();
280
+ const models = "data" in response ? response.data : [];
281
+ const result = models.map((item) => ({
282
+ modelName: item.id,
283
+ capabilities: inferModelCapabilities(item.id),
284
+ }));
285
+ if (ttl > 0) {
286
+ this.modelListCache = { at: Date.now(), value: result };
287
+ }
288
+ return result;
289
+ }
290
+ catch (error) {
291
+ throw mapProviderError(error);
292
+ }
293
+ }
294
+ /**
295
+ * 发起非流式对话请求。
296
+ *
297
+ * @param request 对话请求
298
+ * @param signal 可选取消信号
299
+ * @returns 对话响应
300
+ */
301
+ async chat(request, signal) {
302
+ const extended = request;
303
+ const timeout = withAbortTimeout(signal, this.timeoutMs);
304
+ try {
305
+ const body = {
306
+ model: request.model,
307
+ messages: request.messages.map((message) => mapMessage(message)),
308
+ };
309
+ if (request.temperature !== undefined) {
310
+ body.temperature = request.temperature;
311
+ }
312
+ if (request.maxTokens !== undefined) {
313
+ body.max_tokens = request.maxTokens;
314
+ }
315
+ if (extended.topP !== undefined) {
316
+ body.top_p = extended.topP;
317
+ }
318
+ if (extended.stop) {
319
+ body.stop = extended.stop;
320
+ }
321
+ const tools = toOpenAiTools(request.tools);
322
+ if (tools) {
323
+ body.tools = tools;
324
+ }
325
+ body.tool_choice =
326
+ extended.toolChoice === "required"
327
+ ? "required"
328
+ : extended.toolChoice && typeof extended.toolChoice === "object"
329
+ ? { type: "function", function: { name: extended.toolChoice.function.name } }
330
+ : "auto";
331
+ if (extended.responseFormat) {
332
+ body.response_format = extended.responseFormat;
333
+ }
334
+ const sseNonStream = this.dashScopeSseDisableHeaderForNonStream();
335
+ const response = await this.client.chat.completions.create(body, {
336
+ signal: timeout.signal,
337
+ ...(sseNonStream ? { headers: sseNonStream } : {}),
338
+ });
339
+ const choice = response.choices[0];
340
+ const content = extractContent(choice?.message?.content ?? "");
341
+ const toolCalls = parseOpenAiToolCalls(choice?.message?.tool_calls);
342
+ const finishReason = mapOpenAiFinishReason(choice?.finish_reason);
343
+ return {
344
+ content,
345
+ ...(toolCalls ? { toolCalls } : {}),
346
+ finishReason,
347
+ usage: {
348
+ promptTokens: response.usage?.prompt_tokens ?? 0,
349
+ completionTokens: response.usage?.completion_tokens ?? 0,
350
+ totalTokens: response.usage?.total_tokens ?? 0,
351
+ },
352
+ };
353
+ }
354
+ catch (error) {
355
+ throw mapProviderError(error);
356
+ }
357
+ finally {
358
+ timeout.cleanup();
359
+ }
360
+ }
361
+ /**
362
+ * 发起流式对话请求。
363
+ *
364
+ * @param request 对话请求
365
+ * @param signal 可选取消信号
366
+ * @returns 文本增量流
367
+ */
368
+ async *chatStream(request, signal) {
369
+ const extended = request;
370
+ const timeout = withAbortTimeout(signal, this.timeoutMs);
371
+ try {
372
+ const stream = await this.client.chat.completions.create((() => {
373
+ const body = {
374
+ model: request.model,
375
+ messages: request.messages.map((message) => mapMessage(message)),
376
+ stream: true,
377
+ };
378
+ if (request.temperature !== undefined) {
379
+ body.temperature = request.temperature;
380
+ }
381
+ if (request.maxTokens !== undefined) {
382
+ body.max_tokens = request.maxTokens;
383
+ }
384
+ if (extended.topP !== undefined) {
385
+ body.top_p = extended.topP;
386
+ }
387
+ if (extended.stop) {
388
+ body.stop = extended.stop;
389
+ }
390
+ const tools = toOpenAiTools(request.tools);
391
+ if (tools) {
392
+ body.tools = tools;
393
+ }
394
+ body.tool_choice =
395
+ extended.toolChoice === "required"
396
+ ? "required"
397
+ : extended.toolChoice && typeof extended.toolChoice === "object"
398
+ ? { type: "function", function: { name: extended.toolChoice.function.name } }
399
+ : "auto";
400
+ if (extended.responseFormat) {
401
+ body.response_format = extended.responseFormat;
402
+ }
403
+ return body;
404
+ })(), {
405
+ signal: timeout.signal,
406
+ ...(this.isDashScopeCompatibleBaseUrl()
407
+ ? { headers: { "X-DashScope-SSE": "enable" } }
408
+ : {}),
409
+ });
410
+ // 按 index 聚合 tool_call 分片:
411
+ // OpenAI Stream 把多 tool_call 按 `index` 投递增量(id/name 可能只在第一片出现,
412
+ // `arguments` 跨片拼接)。我们在 stream 期间即时转发 `tool-call-delta`,
413
+ // 并在 `finish_reason` 到达时聚合产出 `tool-call-complete`,最后发 `finish`。
414
+ const toolCallBuffer = new Map();
415
+ let finishReason = "unknown";
416
+ for await (const chunk of stream) {
417
+ if (timeout.signal.aborted) {
418
+ throw timeout.signal.reason ?? new Error("aborted");
419
+ }
420
+ const choice = chunk.choices[0];
421
+ const delta = choice?.delta;
422
+ const text = extractContent(delta?.content ?? "");
423
+ if (text) {
424
+ yield { type: "text-delta", delta: text };
425
+ }
426
+ const toolDelta = Array.isArray(delta?.tool_calls) ? delta.tool_calls : undefined;
427
+ if (toolDelta) {
428
+ for (const entry of toolDelta) {
429
+ const index = typeof entry.index === "number" ? entry.index : 0;
430
+ const id = typeof entry.id === "string" ? entry.id : undefined;
431
+ const name = typeof entry.function?.name === "string" ? entry.function.name : undefined;
432
+ const argumentsDelta = typeof entry.function?.arguments === "string"
433
+ ? entry.function.arguments
434
+ : undefined;
435
+ const buffered = toolCallBuffer.get(index) ?? { arguments: "" };
436
+ if (id)
437
+ buffered.id = id;
438
+ if (name)
439
+ buffered.name = name;
440
+ if (argumentsDelta)
441
+ buffered.arguments += argumentsDelta;
442
+ toolCallBuffer.set(index, buffered);
443
+ yield {
444
+ type: "tool-call-delta",
445
+ index,
446
+ ...(id ? { id } : {}),
447
+ ...(name ? { name } : {}),
448
+ ...(argumentsDelta ? { argumentsDelta } : {}),
449
+ };
450
+ }
451
+ }
452
+ if (choice?.finish_reason) {
453
+ finishReason = mapOpenAiFinishReason(choice.finish_reason);
454
+ break;
455
+ }
456
+ }
457
+ // 聚合阶段:把 buffer 里的 tool_call 逐一解析为 `ToolCallRequest` 并发 complete 事件。
458
+ if (toolCallBuffer.size > 0) {
459
+ const indices = [...toolCallBuffer.keys()].sort((a, b) => a - b);
460
+ for (const index of indices) {
461
+ const entry = toolCallBuffer.get(index);
462
+ const name = entry.name ?? "";
463
+ if (name.length === 0)
464
+ continue;
465
+ const id = entry.id ?? `call-${index}`;
466
+ let parsedArgs = {};
467
+ const argsText = entry.arguments.trim();
468
+ if (argsText.length > 0) {
469
+ try {
470
+ const parsed = JSON.parse(argsText);
471
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
472
+ parsedArgs = parsed;
473
+ }
474
+ else {
475
+ throw new Error("tool arguments must be a JSON object");
476
+ }
477
+ }
478
+ catch (err) {
479
+ throw new ProviderError("PROVIDER_TOOL_ARGUMENTS_INVALID", `OpenAI stream 聚合后的工具调用 ${name} 参数不是合法 JSON`, { cause: err, retryable: true });
480
+ }
481
+ }
482
+ yield {
483
+ type: "tool-call-complete",
484
+ call: { id, name, arguments: parsedArgs },
485
+ };
486
+ }
487
+ }
488
+ yield { type: "finish", finishReason };
489
+ }
490
+ catch (error) {
491
+ throw mapProviderError(error);
492
+ }
493
+ finally {
494
+ timeout.cleanup();
495
+ }
496
+ }
497
+ /**
498
+ * 使用 tiktoken 计算消息 token。
499
+ *
500
+ * @param messages 消息列表
501
+ * @param model 模型名
502
+ * @returns token 数
503
+ */
504
+ async countTokens(messages, model) {
505
+ const payload = messages
506
+ .map((item) => `${item.role}:${item.name ?? ""}:${item.toolCallId ?? ""}:${item.content}`)
507
+ .join("\n");
508
+ return this.getTokenizer(model).count(payload);
509
+ }
510
+ /**
511
+ * 释放 tokenizer 等资源。
512
+ */
513
+ async dispose() {
514
+ for (const tokenizer of this.tokenizerCache.values()) {
515
+ tokenizer.dispose?.();
516
+ }
517
+ this.tokenizerCache.clear();
518
+ }
519
+ getTokenizer(model) {
520
+ const existing = this.tokenizerCache.get(model);
521
+ if (existing) {
522
+ return existing;
523
+ }
524
+ const tokenizer = createTiktokenTokenizer(model);
525
+ this.tokenizerCache.set(model, tokenizer);
526
+ return tokenizer;
527
+ }
528
+ }
529
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}