@ddlqhd/agent-sdk 0.1.0 → 0.1.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 (48) hide show
  1. package/README.md +4 -2
  2. package/dist/{chunk-NDSL7NPN.js → chunk-742JTNYI.js} +224 -19
  3. package/dist/chunk-742JTNYI.js.map +1 -0
  4. package/dist/{chunk-5QMA2YBY.cjs → chunk-AJD3DTL7.cjs} +57 -28
  5. package/dist/chunk-AJD3DTL7.cjs.map +1 -0
  6. package/dist/{chunk-X35MHWXE.cjs → chunk-DQFTAD3I.cjs} +231 -24
  7. package/dist/chunk-DQFTAD3I.cjs.map +1 -0
  8. package/dist/{chunk-Q3SOMX26.js → chunk-DXMVWGLJ.js} +52 -25
  9. package/dist/chunk-DXMVWGLJ.js.map +1 -0
  10. package/dist/chunk-LOYIGOBZ.js +54 -0
  11. package/dist/chunk-LOYIGOBZ.js.map +1 -0
  12. package/dist/chunk-OZO7D77N.cjs +59 -0
  13. package/dist/chunk-OZO7D77N.cjs.map +1 -0
  14. package/dist/{chunk-JF5AJQMU.cjs → chunk-Q3L4GIBG.cjs} +211 -58
  15. package/dist/chunk-Q3L4GIBG.cjs.map +1 -0
  16. package/dist/{chunk-OHXW2YM6.js → chunk-THKEF32L.js} +210 -57
  17. package/dist/chunk-THKEF32L.js.map +1 -0
  18. package/dist/cli/index.cjs +36 -37
  19. package/dist/cli/index.cjs.map +1 -1
  20. package/dist/cli/index.js +11 -12
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/{index-DPsZ1zat.d.ts → index-DGPDMbW5.d.cts} +8 -21
  23. package/dist/{index-RTPmFjMp.d.cts → index-nEfayAzD.d.ts} +8 -21
  24. package/dist/index.cjs +91 -79
  25. package/dist/index.d.cts +26 -6
  26. package/dist/index.d.ts +26 -6
  27. package/dist/index.js +4 -4
  28. package/dist/models/index.cjs +15 -15
  29. package/dist/models/index.d.cts +50 -6
  30. package/dist/models/index.d.ts +50 -6
  31. package/dist/models/index.js +2 -2
  32. package/dist/tools/index.cjs +51 -51
  33. package/dist/tools/index.d.cts +3 -3
  34. package/dist/tools/index.d.ts +3 -3
  35. package/dist/tools/index.js +2 -2
  36. package/dist/{types-C0aX_Qdp.d.cts → types-BLf9IqRs.d.cts} +34 -49
  37. package/dist/{types-C0aX_Qdp.d.ts → types-BLf9IqRs.d.ts} +34 -49
  38. package/package.json +15 -4
  39. package/dist/chunk-5QMA2YBY.cjs.map +0 -1
  40. package/dist/chunk-CNSGZVRN.cjs +0 -152
  41. package/dist/chunk-CNSGZVRN.cjs.map +0 -1
  42. package/dist/chunk-JF5AJQMU.cjs.map +0 -1
  43. package/dist/chunk-NDSL7NPN.js.map +0 -1
  44. package/dist/chunk-OHXW2YM6.js.map +0 -1
  45. package/dist/chunk-Q3SOMX26.js.map +0 -1
  46. package/dist/chunk-WH3APNQ5.js +0 -147
  47. package/dist/chunk-WH3APNQ5.js.map +0 -1
  48. package/dist/chunk-X35MHWXE.cjs.map +0 -1
