mozi-bot 1.0.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.
Files changed (259) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +467 -0
  3. package/dist/agents/agent.d.ts +118 -0
  4. package/dist/agents/agent.d.ts.map +1 -0
  5. package/dist/agents/agent.js +686 -0
  6. package/dist/agents/agent.js.map +1 -0
  7. package/dist/agents/compaction.d.ts +78 -0
  8. package/dist/agents/compaction.d.ts.map +1 -0
  9. package/dist/agents/compaction.js +350 -0
  10. package/dist/agents/compaction.js.map +1 -0
  11. package/dist/agents/failover-error.d.ts +42 -0
  12. package/dist/agents/failover-error.d.ts.map +1 -0
  13. package/dist/agents/failover-error.js +171 -0
  14. package/dist/agents/failover-error.js.map +1 -0
  15. package/dist/agents/index.d.ts +10 -0
  16. package/dist/agents/index.d.ts.map +1 -0
  17. package/dist/agents/index.js +10 -0
  18. package/dist/agents/index.js.map +1 -0
  19. package/dist/agents/model-fallback.d.ts +54 -0
  20. package/dist/agents/model-fallback.d.ts.map +1 -0
  21. package/dist/agents/model-fallback.js +227 -0
  22. package/dist/agents/model-fallback.js.map +1 -0
  23. package/dist/agents/session-store.d.ts +53 -0
  24. package/dist/agents/session-store.d.ts.map +1 -0
  25. package/dist/agents/session-store.js +217 -0
  26. package/dist/agents/session-store.js.map +1 -0
  27. package/dist/agents/system-prompt.d.ts +29 -0
  28. package/dist/agents/system-prompt.d.ts.map +1 -0
  29. package/dist/agents/system-prompt.js +299 -0
  30. package/dist/agents/system-prompt.js.map +1 -0
  31. package/dist/channels/common/base.d.ts +40 -0
  32. package/dist/channels/common/base.d.ts.map +1 -0
  33. package/dist/channels/common/base.js +23 -0
  34. package/dist/channels/common/base.js.map +1 -0
  35. package/dist/channels/common/index.d.ts +21 -0
  36. package/dist/channels/common/index.d.ts.map +1 -0
  37. package/dist/channels/common/index.js +66 -0
  38. package/dist/channels/common/index.js.map +1 -0
  39. package/dist/channels/dingtalk/api.d.ts +30 -0
  40. package/dist/channels/dingtalk/api.d.ts.map +1 -0
  41. package/dist/channels/dingtalk/api.js +149 -0
  42. package/dist/channels/dingtalk/api.js.map +1 -0
  43. package/dist/channels/dingtalk/events.d.ts +80 -0
  44. package/dist/channels/dingtalk/events.d.ts.map +1 -0
  45. package/dist/channels/dingtalk/events.js +92 -0
  46. package/dist/channels/dingtalk/events.js.map +1 -0
  47. package/dist/channels/dingtalk/index.d.ts +51 -0
  48. package/dist/channels/dingtalk/index.d.ts.map +1 -0
  49. package/dist/channels/dingtalk/index.js +231 -0
  50. package/dist/channels/dingtalk/index.js.map +1 -0
  51. package/dist/channels/dingtalk/stream.d.ts +31 -0
  52. package/dist/channels/dingtalk/stream.d.ts.map +1 -0
  53. package/dist/channels/dingtalk/stream.js +116 -0
  54. package/dist/channels/dingtalk/stream.js.map +1 -0
  55. package/dist/channels/feishu/api.d.ts +33 -0
  56. package/dist/channels/feishu/api.d.ts.map +1 -0
  57. package/dist/channels/feishu/api.js +120 -0
  58. package/dist/channels/feishu/api.js.map +1 -0
  59. package/dist/channels/feishu/events.d.ts +87 -0
  60. package/dist/channels/feishu/events.d.ts.map +1 -0
  61. package/dist/channels/feishu/events.js +163 -0
  62. package/dist/channels/feishu/events.js.map +1 -0
  63. package/dist/channels/feishu/index.d.ts +46 -0
  64. package/dist/channels/feishu/index.d.ts.map +1 -0
  65. package/dist/channels/feishu/index.js +207 -0
  66. package/dist/channels/feishu/index.js.map +1 -0
  67. package/dist/channels/feishu/websocket.d.ts +32 -0
  68. package/dist/channels/feishu/websocket.d.ts.map +1 -0
  69. package/dist/channels/feishu/websocket.js +121 -0
  70. package/dist/channels/feishu/websocket.js.map +1 -0
  71. package/dist/channels/index.d.ts +9 -0
  72. package/dist/channels/index.d.ts.map +1 -0
  73. package/dist/channels/index.js +9 -0
  74. package/dist/channels/index.js.map +1 -0
  75. package/dist/cli/index.d.ts +6 -0
  76. package/dist/cli/index.d.ts.map +1 -0
  77. package/dist/cli/index.js +468 -0
  78. package/dist/cli/index.js.map +1 -0
  79. package/dist/commands/index.d.ts +54 -0
  80. package/dist/commands/index.d.ts.map +1 -0
  81. package/dist/commands/index.js +171 -0
  82. package/dist/commands/index.js.map +1 -0
  83. package/dist/config/index.d.ts +201 -0
  84. package/dist/config/index.d.ts.map +1 -0
  85. package/dist/config/index.js +261 -0
  86. package/dist/config/index.js.map +1 -0
  87. package/dist/gateway/index.d.ts +5 -0
  88. package/dist/gateway/index.d.ts.map +1 -0
  89. package/dist/gateway/index.js +5 -0
  90. package/dist/gateway/index.js.map +1 -0
  91. package/dist/gateway/server.d.ts +42 -0
  92. package/dist/gateway/server.d.ts.map +1 -0
  93. package/dist/gateway/server.js +235 -0
  94. package/dist/gateway/server.js.map +1 -0
  95. package/dist/hooks/index.d.ts +168 -0
  96. package/dist/hooks/index.d.ts.map +1 -0
  97. package/dist/hooks/index.js +148 -0
  98. package/dist/hooks/index.js.map +1 -0
  99. package/dist/index.d.ts +18 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +29 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/memory/index.d.ts +94 -0
  104. package/dist/memory/index.d.ts.map +1 -0
  105. package/dist/memory/index.js +282 -0
  106. package/dist/memory/index.js.map +1 -0
  107. package/dist/plugins/index.d.ts +57 -0
  108. package/dist/plugins/index.d.ts.map +1 -0
  109. package/dist/plugins/index.js +103 -0
  110. package/dist/plugins/index.js.map +1 -0
  111. package/dist/providers/anthropic-compatible.d.ts +48 -0
  112. package/dist/providers/anthropic-compatible.d.ts.map +1 -0
  113. package/dist/providers/anthropic-compatible.js +380 -0
  114. package/dist/providers/anthropic-compatible.js.map +1 -0
  115. package/dist/providers/base.d.ts +26 -0
  116. package/dist/providers/base.d.ts.map +1 -0
  117. package/dist/providers/base.js +58 -0
  118. package/dist/providers/base.js.map +1 -0
  119. package/dist/providers/custom-openai.d.ts +66 -0
  120. package/dist/providers/custom-openai.d.ts.map +1 -0
  121. package/dist/providers/custom-openai.js +255 -0
  122. package/dist/providers/custom-openai.js.map +1 -0
  123. package/dist/providers/dashscope.d.ts +15 -0
  124. package/dist/providers/dashscope.d.ts.map +1 -0
  125. package/dist/providers/dashscope.js +237 -0
  126. package/dist/providers/dashscope.js.map +1 -0
  127. package/dist/providers/deepseek.d.ts +10 -0
  128. package/dist/providers/deepseek.d.ts.map +1 -0
  129. package/dist/providers/deepseek.js +57 -0
  130. package/dist/providers/deepseek.js.map +1 -0
  131. package/dist/providers/index.d.ts +33 -0
  132. package/dist/providers/index.d.ts.map +1 -0
  133. package/dist/providers/index.js +142 -0
  134. package/dist/providers/index.js.map +1 -0
  135. package/dist/providers/kimi.d.ts +10 -0
  136. package/dist/providers/kimi.d.ts.map +1 -0
  137. package/dist/providers/kimi.js +83 -0
  138. package/dist/providers/kimi.js.map +1 -0
  139. package/dist/providers/minimax.d.ts +20 -0
  140. package/dist/providers/minimax.d.ts.map +1 -0
  141. package/dist/providers/minimax.js +252 -0
  142. package/dist/providers/minimax.js.map +1 -0
  143. package/dist/providers/modelscope.d.ts +15 -0
  144. package/dist/providers/modelscope.d.ts.map +1 -0
  145. package/dist/providers/modelscope.js +237 -0
  146. package/dist/providers/modelscope.js.map +1 -0
  147. package/dist/providers/openai-compatible.d.ts +57 -0
  148. package/dist/providers/openai-compatible.d.ts.map +1 -0
  149. package/dist/providers/openai-compatible.js +193 -0
  150. package/dist/providers/openai-compatible.js.map +1 -0
  151. package/dist/providers/stepfun.d.ts +10 -0
  152. package/dist/providers/stepfun.d.ts.map +1 -0
  153. package/dist/providers/stepfun.js +125 -0
  154. package/dist/providers/stepfun.js.map +1 -0
  155. package/dist/providers/zhipu.d.ts +15 -0
  156. package/dist/providers/zhipu.d.ts.map +1 -0
  157. package/dist/providers/zhipu.js +247 -0
  158. package/dist/providers/zhipu.js.map +1 -0
  159. package/dist/sessions/index.d.ts +6 -0
  160. package/dist/sessions/index.d.ts.map +1 -0
  161. package/dist/sessions/index.js +6 -0
  162. package/dist/sessions/index.js.map +1 -0
  163. package/dist/sessions/store.d.ts +45 -0
  164. package/dist/sessions/store.d.ts.map +1 -0
  165. package/dist/sessions/store.js +268 -0
  166. package/dist/sessions/store.js.map +1 -0
  167. package/dist/sessions/types.d.ts +110 -0
  168. package/dist/sessions/types.d.ts.map +1 -0
  169. package/dist/sessions/types.js +6 -0
  170. package/dist/sessions/types.js.map +1 -0
  171. package/dist/tools/builtin/apply-patch.d.ts +8 -0
  172. package/dist/tools/builtin/apply-patch.d.ts.map +1 -0
  173. package/dist/tools/builtin/apply-patch.js +272 -0
  174. package/dist/tools/builtin/apply-patch.js.map +1 -0
  175. package/dist/tools/builtin/bash.d.ts +25 -0
  176. package/dist/tools/builtin/bash.d.ts.map +1 -0
  177. package/dist/tools/builtin/bash.js +212 -0
  178. package/dist/tools/builtin/bash.js.map +1 -0
  179. package/dist/tools/builtin/browser.d.ts +12 -0
  180. package/dist/tools/builtin/browser.d.ts.map +1 -0
  181. package/dist/tools/builtin/browser.js +693 -0
  182. package/dist/tools/builtin/browser.js.map +1 -0
  183. package/dist/tools/builtin/filesystem.d.ts +29 -0
  184. package/dist/tools/builtin/filesystem.d.ts.map +1 -0
  185. package/dist/tools/builtin/filesystem.js +484 -0
  186. package/dist/tools/builtin/filesystem.js.map +1 -0
  187. package/dist/tools/builtin/image.d.ts +13 -0
  188. package/dist/tools/builtin/image.d.ts.map +1 -0
  189. package/dist/tools/builtin/image.js +126 -0
  190. package/dist/tools/builtin/image.js.map +1 -0
  191. package/dist/tools/builtin/index.d.ts +30 -0
  192. package/dist/tools/builtin/index.d.ts.map +1 -0
  193. package/dist/tools/builtin/index.js +55 -0
  194. package/dist/tools/builtin/index.js.map +1 -0
  195. package/dist/tools/builtin/process-registry.d.ts +71 -0
  196. package/dist/tools/builtin/process-registry.d.ts.map +1 -0
  197. package/dist/tools/builtin/process-registry.js +172 -0
  198. package/dist/tools/builtin/process-registry.js.map +1 -0
  199. package/dist/tools/builtin/process-tool.d.ts +8 -0
  200. package/dist/tools/builtin/process-tool.d.ts.map +1 -0
  201. package/dist/tools/builtin/process-tool.js +279 -0
  202. package/dist/tools/builtin/process-tool.js.map +1 -0
  203. package/dist/tools/builtin/subagent.d.ts +33 -0
  204. package/dist/tools/builtin/subagent.d.ts.map +1 -0
  205. package/dist/tools/builtin/subagent.js +185 -0
  206. package/dist/tools/builtin/subagent.js.map +1 -0
  207. package/dist/tools/builtin/system.d.ts +11 -0
  208. package/dist/tools/builtin/system.d.ts.map +1 -0
  209. package/dist/tools/builtin/system.js +144 -0
  210. package/dist/tools/builtin/system.js.map +1 -0
  211. package/dist/tools/builtin/web.d.ts +9 -0
  212. package/dist/tools/builtin/web.d.ts.map +1 -0
  213. package/dist/tools/builtin/web.js +87 -0
  214. package/dist/tools/builtin/web.js.map +1 -0
  215. package/dist/tools/common.d.ts +45 -0
  216. package/dist/tools/common.d.ts.map +1 -0
  217. package/dist/tools/common.js +129 -0
  218. package/dist/tools/common.js.map +1 -0
  219. package/dist/tools/index.d.ts +8 -0
  220. package/dist/tools/index.d.ts.map +1 -0
  221. package/dist/tools/index.js +8 -0
  222. package/dist/tools/index.js.map +1 -0
  223. package/dist/tools/registry.d.ts +33 -0
  224. package/dist/tools/registry.d.ts.map +1 -0
  225. package/dist/tools/registry.js +174 -0
  226. package/dist/tools/registry.js.map +1 -0
  227. package/dist/tools/types.d.ts +58 -0
  228. package/dist/tools/types.d.ts.map +1 -0
  229. package/dist/tools/types.js +11 -0
  230. package/dist/tools/types.js.map +1 -0
  231. package/dist/types/index.d.ts +280 -0
  232. package/dist/types/index.d.ts.map +1 -0
  233. package/dist/types/index.js +34 -0
  234. package/dist/types/index.js.map +1 -0
  235. package/dist/utils/index.d.ts +35 -0
  236. package/dist/utils/index.d.ts.map +1 -0
  237. package/dist/utils/index.js +114 -0
  238. package/dist/utils/index.js.map +1 -0
  239. package/dist/utils/logger.d.ts +24 -0
  240. package/dist/utils/logger.d.ts.map +1 -0
  241. package/dist/utils/logger.js +94 -0
  242. package/dist/utils/logger.js.map +1 -0
  243. package/dist/web/index.d.ts +7 -0
  244. package/dist/web/index.d.ts.map +1 -0
  245. package/dist/web/index.js +7 -0
  246. package/dist/web/index.js.map +1 -0
  247. package/dist/web/static.d.ts +12 -0
  248. package/dist/web/static.d.ts.map +1 -0
  249. package/dist/web/static.js +1260 -0
  250. package/dist/web/static.js.map +1 -0
  251. package/dist/web/types.d.ts +95 -0
  252. package/dist/web/types.d.ts.map +1 -0
  253. package/dist/web/types.js +5 -0
  254. package/dist/web/types.js.map +1 -0
  255. package/dist/web/websocket.d.ts +58 -0
  256. package/dist/web/websocket.d.ts.map +1 -0
  257. package/dist/web/websocket.js +371 -0
  258. package/dist/web/websocket.js.map +1 -0
  259. package/package.json +89 -0