package/README.md CHANGED
@@ -21,12 +21,14 @@ A TypeScript library for building AI agents with multi-model support (OpenAI, An
21
21
 
22
22
  ## Installation
23
23
 
24
+ The SDK declares **`zod` as a peer dependency** (v4). Install it alongside the package so your app and the SDK share one `zod` instance (avoids duplicate copies and schema tooling issues).
25
+
24
26
  ```bash
25
- npm install @ddlqhd/agent-sdk
27
+ npm install @ddlqhd/agent-sdk zod
26
28
  ```
27
29
 
28
30
  ```bash
29
- pnpm add @ddlqhd/agent-sdk
31
+ pnpm add @ddlqhd/agent-sdk zod
30
32
  ```
31
33
 
32
34
  ## Documentation
@@ -1,5 +1,28 @@
1
1
  #!/usr/bin/env node
2
- import { BaseModelAdapter, toolsToModelSchema } from './chunk-WH3APNQ5.js';
2
+ import { BaseModelAdapter, toolsToModelSchema } from './chunk-LOYIGOBZ.js';
3
+
4
+ // src/models/request-debug.ts
5
+ var TRUTHY = /^(1|true|yes)$/i;
6
+ function isModelRequestDebugEnabled() {
7
+ const raw = process.env.AGENT_SDK_DEBUG_MODEL_REQUEST;
8
+ if (raw === void 0 || raw === "") {
9
+ return false;
10
+ }
11
+ return TRUTHY.test(String(raw).trim());
12
+ }
13
+ function debugLogModelRequestBody(provider, path, body) {
14
+ if (!isModelRequestDebugEnabled()) {
15
+ return;
16
+ }
17
+ const prefix = `[agent-sdk][model-request][${provider}] ${path}`;
18
+ try {
19
+ const json = body !== null && typeof body === "object" ? JSON.stringify(body, null, 2) : JSON.stringify(body);
20
+ console.error(`${prefix}
21
+ ${json}`);
22
+ } catch {
23
+ console.error(prefix, body);
24
+ }
25
+ }
3
26
 
4
27
  // src/models/openai.ts
5
28
  var OPENAI_CAPABILITIES = {
@@ -199,6 +222,7 @@ var OpenAIAdapter = class extends BaseModelAdapter {
199
222
  return body;
200
223
  }
201
224
  async fetch(path, body, signal) {
225
+ debugLogModelRequestBody("openai", path, body);
202
226
  const headers = {
203
227
  "Content-Type": "application/json",
204
228
  "Authorization": `Bearer ${this.apiKey}`
@@ -226,6 +250,89 @@ function createOpenAI(config) {
226
250
  }
227
251
 
228
252
  // src/models/anthropic.ts
253
+ var DEFAULT_FETCH_RETRY = {
254
+ maxAttempts: 2,
255
+ baseDelayMs: 200,
256
+ maxDelayMs: 2e3
257
+ };
258
+ function normalizeFetchRetry(options) {
259
+ if (options == null) {
260
+ return { ...DEFAULT_FETCH_RETRY };
261
+ }
262
+ const maxAttempts = Math.max(1, Math.floor(options.maxAttempts ?? DEFAULT_FETCH_RETRY.maxAttempts));
263
+ const baseDelayMs = Math.max(0, options.baseDelayMs ?? DEFAULT_FETCH_RETRY.baseDelayMs);
264
+ const maxDelayMs = Math.max(baseDelayMs, options.maxDelayMs ?? DEFAULT_FETCH_RETRY.maxDelayMs);
265
+ return { maxAttempts, baseDelayMs, maxDelayMs };
266
+ }
267
+ function isAbortError(e) {
268
+ if (e instanceof DOMException && e.name === "AbortError") {
269
+ return true;
270
+ }
271
+ return typeof e === "object" && e !== null && e.name === "AbortError";
272
+ }
273
+ function isRetriableFetchError(e) {
274
+ if (isAbortError(e)) {
275
+ return false;
276
+ }
277
+ if (e instanceof TypeError) {
278
+ return true;
279
+ }
280
+ const cause = typeof e === "object" && e !== null && "cause" in e ? e.cause : void 0;
281
+ const code = cause?.code;
282
+ return code === "ECONNRESET" || code === "ETIMEDOUT" || code === "EPIPE" || code === "UND_ERR_SOCKET";
283
+ }
284
+ function isRetriableHttpStatus(status) {
285
+ return status === 429 || status === 502 || status === 503 || status === 504;
286
+ }
287
+ function parseRetryAfterMs(header) {
288
+ if (header == null || header === "") {
289
+ return void 0;
290
+ }
291
+ const trimmed = header.trim();
292
+ const asNum = Number(trimmed);
293
+ if (Number.isFinite(asNum) && asNum >= 0) {
294
+ return asNum * 1e3;
295
+ }
296
+ const parsed = Date.parse(trimmed);
297
+ if (!Number.isNaN(parsed)) {
298
+ const delta = parsed - Date.now();
299
+ return delta > 0 ? delta : 0;
300
+ }
301
+ return void 0;
302
+ }
303
+ function computeBackoffMs(attemptIndex, baseDelayMs, maxDelayMs) {
304
+ const exp = Math.min(maxDelayMs, baseDelayMs * 2 ** attemptIndex);
305
+ const jitter = 0.5 + Math.random() * 0.5;
306
+ return Math.min(maxDelayMs, Math.floor(exp * jitter));
307
+ }
308
+ async function delay(ms, signal) {
309
+ if (ms <= 0) {
310
+ return;
311
+ }
312
+ await new Promise((resolve, reject) => {
313
+ if (signal?.aborted) {
314
+ reject(new DOMException("The operation was aborted.", "AbortError"));
315
+ return;
316
+ }
317
+ const id = setTimeout(() => {
318
+ if (signal) {
319
+ signal.removeEventListener("abort", onAbort);
320
+ }
321
+ resolve();
322
+ }, ms);
323
+ const onAbort = () => {
324
+ clearTimeout(id);
325
+ reject(new DOMException("The operation was aborted.", "AbortError"));
326
+ };
327
+ signal?.addEventListener("abort", onAbort, { once: true });
328
+ });
329
+ }
330
+ async function drainResponseBody(response) {
331
+ try {
332
+ await response.arrayBuffer();
333
+ } catch {
334
+ }
335
+ }
229
336
  var ANTHROPIC_CAPABILITIES = {
230
337
  "claude-sonnet-4-20250514": { contextLength: 2e5, maxOutputTokens: 16384 },
231
338
  "claude-haiku": { contextLength: 2e5, maxOutputTokens: 8192 },
@@ -238,12 +345,16 @@ var AnthropicAdapter = class extends BaseModelAdapter {
238
345
  baseUrl;
239
346
  model;
240
347
  version;
348
+ requestMetadata;
349
+ fetchRetry;
241
350
  constructor(config = {}) {
242
351
  super();
243
352
  this.apiKey = config.apiKey || process.env.ANTHROPIC_API_KEY || "";
244
353
  this.baseUrl = config.baseUrl || process.env.ANTHROPIC_BASE_URL || "https://api.anthropic.com";
245
354
  this.model = config.model || "claude-sonnet-4-20250514";
246
355
  this.version = config.version || "2023-06-01";
356
+ this.requestMetadata = config.metadata;
357
+ this.fetchRetry = normalizeFetchRetry(config.fetchRetry);
247
358
  if (!this.apiKey) {
248
359
  throw new Error("Anthropic API key is required. Set ANTHROPIC_API_KEY environment variable or pass apiKey in config.");
249
360
  }
@@ -455,8 +566,48 @@ var AnthropicAdapter = class extends BaseModelAdapter {
455
566
  input_schema: tool.parameters
456
567
  }));
457
568
  }
569
+ const mergedMetadata = this.mergeAnthropicMetadata(params);
570
+ if (mergedMetadata && Object.keys(mergedMetadata).length > 0) {
571
+ body.metadata = mergedMetadata;
572
+ }
458
573
  return body;
459
574
  }
575
+ /**
576
+ * Build Messages API `metadata`: `sessionId` → `user_id`, merged with resolved adapter `metadata` (dict or fn).
577
+ * Config `metadata` keys override `user_id` when duplicated.
578
+ */
579
+ mergeAnthropicMetadata(params) {
580
+ const extra = this.resolveMetadataExtra(params);
581
+ const hasSession = params.sessionId !== void 0 && params.sessionId !== "";
582
+ if (!hasSession && extra === void 0) {
583
+ return void 0;
584
+ }
585
+ const merged = {};
586
+ if (hasSession) {
587
+ merged.user_id = params.sessionId;
588
+ }
589
+ if (extra !== void 0) {
590
+ Object.assign(merged, extra);
591
+ }
592
+ return Object.keys(merged).length > 0 ? merged : void 0;
593
+ }
594
+ resolveMetadataExtra(params) {
595
+ const raw = this.requestMetadata;
596
+ if (raw == null) {
597
+ return void 0;
598
+ }
599
+ if (typeof raw === "function") {
600
+ const v = raw(params);
601
+ if (typeof v !== "object" || v === null || Array.isArray(v) || Object.keys(v).length === 0) {
602
+ return void 0;
603
+ }
604
+ return { ...v };
605
+ }
606
+ if (typeof raw === "object" && !Array.isArray(raw) && Object.keys(raw).length > 0) {
607
+ return { ...raw };
608
+ }
609
+ return void 0;
610
+ }
460
611
  extractSystemMessage(messages) {
461
612
  const systemMessages = messages.filter((m) => m.role === "system");
462
613
  const otherMessages = messages.filter((m) => m.role !== "system");
@@ -511,8 +662,13 @@ var AnthropicAdapter = class extends BaseModelAdapter {
511
662
  return transformed;
512
663
  });
513
664
  }
665
+ /**
666
+ * 发起 POST;按 `fetchRetry` 对网络错误与 429/502/503/504 重试(不含响应体已开始消费后的 SSE 读失败)。
667
+ */
514
668
  async fetch(path, body, signal) {
515
- return globalThis.fetch(`${this.baseUrl}${path}`, {
669
+ debugLogModelRequestBody("anthropic", path, body);
670
+ const url = `${this.baseUrl}${path}`;
671
+ const init = {
516
672
  method: "POST",
517
673
  headers: {
518
674
  "Content-Type": "application/json",
@@ -521,7 +677,39 @@ var AnthropicAdapter = class extends BaseModelAdapter {
521
677
  },
522
678
  body: JSON.stringify(body),
523
679
  signal
524
- });
680
+ };
681
+ for (let attempt = 0; attempt < this.fetchRetry.maxAttempts; attempt++) {
682
+ if (signal?.aborted) {
683
+ throw new DOMException("The operation was aborted.", "AbortError");
684
+ }
685
+ try {
686
+ const response = await globalThis.fetch(url, init);
687
+ if (response.ok) {
688
+ return response;
689
+ }
690
+ const canRetryHttp = attempt < this.fetchRetry.maxAttempts - 1 && isRetriableHttpStatus(response.status);
691
+ if (canRetryHttp) {
692
+ await drainResponseBody(response);
693
+ const fromHeader = parseRetryAfterMs(response.headers.get("Retry-After"));
694
+ const backoff = computeBackoffMs(attempt, this.fetchRetry.baseDelayMs, this.fetchRetry.maxDelayMs);
695
+ const waitMs = fromHeader != null ? Math.min(fromHeader, this.fetchRetry.maxDelayMs) : backoff;
696
+ await delay(waitMs, signal);
697
+ continue;
698
+ }
699
+ return response;
700
+ } catch (e) {
701
+ if (isAbortError(e) || signal?.aborted) {
702
+ throw e;
703
+ }
704
+ if (attempt < this.fetchRetry.maxAttempts - 1 && isRetriableFetchError(e)) {
705
+ const backoff = computeBackoffMs(attempt, this.fetchRetry.baseDelayMs, this.fetchRetry.maxDelayMs);
706
+ await delay(backoff, signal);
707
+ continue;
708
+ }
709
+ throw e;
710
+ }
711
+ }
712
+ throw new Error("Anthropic fetch: unexpected retry loop exit");
525
713
  }
526
714
  safeParseJSON(str) {
527
715
  try {
@@ -762,6 +950,7 @@ var OllamaAdapter = class extends BaseModelAdapter {
762
950
  return body;
763
951
  }
764
952
  async fetch(path, body, signal) {
953
+ debugLogModelRequestBody("ollama", path, body);
765
954
  return globalThis.fetch(`${this.baseUrl}${path}`, {
766
955
  method: "POST",
767
956
  headers: {
@@ -776,32 +965,48 @@ function createOllama(config) {
776
965
  return new OllamaAdapter(config);
777
966
  }
778
967
 
968
+ // src/core/process-env-merge.ts
969
+ function mergeProcessEnv(overrides) {
970
+ const base = {};
971
+ for (const [key, value] of Object.entries(process.env)) {
972
+ if (typeof value === "string") {
973
+ base[key] = value;
974
+ }
975
+ }
976
+ return overrides ? { ...base, ...overrides } : base;
977
+ }
978
+ function mergeMcpStdioEnv(agentEnv, serverEnv) {
979
+ const merged = mergeProcessEnv(agentEnv);
980
+ return serverEnv ? { ...merged, ...serverEnv } : merged;
981
+ }
982
+
779
983
  // src/models/index.ts
780
- function createModel(config) {
781
- switch (config.provider) {
984
+ function createModel(modelConfig, agentEnv) {
985
+ const merged = mergeProcessEnv(agentEnv);
986
+ switch (modelConfig.provider) {
782
987
  case "openai":
783
988
  return new OpenAIAdapter({
784
- apiKey: config.apiKey,
785
- baseUrl: config.baseUrl,
786
- model: config.model
989
+ apiKey: modelConfig.apiKey || merged.OPENAI_API_KEY || "",
990
+ baseUrl: modelConfig.baseUrl || merged.OPENAI_BASE_URL,
991
+ model: modelConfig.model,
992
+ organization: merged.OPENAI_ORG_ID
787
993
  });
788
994
  case "anthropic":
789
995
  return new AnthropicAdapter({
790
- apiKey: config.apiKey,
791
- baseUrl: config.baseUrl,
792
- model: config.model
996
+ apiKey: modelConfig.apiKey || merged.ANTHROPIC_API_KEY || "",
997
+ baseUrl: modelConfig.baseUrl || merged.ANTHROPIC_BASE_URL,
998
+ model: modelConfig.model
793
999
  });
794
1000
  case "ollama":
795
1001
  return new OllamaAdapter({
796
- baseUrl: config.baseUrl,
797
- model: config.model,
798
- think: config.think
1002
+ baseUrl: modelConfig.baseUrl || merged.OLLAMA_BASE_URL,
1003
+ model: modelConfig.model,
1004
+ think: modelConfig.think
799
1005
  });
800
- default:
801
- throw new Error(`Unknown model provider: ${config.provider}`);
802
1006
  }
1007
+ throw new Error(`Unknown model provider: ${modelConfig.provider}`);
803
1008
  }
804
1009
 
805
- export { AnthropicAdapter, OllamaAdapter, OpenAIAdapter, createAnthropic, createModel, createOllama, createOpenAI, ollamaMessageContentToApiString, ollamaStreamChunksFromChatData };
806
- //# sourceMappingURL=chunk-NDSL7NPN.js.map
807
- //# sourceMappingURL=chunk-NDSL7NPN.js.map
1010
+ export { AnthropicAdapter, OllamaAdapter, OpenAIAdapter, createAnthropic, createModel, createOllama, createOpenAI, mergeMcpStdioEnv, mergeProcessEnv, ollamaMessageContentToApiString, ollamaStreamChunksFromChatData };
1011
+ //# sourceMappingURL=chunk-742JTNYI.js.map
1012
+ //# sourceMappingURL=chunk-742JTNYI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/models/request-debug.ts","../src/models/openai.ts","../src/models/anthropic.ts","../src/models/ollama.ts","../src/core/process-env-merge.ts","../src/models/index.ts"],"names":[],"mappings":"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","file":"chunk-742JTNYI.js","sourcesContent":["/**\n * When `AGENT_SDK_DEBUG_MODEL_REQUEST` is set to `1`, `true`, or `yes` (case-insensitive),\n * model adapters log the JSON request body to stderr before each HTTP call.\n * Use this to verify tools / JSON Schema sent to the provider.\n */\nconst TRUTHY = /^(1|true|yes)$/i;\n\nexport function isModelRequestDebugEnabled(): boolean {\n const raw = process.env.AGENT_SDK_DEBUG_MODEL_REQUEST;\n if (raw === undefined || raw === '') {\n return false;\n }\n return TRUTHY.test(String(raw).trim());\n}\n\n/**\n * @param provider - e.g. `openai`, `anthropic`, `ollama`\n * @param path - request path (e.g. `/chat/completions`)\n * @param body - object that will be JSON.stringify’d for the request\n */\nexport function debugLogModelRequestBody(provider: string, path: string, body: unknown): void {\n if (!isModelRequestDebugEnabled()) {\n return;\n }\n const prefix = `[agent-sdk][model-request][${provider}] ${path}`;\n try {\n const json =\n body !== null && typeof body === 'object'\n ? JSON.stringify(body, null, 2)\n : JSON.stringify(body);\n console.error(`${prefix}\\n${json}`);\n } catch {\n console.error(prefix, body);\n }\n}\n","import type {\n ModelParams,\n ModelCapabilities,\n StreamChunk,\n CompletionResult\n} from '../core/types.js';\nimport { BaseModelAdapter, toolsToModelSchema } from './base.js';\nimport { debugLogModelRequestBody } from './request-debug.js';\n\n/**\n * OpenAI 模型能力映射\n */\nconst OPENAI_CAPABILITIES: Record<string, ModelCapabilities> = {\n 'gpt-4o': { contextLength: 128_000, maxOutputTokens: 16_384 },\n 'gpt-4o-mini': { contextLength: 128_000, maxOutputTokens: 16_384 },\n 'gpt-4-turbo': { contextLength: 128_000, maxOutputTokens: 4_096 },\n 'gpt-4': { contextLength: 8_192, maxOutputTokens: 4_096 },\n 'gpt-3.5-turbo': { contextLength: 16_385, maxOutputTokens: 4_096 },\n};\n\n/**\n * OpenAI 配置\n */\nexport interface OpenAIConfig {\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n organization?: string;\n /** 自定义模型能力 (覆盖默认值) */\n capabilities?: ModelCapabilities;\n}\n\n/**\n * OpenAI 模型适配器\n */\nexport class OpenAIAdapter extends BaseModelAdapter {\n readonly name: string;\n private apiKey: string;\n private baseUrl: string;\n private model: string;\n private organization?: string;\n\n constructor(config: OpenAIConfig = {}) {\n super();\n this.apiKey = config.apiKey || process.env.OPENAI_API_KEY || '';\n this.baseUrl = config.baseUrl || process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1';\n this.model = config.model || 'gpt-4o';\n this.organization = config.organization || process.env.OPENAI_ORG_ID;\n\n if (!this.apiKey) {\n throw new Error('OpenAI API key is required. Set OPENAI_API_KEY environment variable or pass apiKey in config.');\n }\n\n this.name = `openai/${this.model}`;\n\n // 设置模型能力\n this.capabilities = config.capabilities\n ?? OPENAI_CAPABILITIES[this.model]\n ?? { contextLength: 128_000, maxOutputTokens: 4_096 };\n }\n\n async *stream(params: ModelParams): AsyncIterable<StreamChunk> {\n const body = this.buildRequestBody(params, true);\n const response = await this.fetch('/chat/completions', body, params.signal);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${response.status} - ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let currentToolCall: { id: string; name: string; arguments: string } | null = null;\n\n try {\n while (true) {\n if (params.signal?.aborted) {\n reader.cancel();\n break;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed === 'data: [DONE]') continue;\n if (!trimmed.startsWith('data: ')) continue;\n\n try {\n const data = JSON.parse(trimmed.slice(6));\n const choice = data.choices?.[0];\n if (!choice) continue;\n const raw = params.includeRawStreamEvents ? { providerRaw: data as unknown } : {};\n\n // 处理内容增量\n if (choice.delta?.content) {\n yield { type: 'text', content: choice.delta.content, ...raw };\n }\n\n // 处理工具调用\n if (choice.delta?.tool_calls) {\n for (const toolCall of choice.delta.tool_calls) {\n if (toolCall.index !== undefined) {\n // 新的工具调用开始\n if (toolCall.id && toolCall.function?.name) {\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: this.safeParseJSON(currentToolCall.arguments)\n },\n ...raw\n };\n }\n currentToolCall = {\n id: toolCall.id,\n name: toolCall.function.name,\n arguments: toolCall.function.arguments || ''\n };\n yield {\n type: 'tool_call_start',\n content: toolCall.function.name,\n toolCallId: toolCall.id,\n ...raw\n };\n } else if (toolCall.function?.arguments && currentToolCall) {\n currentToolCall.arguments += toolCall.function.arguments;\n yield {\n type: 'tool_call_delta',\n content: toolCall.function.arguments,\n toolCallId: currentToolCall.id,\n ...raw\n };\n }\n }\n }\n }\n\n // 处理完成\n if (choice.finish_reason === 'tool_calls' && currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: this.safeParseJSON(currentToolCall.arguments)\n },\n ...raw\n };\n currentToolCall = null;\n }\n\n // 处理元数据\n if (data.usage) {\n yield {\n type: 'metadata',\n usagePhase: 'output',\n metadata: {\n usage: {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens\n }\n },\n ...raw\n };\n }\n } catch {\n // 跳过解析错误\n }\n }\n }\n\n // 处理剩余的工具调用\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: this.safeParseJSON(currentToolCall.arguments)\n },\n ...(params.includeRawStreamEvents ? { providerRaw: { trailing: true } } : {})\n };\n }\n\n yield { type: 'done' };\n } finally {\n reader.releaseLock();\n }\n }\n\n async complete(params: ModelParams): Promise<CompletionResult> {\n const body = this.buildRequestBody(params, false);\n const response = await this.fetch('/chat/completions', body);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${response.status} - ${error}`);\n }\n\n const data = await response.json() as any;\n const choice = data.choices?.[0];\n if (!choice) {\n throw new Error('No completion choice returned');\n }\n\n const result: CompletionResult = {\n content: choice.message?.content || ''\n };\n\n // 处理工具调用\n if (choice.message?.tool_calls) {\n result.toolCalls = choice.message.tool_calls.map((tc: any) => ({\n id: tc.id,\n name: tc.function.name,\n arguments: this.safeParseJSON(tc.function.arguments)\n }));\n }\n\n // 处理使用统计\n if (data.usage) {\n result.usage = {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens\n };\n }\n\n return result;\n }\n\n private buildRequestBody(params: ModelParams, stream: boolean): unknown {\n const messages = this.transformMessages(params.messages);\n const body: Record<string, unknown> = {\n model: this.model,\n messages,\n stream,\n ...(stream && { stream_options: { include_usage: true } }),\n ...(params.temperature !== undefined && { temperature: params.temperature }),\n ...(params.maxTokens !== undefined && { max_tokens: params.maxTokens }),\n ...(params.stopSequences && { stop: params.stopSequences })\n };\n\n // 添加工具\n if (params.tools && params.tools.length > 0) {\n body.tools = toolsToModelSchema(params.tools).map(tool => ({\n type: 'function',\n function: tool\n }));\n }\n\n return body;\n }\n\n private async fetch(path: string, body: unknown, signal?: AbortSignal): Promise<Response> {\n debugLogModelRequestBody('openai', path, body);\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`\n };\n\n if (this.organization) {\n headers['OpenAI-Organization'] = this.organization;\n }\n\n return globalThis.fetch(`${this.baseUrl}${path}`, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal\n });\n }\n\n private safeParseJSON(str: string): unknown {\n try {\n return JSON.parse(str);\n } catch {\n return str;\n }\n }\n}\n\n/**\n * 创建 OpenAI 适配器\n */\nexport function createOpenAI(config?: OpenAIConfig): OpenAIAdapter {\n return new OpenAIAdapter(config);\n}\n","import type {\n ModelParams,\n ModelCapabilities,\n StreamChunk,\n CompletionResult\n} from '../core/types.js';\nimport { BaseModelAdapter, toolsToModelSchema } from './base.js';\nimport { debugLogModelRequestBody } from './request-debug.js';\n\n/**\n * Messages API 顶层 `metadata`:静态字典,或根据每次请求的 {@link ModelParams} 生成字典。\n */\nexport type AnthropicRequestMetadata =\n | Record<string, unknown>\n | ((params: ModelParams) => Record<string, unknown>);\n\n/**\n * 初次 Messages API `POST` 的重试选项(不含 SSE 已建立后 `read` 中途断线)。\n * 未传 `fetchRetry` 时默认共 **2** 次尝试(即 **1** 次自动重试),退避基数 200ms、单次等待上限 2000ms。\n */\nexport interface AnthropicFetchRetryOptions {\n /**\n * 总尝试次数(含第一次)。省略 `fetchRetry` 时默认为 **2**(失败可再试 1 次)。\n * 设为 `1` 可关闭重试。\n * @example `4` → 首次失败后最多再试 3 次。\n */\n maxAttempts?: number;\n /** 指数退避的基准间隔(毫秒),默认 200。 */\n baseDelayMs?: number;\n /** 单次等待上限(毫秒),默认 2000;亦为 `Retry-After` 解析结果的上限。 */\n maxDelayMs?: number;\n}\n\n/** 未配置 `fetchRetry` 时的默认策略:最多 2 次 HTTP 尝试(网络抖动或 429/502/503/504 时可自动重试 1 次)。 */\nconst DEFAULT_FETCH_RETRY: Required<AnthropicFetchRetryOptions> = {\n maxAttempts: 2,\n baseDelayMs: 200,\n maxDelayMs: 2_000\n};\n\nfunction normalizeFetchRetry(options?: AnthropicFetchRetryOptions): Required<AnthropicFetchRetryOptions> {\n if (options == null) {\n return { ...DEFAULT_FETCH_RETRY };\n }\n const maxAttempts = Math.max(1, Math.floor(options.maxAttempts ?? DEFAULT_FETCH_RETRY.maxAttempts));\n const baseDelayMs = Math.max(0, options.baseDelayMs ?? DEFAULT_FETCH_RETRY.baseDelayMs);\n const maxDelayMs = Math.max(baseDelayMs, options.maxDelayMs ?? DEFAULT_FETCH_RETRY.maxDelayMs);\n return { maxAttempts, baseDelayMs, maxDelayMs };\n}\n\nfunction isAbortError(e: unknown): boolean {\n if (e instanceof DOMException && e.name === 'AbortError') {\n return true;\n }\n return typeof e === 'object' && e !== null && (e as { name?: string }).name === 'AbortError';\n}\n\nfunction isRetriableFetchError(e: unknown): boolean {\n if (isAbortError(e)) {\n return false;\n }\n if (e instanceof TypeError) {\n return true;\n }\n const cause = typeof e === 'object' && e !== null && 'cause' in e\n ? (e as { cause?: { code?: string } }).cause\n : undefined;\n const code = cause?.code;\n return (\n code === 'ECONNRESET' ||\n code === 'ETIMEDOUT' ||\n code === 'EPIPE' ||\n code === 'UND_ERR_SOCKET'\n );\n}\n\nfunction isRetriableHttpStatus(status: number): boolean {\n return status === 429 || status === 502 || status === 503 || status === 504;\n}\n\n/** Parse Retry-After: delta-seconds or HTTP-date → wait ms (undefined if unparseable). */\nfunction parseRetryAfterMs(header: string | null): number | undefined {\n if (header == null || header === '') {\n return undefined;\n }\n const trimmed = header.trim();\n const asNum = Number(trimmed);\n if (Number.isFinite(asNum) && asNum >= 0) {\n return asNum * 1000;\n }\n const parsed = Date.parse(trimmed);\n if (!Number.isNaN(parsed)) {\n const delta = parsed - Date.now();\n return delta > 0 ? delta : 0;\n }\n return undefined;\n}\n\nfunction computeBackoffMs(\n attemptIndex: number,\n baseDelayMs: number,\n maxDelayMs: number\n): number {\n const exp = Math.min(maxDelayMs, baseDelayMs * 2 ** attemptIndex);\n const jitter = 0.5 + Math.random() * 0.5;\n return Math.min(maxDelayMs, Math.floor(exp * jitter));\n}\n\nasync function delay(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) {\n return;\n }\n await new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException('The operation was aborted.', 'AbortError'));\n return;\n }\n const id = setTimeout(() => {\n if (signal) {\n signal.removeEventListener('abort', onAbort);\n }\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(id);\n reject(new DOMException('The operation was aborted.', 'AbortError'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nasync function drainResponseBody(response: Response): Promise<void> {\n try {\n await response.arrayBuffer();\n } catch {\n // ignore\n }\n}\n\n/**\n * Anthropic 模型能力映射\n */\nconst ANTHROPIC_CAPABILITIES: Record<string, ModelCapabilities> = {\n 'claude-sonnet-4-20250514': { contextLength: 200_000, maxOutputTokens: 16_384 },\n 'claude-haiku': { contextLength: 200_000, maxOutputTokens: 8_192 },\n 'claude-3-5-sonnet-20241022': { contextLength: 200_000, maxOutputTokens: 8_192 },\n 'claude-3-haiku-20240307': { contextLength: 200_000, maxOutputTokens: 4_096 },\n};\n\n/**\n * Anthropic 配置\n */\nexport interface AnthropicConfig {\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n version?: string;\n /** 自定义模型能力 (覆盖默认值) */\n capabilities?: ModelCapabilities;\n /**\n * 与 {@link ModelParams.sessionId} 合并进 Messages API 顶层 `metadata`(`sessionId` → `user_id`)。\n * 配置中的键可覆盖 `user_id`。\n */\n metadata?: AnthropicRequestMetadata;\n /**\n * 仅针对**建立连接前**的初次 `POST` 的重试策略,见 {@link AnthropicFetchRetryOptions}。\n * 省略时默认共 2 次尝试(**1** 次自动重试);传入 `fetchRetry: { maxAttempts: 1 }` 可改为只请求 1 次、不重试。\n */\n fetchRetry?: AnthropicFetchRetryOptions;\n}\n\n/**\n * Anthropic 模型适配器\n */\nexport class AnthropicAdapter extends BaseModelAdapter {\n readonly name: string;\n private apiKey: string;\n private baseUrl: string;\n private model: string;\n private version: string;\n private requestMetadata?: AnthropicRequestMetadata;\n private fetchRetry: Required<AnthropicFetchRetryOptions>;\n\n constructor(config: AnthropicConfig = {}) {\n super();\n this.apiKey = config.apiKey || process.env.ANTHROPIC_API_KEY || '';\n this.baseUrl = config.baseUrl || process.env.ANTHROPIC_BASE_URL || 'https://api.anthropic.com';\n this.model = config.model || 'claude-sonnet-4-20250514';\n this.version = config.version || '2023-06-01';\n this.requestMetadata = config.metadata;\n this.fetchRetry = normalizeFetchRetry(config.fetchRetry);\n\n if (!this.apiKey) {\n throw new Error('Anthropic API key is required. Set ANTHROPIC_API_KEY environment variable or pass apiKey in config.');\n }\n\n this.name = `anthropic/${this.model}`;\n\n // 设置模型能力\n this.capabilities = config.capabilities\n ?? ANTHROPIC_CAPABILITIES[this.model]\n ?? { contextLength: 200_000, maxOutputTokens: 4_096 };\n }\n\n async *stream(params: ModelParams): AsyncIterable<StreamChunk> {\n const body = this.buildRequestBody(params, true);\n const response = await this.fetch('/v1/messages', body, params.signal);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${response.status} - ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n let currentToolCall: { id: string; name: string; input: string } | null = null;\n let currentThinkingBlock: { signature?: string } | null = null;\n\n try {\n while (true) {\n if (params.signal?.aborted) {\n reader.cancel();\n break;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith('data:')) continue;\n // 跳过 'data:' 前缀,可能有空格\n let jsonStart = 5;\n if (trimmed.length > 5 && trimmed[5] === ' ') {\n jsonStart = 6;\n }\n const jsonStr = trimmed.slice(jsonStart);\n\n try {\n const data = JSON.parse(jsonStr);\n const raw = params.includeRawStreamEvents ? { providerRaw: data as unknown } : {};\n\n switch (data.type) {\n case 'content_block_start':\n if (data.content_block?.type === 'tool_use') {\n currentToolCall = {\n id: data.content_block.id,\n name: data.content_block.name,\n input: ''\n };\n yield {\n type: 'tool_call_start',\n toolCall: {\n id: data.content_block.id,\n name: data.content_block.name,\n arguments: {}\n },\n ...raw\n };\n } else if (data.content_block?.type === 'thinking') {\n currentThinkingBlock = {\n signature: data.content_block.signature\n };\n yield {\n type: 'thinking',\n content: data.content_block.thinking,\n signature: currentThinkingBlock.signature,\n ...raw\n };\n }\n break;\n\n case 'content_block_delta':\n if (data.delta?.type === 'text_delta') {\n yield { type: 'text', content: data.delta.text, ...raw };\n } else if (data.delta?.type === 'thinking_delta') {\n yield {\n type: 'thinking',\n content: data.delta.thinking,\n signature: currentThinkingBlock?.signature,\n ...raw\n };\n } else if (data.delta?.type === 'input_json_delta' && currentToolCall) {\n currentToolCall.input += data.delta.partial_json;\n yield {\n type: 'tool_call_delta',\n content: data.delta.partial_json,\n toolCallId: currentToolCall.id,\n ...raw\n };\n }\n break;\n\n case 'content_block_stop':\n if (currentToolCall) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n arguments: this.safeParseJSON(currentToolCall.input)\n },\n ...raw\n };\n currentToolCall = null;\n }\n if (currentThinkingBlock) {\n currentThinkingBlock = null;\n }\n break;\n\n case 'message_start':\n if (data.message?.usage) {\n const usage = data.message.usage;\n // Anthropic 的 input_tokens 已扣除缓存命中的部分\n // 完整的上下文大小 = input_tokens + cache_read_input_tokens\n const actualInputTokens = usage.input_tokens + (usage.cache_read_input_tokens || 0);\n yield {\n type: 'metadata',\n usagePhase: 'input',\n metadata: {\n usage: {\n promptTokens: actualInputTokens,\n completionTokens: 0,\n totalTokens: actualInputTokens,\n // 传递缓存信息\n cacheReadTokens: usage.cache_read_input_tokens || 0,\n cacheWriteTokens: usage.cache_creation_input_tokens || 0\n }\n },\n ...raw\n };\n }\n break;\n\n case 'message_delta':\n if (data.usage) {\n yield {\n type: 'metadata',\n usagePhase: 'output',\n metadata: {\n usage: {\n promptTokens: 0,\n completionTokens: data.usage.output_tokens,\n totalTokens: data.usage.output_tokens\n }\n },\n ...raw\n };\n }\n break;\n }\n } catch {\n // 跳过解析错误\n }\n }\n }\n\n yield { type: 'done' };\n } finally {\n reader.releaseLock();\n }\n }\n\n async complete(params: ModelParams): Promise<CompletionResult> {\n const body = this.buildRequestBody(params, false);\n const response = await this.fetch('/v1/messages', body);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${response.status} - ${error}`);\n }\n\n const data = await response.json() as any;\n const result: CompletionResult = {\n content: ''\n };\n\n // 处理内容块\n const toolCalls: any[] = [];\n for (const block of data.content || []) {\n if (block.type === 'text') {\n result.content += block.text;\n } else if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id,\n name: block.name,\n arguments: block.input\n });\n }\n }\n\n if (toolCalls.length > 0) {\n result.toolCalls = toolCalls;\n }\n\n // 处理使用统计\n if (data.usage) {\n const usage = data.usage;\n // Anthropic 的 input_tokens 已扣除缓存命中的部分\n // 完整的上下文大小 = input_tokens + cache_read_input_tokens\n const actualInputTokens = usage.input_tokens + (usage.cache_read_input_tokens || 0);\n result.usage = {\n promptTokens: actualInputTokens,\n completionTokens: usage.output_tokens,\n totalTokens: actualInputTokens + usage.output_tokens\n };\n }\n\n return result;\n }\n\n private buildRequestBody(params: ModelParams, stream: boolean): unknown {\n const { system, messages } = this.extractSystemMessage(params.messages);\n const transformedMessages = this.transformAnthropicMessages(messages);\n\n const body: Record<string, unknown> = {\n model: this.model,\n max_tokens: params.maxTokens || 4096,\n messages: transformedMessages,\n stream,\n ...(system && { system }),\n ...(params.temperature !== undefined && { temperature: params.temperature })\n };\n\n // 添加工具\n if (params.tools && params.tools.length > 0) {\n body.tools = toolsToModelSchema(params.tools).map(tool => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.parameters\n }));\n }\n\n const mergedMetadata = this.mergeAnthropicMetadata(params);\n if (mergedMetadata && Object.keys(mergedMetadata).length > 0) {\n body.metadata = mergedMetadata;\n }\n\n return body;\n }\n\n /**\n * Build Messages API `metadata`: `sessionId` → `user_id`, merged with resolved adapter `metadata` (dict or fn).\n * Config `metadata` keys override `user_id` when duplicated.\n */\n private mergeAnthropicMetadata(params: ModelParams): Record<string, unknown> | undefined {\n const extra = this.resolveMetadataExtra(params);\n const hasSession = params.sessionId !== undefined && params.sessionId !== '';\n if (!hasSession && extra === undefined) {\n return undefined;\n }\n const merged: Record<string, unknown> = {};\n if (hasSession) {\n merged.user_id = params.sessionId;\n }\n if (extra !== undefined) {\n Object.assign(merged, extra);\n }\n return Object.keys(merged).length > 0 ? merged : undefined;\n }\n\n private resolveMetadataExtra(params: ModelParams): Record<string, unknown> | undefined {\n const raw = this.requestMetadata;\n if (raw == null) {\n return undefined;\n }\n if (typeof raw === 'function') {\n const v = raw(params);\n if (\n typeof v !== 'object' ||\n v === null ||\n Array.isArray(v) ||\n Object.keys(v).length === 0\n ) {\n return undefined;\n }\n return { ...v };\n }\n if (typeof raw === 'object' && !Array.isArray(raw) && Object.keys(raw).length > 0) {\n return { ...raw };\n }\n return undefined;\n }\n\n private extractSystemMessage(messages: ModelParams['messages']): {\n system?: string;\n messages: ModelParams['messages'];\n } {\n const systemMessages = messages.filter(m => m.role === 'system');\n const otherMessages = messages.filter(m => m.role !== 'system');\n\n // 合并多条 system 消息为一条\n const combinedSystem = systemMessages.length > 0\n ? systemMessages.map(m => m.content as string).join('\\n\\n')\n : undefined;\n\n return {\n system: combinedSystem,\n messages: otherMessages\n };\n }\n\n private transformAnthropicMessages(messages: ModelParams['messages']): unknown[] {\n return messages.map(msg => {\n const transformed: Record<string, unknown> = {\n role: msg.role === 'assistant' ? 'assistant' : 'user',\n content: []\n };\n\n if (typeof msg.content === 'string') {\n transformed.content = [{ type: 'text', text: msg.content }];\n } else if (Array.isArray(msg.content)) {\n // 处理 ContentPart 数组\n const contentParts: any[] = [];\n for (const part of msg.content) {\n if (part.type === 'thinking') {\n contentParts.push(part);\n } else if (part.type === 'text') {\n contentParts.push({ type: 'text', text: (part as any).text });\n } else {\n contentParts.push(part);\n }\n }\n transformed.content = contentParts;\n\n // 如果过滤后为空,设置空字符串\n if (contentParts.length === 0) {\n transformed.content = '';\n }\n }\n\n // 处理工具调用\n if (msg.toolCalls && msg.role === 'assistant') {\n for (const tc of msg.toolCalls) {\n (transformed.content as any[]).push({\n type: 'tool_use',\n id: tc.id,\n name: tc.name,\n input: tc.arguments\n });\n }\n }\n\n // 处理工具结果\n if (msg.role === 'tool' && msg.toolCallId) {\n transformed.role = 'user';\n transformed.content = [{\n type: 'tool_result',\n tool_use_id: msg.toolCallId,\n content: msg.content\n }];\n }\n\n return transformed;\n });\n }\n\n /**\n * 发起 POST;按 `fetchRetry` 对网络错误与 429/502/503/504 重试(不含响应体已开始消费后的 SSE 读失败)。\n */\n private async fetch(path: string, body: unknown, signal?: AbortSignal): Promise<Response> {\n debugLogModelRequestBody('anthropic', path, body);\n const url = `${this.baseUrl}${path}`;\n const init: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': this.version\n },\n body: JSON.stringify(body),\n signal\n };\n\n for (let attempt = 0; attempt < this.fetchRetry.maxAttempts; attempt++) {\n if (signal?.aborted) {\n throw new DOMException('The operation was aborted.', 'AbortError');\n }\n\n try {\n const response = await globalThis.fetch(url, init);\n if (response.ok) {\n return response;\n }\n\n const canRetryHttp =\n attempt < this.fetchRetry.maxAttempts - 1 && isRetriableHttpStatus(response.status);\n if (canRetryHttp) {\n await drainResponseBody(response);\n const fromHeader = parseRetryAfterMs(response.headers.get('Retry-After'));\n const backoff = computeBackoffMs(attempt, this.fetchRetry.baseDelayMs, this.fetchRetry.maxDelayMs);\n const waitMs =\n fromHeader != null\n ? Math.min(fromHeader, this.fetchRetry.maxDelayMs)\n : backoff;\n await delay(waitMs, signal);\n continue;\n }\n\n return response;\n } catch (e) {\n if (isAbortError(e) || signal?.aborted) {\n throw e;\n }\n if (attempt < this.fetchRetry.maxAttempts - 1 && isRetriableFetchError(e)) {\n const backoff = computeBackoffMs(attempt, this.fetchRetry.baseDelayMs, this.fetchRetry.maxDelayMs);\n await delay(backoff, signal);\n continue;\n }\n throw e;\n }\n }\n\n throw new Error('Anthropic fetch: unexpected retry loop exit');\n }\n\n private safeParseJSON(str: string): unknown {\n try {\n return JSON.parse(str);\n } catch {\n return str;\n }\n }\n}\n\n/**\n * 创建 Anthropic 适配器\n */\nexport function createAnthropic(config?: AnthropicConfig): AnthropicAdapter {\n return new AnthropicAdapter(config);\n}\n","import type {\n ModelParams,\n ModelCapabilities,\n StreamChunk,\n CompletionResult,\n ContentPart\n} from '../core/types.js';\nimport { BaseModelAdapter, toolsToModelSchema } from './base.js';\nimport { debugLogModelRequestBody } from './request-debug.js';\n\n/**\n * Ollama `/api/chat` `think` parameter (see https://docs.ollama.com/capabilities/thinking).\n */\nexport type OllamaThinkOption = boolean | 'low' | 'medium' | 'high';\n\n/**\n * Ollama 常见模型能力映射\n */\nconst OLLAMA_CAPABILITIES: Record<string, ModelCapabilities> = {\n 'qwen3.5:0.8b': { contextLength: 32_768, maxOutputTokens: 4_096 },\n 'minimax-m2.7:cloud': { contextLength: 128_000, maxOutputTokens: 16_384 },\n 'nemotron-3-super:cloud': { contextLength: 128_000, maxOutputTokens: 16_384 },\n 'glm-5:cloud': { contextLength: 128_000, maxOutputTokens: 16_384 },\n};\n\n/**\n * Ollama 配置\n */\nexport interface OllamaConfig {\n baseUrl?: string;\n model?: string;\n /** 自定义模型能力 (覆盖默认值) */\n capabilities?: ModelCapabilities;\n /**\n * When set, sent as top-level `think` on `/api/chat`.\n * Omit to use the server default for the model.\n */\n think?: OllamaThinkOption;\n}\n\n/**\n * Map one Ollama `/api/chat` stream JSON object to stream chunks (thinking before text).\n * @internal Exported for unit tests.\n */\nexport function ollamaStreamChunksFromChatData(\n data: Record<string, unknown>,\n parseToolArguments: (args: unknown) => Record<string, unknown>,\n nextToolCallId: () => string\n): StreamChunk[] {\n const chunks: StreamChunk[] = [];\n const msg = data.message as Record<string, unknown> | undefined;\n if (!msg) return chunks;\n\n const thinking = msg.thinking;\n if (typeof thinking === 'string' && thinking.length > 0) {\n chunks.push({ type: 'thinking', content: thinking });\n }\n\n const content = msg.content;\n if (typeof content === 'string' && content.length > 0) {\n chunks.push({ type: 'text', content });\n }\n\n const toolCalls = msg.tool_calls as unknown[] | undefined;\n if (toolCalls && Array.isArray(toolCalls)) {\n for (const tc of toolCalls) {\n const t = tc as Record<string, unknown>;\n const fn = t.function as Record<string, unknown> | undefined;\n chunks.push({\n type: 'tool_call',\n toolCall: {\n id: nextToolCallId(),\n name: (typeof fn?.name === 'string' ? fn.name : '') || '',\n arguments: parseToolArguments(fn?.arguments)\n }\n });\n }\n }\n\n return chunks;\n}\n\n/**\n * Ollama `/api/chat` requires string `content` on each message. The Agent may persist assistant\n * turns as `ContentPart[]` (e.g. thinking + text); replay only `text` parts so the JSON matches\n * Ollama's schema (thinking is not re-sent; the model produces a new trace each request).\n */\nexport function ollamaMessageContentToApiString(content: string | ContentPart[]): string {\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n const texts: string[] = [];\n for (const part of content) {\n if (part.type === 'text') {\n texts.push(part.text);\n }\n }\n return texts.join('\\n\\n');\n}\n\n/** Stable unique id for tool calls in a single adapter response (non-stream complete). */\nfunction uniqueOllamaToolCallId(batchMs: number, index: number): string {\n return `ollama_${batchMs}_${index}_${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * Ollama 模型适配器 (本地模型)\n */\nexport class OllamaAdapter extends BaseModelAdapter {\n readonly name: string;\n private baseUrl: string;\n private model: string;\n private readonly think: OllamaThinkOption | undefined;\n\n constructor(config: OllamaConfig = {}) {\n super();\n this.baseUrl = config.baseUrl || process.env.OLLAMA_BASE_URL || 'http://localhost:11434';\n this.model = config.model || 'qwen3.5:0.8b';\n this.think = config.think;\n\n this.name = `ollama/${this.model}`;\n\n // 设置模型能力 (Ollama 默认使用较小的上下文)\n this.capabilities = config.capabilities\n ?? OLLAMA_CAPABILITIES[this.model]\n ?? { contextLength: 4_096, maxOutputTokens: 2_048 };\n }\n\n async *stream(params: ModelParams): AsyncIterable<StreamChunk> {\n const body = this.buildRequestBody(params, true);\n const response = await this.fetch('/api/chat', body, params.signal);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Ollama API error: ${response.status} - ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n const nextToolCallId = (): string => `ollama_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n\n try {\n while (true) {\n if (params.signal?.aborted) {\n reader.cancel();\n break;\n }\n\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const data = JSON.parse(trimmed) as Record<string, unknown>;\n const raw = params.includeRawStreamEvents ? { providerRaw: data as unknown } : {};\n\n const messageChunks = ollamaStreamChunksFromChatData(\n data,\n (args) => this.parseToolArguments(args),\n nextToolCallId\n );\n for (const chunk of messageChunks) {\n yield { ...chunk, ...raw };\n }\n\n // 处理完成\n if (data.done) {\n if (data.prompt_eval_count || data.eval_count) {\n yield {\n type: 'metadata',\n usagePhase: 'output',\n metadata: {\n usage: {\n promptTokens: (data.prompt_eval_count as number) || 0,\n completionTokens: (data.eval_count as number) || 0,\n totalTokens:\n ((data.prompt_eval_count as number) || 0) + ((data.eval_count as number) || 0)\n }\n },\n ...raw\n };\n }\n yield { type: 'done', ...raw };\n }\n } catch {\n // 跳过解析错误\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n async complete(params: ModelParams): Promise<CompletionResult> {\n const body = this.buildRequestBody(params, false);\n const response = await this.fetch('/api/chat', body);\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Ollama API error: ${response.status} - ${error}`);\n }\n\n const data = await response.json() as any;\n const result: CompletionResult = {\n content: data.message?.content || ''\n };\n\n const thinking = data.message?.thinking;\n if (typeof thinking === 'string' && thinking.length > 0) {\n result.thinking = thinking;\n }\n\n // 处理工具调用(同一毫秒内多条也需唯一 id)\n if (data.message?.tool_calls) {\n const batchMs = Date.now();\n result.toolCalls = data.message.tool_calls.map((tc: any, index: number) => ({\n id: uniqueOllamaToolCallId(batchMs, index),\n name: tc.function?.name || '',\n arguments: this.parseToolArguments(tc.function?.arguments)\n }));\n }\n\n // 处理使用统计\n if (data.prompt_eval_count || data.eval_count) {\n result.usage = {\n promptTokens: data.prompt_eval_count || 0,\n completionTokens: data.eval_count || 0,\n totalTokens: (data.prompt_eval_count || 0) + (data.eval_count || 0)\n };\n }\n\n return result;\n }\n\n private parseToolArguments(args: unknown): Record<string, unknown> {\n if (args == null) return {};\n if (typeof args === 'object' && !Array.isArray(args)) return args as Record<string, unknown>;\n if (typeof args === 'string') {\n try {\n const parsed = JSON.parse(args);\n return typeof parsed === 'object' && parsed !== null ? parsed : { value: parsed };\n } catch {\n return {};\n }\n }\n return {};\n }\n\n /**\n * Ollama 要求 tool_calls.function.arguments 为对象,而非 JSON 字符串。\n * 工具结果消息使用 tool_name(见 https://docs.ollama.com/capabilities/tool-calling ),非 OpenAI 的 tool_call_id。\n */\n protected override transformMessages(messages: ModelParams['messages']): unknown[] {\n const toolCallIdToName = new Map<string, string>();\n for (const msg of messages) {\n if (msg.role === 'assistant' && msg.toolCalls) {\n for (const tc of msg.toolCalls) {\n toolCallIdToName.set(tc.id, tc.name);\n }\n }\n }\n\n return messages.map(msg => {\n if (msg.role === 'tool' && msg.toolCallId) {\n const toolName = toolCallIdToName.get(msg.toolCallId) ?? msg.name;\n return {\n role: 'tool' as const,\n content: ollamaMessageContentToApiString(msg.content as string | ContentPart[]),\n ...(toolName && { tool_name: toolName })\n };\n }\n\n return {\n role: msg.role,\n content: ollamaMessageContentToApiString(msg.content),\n ...(msg.toolCalls && { tool_calls: msg.toolCalls.map(tc => ({\n id: tc.id,\n type: 'function',\n function: {\n name: tc.name,\n arguments: this.parseToolArguments(tc.arguments)\n }\n }))})\n };\n });\n }\n\n private buildRequestBody(params: ModelParams, stream: boolean): unknown {\n const body: Record<string, unknown> = {\n model: this.model,\n messages: this.transformMessages(params.messages),\n stream,\n ...(params.temperature !== undefined && { options: { temperature: params.temperature } })\n };\n\n if (this.think !== undefined) {\n body.think = this.think;\n }\n\n // 与 OpenAI 一致:每项为 { type: 'function', function: { name, description, parameters } }\n // 参见 https://docs.ollama.com/api/chat ToolDefinition\n if (params.tools && params.tools.length > 0) {\n body.tools = toolsToModelSchema(params.tools).map(tool => ({\n type: 'function' as const,\n function: tool\n }));\n }\n\n return body;\n }\n\n private async fetch(path: string, body: unknown, signal?: AbortSignal): Promise<Response> {\n debugLogModelRequestBody('ollama', path, body);\n return globalThis.fetch(`${this.baseUrl}${path}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(body),\n signal\n });\n }\n}\n\n/**\n * 创建 Ollama 模型适配器\n */\nexport function createOllama(config?: OllamaConfig): OllamaAdapter {\n return new OllamaAdapter(config);\n}\n","/**\n * 当前 `process.env` 中值为 string 的键的快照,再叠 `overrides`(后者覆盖同名键)。\n * 供应用层构造 model(如显式传入 `apiKey`)与 Agent 内部合并 MCP stdio 环境共用。\n *\n * 注意:快照包含当前进程 environ 中的敏感变量;传入 MCP 子进程时由调用方控制 `env` / `overrides`。\n */\nexport function mergeProcessEnv(overrides?: Record<string, string>): Record<string, string> {\n const base: Record<string, string> = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (typeof value === 'string') {\n base[key] = value;\n }\n }\n return overrides ? { ...base, ...overrides } : base;\n}\n\n/**\n * stdio MCP 子进程环境:`process.env` + 可选 Agent 级 `env` + 可选单服务 `MCPServerConfig.env`(优先级递增)。\n */\nexport function mergeMcpStdioEnv(\n agentEnv?: Record<string, string>,\n serverEnv?: Record<string, string>\n): Record<string, string> {\n const merged = mergeProcessEnv(agentEnv);\n return serverEnv ? { ...merged, ...serverEnv } : merged;\n}\n","// Model adapters\nexport {\n BaseModelAdapter,\n zodToJsonSchema,\n toolsToModelSchema,\n mergeTokenUsage\n} from './base.js';\nexport type { ZodToJsonSchemaOptions } from './base.js';\nexport { OpenAIAdapter, createOpenAI } from './openai.js';\nexport type { OpenAIConfig } from './openai.js';\nexport { AnthropicAdapter, createAnthropic } from './anthropic.js';\nexport type {\n AnthropicConfig,\n AnthropicRequestMetadata,\n AnthropicFetchRetryOptions\n} from './anthropic.js';\nexport { OllamaAdapter, createOllama } from './ollama.js';\nexport type { OllamaConfig, OllamaThinkOption } from './ollama.js';\nexport { ollamaStreamChunksFromChatData, ollamaMessageContentToApiString } from './ollama.js';\n\nimport type { ModelAdapter } from '../core/types.js';\nimport { mergeProcessEnv } from '../core/process-env-merge.js';\nimport { OpenAIAdapter } from './openai.js';\nimport { AnthropicAdapter } from './anthropic.js';\nimport { OllamaAdapter } from './ollama.js';\nimport type { OllamaThinkOption } from './ollama.js';\n\nexport type ModelProvider = 'openai' | 'anthropic' | 'ollama';\n\nexport interface CreateModelConfig {\n provider: ModelProvider;\n apiKey?: string;\n baseUrl?: string;\n model?: string;\n /** Ollama only: passed as `think` on `/api/chat`. */\n think?: OllamaThinkOption;\n}\n\n/**\n * 创建模型适配器。\n * 若传入 `agentEnv`,先与当前进程环境合并(`mergeProcessEnv`),再解析各提供商的默认密钥/URL;省略时等价于仅使用 `process.env` 快照。\n */\nexport function createModel(\n modelConfig: CreateModelConfig,\n agentEnv?: Record<string, string>\n): ModelAdapter {\n const merged = mergeProcessEnv(agentEnv);\n switch (modelConfig.provider) {\n case 'openai':\n return new OpenAIAdapter({\n apiKey: modelConfig.apiKey || merged.OPENAI_API_KEY || '',\n baseUrl: modelConfig.baseUrl || merged.OPENAI_BASE_URL,\n model: modelConfig.model,\n organization: merged.OPENAI_ORG_ID\n });\n case 'anthropic':\n return new AnthropicAdapter({\n apiKey: modelConfig.apiKey || merged.ANTHROPIC_API_KEY || '',\n baseUrl: modelConfig.baseUrl || merged.ANTHROPIC_BASE_URL,\n model: modelConfig.model\n });\n case 'ollama':\n return new OllamaAdapter({\n baseUrl: modelConfig.baseUrl || merged.OLLAMA_BASE_URL,\n model: modelConfig.model,\n think: modelConfig.think\n });\n }\n throw new Error(`Unknown model provider: ${(modelConfig as { provider: string }).provider}`);\n}\n"]}