@@ -0,0 +1,380 @@
1
+ /**
2
+ * Anthropic 兼容提供商
3
+ * 支持 Anthropic 原生 API 格式,可配置 API 地址、模型和 API Key
4
+ */
5
+ import { BaseProvider } from "./base.js";
6
+ export class AnthropicCompatibleProvider extends BaseProvider {
7
+ customHeaders;
8
+ apiVersion;
9
+ constructor(config) {
10
+ const models = config.models.map((m) => ({
11
+ id: m.id,
12
+ name: m.name ?? m.id,
13
+ provider: config.id,
14
+ api: "anthropic",
15
+ contextWindow: m.contextWindow ?? 200000,
16
+ maxTokens: m.maxTokens ?? 8192,
17
+ supportsVision: m.supportsVision ?? false,
18
+ supportsReasoning: false,
19
+ }));
20
+ const providerConfig = {
21
+ id: config.id,
22
+ name: config.name,
23
+ baseUrl: config.baseUrl,
24
+ apiKey: config.apiKey,
25
+ api: "anthropic",
26
+ models,
27
+ };
28
+ super(providerConfig);
29
+ this.customHeaders = config.headers ?? {};
30
+ this.apiVersion = config.apiVersion ?? "2023-06-01";
31
+ this.logger = this.logger.child({ provider: config.id });
32
+ }
33
+ getHeaders() {
34
+ return {
35
+ "Content-Type": "application/json",
36
+ "x-api-key": this.apiKey ?? "",
37
+ "anthropic-version": this.apiVersion,
38
+ ...this.customHeaders,
39
+ };
40
+ }
41
+ /** 安全解析工具参数(处理拼接 JSON 的情况) */
42
+ safeParseArguments(argsStr) {
43
+ if (!argsStr || argsStr.trim() === "" || argsStr.trim() === "{}") {
44
+ return {};
45
+ }
46
+ try {
47
+ return JSON.parse(argsStr);
48
+ }
49
+ catch {
50
+ // 尝试提取第一个完整的 JSON 对象(括号匹配)
51
+ let depth = 0;
52
+ for (let i = 0; i < argsStr.length; i++) {
53
+ if (argsStr[i] === "{")
54
+ depth++;
55
+ else if (argsStr[i] === "}") {
56
+ depth--;
57
+ if (depth === 0) {
58
+ try {
59
+ return JSON.parse(argsStr.slice(0, i + 1));
60
+ }
61
+ catch {
62
+ break;
63
+ }
64
+ }
65
+ }
66
+ }
67
+ return {};
68
+ }
69
+ }
70
+ /** 转换消息格式 */
71
+ convertMessages(messages) {
72
+ let system;
73
+ const anthropicMessages = [];
74
+ for (const msg of messages) {
75
+ if (msg.role === "system") {
76
+ // 系统消息单独处理
77
+ system = typeof msg.content === "string"
78
+ ? msg.content
79
+ : Array.isArray(msg.content)
80
+ ? msg.content.filter((p) => p.type === "text").map((p) => p.text).join("\n")
81
+ : "";
82
+ continue;
83
+ }
84
+ if (msg.role === "tool") {
85
+ // 工具结果消息转换为 tool_result
86
+ const toolResult = {
87
+ type: "tool_result",
88
+ tool_use_id: msg.tool_call_id,
89
+ content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content),
90
+ };
91
+ anthropicMessages.push({
92
+ role: "user",
93
+ content: [toolResult],
94
+ });
95
+ continue;
96
+ }
97
+ const role = msg.role === "assistant" ? "assistant" : "user";
98
+ let content;
99
+ if (typeof msg.content === "string") {
100
+ content = msg.content;
101
+ }
102
+ else if (Array.isArray(msg.content)) {
103
+ content = msg.content.map((part) => {
104
+ if (part.type === "text") {
105
+ return { type: "text", text: part.text };
106
+ }
107
+ else if (part.type === "image") {
108
+ return {
109
+ type: "image",
110
+ source: {
111
+ type: "base64",
112
+ media_type: part.mediaType ?? "image/jpeg",
113
+ data: part.base64,
114
+ },
115
+ };
116
+ }
117
+ return { type: "text", text: "" };
118
+ });
119
+ }
120
+ else {
121
+ content = "";
122
+ }
123
+ // 如果是 assistant 消息且有 tool_calls,添加 tool_use 块
124
+ if (msg.role === "assistant" && msg.tool_calls) {
125
+ const blocks = [];
126
+ if (typeof content === "string" && content) {
127
+ blocks.push({ type: "text", text: content });
128
+ }
129
+ else if (Array.isArray(content)) {
130
+ blocks.push(...content);
131
+ }
132
+ for (const tc of msg.tool_calls) {
133
+ blocks.push({
134
+ type: "tool_use",
135
+ id: tc.id,
136
+ name: tc.function.name,
137
+ input: this.safeParseArguments(tc.function.arguments),
138
+ });
139
+ }
140
+ anthropicMessages.push({ role: "assistant", content: blocks });
141
+ }
142
+ else {
143
+ anthropicMessages.push({ role, content });
144
+ }
145
+ }
146
+ return { system, messages: anthropicMessages };
147
+ }
148
+ /** 转换工具定义 */
149
+ convertTools(tools) {
150
+ if (!tools || tools.length === 0)
151
+ return undefined;
152
+ return tools.map((tool) => ({
153
+ name: tool.function.name,
154
+ description: tool.function.description ?? "",
155
+ input_schema: tool.function.parameters,
156
+ }));
157
+ }
158
+ /** 聊天完成 */
159
+ async chat(request) {
160
+ const url = `${this.baseUrl}/messages`;
161
+ const { system, messages } = this.convertMessages(request.messages);
162
+ const body = {
163
+ model: request.model,
164
+ messages,
165
+ max_tokens: request.maxTokens ?? 4096,
166
+ temperature: request.temperature,
167
+ top_p: request.topP,
168
+ stream: false,
169
+ };
170
+ if (system) {
171
+ body.system = system;
172
+ }
173
+ const tools = this.convertTools(request.tools);
174
+ if (tools) {
175
+ body.tools = tools;
176
+ if (request.tool_choice === "auto") {
177
+ body.tool_choice = { type: "auto" };
178
+ }
179
+ else if (request.tool_choice === "none") {
180
+ // Anthropic 不支持 none,不设置 tool_choice
181
+ }
182
+ else if (typeof request.tool_choice === "object") {
183
+ body.tool_choice = { type: "tool", name: request.tool_choice.function.name };
184
+ }
185
+ }
186
+ this.logger.debug({ url, model: request.model, hasTools: !!tools }, "Sending chat request");
187
+ try {
188
+ const response = await fetch(url, {
189
+ method: "POST",
190
+ headers: this.getHeaders(),
191
+ body: JSON.stringify(body),
192
+ });
193
+ if (!response.ok) {
194
+ const errorText = await response.text();
195
+ throw new Error(`HTTP ${response.status}: ${errorText}`);
196
+ }
197
+ const data = (await response.json());
198
+ // 提取文本内容
199
+ let textContent = "";
200
+ const toolCalls = [];
201
+ for (const block of data.content) {
202
+ if (block.type === "text") {
203
+ textContent += block.text ?? "";
204
+ }
205
+ else if (block.type === "tool_use") {
206
+ toolCalls.push({
207
+ id: block.id,
208
+ type: "function",
209
+ function: {
210
+ name: block.name,
211
+ arguments: JSON.stringify(block.input ?? {}),
212
+ },
213
+ });
214
+ }
215
+ }
216
+ return {
217
+ id: data.id,
218
+ model: data.model,
219
+ content: textContent,
220
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
221
+ usage: {
222
+ promptTokens: data.usage.input_tokens,
223
+ completionTokens: data.usage.output_tokens,
224
+ totalTokens: data.usage.input_tokens + data.usage.output_tokens,
225
+ },
226
+ finishReason: data.stop_reason === "tool_use" ? "tool_calls" : "stop",
227
+ };
228
+ }
229
+ catch (error) {
230
+ this.handleError(error, "chat");
231
+ }
232
+ }
233
+ /** 流式聊天 */
234
+ async *chatStream(request) {
235
+ const url = `${this.baseUrl}/messages`;
236
+ const { system, messages } = this.convertMessages(request.messages);
237
+ const body = {
238
+ model: request.model,
239
+ messages,
240
+ max_tokens: request.maxTokens ?? 4096,
241
+ temperature: request.temperature,
242
+ top_p: request.topP,
243
+ stream: true,
244
+ };
245
+ if (system) {
246
+ body.system = system;
247
+ }
248
+ const tools = this.convertTools(request.tools);
249
+ if (tools) {
250
+ body.tools = tools;
251
+ if (request.tool_choice === "auto") {
252
+ body.tool_choice = { type: "auto" };
253
+ }
254
+ }
255
+ this.logger.debug({ url, model: request.model }, "Sending stream chat request");
256
+ try {
257
+ const response = await fetch(url, {
258
+ method: "POST",
259
+ headers: this.getHeaders(),
260
+ body: JSON.stringify(body),
261
+ });
262
+ if (!response.ok) {
263
+ const errorText = await response.text();
264
+ throw new Error(`HTTP ${response.status}: ${errorText}`);
265
+ }
266
+ const reader = response.body?.getReader();
267
+ if (!reader) {
268
+ throw new Error("Response body is not readable");
269
+ }
270
+ const decoder = new TextDecoder();
271
+ let buffer = "";
272
+ let currentId = "";
273
+ // 使用 tool_use id 作为 key,而非 index (更可靠)
274
+ const toolCallsInProgress = new Map();
275
+ let currentToolCallId = ""; // 跟踪当前正在处理的 tool call
276
+ while (true) {
277
+ const { done, value } = await reader.read();
278
+ if (done)
279
+ break;
280
+ buffer += decoder.decode(value, { stream: true });
281
+ const lines = buffer.split("\n");
282
+ buffer = lines.pop() ?? "";
283
+ for (const line of lines) {
284
+ const trimmed = line.trim();
285
+ if (!trimmed || !trimmed.startsWith("data: "))
286
+ continue;
287
+ try {
288
+ const event = JSON.parse(trimmed.slice(6));
289
+ // 调试日志:记录所有事件
290
+ this.logger.debug({ eventType: event.type, event }, "Stream event received");
291
+ if (event.type === "message_start" && event.message) {
292
+ currentId = event.message.id;
293
+ }
294
+ else if (event.type === "content_block_start" && event.content_block) {
295
+ // 重置当前工具调用 ID(每次新 content block 开始时)
296
+ currentToolCallId = "";
297
+ if (event.content_block.type === "tool_use") {
298
+ const toolId = event.content_block.id;
299
+ currentToolCallId = toolId;
300
+ this.logger.debug({ toolId, name: event.content_block.name, index: event.index }, "Tool use block started");
301
+ toolCallsInProgress.set(toolId, {
302
+ id: toolId,
303
+ name: event.content_block.name,
304
+ arguments: "",
305
+ index: event.index ?? toolCallsInProgress.size,
306
+ });
307
+ }
308
+ }
309
+ else if (event.type === "content_block_delta" && event.delta) {
310
+ if (event.delta.type === "text_delta" && event.delta.text) {
311
+ yield {
312
+ id: currentId,
313
+ delta: event.delta.text,
314
+ };
315
+ }
316
+ else if (event.delta.type === "input_json_delta" && event.delta.partial_json) {
317
+ // 使用 currentToolCallId 来找到正确的 tool call
318
+ this.logger.debug({
319
+ currentToolCallId,
320
+ partial_json: event.delta.partial_json,
321
+ toolCallsInProgressKeys: Array.from(toolCallsInProgress.keys()),
322
+ }, "input_json_delta received");
323
+ const tc = toolCallsInProgress.get(currentToolCallId);
324
+ if (tc) {
325
+ tc.arguments += event.delta.partial_json;
326
+ this.logger.debug({
327
+ toolId: tc.id,
328
+ name: tc.name,
329
+ argsLength: tc.arguments.length,
330
+ }, "Tool arguments updated");
331
+ yield {
332
+ id: currentId,
333
+ delta: "",
334
+ toolCallDeltas: [{
335
+ index: tc.index,
336
+ id: tc.id,
337
+ type: "function",
338
+ function: {
339
+ name: tc.name,
340
+ arguments: event.delta.partial_json,
341
+ },
342
+ }],
343
+ };
344
+ }
345
+ else {
346
+ this.logger.warn({
347
+ currentToolCallId,
348
+ partial_json: event.delta.partial_json,
349
+ }, "Received input_json_delta but no matching tool call found");
350
+ }
351
+ }
352
+ }
353
+ else if (event.type === "content_block_stop") {
354
+ // content block 结束,重置 currentToolCallId
355
+ currentToolCallId = "";
356
+ }
357
+ else if (event.type === "message_stop") {
358
+ yield {
359
+ id: currentId,
360
+ delta: "",
361
+ finishReason: toolCallsInProgress.size > 0 ? "tool_calls" : "stop",
362
+ };
363
+ }
364
+ }
365
+ catch {
366
+ // 忽略解析错误
367
+ }
368
+ }
369
+ }
370
+ }
371
+ catch (error) {
372
+ this.handleError(error, "chatStream");
373
+ }
374
+ }
375
+ }
376
+ /** 创建自定义 Anthropic 兼容提供商 */
377
+ export function createAnthropicCompatibleProvider(config) {
378
+ return new AnthropicCompatibleProvider(config);
379
+ }
380
+ //# sourceMappingURL=anthropic-compatible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-compatible.js","sourceRoot":"","sources":["../../src/providers/anthropic-compatible.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 模型提供商基类
3
+ */
4
+ import type { ChatCompletionRequest, ChatCompletionResponse, StreamChunk, ProviderConfig, ProviderId } from "../types/index.js";
5
+ export declare abstract class BaseProvider {
6
+ protected config: ProviderConfig;
7
+ protected logger: import("pino").Logger;
8
+ constructor(config: ProviderConfig);
9
+ get id(): ProviderId;
10
+ get name(): string;
11
+ get baseUrl(): string;
12
+ get apiKey(): string | undefined;
13
+ /** 获取请求头 */
14
+ protected getHeaders(): Record<string, string>;
15
+ /** 聊天完成 */
16
+ abstract chat(request: ChatCompletionRequest): Promise<ChatCompletionResponse>;
17
+ /** 流式聊天 */
18
+ abstract chatStream(request: ChatCompletionRequest): AsyncGenerator<StreamChunk, void, unknown>;
19
+ /** 检查模型是否支持 */
20
+ supportsModel(modelId: string): boolean;
21
+ /** 获取模型列表 */
22
+ getModels(): import("../types/index.js").ModelDefinition[];
23
+ /** 处理错误 */
24
+ protected handleError(error: unknown, context: string): never;
25
+ }
26
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,WAAW,EACX,cAAc,EACd,UAAU,EAEX,MAAM,mBAAmB,CAAC;AAG3B,8BAAsB,YAAY;IAChC,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC;IACjC,SAAS,CAAC,MAAM,wBAA8B;gBAElC,MAAM,EAAE,cAAc;IAIlC,IAAI,EAAE,IAAI,UAAU,CAEnB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAED,YAAY;IACZ,SAAS,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAa9C,WAAW;IACX,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAE9E,WAAW;IACX,QAAQ,CAAC,UAAU,CACjB,OAAO,EAAE,qBAAqB,GAC7B,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC;IAE7C,eAAe;IACf,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIvC,aAAa;IACb,SAAS;IAIT,WAAW;IACX,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK;CAgB9D"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 模型提供商基类
3
+ */
4
+ import { getChildLogger } from "../utils/logger.js";
5
+ export class BaseProvider {
6
+ config;
7
+ logger = getChildLogger("provider");
8
+ constructor(config) {
9
+ this.config = config;
10
+ }
11
+ get id() {
12
+ return this.config.id;
13
+ }
14
+ get name() {
15
+ return this.config.name;
16
+ }
17
+ get baseUrl() {
18
+ return this.config.baseUrl;
19
+ }
20
+ get apiKey() {
21
+ return this.config.apiKey;
22
+ }
23
+ /** 获取请求头 */
24
+ getHeaders() {
25
+ const headers = {
26
+ "Content-Type": "application/json",
27
+ ...this.config.headers,
28
+ };
29
+ if (this.apiKey) {
30
+ headers["Authorization"] = `Bearer ${this.apiKey}`;
31
+ }
32
+ return headers;
33
+ }
34
+ /** 检查模型是否支持 */
35
+ supportsModel(modelId) {
36
+ return this.config.models.some((m) => m.id === modelId);
37
+ }
38
+ /** 获取模型列表 */
39
+ getModels() {
40
+ return this.config.models;
41
+ }
42
+ /** 处理错误 */
43
+ handleError(error, context) {
44
+ const message = error instanceof Error ? error.message : String(error);
45
+ const providerId = this.config.id;
46
+ this.logger.error({ error, context }, `Provider error: ${message}`);
47
+ class ProviderErrorImpl extends Error {
48
+ code = "PROVIDER_ERROR";
49
+ provider = providerId;
50
+ constructor() {
51
+ super(`[${context}] ${message}`);
52
+ this.name = "ProviderError";
53
+ }
54
+ }
55
+ throw new ProviderErrorImpl();
56
+ }
57
+ }
58
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,OAAgB,YAAY;IACtB,MAAM,CAAiB;IACvB,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAE9C,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,YAAY;IACF,UAAU;QAClB,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;SACvB,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACrD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAUD,eAAe;IACf,aAAa,CAAC,OAAe;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,aAAa;IACb,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,WAAW;IACD,WAAW,CAAC,KAAc,EAAE,OAAe;QACnD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,mBAAmB,OAAO,EAAE,CAAC,CAAC;QAEpE,MAAM,iBAAkB,SAAQ,KAAK;YACnC,IAAI,GAAG,gBAAgB,CAAC;YACxB,QAAQ,GAAG,UAAU,CAAC;YACtB;gBACE,KAAK,CAAC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC;gBACjC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;YAC9B,CAAC;SACF;QAED,MAAM,IAAI,iBAAiB,EAAE,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * 自定义 OpenAI 兼容提供商
3
+ * 允许用户配置自定义的 API 地址、模型和 API Key
4
+ * 可用于 OpenAI、Azure OpenAI、本地 LLM (Ollama, vLLM 等) 或其他兼容 API
5
+ */
6
+ import { OpenAICompatibleProvider } from "./openai-compatible.js";
7
+ /** 自定义 OpenAI 兼容提供商配置 */
8
+ export interface CustomOpenAIProviderConfig {
9
+ /** 提供商 ID (唯一标识) */
10
+ id: string;
11
+ /** 提供商名称 (显示名称) */
12
+ name: string;
13
+ /** API 基础 URL (例如: https://api.openai.com/v1) */
14
+ baseUrl: string;
15
+ /** API Key */
16
+ apiKey: string;
17
+ /** 可用模型列表 */
18
+ models: Array<{
19
+ /** 模型 ID */
20
+ id: string;
21
+ /** 模型名称 (可选,默认使用 id) */
22
+ name?: string;
23
+ /** 上下文窗口大小 (可选,默认 128000) */
24
+ contextWindow?: number;
25
+ /** 最大输出 token 数 (可选,默认 4096) */
26
+ maxTokens?: number;
27
+ /** 是否支持视觉 (可选,默认 false) */
28
+ supportsVision?: boolean;
29
+ /** 是否支持推理 (可选,默认 false) */
30
+ supportsReasoning?: boolean;
31
+ /** 成本配置 (可选) */
32
+ cost?: {
33
+ input: number;
34
+ output: number;
35
+ };
36
+ }>;
37
+ /** 自定义请求头 (可选) */
38
+ headers?: Record<string, string>;
39
+ }
40
+ export declare class CustomOpenAIProvider extends OpenAICompatibleProvider {
41
+ private customHeaders;
42
+ constructor(config: CustomOpenAIProviderConfig);
43
+ protected getHeaders(): Record<string, string>;
44
+ }
45
+ /** 创建自定义 OpenAI 兼容提供商 */
46
+ export declare function createCustomOpenAIProvider(config: CustomOpenAIProviderConfig): CustomOpenAIProvider;
47
+ /** 预设配置:OpenAI 官方 */
48
+ export declare function createOpenAIProvider(apiKey: string, baseUrl?: string): CustomOpenAIProvider;
49
+ /** 预设配置:Azure OpenAI */
50
+ export declare function createAzureOpenAIProvider(config: {
51
+ endpoint: string;
52
+ apiKey: string;
53
+ deploymentId: string;
54
+ apiVersion?: string;
55
+ }): CustomOpenAIProvider;
56
+ /** 预设配置:Ollama 本地模型 */
57
+ export declare function createOllamaProvider(baseUrl?: string, models?: string[]): CustomOpenAIProvider;
58
+ /** 预设配置:vLLM */
59
+ export declare function createVLLMProvider(baseUrl: string, models: string[]): CustomOpenAIProvider;
60
+ /** 预设配置:OpenRouter */
61
+ export declare function createOpenRouterProvider(apiKey: string): CustomOpenAIProvider;
62
+ /** 预设配置:Together AI */
63
+ export declare function createTogetherProvider(apiKey: string): CustomOpenAIProvider;
64
+ /** 预设配置:Groq */
65
+ export declare function createGroqProvider(apiKey: string): CustomOpenAIProvider;
66
+ //# sourceMappingURL=custom-openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-openai.d.ts","sourceRoot":"","sources":["../../src/providers/custom-openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGlE,yBAAyB;AACzB,MAAM,WAAW,0BAA0B;IACzC,oBAAoB;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,aAAa;IACb,MAAM,EAAE,KAAK,CAAC;QACZ,YAAY;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,wBAAwB;QACxB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,6BAA6B;QAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,gCAAgC;QAChC,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,2BAA2B;QAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,2BAA2B;QAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,gBAAgB;QAChB,IAAI,CAAC,EAAE;YACL,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC,CAAC;IACH,kBAAkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,qBAAa,oBAAqB,SAAQ,wBAAwB;IAChE,OAAO,CAAC,aAAa,CAAyB;gBAElC,MAAM,EAAE,0BAA0B;cA2B3B,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAMxD;AAED,yBAAyB;AACzB,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,0BAA0B,GAAG,oBAAoB,CAEnG;AAED,qBAAqB;AACrB,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAwD3F;AAED,wBAAwB;AACxB,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,oBAAoB,CAkBvB;AAED,uBAAuB;AACvB,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,oBAAoB,CAe9F;AAED,gBAAgB;AAChB,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,oBAAoB,CAa1F;AAED,sBAAsB;AACtB,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAwC7E;AAED,uBAAuB;AACvB,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CA6B3E;AAED,gBAAgB;AAChB,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CA2BvE"}