@agentdevjs/llm 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.
package/dist/index.js CHANGED
@@ -979,6 +979,9 @@ function compileChatMessages(messages, visionEnabled = false) {
979
979
  }
980
980
  continue;
981
981
  }
982
+ if (m.role === "assistant") {
983
+ flushRemindersAsUserMessage();
984
+ }
982
985
  if (m.role === "tool") {
983
986
  compiled.push({ role: "tool", content: m.content, tool_call_id: m.toolCallId });
984
987
  if (m.images && m.images.length > 0) {
@@ -1174,9 +1177,10 @@ var OpenAILLM = class {
1174
1177
  continue;
1175
1178
  }
1176
1179
  const rawDelta = delta;
1177
- if (rawDelta.reasoning_content) {
1180
+ const reasoningDelta = rawDelta.reasoning_content || rawDelta.reasoning;
1181
+ if (reasoningDelta) {
1178
1182
  currentPhase = "thinking";
1179
- reasoning += rawDelta.reasoning_content;
1183
+ reasoning += reasoningDelta;
1180
1184
  }
1181
1185
  if (delta.content) {
1182
1186
  currentPhase = "content";
@@ -2005,8 +2009,8 @@ function createOpenAIResponsesLLM(configOrApiKey, modelName, baseUrl) {
2005
2009
  }
2006
2010
 
2007
2011
  // src/index.ts
2008
- import { DEFAULT_MAX_RETRIES as DEFAULT_MAX_RETRIES3, getRetryDelay as getRetryDelay4, parseRetryAfter as parseRetryAfter4, shouldRetry as shouldRetry4, sleep } from "@agentdevjs/core";
2009
- import { ClassifiedAPIError as ClassifiedAPIError4, classifyAPIError as classifyAPIError3, classifyAndWrapError as classifyAndWrapError4, extractConnectionErrorDetails, getUserFriendlyMessage } from "@agentdevjs/core";
2012
+ import { DEFAULT_MAX_RETRIES, getRetryDelay as getRetryDelay4, parseRetryAfter as parseRetryAfter4, shouldRetry as shouldRetry4, sleep } from "@agentdevjs/core";
2013
+ import { ClassifiedAPIError, classifyAPIError as classifyAPIError2, classifyAndWrapError as classifyAndWrapError4, extractConnectionErrorDetails, getUserFriendlyMessage } from "@agentdevjs/core";
2010
2014
  function createLLM(configOrApiKey, modelName, provider, baseUrl) {
2011
2015
  if (typeof configOrApiKey === "string") {
2012
2016
  return provider === "anthropic" ? createAnthropicLLM(configOrApiKey, modelName, baseUrl) : createOpenAILLM(configOrApiKey, modelName, baseUrl);
@@ -2032,11 +2036,11 @@ function createLLM(configOrApiKey, modelName, provider, baseUrl) {
2032
2036
  }
2033
2037
  export {
2034
2038
  AnthropicLLM,
2035
- ClassifiedAPIError4 as ClassifiedAPIError,
2036
- DEFAULT_MAX_RETRIES3 as DEFAULT_MAX_RETRIES,
2039
+ ClassifiedAPIError,
2040
+ DEFAULT_MAX_RETRIES,
2037
2041
  OpenAILLM,
2038
2042
  OpenAIResponsesLLM,
2039
- classifyAPIError3 as classifyAPIError,
2043
+ classifyAPIError2 as classifyAPIError,
2040
2044
  classifyAndWrapError4 as classifyAndWrapError,
2041
2045
  compileChatMessages,
2042
2046
  compileContextForAnthropic,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/custom-headers.ts","../src/anthropic.ts","../src/http-client.ts","../src/image-resolver.ts","../src/schema-sanitizer.ts","../src/retry-observability.ts","../src/reminder.ts","../src/openai.ts","../src/openai-responses.ts","../src/index.ts"],"sourcesContent":["/**\n * 自定义请求头动态解析工具\n *\n * 支持 valueMode:\n * - 'static': 使用 value 原样\n * - 'uuid': 每次调用生成新的 UUID v4\n * - 'random': 每次调用生成新的随机整数字符串\n */\n\nimport { randomUUID } from 'crypto';\nimport type { CustomHeaderEntry } from '@agentdevjs/core';\n\n/**\n * 将 CustomHeaderEntry[] 解析为扁平的 Record<string,string>。\n * 对于 uuid / random 模式,每次调用都会生成新值。\n */\nexport function resolveCustomHeaders(\n headers?: CustomHeaderEntry[] | null,\n): Record<string, string> {\n if (!headers || headers.length === 0) return {};\n const result: Record<string, string> = {};\n for (const h of headers) {\n const key = (h.key ?? '').trim();\n if (!key) continue;\n const mode = h.valueMode ?? 'static';\n if (mode === 'uuid') {\n result[key] = randomUUID();\n } else if (mode === 'random') {\n result[key] = String(Math.floor(Math.random() * 1e16));\n } else {\n result[key] = h.value ?? '';\n }\n }\n return result;\n}\n","import type { AgentConfigFile, ModelConfig, CustomHeaderEntry, ThinkingEffort } from '@agentdevjs/core';\nimport { resolveCustomHeaders } from './custom-headers.js';\nimport type { LLMClient, LLMResponse, LLMChatOptions, Message, ThinkingBlock, Tool, ToolCall, UsageInfo, ImageInput } from '@agentdevjs/core';\nimport type { LLMPhase } from '@agentdevjs/core';\nimport { DEFAULT_MAX_RETRIES, getRetryDelay, parseRetryAfter, shouldRetry, resolveModelCallPolicy, withDeadline } from '@agentdevjs/core';\nimport { classifyAPIError, classifyAndWrapError, ClassifiedAPIError } from '@agentdevjs/core';\nimport { initHttpClient } from './http-client.js';\nimport { resolveImageBase64 } from './image-resolver.js';\nimport { sanitizeToolSchema } from './schema-sanitizer.js';\nimport { emitRetryObservability } from './retry-observability.js';\nimport { wrapReminder } from './reminder.js';\n\n// 确保 HTTP 客户端基础设施(DNS 缓存、代理、连接池)在首次 fetch 前初始化\nlet httpClientInitPromise: Promise<void> | null = null;\nfunction ensureHttpClientInitialized() {\n if (!httpClientInitPromise) {\n httpClientInitPromise = initHttpClient();\n }\n return httpClientInitPromise;\n}\n\ntype AnthropicTextBlock = {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' };\n};\n\ntype AnthropicThinkingBlock = {\n type: 'thinking';\n thinking: string;\n signature: string;\n};\n\ntype AnthropicToolResultBlock = {\n type: 'tool_result';\n tool_use_id: string;\n content: string | (AnthropicTextBlock | AnthropicImageBlock)[];\n is_error?: boolean;\n};\n\ntype AnthropicToolUseBlock = {\n type: 'tool_use';\n id: string;\n name: string;\n input?: unknown;\n};\n\ntype AnthropicImageBlock = {\n type: 'image';\n source: {\n type: 'base64';\n media_type: string;\n data: string;\n };\n};\n\ntype AnthropicContentBlock = AnthropicTextBlock | AnthropicThinkingBlock | AnthropicToolResultBlock | AnthropicToolUseBlock | AnthropicImageBlock;\n\ninterface AnthropicRequestMessage {\n role: 'user' | 'assistant';\n content: string | AnthropicContentBlock[];\n}\n\ninterface AnthropicToolDef {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n}\n\ninterface AnthropicStreamEvent {\n type?: string;\n index?: number;\n content_block?: AnthropicContentBlock;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n delta?: {\n type?: string;\n text?: string;\n thinking?: string;\n partial_json?: string;\n stop_reason?: string | null;\n stop_sequence?: string | null;\n };\n message?: {\n id?: string;\n stop_reason?: string | null;\n stop_sequence?: string | null;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n };\n}\n\ninterface CompiledAnthropicRequest {\n system?: AnthropicTextBlock[];\n messages: AnthropicRequestMessage[];\n tools?: AnthropicToolDef[];\n}\n\ninterface AnthropicCompatErrorPayload {\n code?: number;\n msg?: string;\n message?: string;\n success?: boolean;\n}\n\ninterface PendingToolUse {\n id: string;\n name: string;\n inputJson: string;\n}\n\ninterface PendingThinkingBlock {\n thinking: string;\n signature: string;\n}\n\nconst DEFAULT_BASE_URL = 'https://api.anthropic.com/v1';\nconst DEFAULT_MAX_TOKENS = 4096;\n\nexport class AnthropicLLM implements LLMClient {\n private initPromise: Promise<void>;\n private maxRetries: number;\n private deadlineMs: number | undefined;\n\n /** 返回当前 LLM 实例使用的模型名 */\n get modelName(): string { return this._modelName; }\n\n constructor(\n private readonly apiKey: string,\n private readonly _modelName: string = 'claude-sonnet-4-5-20250929',\n private readonly baseUrl: string = DEFAULT_BASE_URL,\n private readonly maxTokens: number = DEFAULT_MAX_TOKENS,\n private readonly thinkingEffort?: ThinkingEffort,\n private readonly _thinkingBudgetTokens?: number,\n private readonly _thinkingKeepTurns: number = 5,\n private readonly customHeaders?: CustomHeaderEntry[],\n private readonly visionEnabled: boolean = false,\n callPolicy?: { maxRetries?: number; timeoutMs?: number },\n ) {\n const resolved = resolveModelCallPolicy(callPolicy);\n this.maxRetries = resolved.maxRetries;\n this.deadlineMs = resolved.timeoutMs;\n this.initPromise = ensureHttpClientInitialized();\n }\n\n async chat(messages: Message[], tools: Tool[], options?: LLMChatOptions): Promise<LLMResponse> {\n // 确保 HTTP 客户端已初始化\n await this.initPromise;\n // 整体时限:deadline 到达以 AbortError 中止,不进入重试\n const signal = withDeadline(options?.signal, this.deadlineMs);\n const compiled = compileContextForAnthropic(messages, tools, this.visionEnabled);\n const noStream = options?.noStream === true;\n\n for (let attempt = 1; attempt <= this.maxRetries + 1; attempt++) {\n let response: Response | undefined;\n try {\n // 检查中断信号\n if (signal?.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n const effectiveMaxTokens = this.maxTokens;\n\n // thinkingEffort controls whether thinking is on/off:\n // - valid effort value + budgetTokens > 0 → thinking: { type: 'enabled', budget_tokens }\n // - 'none' → thinking: { type: 'disabled' }\n // - undefined → no thinking params (vendor decides)\n const effort = this.thinkingEffort;\n const validEfforts: ThinkingEffort[] = ['low', 'medium', 'high', 'xhigh', 'max'];\n const wantsThinking = effort !== undefined && validEfforts.includes(effort);\n const useDisabled = effort === 'none';\n const budget = this._thinkingBudgetTokens;\n const useEnabled = wantsThinking && typeof budget === 'number' && budget > 0;\n // Clamp budget to leave room for output (budget_tokens must be < max_tokens)\n const effectiveBudget = useEnabled ? Math.min(budget!, effectiveMaxTokens - 1) : undefined;\n\n response = await fetch(resolveAnthropicMessagesUrl(this.baseUrl), {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': '2023-06-01',\n ...resolveCustomHeaders(this.customHeaders),\n },\n body: JSON.stringify({\n model: this._modelName,\n max_tokens: effectiveMaxTokens,\n ...(noStream ? {} : { stream: true }),\n ...(useDisabled\n ? { thinking: { type: 'disabled' } }\n : useEnabled\n ? { thinking: { type: 'enabled', budget_tokens: effectiveBudget } }\n : {}),\n ...(compiled.system ? { system: compiled.system } : {}),\n messages: compiled.messages,\n ...(compiled.tools && compiled.tools.length > 0 ? { tools: compiled.tools } : {}),\n }),\n signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n const err = new Error(`Anthropic API error ${response.status}: ${errorText}`);\n (err as any).status = response.status;\n throw err;\n }\n\n if (noStream) {\n const payload = await response.json() as AnthropicCompatErrorPayload;\n if (isCompatErrorPayload(payload)) {\n const err = new Error(`Anthropic-compatible API error ${payload.code ?? 'unknown'}: ${payload.msg ?? payload.message ?? 'unknown error'}`);\n (err as any).status = payload.code;\n throw err;\n }\n return parseAnthropicJsonResponse(payload);\n }\n\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n const payload = await response.json() as AnthropicCompatErrorPayload;\n if (isCompatErrorPayload(payload)) {\n const err = new Error(`Anthropic-compatible API error ${payload.code ?? 'unknown'}: ${payload.msg ?? payload.message ?? 'unknown error'}`);\n (err as any).status = payload.code;\n throw err;\n }\n throw new Error(`Anthropic streaming expected SSE but received JSON: ${JSON.stringify(payload)}`);\n }\n\n if (!response.body) {\n throw new Error('Anthropic API returned an empty response body');\n }\n\n return await readAnthropicStream(response.body, signal);\n } catch (error) {\n // 中断错误不重试,直接传播\n if (error instanceof DOMException && error.name === 'AbortError') {\n throw error;\n }\n if (error instanceof Error && error.name === 'AbortError') {\n throw error;\n }\n\n const status = (error as any)?.status as number | undefined;\n if (attempt <= this.maxRetries && shouldRetry(error, status)) {\n const retryAfterMs = parseRetryAfter(response?.headers);\n const delayMs = getRetryDelay(attempt, retryAfterMs);\n await emitRetryObservability({\n attempt,\n maxRetries: this.maxRetries,\n delayMs,\n signal,\n error,\n status,\n });\n continue;\n }\n // 重试耗尽或不可重试 → 分类包装后抛出\n throw classifyAndWrapError(error, status);\n }\n }\n\n // 理论上不会到这里,但 TypeScript 需要返回值\n throw new Error('Anthropic API call failed after all retries');\n }\n}\n\nfunction resolveAnthropicMessagesUrl(baseUrl: string): string {\n const normalized = baseUrl.replace(/\\/+$/, '');\n if (/\\/v\\d+$/i.test(normalized)) {\n return `${normalized}/messages`;\n }\n return `${normalized}/v1/messages`;\n}\n\nfunction isCompatErrorPayload(payload: AnthropicCompatErrorPayload): boolean {\n if (payload.success === false) return true;\n if (typeof payload.code === 'number' && payload.code !== 0) return true;\n return false;\n}\n\nexport function compileContextForAnthropic(messages: Message[], tools: Tool[], visionEnabled: boolean = false): CompiledAnthropicRequest {\n const systemBlocks: AnthropicTextBlock[] = [];\n const compiledMessages: AnthropicRequestMessage[] = [];\n let seenFirstUser = false;\n let pendingUserBlocks: AnthropicContentBlock[] = [];\n\n const flushPendingUserBlocks = (): void => {\n if (pendingUserBlocks.length === 0) return;\n compiledMessages.push({ role: 'user', content: pendingUserBlocks });\n pendingUserBlocks = [];\n };\n\n for (const message of messages) {\n if (!seenFirstUser && message.role === 'system') {\n // Agent system prompt (no source) → top-level system parameter.\n // Feature-injected system messages (source set, e.g. 'handoff-seed',\n // 'partial-compact') → wrap as <reminder> and embed in the next user\n // turn, so they don't mix into the top-level system parameter.\n if (!message.source) {\n systemBlocks.push({\n type: 'text',\n text: message.content,\n cache_control: { type: 'ephemeral' },\n });\n } else {\n pendingUserBlocks.push({\n type: 'text',\n text: wrapReminder(message.content),\n });\n }\n continue;\n }\n\n if (!seenFirstUser && message.role !== 'user') {\n throw new Error(`Anthropic compilation requires the first non-system message to be user, got '${message.role}'`);\n }\n\n switch (message.role) {\n case 'system':\n pendingUserBlocks.push({\n type: 'text',\n text: wrapReminder(message.content),\n });\n break;\n case 'tool':\n pendingUserBlocks.push(toolMessageToAnthropicBlock(message, visionEnabled));\n break;\n case 'user': {\n seenFirstUser = true;\n const contentBlocks: AnthropicContentBlock[] = [...pendingUserBlocks];\n let textContent = message.content;\n\n // 处理图片\n if (message.images && message.images.length > 0) {\n if (visionEnabled) {\n for (const img of message.images) {\n const data = resolveImageBase64(img);\n if (data) {\n contentBlocks.push({\n type: 'image',\n source: {\n type: 'base64',\n media_type: img.mediaType || 'image/png',\n data,\n },\n });\n }\n }\n } else {\n // 非视觉模式:降级为文字占位符\n const placeholders = message.images\n .map(img => `【Image】${img.source || '(inline image)'}`)\n .join('\\n');\n textContent = `${message.content}\\n${placeholders}`;\n }\n }\n\n contentBlocks.push({ type: 'text', text: textContent });\n compiledMessages.push({\n role: 'user',\n content: contentBlocks.length === 1 ? textContent : contentBlocks,\n });\n pendingUserBlocks = [];\n break;\n }\n case 'assistant':\n flushPendingUserBlocks();\n compiledMessages.push({\n role: 'assistant',\n content: assistantMessageToAnthropicContent(message),\n });\n break;\n default:\n throw new Error(`Anthropic compilation does not support message role '${message.role}'`);\n }\n }\n\n flushPendingUserBlocks();\n\n return {\n ...(systemBlocks.length > 0 ? { system: systemBlocks } : {}),\n messages: compiledMessages,\n ...(tools.length > 0 ? { tools: tools.map(toolToAnthropicDefinition) } : {}),\n };\n}\n\nfunction toolToAnthropicDefinition(tool: Tool): AnthropicToolDef {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: sanitizeToolSchema(tool.parameters),\n };\n}\n\nfunction assistantMessageToAnthropicContent(message: Message): string | AnthropicContentBlock[] {\n const blocks: AnthropicContentBlock[] = [];\n if (message.thinkingBlocks) {\n for (const thinkingBlock of message.thinkingBlocks) {\n blocks.push({\n type: 'thinking',\n thinking: thinkingBlock.thinking,\n signature: thinkingBlock.signature,\n });\n }\n }\n\n if (message.content) {\n blocks.push({ type: 'text', text: message.content });\n }\n\n if (message.toolCalls) {\n for (const toolCall of message.toolCalls) {\n blocks.push({\n type: 'tool_use',\n id: toolCall.id,\n name: toolCall.name,\n input: toolCall.arguments,\n });\n }\n }\n\n if (blocks.length === 0) {\n return '';\n }\n\n if (blocks.length === 1 && blocks[0].type === 'text') {\n return blocks[0].text;\n }\n\n return blocks;\n}\n\nfunction toolMessageToAnthropicBlock(message: Message, visionEnabled: boolean): AnthropicToolResultBlock {\n if (!message.toolCallId) {\n throw new Error('Anthropic compilation requires tool messages to include toolCallId');\n }\n\n const parsed = parseToolPayload(message.content);\n const isError = parsed.isError;\n\n // No images → simple string content (unchanged behavior)\n if (!message.images || message.images.length === 0) {\n return {\n type: 'tool_result',\n tool_use_id: message.toolCallId,\n content: parsed.content,\n ...(isError ? { is_error: true } : {}),\n };\n }\n\n // Images present\n if (visionEnabled) {\n // Vision mode: embed image blocks inside tool_result.content array\n const contentParts: (AnthropicTextBlock | AnthropicImageBlock)[] = [\n { type: 'text', text: parsed.content },\n ];\n for (const img of message.images) {\n const data = resolveImageBase64(img);\n if (data) {\n contentParts.push({\n type: 'image',\n source: {\n type: 'base64',\n media_type: img.mediaType || 'image/png',\n data,\n },\n });\n }\n }\n return {\n type: 'tool_result',\n tool_use_id: message.toolCallId,\n content: contentParts,\n ...(isError ? { is_error: true } : {}),\n };\n }\n\n // Non-vision mode: degrade to text placeholders appended to tool result\n const placeholders = message.images\n .map(img => `【Image】${img.source || '(inline image)'}`)\n .join('\\n');\n return {\n type: 'tool_result',\n tool_use_id: message.toolCallId,\n content: `${parsed.content}\\n${placeholders}`,\n ...(isError ? { is_error: true } : {}),\n };\n}\n\nfunction parseToolPayload(content: string): { content: string; isError: boolean } {\n try {\n const parsed = JSON.parse(content) as { success?: boolean; result?: unknown; error?: unknown };\n if (parsed && typeof parsed === 'object' && ('result' in parsed || 'error' in parsed || 'success' in parsed)) {\n const isError = parsed.success === false || !!parsed.error;\n if (isError && typeof parsed.error === 'string' && parsed.error.trim()) {\n return { content: parsed.error, isError: true };\n }\n if (parsed.result !== undefined) {\n return { content: stringifyToolValue(parsed.result), isError };\n }\n return { content, isError };\n }\n } catch {\n // Keep raw tool content if it is not JSON.\n }\n\n return { content, isError: false };\n}\n\nfunction stringifyToolValue(value: unknown): string {\n if (typeof value === 'string') return value;\n return JSON.stringify(value);\n}\n\n/**\n * Find the index right after the first SSE event boundary in a text buffer.\n * Matches the Anthropic SDK's findDoubleNewlineIndex behavior — supports\n * \\n\\n, \\r\\r, and \\r\\n\\r\\n separators. Returns -1 if none found.\n */\nfunction findDoubleNewlineIndex(buffer: string): { index: number; separatorLen: number } {\n for (let i = 0; i < buffer.length - 1; i++) {\n const ch = buffer[i];\n const next = buffer[i + 1];\n if (ch === '\\n' && next === '\\n') return { index: i, separatorLen: 2 };\n if (ch === '\\r' && next === '\\r') return { index: i, separatorLen: 2 };\n if (ch === '\\r' && next === '\\n' && i + 3 < buffer.length && buffer[i + 2] === '\\r' && buffer[i + 3] === '\\n') {\n return { index: i, separatorLen: 4 };\n }\n }\n return { index: -1, separatorLen: 0 };\n}\n\n/**\n * Parse a non-streaming Anthropic API JSON response into LLMResponse.\n * Used when noStream option is set — avoids SSE fragility for one-shot calls.\n */\nfunction parseAnthropicJsonResponse(data: Record<string, any>): LLMResponse {\n let content = '';\n let reasoning = '';\n const toolCalls: ToolCall[] = [];\n const thinkingBlocks: ThinkingBlock[] = [];\n\n if (Array.isArray(data.content)) {\n for (const block of data.content) {\n if (block.type === 'text' && typeof block.text === 'string') {\n content += block.text;\n } else if (block.type === 'thinking') {\n const thinking = typeof block.thinking === 'string' ? block.thinking : '';\n const signature = typeof block.signature === 'string' ? block.signature : '';\n if (thinking) reasoning += thinking;\n if (signature.length > 0 && thinking.length > 0) {\n thinkingBlocks.push({ thinking, signature });\n }\n } else if (block.type === 'tool_use') {\n toolCalls.push({\n id: String(block.id ?? ''),\n name: String(block.name ?? ''),\n arguments: (block.input && typeof block.input === 'object' && !Array.isArray(block.input))\n ? block.input as Record<string, any>\n : {},\n });\n }\n }\n }\n\n const usageRaw = data.usage;\n let usageInfo: UsageInfo | undefined;\n if (usageRaw && (usageRaw.input_tokens !== undefined || usageRaw.output_tokens !== undefined)) {\n const realInput = (usageRaw.input_tokens || 0)\n + (usageRaw.cache_creation_input_tokens || 0)\n + (usageRaw.cache_read_input_tokens || 0);\n usageInfo = {\n inputTokens: realInput,\n outputTokens: usageRaw.output_tokens || 0,\n totalTokens: realInput + (usageRaw.output_tokens || 0),\n ...(usageRaw.cache_creation_input_tokens ? { cacheCreationTokens: usageRaw.cache_creation_input_tokens } : {}),\n ...(usageRaw.cache_read_input_tokens ? { cacheReadTokens: usageRaw.cache_read_input_tokens } : {}),\n };\n }\n\n return {\n content,\n ...(toolCalls.length > 0 ? { toolCalls } : {}),\n ...(reasoning ? { reasoning } : {}),\n ...(thinkingBlocks.length > 0 ? { thinkingBlocks } : {}),\n ...(usageInfo ? { usage: usageInfo } : {}),\n stopReason: data.stop_reason ?? null,\n };\n}\n\nasync function readAnthropicStream(body: ReadableStream<Uint8Array>, signal?: AbortSignal): Promise<LLMResponse> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let content = '';\n let reasoning = '';\n const pendingThinkingBlocks = new Map<number, PendingThinkingBlock>();\n let charCount = 0;\n let currentPhase: LLMPhase = 'content';\n const pendingToolUses = new Map<number, PendingToolUse>();\n\n // 收集 usage 数据\n let usageInfo: UsageInfo | null = null;\n\n // 收集 stop_reason\n let stopReason: string | null = null;\n\n // 流式完整性追踪\n let receivedMessageStart = false;\n let receivedMessageStop = false;\n\n // 只注册一次 abort listener,用于中断 reader.read()。\n // 旧实现在 while 循环每次迭代中创建新的 abort Promise 并注册 listener,\n // 导致正常完成时 listener 累积不释放(MaxListenersExceededWarning)。\n const onStreamAbort = () => reader.cancel().catch(() => {});\n if (signal && !signal.aborted) {\n signal.addEventListener('abort', onStreamAbort, { once: true });\n }\n\n // 各 phase 独立计数:正文阶段不应延续思考阶段的累计值\n const phaseCharCount = (phase: LLMPhase): number =>\n phase === 'thinking' ? reasoning.length : content.length;\n\n const applyEvent = (event: AnthropicStreamEvent): void => {\n if (event.type === 'message_start') receivedMessageStart = true;\n if (event.type === 'message_stop') receivedMessageStop = true;\n applyAnthropicStreamEvent(event, pendingThinkingBlocks, pendingToolUses, (delta) => {\n content += delta.content;\n reasoning += delta.reasoning;\n charCount += delta.charCount;\n currentPhase = delta.phase;\n }, (usage) => {\n // Merge instead of replace: message_delta may omit input_tokens\n // (some Anthropic-compatible providers only send output_tokens in\n // deltas). Preserve inputTokens/cache tokens from message_start so\n // the final usageInfo accurately reflects the actual context size.\n if (usageInfo) {\n const inputTokens = usage.inputTokens || usageInfo.inputTokens;\n const outputTokens = usage.outputTokens || usageInfo.outputTokens;\n usageInfo = {\n ...usageInfo,\n ...usage,\n inputTokens,\n totalTokens: inputTokens + outputTokens,\n };\n } else {\n usageInfo = usage;\n }\n }, (reason) => {\n stopReason = reason;\n });\n };\n\n try {\n while (true) {\n // signal 已中断则立即抛出\n if (signal?.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n const { value, done } = await reader.read();\n // reader.read() 可能被 abort 中断后返回,检查是否需要提前退出\n if (signal?.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n let sep = findDoubleNewlineIndex(buffer);\n while (sep.index >= 0) {\n const rawEvent = buffer.slice(0, sep.index);\n buffer = buffer.slice(sep.index + sep.separatorLen);\n const event = parseSSEEvent(rawEvent);\n if (event) {\n applyEvent(event);\n const toolNames = Array.from(pendingToolUses.values()).map(t => t.name).filter(Boolean);\n await emitAnthropicProgress(\n phaseCharCount(currentPhase),\n currentPhase,\n pendingToolUses.size,\n toolNames,\n reasoning.length,\n content.length,\n );\n }\n sep = findDoubleNewlineIndex(buffer);\n }\n }\n } catch (e) {\n // AbortError 直接传播\n if (e instanceof DOMException && e.name === 'AbortError') throw e;\n if (e instanceof Error && e.name === 'AbortError') throw e;\n throw e;\n } finally {\n // 确保移除 abort listener,避免泄漏\n signal?.removeEventListener('abort', onStreamAbort);\n }\n\n // 处理缓冲区中最后的残余数据\n if (buffer.trim()) {\n const event = parseSSEEvent(buffer);\n if (event) {\n applyEvent(event);\n const toolNames = Array.from(pendingToolUses.values()).map(t => t.name).filter(Boolean);\n await emitAnthropicProgress(\n phaseCharCount(currentPhase),\n currentPhase,\n pendingToolUses.size,\n toolNames,\n reasoning.length,\n content.length,\n );\n }\n }\n\n // 检测不完整流:收到了 message_start 但没有 message_stop,也没有任何有效内容\n if (receivedMessageStart && !receivedMessageStop && !content && pendingToolUses.size === 0 && !reasoning) {\n throw new Error('Anthropic stream ended incompletely: received message_start but no message_stop or content');\n }\n\n const toolCalls = finalizeToolCalls(pendingToolUses);\n const thinkingBlocks = finalizeThinkingBlocks(pendingThinkingBlocks);\n await emitAnthropicComplete(charCount);\n return {\n content,\n ...(toolCalls.length > 0 ? { toolCalls } : {}),\n ...(reasoning ? { reasoning } : {}),\n ...(thinkingBlocks.length > 0 ? { thinkingBlocks } : {}),\n ...(usageInfo ? { usage: usageInfo } : {}),\n stopReason,\n };\n}\n\nfunction parseSSEEvent(rawEvent: string): AnthropicStreamEvent | null {\n const dataLines = rawEvent\n .split(/\\r?\\n/)\n .filter(line => line.startsWith('data:'))\n .map(line => line.slice(5).trim());\n\n if (dataLines.length === 0) return null;\n const data = dataLines.join('\\n');\n if (data === '[DONE]') return null;\n\n try {\n return JSON.parse(data) as AnthropicStreamEvent;\n } catch {\n // Skip malformed SSE events instead of crashing the entire stream.\n console.warn(`[Anthropic] Skipping malformed SSE event: ${data.slice(0, 200)}`);\n return null;\n }\n}\n\nfunction applyAnthropicStreamEvent(\n event: AnthropicStreamEvent,\n pendingThinkingBlocks: Map<number, PendingThinkingBlock>,\n pendingToolUses: Map<number, PendingToolUse>,\n append: (delta: { content: string; reasoning: string; charCount: number; phase: LLMPhase }) => void,\n onUsage: (usage: UsageInfo) => void,\n onStopReason?: (stopReason: string) => void,\n): void {\n switch (event.type) {\n case 'content_block_start': {\n if (event.content_block?.type === 'thinking' && typeof event.index === 'number') {\n pendingThinkingBlocks.set(event.index, {\n thinking: event.content_block.thinking || '',\n signature: event.content_block.signature || '',\n });\n }\n if (event.content_block?.type === 'tool_use' && typeof event.index === 'number') {\n pendingToolUses.set(event.index, {\n id: event.content_block.id,\n name: event.content_block.name,\n // Always start with empty string — the API sends input: {} at\n // content_block_start but actual content arrives via\n // input_json_delta events. Initializing with a stringified\n // non-empty object would corrupt the accumulated JSON when\n // deltas are appended. (Matches Claude Code's approach.)\n inputJson: '',\n });\n }\n break;\n }\n case 'content_block_delta': {\n const deltaType = event.delta?.type;\n if (deltaType === 'text_delta') {\n const text = event.delta?.text ?? '';\n append({ content: text, reasoning: '', charCount: text.length, phase: 'content' });\n } else if (deltaType === 'thinking_delta') {\n const thinking = event.delta?.thinking ?? '';\n if (typeof event.index === 'number') {\n const block = pendingThinkingBlocks.get(event.index) ?? { thinking: '', signature: '' };\n block.thinking += thinking;\n pendingThinkingBlocks.set(event.index, block);\n }\n append({ content: '', reasoning: thinking, charCount: thinking.length, phase: 'thinking' });\n } else if (deltaType === 'signature_delta' && typeof event.index === 'number') {\n const block = pendingThinkingBlocks.get(event.index) ?? { thinking: '', signature: '' };\n block.signature += ((event.delta as { signature?: string }).signature ?? '');\n pendingThinkingBlocks.set(event.index, block);\n } else if (deltaType === 'input_json_delta' && typeof event.index === 'number') {\n const toolUse = pendingToolUses.get(event.index);\n if (toolUse) {\n const partial = event.delta?.partial_json ?? '';\n toolUse.inputJson = mergeToolInputJson(toolUse.inputJson, partial);\n append({ content: '', reasoning: '', charCount: 0, phase: 'tool_calling' });\n } else {\n console.warn(`[Anthropic] input_json_delta for unknown content block index ${event.index}, skipping`);\n }\n }\n break;\n }\n case 'message_start': {\n const usage = event.message?.usage;\n if (usage && (usage.input_tokens !== undefined || usage.output_tokens !== undefined)) {\n const realInput = (usage.input_tokens || 0) + (usage.cache_creation_input_tokens || 0) + (usage.cache_read_input_tokens || 0);\n onUsage({\n inputTokens: realInput,\n outputTokens: usage.output_tokens || 0,\n totalTokens: realInput + (usage.output_tokens || 0),\n ...(usage.cache_creation_input_tokens ? { cacheCreationTokens: usage.cache_creation_input_tokens } : {}),\n ...(usage.cache_read_input_tokens ? { cacheReadTokens: usage.cache_read_input_tokens } : {}),\n });\n }\n break;\n }\n case 'message_delta': {\n // Anthropic 的 message_delta usage 在事件顶层,不在 delta 里\n if (event.delta?.stop_reason && onStopReason) {\n onStopReason(event.delta.stop_reason);\n }\n const usage = event.usage;\n if (usage && (usage.input_tokens !== undefined || usage.output_tokens !== undefined)) {\n const realInput = (usage.input_tokens || 0) + (usage.cache_creation_input_tokens || 0) + (usage.cache_read_input_tokens || 0);\n onUsage({\n inputTokens: realInput,\n outputTokens: usage.output_tokens || 0,\n totalTokens: realInput + (usage.output_tokens || 0),\n ...(usage.cache_creation_input_tokens ? { cacheCreationTokens: usage.cache_creation_input_tokens } : {}),\n ...(usage.cache_read_input_tokens ? { cacheReadTokens: usage.cache_read_input_tokens } : {}),\n });\n }\n break;\n }\n default:\n break;\n }\n}\n\nasync function emitAnthropicProgress(\n charCount: number,\n phase: LLMPhase,\n toolCallCount: number,\n toolNames?: string[],\n thinkingChars?: number,\n contentChars?: number,\n): Promise<void> {\n try {\n const { emitNotification, createLLMCharCount } = await import('@agentdevjs/core');\n if (charCount > 0 || toolCallCount > 0) {\n emitNotification(createLLMCharCount(charCount, phase, {\n toolCallCount,\n ...(typeof thinkingChars === 'number' ? { thinkingChars } : {}),\n ...(typeof contentChars === 'number' ? { contentChars } : {}),\n ...(Array.isArray(toolNames) && toolNames.length > 0 ? { streamToolNames: toolNames } : {}),\n }));\n }\n } catch {\n // Ignore notification failures.\n }\n}\n\nasync function emitAnthropicComplete(charCount: number): Promise<void> {\n try {\n const { emitNotification, createLLMComplete } = await import('@agentdevjs/core');\n emitNotification(createLLMComplete(charCount));\n } catch {\n // Ignore notification failures.\n }\n}\n\nfunction mergeToolInputJson(current: string, partial: string): string {\n if (!current.trim()) return partial;\n return current + partial;\n}\n\nfunction finalizeThinkingBlocks(pendingThinkingBlocks: Map<number, PendingThinkingBlock>): ThinkingBlock[] {\n return Array.from(pendingThinkingBlocks.entries())\n .sort((a, b) => a[0] - b[0])\n .map(([, block]) => ({\n signature: block.signature,\n thinking: block.thinking,\n }))\n .filter(block => block.signature.length > 0 && block.thinking.length > 0);\n}\n\nfunction finalizeToolCalls(pendingToolUses: Map<number, PendingToolUse>): ToolCall[] {\n return Array.from(pendingToolUses.entries())\n .sort((a, b) => a[0] - b[0])\n .map(([, toolUse]) => ({\n id: toolUse.id,\n name: toolUse.name,\n arguments: parseToolInput(toolUse.inputJson, toolUse.name),\n }));\n}\n\nfunction stripBOM(str: string): string {\n // eslint-disable-next-line no-irregular-whitespace -- BOM 字符 (U+FEFF) 是正则匹配目标\n return str.replace(/^/, '');\n}\n\nfunction safeParseJSON(json: string): unknown {\n if (!json) return null;\n try {\n return JSON.parse(stripBOM(json));\n } catch {\n return null;\n }\n}\n\nfunction parseToolInput(inputJson: string, toolName?: string): Record<string, any> {\n const trimmed = inputJson.trim();\n if (!trimmed) return {};\n\n const parsed = safeParseJSON(trimmed);\n if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, any>;\n }\n\n // Fallback: some Anthropic-compatible endpoints produce tool-call input JSON\n // with trailing non-JSON content in streaming deltas. Try extracting the\n // first valid JSON object from the string.\n const braceStart = trimmed.indexOf('{');\n if (braceStart >= 0) {\n let depth = 0;\n let inString = false;\n let escape = false;\n for (let i = braceStart; i < trimmed.length; i++) {\n const ch = trimmed[i];\n if (escape) { escape = false; continue; }\n if (ch === '\\\\') { if (inString) escape = true; continue; }\n if (ch === '\"') { inString = !inString; continue; }\n if (inString) continue;\n if (ch === '{' || ch === '[') depth++;\n else if (ch === '}' || ch === ']') {\n depth--;\n if (depth === 0) {\n const candidate = trimmed.slice(braceStart, i + 1);\n const recovered = safeParseJSON(candidate);\n if (recovered !== null && typeof recovered === 'object' && !Array.isArray(recovered)) {\n return recovered as Record<string, any>;\n }\n break;\n }\n }\n }\n }\n\n // Graceful degradation: never throw — return empty object and let the\n // downstream tool execution deal with missing arguments. This mirrors\n // Claude Code's approach where a parse failure falls back to `{}` so the\n // ReAct loop keeps running instead of crashing entirely.\n console.warn(\n `[Anthropic] Failed to parse tool input JSON${toolName ? ` for tool \"${toolName}\"` : ''}. ` +\n `Input length: ${trimmed.length}, preview: ${trimmed.slice(0, 200)}`,\n );\n return {};\n}\n\nexport function createAnthropicLLM(config: AgentConfigFile): AnthropicLLM;\nexport function createAnthropicLLM(modelConfig: ModelConfig): AnthropicLLM;\nexport function createAnthropicLLM(\n apiKey: string,\n modelName: string,\n baseUrl?: string,\n): AnthropicLLM;\nexport function createAnthropicLLM(\n configOrApiKey: AgentConfigFile | ModelConfig | string,\n modelName?: string,\n baseUrl?: string,\n): AnthropicLLM {\n if (typeof configOrApiKey === 'object' && 'defaultModel' in configOrApiKey) {\n return new AnthropicLLM(\n configOrApiKey.defaultModel.apiKey,\n configOrApiKey.defaultModel.model,\n configOrApiKey.defaultModel.baseUrl,\n (configOrApiKey.defaultModel.maxTokens && configOrApiKey.defaultModel.maxTokens > 0) ? configOrApiKey.defaultModel.maxTokens : DEFAULT_MAX_TOKENS,\n configOrApiKey.defaultModel.thinkingEffort,\n configOrApiKey.defaultModel.thinkingBudgetTokens,\n configOrApiKey.defaultModel.thinkingKeepTurns ?? 5,\n configOrApiKey.defaultModel.customHeaders,\n configOrApiKey.defaultModel.vision ?? false,\n { maxRetries: configOrApiKey.defaultModel.maxRetries, timeoutMs: configOrApiKey.defaultModel.timeoutMs },\n );\n }\n\n if (typeof configOrApiKey === 'object') {\n return new AnthropicLLM(\n configOrApiKey.apiKey,\n configOrApiKey.model,\n configOrApiKey.baseUrl,\n (configOrApiKey.maxTokens && configOrApiKey.maxTokens > 0) ? configOrApiKey.maxTokens : DEFAULT_MAX_TOKENS,\n configOrApiKey.thinkingEffort,\n configOrApiKey.thinkingBudgetTokens,\n configOrApiKey.thinkingKeepTurns ?? 5,\n configOrApiKey.customHeaders,\n configOrApiKey.vision ?? false,\n { maxRetries: configOrApiKey.maxRetries, timeoutMs: configOrApiKey.timeoutMs },\n );\n }\n\n return new AnthropicLLM(configOrApiKey, modelName!, baseUrl);\n}\n","/**\n * HTTP 客户端基础设施\n *\n * 复用 Claude Code 同款解决方式:\n * - 不手动覆写 dns.lookup,利用 undici 内置 DNS 缓存和连接池\n * - 使用 EnvHttpProxyAgent 自动处理 HTTPS_PROXY / NO_PROXY\n * - 通过 setGlobalDispatcher 全局设置(对原生 fetch 立即生效)\n *\n * 两种 fetch 的集成方式:\n * 1. 原生 fetch()(Anthropic 适配器) → setGlobalDispatcher 全局生效\n * 2. OpenAI SDK 的 node-fetch → 自带 agentkeepalive,无需额外处理\n */\n\nimport { createLogger } from '@agentdevjs/core';\n\nconst logger = createLogger('llm.http-client');\n\n// 动态加载 undici(兼容打包和运行时)\nlet undici: any;\nlet undiciLoadPromise: Promise<any> | null = null;\nlet initialGlobalDispatcher: any = null;\n\nexport const HTTP_CONNECT_TIMEOUT_MS = 10_000;\nexport const HTTP_HEADERS_TIMEOUT_MS = 60_000;\nexport const HTTP_BODY_TIMEOUT_MS = 60_000;\n\nexport function buildHttpDispatcherOptions(noProxy?: string): Record<string, unknown> {\n return {\n ...(noProxy ? { noProxy } : {}),\n headersTimeout: HTTP_HEADERS_TIMEOUT_MS,\n bodyTimeout: HTTP_BODY_TIMEOUT_MS,\n connect: { timeout: HTTP_CONNECT_TIMEOUT_MS },\n };\n}\n\nexport function isExternallyManagedDispatcher(current: any, initial: any): boolean {\n return current != null && initial != null && current !== initial;\n}\n\nasync function loadUndici(): Promise<any> {\n if (undiciLoadPromise) {\n return undiciLoadPromise;\n }\n\n undiciLoadPromise = (async () => {\n // 方法1: 尝试直接 ESM 导入 undici\n try {\n const mod = await import('undici');\n return mod;\n } catch {\n // 方法2: 使用 createRequire\n try {\n const { createRequire } = await import('module');\n const _require = createRequire(import.meta.url);\n return _require('undici');\n } catch {\n logger.warn('Failed to load undici, proxy and DNS caching will not be available');\n return null;\n }\n }\n })();\n\n return undiciLoadPromise;\n}\n\n// 初始化 undici 加载\nundici = await loadUndici();\ninitialGlobalDispatcher = undici?.getGlobalDispatcher?.() ?? null;\n\n// ========== 代理配置 ==========\n\n/**\n * 检测代理 URL\n *\n * 优先级:HTTPS_PROXY > https_proxy > HTTP_PROXY > http_proxy\n */\nfunction getProxyUrl(): string | undefined {\n return (\n process.env.HTTPS_PROXY ||\n process.env.https_proxy ||\n process.env.HTTP_PROXY ||\n process.env.http_proxy\n );\n}\n\n/**\n * 遮蔽代理 URL 中的密码\n */\nfunction maskProxyUrl(url: string): string {\n try {\n const parsed = new URL(url);\n if (parsed.password) {\n parsed.password = '***';\n }\n return parsed.toString();\n } catch {\n return url;\n }\n}\n\n// ========== Undici 全局调度器 ==========\n\nlet httpClientInitialized = false;\nlet _dispatcher: any = null;\n\n/**\n * 获取当前的 undici Dispatcher\n */\nexport function getGlobalDispatcher(): any {\n return _dispatcher;\n}\n\n/**\n * 初始化 HTTP 客户端\n *\n * 设置 Undici 全局调度器(同步完成):\n * - 有代理 → EnvHttpProxyAgent(自动处理 NO_PROXY)\n * - 无代理 → Agent(keep-alive + 连接池,内置 DNS 缓存)\n *\n * 此函数幂等,多次调用无副作用。\n */\nexport async function initHttpClient(): Promise<void> {\n if (httpClientInitialized) return;\n httpClientInitialized = true;\n\n // 确保 undici 已加载\n if (!undici) {\n undici = await loadUndici();\n if (!undici) {\n logger.warn('undici not available, skipping HTTP client initialization');\n return;\n }\n }\n\n const proxyUrl = getProxyUrl();\n\n try {\n // An embedding host may already own the global dispatcher (for example,\n // AgentDevClaw applies a runtime-switchable proxy before starting agents).\n // Replacing it here creates two competing proxy lifecycles and discards\n // the host's timeout/NO_PROXY policy. Reuse the host-owned dispatcher.\n const currentDispatcher = undici.getGlobalDispatcher?.() ?? null;\n if (isExternallyManagedDispatcher(currentDispatcher, initialGlobalDispatcher)) {\n _dispatcher = currentDispatcher;\n logger.info('Using host-managed Undici dispatcher');\n return;\n }\n\n // undici 已作为外部依赖导入,运行时由 Node.js 提供\n\n if (proxyUrl) {\n // EnvHttpProxyAgent 自动尊重 NO_PROXY / no_proxy 环境变量\n const proxyAgent = new undici.EnvHttpProxyAgent({\n httpProxy: proxyUrl,\n httpsProxy: proxyUrl,\n ...buildHttpDispatcherOptions(process.env.NO_PROXY || process.env.no_proxy),\n });\n undici.setGlobalDispatcher(proxyAgent);\n _dispatcher = proxyAgent;\n logger.info('Proxy Agent configured (EnvHttpProxyAgent)', {\n proxy: maskProxyUrl(proxyUrl),\n });\n } else {\n // 默认 Agent:keep-alive + 连接池\n // undici Agent 内置 DNS 缓存(通过 Node.js 内部的 c-ares 解析器)\n const agent = new undici.Agent({\n ...buildHttpDispatcherOptions(),\n keepAliveTimeout: 30_000,\n keepAliveMaxTimeout: 300_000,\n connections: 50,\n pipelining: 1,\n });\n undici.setGlobalDispatcher(agent);\n _dispatcher = agent;\n logger.debug('Undici Agent configured (default, with keep-alive)');\n }\n } catch (e: any) {\n logger.warn('Failed to set up undici dispatcher, proxy env vars will be ignored', {\n error: e.message || String(e),\n });\n }\n}\n","/**\n * Image data resolver for LLM compilers.\n *\n * Resolves an {@link ImageInput} to base64 data by either:\n * - Reading the inline `base64` field (backward compat with old sessions)\n * - Reading from `path` on disk (preferred, avoids session bloat)\n *\n * Used by compileContextForAnthropic, OpenAILLM, and OpenAIResponsesLLM.\n */\n\nimport { readFileSync } from 'node:fs';\nimport type { ImageInput } from '@agentdevjs/core';\n\n/**\n * Resolve an ImageInput to raw base64 data (no data-URI prefix).\n *\n * Priority: `base64` field → `path` file read.\n * Returns `null` if neither source yields data.\n */\nexport function resolveImageBase64(img: ImageInput): string | null {\n if (img.base64) return img.base64;\n if (img.path) {\n try {\n const buf = readFileSync(img.path);\n return buf.toString('base64');\n } catch {\n return null;\n }\n }\n return null;\n}\n\n/**\n * Build a data-URI string (e.g. \"data:image/png;base64,...\") from an ImageInput.\n * Returns `null` if no data can be resolved.\n */\nexport function resolveImageDataUri(img: ImageInput): string | null {\n const base64 = resolveImageBase64(img);\n if (!base64) return null;\n const mediaType = img.mediaType || 'image/png';\n return `data:${mediaType};base64,${base64}`;\n}\n","/**\r\n * Tool JSON schema sanitizer shared by LLM adapters.\r\n *\r\n * `$schema` is a documentation-only pointer to the JSON Schema dialect\r\n * (e.g. \"https://json-schema.org/draft/2020-12/schema\"). It carries no\r\n * meaning for the model, and some OpenAI/Anthropic-compatible backends\r\n * choke on it — notably, an internal DeepSeek endpoint silently disables\r\n * tool use entirely once `$schema` appears in 3+ tool definitions.\r\n * Strip it recursively before sending schemas over the wire.\r\n */\r\n\r\nexport function sanitizeToolSchema(parameters: Record<string, unknown> | undefined): Record<string, unknown> {\r\n const base = parameters && typeof parameters === 'object' ? parameters : { type: 'object', properties: {} };\r\n return stripSchemaMeta(base) as Record<string, unknown>;\r\n}\r\n\r\nfunction stripSchemaMeta(node: unknown): unknown {\r\n if (Array.isArray(node)) {\r\n return node.map(stripSchemaMeta);\r\n }\r\n if (node && typeof node === 'object') {\r\n const out: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(node)) {\r\n if (key === '$schema') continue;\r\n out[key] = stripSchemaMeta(value);\r\n }\r\n return out;\r\n }\r\n return node;\r\n}\r\n","/**\n * LLM 适配器重试可观测性\n *\n * 单次模型请求内部的重试过程通知。与执行控制流解耦:\n * 通知发射失败(无 notification scope / 模块不可用)不影响重试本身。\n */\n\nimport { classifyAPIError } from '@agentdevjs/core';\nimport type { LLMRetryData } from '@agentdevjs/core';\n\n/**\n * 在适配器重试点发射 llm.retry 通知(waiting → sleep → requesting)。\n *\n * sleep 接受 AbortSignal:用户中断会同时取消退避等待并向上传播 AbortError。\n */\nexport async function emitRetryObservability(params: {\n attempt: number;\n maxRetries: number;\n delayMs: number;\n signal?: AbortSignal;\n error: unknown;\n status?: number;\n}): Promise<void> {\n const { attempt, maxRetries, delayMs, signal, error, status } = params;\n const base: LLMRetryData = {\n attempt,\n maxRetries,\n ...(delayMs !== undefined ? { delayMs } : {}),\n ...(status !== undefined ? { statusCode: status } : {}),\n errorType: classifyAPIError(error, status),\n };\n await emitRetryNotification({ ...base, phase: 'waiting' });\n await sleepQuietly(delayMs, signal);\n await emitRetryNotification({ ...base, phase: 'requesting' });\n}\n\nasync function emitRetryNotification(data: LLMRetryData): Promise<void> {\n try {\n // 动态导入避免 llm → core 的静态依赖加重;模块缓存后开销可忽略\n const { emitNotification, createLLMRetry } = await import('@agentdevjs/core');\n emitNotification(createLLMRetry(data));\n } catch {\n // 通知失败不影响重试\n }\n}\n\nasync function sleepQuietly(ms: number, signal?: AbortSignal): Promise<void> {\n const { sleep } = await import('@agentdevjs/core');\n await sleep(ms, signal);\n}\n","/**\r\n * Feature 注入 system 消息的 reminder 包装。\r\n *\r\n * 无 source 的 system(agent 系统提示词)与有 source 的 system(Feature 注入,\r\n * 如 handoff-seed、partial-compact)在编译层分流:后者包为 <reminder> 嵌入\r\n * 最近的 user turn,而非混入顶层 system。已带 <reminder> 前缀的内容不重复包装。\r\n */\r\nexport function wrapReminder(text: string): string {\r\n const trimmed = text.trim();\r\n return /^<reminder[\\s>]/.test(trimmed) ? trimmed : `<reminder>${trimmed}</reminder>`;\r\n}\r\n","/**\n * OpenAI LLM 适配器\n * 实现 LLMClient 接口\n */\n\nimport type { LLMClient, Message, Tool, LLMResponse, ToolCall, UsageInfo, ImageInput } from '@agentdevjs/core';\nimport type { LLMPhase } from '@agentdevjs/core';\nimport type { CustomHeaderEntry, ThinkingEffort } from '@agentdevjs/core';\nimport { OPENAI_THINKING_EFFORTS } from '@agentdevjs/core';\nimport { resolveCustomHeaders } from './custom-headers.js';\nimport { resolveImageDataUri } from './image-resolver.js';\nimport { sanitizeToolSchema } from './schema-sanitizer.js';\nimport OpenAI from 'openai';\nimport { DEFAULT_MAX_RETRIES, getRetryDelay, parseRetryAfter, shouldRetry, resolveModelCallPolicy, withDeadline } from '@agentdevjs/core';\nimport { classifyAndWrapError, ClassifiedAPIError } from '@agentdevjs/core';\nimport { initHttpClient } from './http-client.js';\nimport { emitRetryObservability } from './retry-observability.js';\nimport { wrapReminder } from './reminder.js';\n\n// 确保 HTTP 客户端基础设施(DNS 缓存、代理、连接池)在首次 fetch 前初始化\nlet httpClientInitPromise: Promise<void> | null = null;\nfunction ensureHttpClientInitialized() {\n if (!httpClientInitPromise) {\n httpClientInitPromise = initHttpClient();\n }\n return httpClientInitPromise;\n}\n\n// GLM-4.7等模型扩展了OpenAI的响应格式,添加了reasoning_content字段\ninterface ExtendedChatCompletionMessage extends OpenAI.Chat.ChatCompletionMessage {\n reasoning_content?: string;\n}\n\n/**\n * 将内部 Message[] 编译为 OpenAI Chat Completions wire 格式。\n * 与 compileContextForAnthropic / compileContextForOpenAIResponses 对称的导出编译函数。\n *\n * system 消息按 source 二分处理(对齐 compileContextForAnthropic):\n * - 无 source(agent 系统提示词及经 context.add 注入的同级文档)→ 合并为\n * 开头恰好一条 system 消息。部分 OpenAI 兼容后端(vLLM Qwen chat template 等)\n * 仅接受一条位于开头的 system,多条返回 400 \"System message must be at the beginning.\"。\n * - 有 source(Feature 注入,如 handoff-seed、partial-compact)→ 包 <reminder>\n * 嵌入下一个 user turn(作为文本前缀);若后续无 user 消息则以独立 user\n * 消息落尾。不插入 assistant/tool 之间,避免破坏 tool_calls 配对。\n */\nexport function compileChatMessages(\n messages: Message[],\n visionEnabled = false,\n): OpenAI.Chat.ChatCompletionMessageParam[] {\n const systemPromptParts: string[] = [];\n const compiled: OpenAI.Chat.ChatCompletionMessageParam[] = [];\n let seenFirstUser = false;\n let pendingReminders: string[] = [];\n\n const flushRemindersAsUserMessage = (): void => {\n if (pendingReminders.length === 0) return;\n compiled.push({ role: 'user', content: pendingReminders.join('\\n\\n') });\n pendingReminders = [];\n };\n\n for (const m of messages) {\n if (m.role === 'system') {\n if (!seenFirstUser && !m.source) {\n systemPromptParts.push(m.content);\n } else {\n pendingReminders.push(wrapReminder(m.content));\n }\n continue;\n }\n\n if (m.role === 'tool') {\n compiled.push({ role: 'tool', content: m.content, tool_call_id: m.toolCallId! });\n // tool 消息附带图片\n if (m.images && m.images.length > 0) {\n if (visionEnabled) {\n // 视觉模式:追加一条 user 消息携带图片\n const parts: OpenAI.Chat.ChatCompletionContentPart[] = [\n { type: 'text', text: `[Tool image result for ${m.toolCallId}]` },\n ];\n for (const img of m.images) {\n const url = resolveImageDataUri(img) || img.source;\n if (url) {\n parts.push({ type: 'image_url', image_url: { url } });\n }\n }\n compiled.push({ role: 'user', content: parts });\n } else {\n // 非视觉模式:降级为文字占位符,追加到 tool 消息后\n const placeholders = m.images\n .map(img => `【Image】${img.source || '(inline image)'}`)\n .join('\\n');\n compiled.push({ role: 'user', content: `[Tool image placeholders]\\n${placeholders}` });\n }\n }\n continue;\n }\n\n // assistant 消息携带 toolCalls 时必须序列化为 tool_calls,\n // 否则后续 tool 消息会成为孤儿(严格校验的 OpenAI 兼容后端会返回 400:\n // \"Messages with role 'tool' must be a response to a preceding message with 'tool_calls'\")\n if (m.role === 'assistant' && Array.isArray(m.toolCalls) && m.toolCalls.length > 0) {\n compiled.push({\n role: 'assistant' as const,\n content: m.content ?? '',\n tool_calls: m.toolCalls.map(tc => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.arguments ?? {}),\n },\n })),\n });\n continue;\n }\n\n // user 消息:待嵌入的 reminder 作为文本前缀拼入 content\n if (m.role === 'user' && m.images && m.images.length > 0) {\n seenFirstUser = true;\n const prefix = pendingReminders.length > 0 ? `${pendingReminders.join('\\n\\n')}\\n\\n` : '';\n pendingReminders = [];\n if (visionEnabled) {\n const parts: OpenAI.Chat.ChatCompletionContentPart[] = [];\n if (m.content) {\n parts.push({ type: 'text', text: `${prefix}${m.content}` });\n } else if (prefix) {\n parts.push({ type: 'text', text: prefix.trimEnd() });\n }\n for (const img of m.images) {\n const url = resolveImageDataUri(img) || img.source;\n if (url) {\n parts.push({ type: 'image_url', image_url: { url } });\n }\n }\n compiled.push({ role: 'user', content: parts });\n } else {\n // 非视觉模式:将图片降级为文字占位符\n const placeholders = m.images\n .map(img => `【Image】${img.source || '(inline image)'}`)\n .join('\\n');\n compiled.push({ role: 'user', content: `${prefix}${m.content}\\n${placeholders}` });\n }\n continue;\n }\n\n if (m.role === 'user') {\n seenFirstUser = true;\n if (pendingReminders.length > 0) {\n compiled.push({ role: 'user', content: `${pendingReminders.join('\\n\\n')}\\n\\n${m.content}` });\n pendingReminders = [];\n } else {\n compiled.push({ role: 'user', content: m.content });\n }\n continue;\n }\n\n compiled.push({ role: m.role, content: m.content } as OpenAI.Chat.ChatCompletionMessageParam);\n }\n\n flushRemindersAsUserMessage();\n\n const result: OpenAI.Chat.ChatCompletionMessageParam[] = [];\n if (systemPromptParts.length > 0) {\n result.push({ role: 'system', content: systemPromptParts.join('\\n\\n') });\n }\n result.push(...compiled);\n return result;\n}\n\nexport class OpenAILLM implements LLMClient {\n private client: OpenAI;\n private _modelName: string;\n private maxTokens?: number;\n private thinkingEffort?: ThinkingEffort;\n private providerOptions?: Record<string, unknown>;\n private customHeaders?: CustomHeaderEntry[];\n private visionEnabled: boolean;\n private initPromise: Promise<void>;\n private maxRetries: number;\n private deadlineMs: number | undefined;\n\n /** 返回当前 LLM 实例使用的模型名 */\n get modelName(): string { return this._modelName; }\n\n constructor(\n apiKey: string,\n modelName: string = 'gpt-4o',\n baseUrl?: string,\n maxTokens?: number,\n thinkingEffort?: ThinkingEffort,\n providerOptions?: Record<string, unknown>,\n customHeaders?: CustomHeaderEntry[],\n visionEnabled: boolean = false,\n callPolicy?: { maxRetries?: number; timeoutMs?: number },\n ) {\n const resolved = resolveModelCallPolicy(callPolicy);\n this.maxRetries = resolved.maxRetries;\n this.deadlineMs = resolved.timeoutMs;\n this.client = new OpenAI({\n apiKey,\n baseURL: baseUrl,\n // 通过自定义 fetch 注入动态请求头,使 uuid / random 模式在每次请求时重新生成\n ...(customHeaders && customHeaders.length > 0\n ? {\n fetch: (input: any, init: any) => {\n init = init || {};\n const headers = new Headers(init.headers);\n for (const [k, v] of Object.entries(resolveCustomHeaders(customHeaders))) {\n headers.set(k, v);\n }\n // The OpenAI SDK has already serialized the body and sets its\n // own Content-Length. Once a custom fetch forwards that header\n // through Undici's ProxyAgent, Undici 7 rejects it before the\n // request reaches the proxy (UND_ERR_INVALID_ARG). Let the\n // final fetch implementation calculate it after header\n // injection instead.\n headers.delete('content-length');\n init.headers = headers;\n return globalThis.fetch(input, init);\n },\n }\n : {}),\n });\n this._modelName = modelName;\n this.maxTokens = maxTokens;\n this.thinkingEffort = thinkingEffort;\n this.providerOptions = providerOptions;\n this.customHeaders = customHeaders;\n this.visionEnabled = visionEnabled;\n this.initPromise = ensureHttpClientInitialized();\n }\n\n /**\n * 聊天 - 核心方法(内部使用流式处理,带重试)\n */\n async chat(messages: Message[], tools: Tool[], options?: { signal?: AbortSignal }): Promise<LLMResponse> {\n // 确保 HTTP 客户端已初始化\n await this.initPromise;\n // 整体时限:deadline 到达以 AbortError 中止,不进入重试\n const signal = withDeadline(options?.signal, this.deadlineMs);\n // 转换消息格式为 OpenAI 格式\n const chatMessages = compileChatMessages(messages, this.visionEnabled);\n\n // 转换工具格式\n const chatTools = tools.map(t => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: sanitizeToolSchema(t.parameters),\n },\n }));\n\n const requestBody = {\n model: this._modelName,\n messages: chatMessages,\n tools: chatTools.length > 0 ? chatTools : undefined,\n stream: true,\n stream_options: { include_usage: true },\n ...(this.maxTokens ? { max_tokens: this.maxTokens } : {}),\n ...(this.thinkingEffort && OPENAI_THINKING_EFFORTS.includes(this.thinkingEffort)\n ? { reasoning_effort: this.thinkingEffort }\n : {}),\n ...(this.providerOptions ?? {}),\n } as OpenAI.Chat.ChatCompletionCreateParamsStreaming;\n\n for (let attempt = 1; attempt <= this.maxRetries + 1; attempt++) {\n try {\n // 检查中断信号\n if (signal?.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n const stream = await this.client.chat.completions.create(requestBody, {\n signal,\n });\n\n // ========== 流式处理(内部) ==========\n\n // 累积内容\n let content = '';\n let reasoning = '';\n let currentPhase: LLMPhase = 'content';\n\n // 累积 tool_calls\n interface AccumulatedToolCall {\n id: string;\n name: string;\n arguments: string;\n }\n const accumulatedToolCalls: Map<number, AccumulatedToolCall> = new Map();\n\n // 收集 usage 数据\n let usageInfo: UsageInfo | null = null;\n\n // 收集 finish_reason\n let finishReason: string | null = null;\n\n // 迭代流式响应\n for await (const chunk of stream) {\n // 在流式读取中检查中断信号\n if (signal?.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n if (chunk.usage) {\n const u = chunk.usage;\n const extendedDetails = u as any;\n let reasoningTokens = 0;\n if (extendedDetails.prompt_tokens_details?.reasoning_tokens) {\n reasoningTokens += extendedDetails.prompt_tokens_details.reasoning_tokens;\n }\n if (extendedDetails.completion_tokens_details?.reasoning_tokens) {\n reasoningTokens += extendedDetails.completion_tokens_details.reasoning_tokens;\n }\n\n usageInfo = {\n inputTokens: u.prompt_tokens || 0,\n outputTokens: u.completion_tokens || 0,\n totalTokens: (u.prompt_tokens || 0) + (u.completion_tokens || 0),\n ...(reasoningTokens > 0 ? { reasoningTokens } : {}),\n };\n }\n\n const delta = chunk.choices[0]?.delta;\n if (!delta) {\n continue;\n }\n\n const rawDelta = delta as { reasoning_content?: string; content?: string | null };\n // reasoning 与 content 独立累积:过渡 chunk 可能同包携带两者(reasoning 尾巴 +\n // 正文开头),else-if 结构会永久丢弃正文开头片段\n if (rawDelta.reasoning_content) {\n currentPhase = 'thinking';\n reasoning += rawDelta.reasoning_content;\n }\n if (delta.content) {\n currentPhase = 'content';\n content += delta.content;\n }\n\n if (delta.tool_calls) {\n currentPhase = 'tool_calling';\n for (const toolCall of delta.tool_calls) {\n // 兼容省略 index 的 OpenAI 兼容实现(部分网关非并行场景不回填 index):\n // 静默丢弃会导致工具调用整体丢失,表现为\"会话没有工具调用就被打断\"。\n // 带 id 的增量优先续写同 id 条目,否则开启新调用;不带 id 的增量续写最近条目。\n let index = toolCall.index;\n if (index === undefined || index === null) {\n if (toolCall.id) {\n const existingIndex = Array.from(accumulatedToolCalls.entries())\n .find(([, v]) => v.id === toolCall.id)?.[0];\n index = existingIndex ?? accumulatedToolCalls.size;\n } else {\n index = Math.max(accumulatedToolCalls.size - 1, 0);\n }\n }\n\n if (!accumulatedToolCalls.has(index)) {\n accumulatedToolCalls.set(index, {\n id: toolCall.id || '',\n name: toolCall.function?.name || '',\n arguments: toolCall.function?.arguments || '',\n });\n } else {\n const accumulated = accumulatedToolCalls.get(index)!;\n if (toolCall.id) accumulated.id = toolCall.id;\n if (toolCall.function?.name) accumulated.name += toolCall.function.name;\n if (toolCall.function?.arguments) accumulated.arguments += toolCall.function.arguments;\n }\n }\n }\n\n try {\n const { emitNotification, createLLMCharCount } = await import('@agentdevjs/core');\n // 各 phase 独立计数:正文阶段不应延续思考阶段的累计值\n const phaseCharCount = currentPhase === 'thinking' ? reasoning.length : content.length;\n if (phaseCharCount > 0 || accumulatedToolCalls.size > 0) {\n const toolNames = Array.from(accumulatedToolCalls.values()).map(tc => tc.name).filter(Boolean);\n emitNotification(createLLMCharCount(phaseCharCount, currentPhase, {\n thinkingChars: reasoning.length,\n contentChars: content.length,\n toolCallCount: accumulatedToolCalls.size,\n ...(toolNames.length > 0 ? { streamToolNames: toolNames } : {}),\n }));\n }\n } catch {\n // 通知模块不可用,忽略\n }\n\n if (chunk.choices[0]?.finish_reason) {\n // 仅记录,不立即中断迭代:部分网关 finish_reason 先行、增量殿后,\n // 提前 break 会丢失尾部 tool_calls 增量与 usage chunk。\n // 规范网关在 [DONE] 后迭代器自然结束,无额外等待。\n finishReason = chunk.choices[0].finish_reason;\n }\n }\n\n // 构建最终的 tool_calls 数组\n let toolCalls: ToolCall[] | undefined;\n if (accumulatedToolCalls.size > 0) {\n toolCalls = Array.from(accumulatedToolCalls.values()).map(tc => {\n let parsedArgs: Record<string, any> = {};\n const argStr = tc.arguments.trim();\n if (argStr) {\n try {\n parsedArgs = JSON.parse(argStr);\n } catch {\n // JSON 不完整(通常是 max_tokens 截断导致)\n // 返回空对象,由 react-loop 的截断防御处理\n console.warn(\n `[OpenAI] Failed to parse tool arguments for tool \"${tc.name}\". ` +\n `Arguments length: ${argStr.length}, preview: ${argStr.slice(0, 200)}`,\n );\n }\n }\n return {\n id: tc.id,\n name: tc.name,\n arguments: parsedArgs,\n };\n });\n }\n\n return {\n content,\n toolCalls,\n reasoning,\n ...(usageInfo ? { usage: usageInfo } : {}),\n stopReason: finishReason,\n };\n } catch (error) {\n // 中断错误不重试,直接传播\n if (error instanceof DOMException && error.name === 'AbortError') {\n throw error;\n }\n // AbortError from fetch/signal\n if (error instanceof Error && error.name === 'AbortError') {\n throw error;\n }\n\n // OpenAI SDK 错误对象上通常有 status 和 headers\n const status = (error as any)?.status as number | undefined;\n if (attempt <= this.maxRetries && shouldRetry(error, status)) {\n const retryAfterMs = parseRetryAfter((error as any)?.headers);\n const delayMs = getRetryDelay(attempt, retryAfterMs);\n await emitRetryObservability({\n attempt,\n maxRetries: this.maxRetries,\n delayMs,\n signal,\n error,\n status,\n });\n continue;\n }\n // 重试耗尽或不可重试 → 分类包装后抛出\n throw classifyAndWrapError(error, status);\n }\n }\n\n // 理论上不会到这里\n throw new Error('OpenAI API call failed after all retries');\n }\n}\n\nimport type { ModelConfig, AgentConfigFile } from '@agentdevjs/core';\n\n/**\n * 从配置创建 OpenAI LLM 实例\n *\n * @example\n * // 方式1:传入配置文件对象(推荐)\n * const llm = createOpenAILLM(config);\n *\n * @example\n * // 方式2:传入模型配置\n * const llm = createOpenAILLM(config.defaultModel);\n *\n * @example\n * // 方式3:单独传参\n * const llm = createOpenAILLM(apiKey, 'gpt-4o', baseUrl);\n *\n * @example\n * // 方式4:自定义配置\n * const llm = createOpenAILLM({ apiKey: 'xxx', model: 'gpt-4o' });\n */\nexport function createOpenAILLM(config: AgentConfigFile): OpenAILLM;\nexport function createOpenAILLM(modelConfig: ModelConfig): OpenAILLM;\nexport function createOpenAILLM(\n apiKey: string,\n modelName: string,\n baseUrl?: string\n): OpenAILLM;\nexport function createOpenAILLM(\n configOrApiKey: AgentConfigFile | ModelConfig | string,\n modelName?: string,\n baseUrl?: string\n): OpenAILLM {\n // 处理 AgentConfigFile\n if (typeof configOrApiKey === 'object' && 'defaultModel' in configOrApiKey) {\n return new OpenAILLM(\n configOrApiKey.defaultModel.apiKey,\n configOrApiKey.defaultModel.model,\n configOrApiKey.defaultModel.baseUrl,\n configOrApiKey.defaultModel.maxTokens,\n configOrApiKey.defaultModel.thinkingEffort,\n configOrApiKey.defaultModel.providerOptions,\n configOrApiKey.defaultModel.customHeaders,\n configOrApiKey.defaultModel.vision ?? false,\n { maxRetries: configOrApiKey.defaultModel.maxRetries, timeoutMs: configOrApiKey.defaultModel.timeoutMs },\n );\n }\n // 处理 ModelConfig\n if (typeof configOrApiKey === 'object') {\n return new OpenAILLM(\n configOrApiKey.apiKey,\n configOrApiKey.model,\n configOrApiKey.baseUrl,\n configOrApiKey.maxTokens,\n configOrApiKey.thinkingEffort,\n configOrApiKey.providerOptions,\n configOrApiKey.customHeaders,\n configOrApiKey.vision ?? false,\n { maxRetries: configOrApiKey.maxRetries, timeoutMs: configOrApiKey.timeoutMs },\n );\n }\n // 处理单独传参\n return new OpenAILLM(configOrApiKey, modelName!, baseUrl);\n}\n","/**\n * OpenAI Responses LLM 适配器\n *\n * 只负责把框架的 Message / Tool 编译为 Responses 输入,\n * 再把 Responses 输出收敛回 LLMResponse。\n */\n\nimport OpenAI from 'openai';\nimport type { AgentConfigFile, ModelConfig, CustomHeaderEntry, ThinkingEffort } from '@agentdevjs/core';\nimport { OPENAI_THINKING_EFFORTS } from '@agentdevjs/core';\nimport type { LLMClient, LLMResponse, LLMPhase, Message, Tool, ToolCall, UsageInfo, ThinkingBlock, ImageInput } from '@agentdevjs/core';\nimport { resolveCustomHeaders } from './custom-headers.js';\nimport { resolveImageDataUri } from './image-resolver.js';\nimport { sanitizeToolSchema } from './schema-sanitizer.js';\nimport { getRetryDelay, parseRetryAfter, shouldRetry, resolveModelCallPolicy, withDeadline } from '@agentdevjs/core';\nimport { classifyAndWrapError, ClassifiedAPIError } from '@agentdevjs/core';\nimport { initHttpClient } from './http-client.js';\nimport { emitRetryObservability } from './retry-observability.js';\n\n// 确保 HTTP 客户端基础设施(DNS 缓存、代理、连接池)在首次 fetch 前初始化\nlet httpClientInitPromise: Promise<void> | null = null;\nfunction ensureHttpClientInitialized() {\n if (!httpClientInitPromise) {\n httpClientInitPromise = initHttpClient();\n }\n return httpClientInitPromise;\n}\n\ntype ResponsesRequest = {\n model: string;\n instructions?: string;\n input: any[];\n tools?: Array<Record<string, unknown>>;\n tool_choice?: 'auto';\n max_output_tokens?: number;\n parallel_tool_calls?: boolean;\n reasoning?: Record<string, unknown>;\n previous_response_id?: string;\n store?: boolean;\n text?: Record<string, unknown>;\n include?: Array<string>;\n [key: string]: unknown;\n};\n\nexport type OpenAIResponsesProfile = 'standard' | 'codex';\n\nconst DEFAULT_CODEX_INSTRUCTIONS = 'You are a helpful assistant.';\n\ntype ResponsesSnapshot = {\n output?: any[];\n output_text?: string;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n input_tokens_details?: { cached_tokens?: number };\n output_tokens_details?: { reasoning_tokens?: number };\n };\n status?: string;\n incomplete_details?: { reason?: string } | null;\n};\n\ninterface AccumulatedFunctionCall {\n call_id: string;\n name: string;\n arguments: string;\n}\n\ninterface AccumulatedReasoning {\n id: string;\n summary: string[];\n}\n\nexport class OpenAIResponsesLLM implements LLMClient {\n private client: OpenAI;\n private _modelName: string;\n private maxTokens?: number;\n private thinkingEffort?: ThinkingEffort;\n private thinkingBudgetTokens?: number;\n private providerOptions?: Record<string, unknown>;\n private customHeaders?: CustomHeaderEntry[];\n private visionEnabled: boolean;\n private responsesProfile: OpenAIResponsesProfile;\n private initPromise: Promise<void>;\n private maxRetries: number;\n private deadlineMs: number | undefined;\n\n /** 返回当前 LLM 实例使用的模型名 */\n get modelName(): string { return this._modelName; }\n\n constructor(\n apiKey: string,\n modelName: string = 'gpt-4o',\n baseUrl?: string,\n maxTokens?: number,\n thinkingEffort?: ThinkingEffort,\n thinkingBudgetTokens?: number,\n providerOptions?: Record<string, unknown>,\n customHeaders?: CustomHeaderEntry[],\n visionEnabled: boolean = false,\n responsesProfile: OpenAIResponsesProfile = 'standard',\n callPolicy?: { maxRetries?: number; timeoutMs?: number },\n ) {\n const resolved = resolveModelCallPolicy(callPolicy);\n this.maxRetries = resolved.maxRetries;\n this.deadlineMs = resolved.timeoutMs;\n this.client = new OpenAI({\n apiKey,\n baseURL: baseUrl,\n ...(customHeaders && customHeaders.length > 0\n ? {\n fetch: (input: any, init: any) => {\n init = init || {};\n const headers = new Headers(init.headers);\n for (const [k, v] of Object.entries(resolveCustomHeaders(customHeaders))) {\n headers.set(k, v);\n }\n // The OpenAI SDK has already serialized the body and sets its\n // own Content-Length. Once a custom fetch forwards that header\n // through Undici's ProxyAgent, Undici 7 rejects it before the\n // request reaches the proxy (UND_ERR_INVALID_ARG). Let the\n // final fetch implementation calculate it after header\n // injection instead.\n headers.delete('content-length');\n init.headers = headers;\n return globalThis.fetch(input, init);\n },\n }\n : {}),\n });\n this._modelName = modelName;\n this.maxTokens = maxTokens;\n this.thinkingEffort = thinkingEffort;\n this.thinkingBudgetTokens = thinkingBudgetTokens;\n this.providerOptions = providerOptions;\n this.customHeaders = customHeaders;\n this.visionEnabled = visionEnabled;\n this.responsesProfile = responsesProfile;\n this.initPromise = ensureHttpClientInitialized();\n }\n\n async chat(messages: Message[], tools: Tool[], options?: { signal?: AbortSignal }): Promise<LLMResponse> {\n await this.initPromise;\n\n const compiled = compileContextForOpenAIResponses(messages, tools, {\n modelName: this._modelName,\n maxTokens: this.maxTokens,\n thinkingEffort: this.thinkingEffort,\n thinkingBudgetTokens: this.thinkingBudgetTokens,\n providerOptions: this.providerOptions,\n visionEnabled: this.visionEnabled,\n responsesProfile: this.responsesProfile,\n });\n let preferNonStreaming = false;\n const signal = withDeadline(options?.signal, this.deadlineMs);\n\n for (let attempt = 1; attempt <= this.maxRetries + 1; attempt++) {\n let sawAnyStreamEvent = false;\n try {\n if (signal?.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n if (preferNonStreaming) {\n return await this.createResponsesCompletion(compiled, options);\n }\n\n const stream = this.client.responses.stream(\n {\n ...compiled,\n stream: true,\n } as any,\n { signal },\n );\n\n let content = '';\n let reasoning = '';\n let currentPhase: LLMPhase = 'content';\n let stopReason: string | null = null;\n let usageInfo: UsageInfo | null = null;\n let completedSnapshot: ResponsesSnapshot | null = null;\n let completedText = '';\n\n const functionCalls = new Map<string, AccumulatedFunctionCall>();\n const reasoningItems = new Map<string, AccumulatedReasoning>();\n\n for await (const event of stream) {\n sawAnyStreamEvent = true;\n if (signal?.aborted) {\n throw new DOMException('Aborted', 'AbortError');\n }\n\n switch (event.type) {\n case 'response.output_text.delta': {\n const delta = String(event.delta || '');\n if (delta) {\n currentPhase = 'content';\n content += delta;\n }\n break;\n }\n case 'response.output_text.done': {\n completedText = String(event.text || completedText || '');\n break;\n }\n case 'response.function_call_arguments.delta': {\n const key = String(event.item_id || event.output_index);\n currentPhase = 'tool_calling';\n if (!functionCalls.has(key)) {\n functionCalls.set(key, {\n call_id: '',\n name: '',\n arguments: '',\n });\n }\n functionCalls.get(key)!.arguments += String(event.delta || '');\n break;\n }\n case 'response.function_call_arguments.done': {\n const key = String(event.item_id || event.output_index);\n if (!functionCalls.has(key)) {\n functionCalls.set(key, {\n call_id: '',\n name: '',\n arguments: '',\n });\n }\n functionCalls.get(key)!.arguments = String(event.arguments || functionCalls.get(key)!.arguments || '');\n break;\n }\n case 'response.output_item.added':\n case 'response.output_item.done': {\n const item = event.item || {};\n if (item.type === 'function_call') {\n const key = String(item.id || event.output_index);\n currentPhase = 'tool_calling';\n functionCalls.set(key, {\n call_id: String(item.call_id || ''),\n name: String(item.name || ''),\n arguments: String(item.arguments || ''),\n });\n } else if (item.type === 'reasoning') {\n recordReasoningItem(reasoningItems, item);\n } else if (item.type === 'message' && event.type === 'response.output_item.done') {\n completedText = extractOutputMessageText(item) || completedText;\n }\n break;\n }\n case 'response.reasoning_summary.delta':\n case 'response.reasoning_summary_text.delta': {\n const key = String(event.item_id || event.output_index);\n if (!reasoningItems.has(key)) {\n reasoningItems.set(key, { id: String(event.item_id || ''), summary: [] });\n }\n const delta = extractTextDelta(event.delta);\n if (delta) {\n const entry = reasoningItems.get(key)!;\n if (entry.summary.length === 0) {\n entry.summary.push(delta);\n } else {\n entry.summary[entry.summary.length - 1] += delta;\n }\n currentPhase = 'thinking';\n reasoning += delta;\n }\n break;\n }\n case 'response.reasoning_summary.done': {\n const key = String(event.item_id || event.output_index);\n const text = String(event.text || '');\n if (!reasoningItems.has(key)) {\n reasoningItems.set(key, { id: String(event.item_id || ''), summary: [] });\n }\n const entry = reasoningItems.get(key)!;\n if (text) {\n entry.summary = [text];\n currentPhase = 'thinking';\n reasoning += text;\n }\n break;\n }\n case 'response.reasoning_summary_text.done': {\n const key = String(event.item_id || event.output_index);\n const text = String(event.text || '');\n if (!reasoningItems.has(key)) {\n reasoningItems.set(key, { id: String(event.item_id || ''), summary: [] });\n }\n const entry = reasoningItems.get(key)!;\n if (text) {\n entry.summary = [text];\n currentPhase = 'thinking';\n reasoning += text;\n }\n break;\n }\n case 'response.completed': {\n completedSnapshot = event.response as ResponsesSnapshot | null;\n stopReason = mapResponseStatusToStopReason(completedSnapshot);\n break;\n }\n case 'response.failed': {\n completedSnapshot = event.response as ResponsesSnapshot | null;\n stopReason = 'failed';\n break;\n }\n case 'response.incomplete': {\n completedSnapshot = event.response as ResponsesSnapshot | null;\n stopReason = mapResponseStatusToStopReason(completedSnapshot);\n break;\n }\n default:\n break;\n }\n\n try {\n const { emitNotification, createLLMCharCount } = await import('@agentdevjs/core');\n // 各 phase 独立计数:正文阶段不应延续思考阶段的累计值\n const phaseCharCount = currentPhase === 'thinking' ? reasoning.length : content.length;\n if (phaseCharCount > 0 || functionCalls.size > 0) {\n const toolNames = Array.from(functionCalls.values()).map(fc => fc.name).filter(Boolean);\n emitNotification(createLLMCharCount(phaseCharCount, currentPhase, {\n thinkingChars: reasoning.length,\n contentChars: content.length,\n toolCallCount: functionCalls.size,\n ...(toolNames.length > 0 ? { streamToolNames: toolNames } : {}),\n }));\n }\n } catch {\n // Ignore notification failures.\n }\n }\n\n const parsedSnapshot = completedSnapshot ? parseOpenAIResponsesSnapshot(completedSnapshot) : null;\n if (parsedSnapshot?.usage) {\n usageInfo = parsedSnapshot.usage;\n }\n\n const parsedToolCalls = parsedSnapshot?.toolCalls?.length\n ? parsedSnapshot.toolCalls\n : finalizeToolCalls(functionCalls);\n const parsedThinkingBlocks = parsedSnapshot?.thinkingBlocks?.length\n ? parsedSnapshot.thinkingBlocks\n : finalizeThinkingBlocks(reasoningItems);\n // ChatGPT's Codex backend currently emits the actual message through\n // stream events but returns response.completed with output: []. Never\n // let that sparse terminal snapshot erase text already received.\n const finalContent = parsedSnapshot?.content || content || completedText;\n const finalReasoning = parsedSnapshot?.reasoning || reasoning;\n const finalStopReason = parsedSnapshot?.stopReason ?? stopReason;\n\n return {\n content: finalContent,\n ...(parsedToolCalls.length > 0 ? { toolCalls: parsedToolCalls } : {}),\n ...(finalReasoning ? { reasoning: finalReasoning } : {}),\n ...(parsedThinkingBlocks.length > 0 ? { thinkingBlocks: parsedThinkingBlocks } : {}),\n ...(usageInfo ? { usage: usageInfo } : {}),\n stopReason: finalStopReason,\n };\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n throw error;\n }\n if (error instanceof Error && error.name === 'AbortError') {\n throw error;\n }\n\n if (isEmptyResponsesStreamError(error) && !sawAnyStreamEvent) {\n preferNonStreaming = true;\n try {\n return await this.createResponsesCompletion(compiled, options);\n } catch (fallbackError) {\n if (fallbackError instanceof DOMException && fallbackError.name === 'AbortError') {\n throw fallbackError;\n }\n if (fallbackError instanceof Error && fallbackError.name === 'AbortError') {\n throw fallbackError;\n }\n\n const fallbackStatus = (fallbackError as any)?.status as number | undefined;\n if (attempt <= this.maxRetries && shouldRetry(fallbackError, fallbackStatus)) {\n const retryAfterMs = parseRetryAfter((fallbackError as any)?.headers);\n const delayMs = getRetryDelay(attempt, retryAfterMs);\n await emitRetryObservability({\n attempt,\n maxRetries: this.maxRetries,\n delayMs,\n signal,\n error: fallbackError,\n status: fallbackStatus,\n });\n continue;\n }\n\n throw classifyAndWrapError(fallbackError, fallbackStatus);\n }\n }\n\n const status = (error as any)?.status as number | undefined;\n if (attempt <= this.maxRetries && shouldRetry(error, status)) {\n const retryAfterMs = parseRetryAfter((error as any)?.headers);\n const delayMs = getRetryDelay(attempt, retryAfterMs);\n await emitRetryObservability({\n attempt,\n maxRetries: this.maxRetries,\n delayMs,\n signal,\n error,\n status,\n });\n continue;\n }\n\n throw classifyAndWrapError(error, status);\n }\n }\n\n throw new Error('OpenAI Responses API call failed after all retries');\n }\n\n private async createResponsesCompletion(\n compiled: ResponsesRequest,\n options?: { signal?: AbortSignal },\n ): Promise<LLMResponse> {\n const response = await this.client.responses.create(compiled as any, { signal: options?.signal } as any);\n const parsedSnapshot = parseOpenAIResponsesSnapshot(response as ResponsesSnapshot);\n\n return {\n content: parsedSnapshot.content,\n ...(parsedSnapshot.toolCalls.length > 0 ? { toolCalls: parsedSnapshot.toolCalls } : {}),\n ...(parsedSnapshot.reasoning ? { reasoning: parsedSnapshot.reasoning } : {}),\n ...(parsedSnapshot.thinkingBlocks.length > 0 ? { thinkingBlocks: parsedSnapshot.thinkingBlocks } : {}),\n ...(parsedSnapshot.usage ? { usage: parsedSnapshot.usage } : {}),\n stopReason: parsedSnapshot.stopReason,\n };\n }\n}\n\nexport interface CompileOpenAIResponsesOptions {\n modelName?: string;\n maxTokens?: number;\n thinkingEffort?: ThinkingEffort;\n thinkingBudgetTokens?: number;\n providerOptions?: Record<string, unknown>;\n visionEnabled?: boolean;\n responsesProfile?: OpenAIResponsesProfile;\n}\n\nexport function compileContextForOpenAIResponses(\n messages: Message[],\n tools: Tool[],\n options: CompileOpenAIResponsesOptions = {},\n): ResponsesRequest {\n const input: any[] = [];\n const responsesProfile = options.responsesProfile ?? 'standard';\n const codexInstructionParts: string[] = [];\n let reachedConversation = false;\n\n for (const message of messages) {\n if (!message) continue;\n\n if (message.role === 'system') {\n if (responsesProfile === 'codex' && !reachedConversation && !message.source) {\n const instruction = String(message.content ?? '').trim();\n if (instruction) codexInstructionParts.push(instruction);\n continue;\n }\n\n input.push({\n type: 'message',\n // ChatGPT's Codex endpoint only accepts the stable, leading system\n // identity through `instructions`. Runtime reminders can be injected\n // after the conversation starts without a `source` marker, so every\n // remaining system message must be replayed as user input.\n role: responsesProfile === 'codex' ? 'user' : 'system',\n content: [\n {\n type: 'input_text',\n text: String(message.content ?? ''),\n },\n ],\n });\n if (responsesProfile === 'codex') reachedConversation = true;\n continue;\n }\n\n reachedConversation = true;\n\n if (message.role === 'user') {\n const visionEnabled = options.visionEnabled ?? false;\n let textContent = String(message.content ?? '');\n\n // 处理图片\n if (message.images && message.images.length > 0) {\n if (visionEnabled) {\n // 视觉模式:生成 input_image 内容块\n const contentParts: any[] = [\n { type: 'input_text', text: textContent },\n ];\n for (const img of message.images) {\n const url = resolveImageDataUri(img) || img.source;\n if (url) {\n contentParts.push({ type: 'input_image', image_url: url, detail: 'auto' });\n }\n }\n input.push({ type: 'message', role: 'user', content: contentParts });\n continue;\n }\n // 非视觉模式:降级为文字占位符\n const placeholders = message.images\n .map(img => `【Image】${img.source || '(inline image)'}`)\n .join('\\n');\n textContent = `${textContent}\\n${placeholders}`;\n }\n\n input.push({\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: textContent }],\n });\n continue;\n }\n\n if (message.role === 'assistant') {\n const assistantItems = compileAssistantMessageToResponsesItems(message, responsesProfile);\n input.push(...assistantItems);\n continue;\n }\n\n if (message.role === 'tool') {\n if (!message.toolCallId) {\n throw new Error('OpenAI Responses compilation requires tool messages to include toolCallId');\n }\n input.push({\n type: 'function_call_output',\n call_id: message.toolCallId,\n output: String(message.content ?? ''),\n });\n // tool 消息附带图片:保守策略——追加一条 user 消息携带图片\n if (message.images && message.images.length > 0) {\n const visionEnabled = options.visionEnabled ?? false;\n if (visionEnabled) {\n const contentParts: any[] = [\n { type: 'input_text', text: `[Tool image result for ${message.toolCallId}]` },\n ];\n for (const img of message.images) {\n const url = resolveImageDataUri(img) || img.source;\n if (url) {\n contentParts.push({ type: 'input_image', image_url: url, detail: 'auto' });\n }\n }\n input.push({ type: 'message', role: 'user', content: contentParts });\n } else {\n const placeholders = message.images\n .map(img => `【Image】${img.source || '(inline image)'}`)\n .join('\\n');\n input.push({\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: `[Tool image placeholders]\\n${placeholders}` }],\n });\n }\n }\n continue;\n }\n\n input.push({\n type: 'message',\n role: 'user',\n content: [\n {\n type: 'input_text',\n text: String(message.content ?? ''),\n },\n ],\n });\n }\n\n const compiledTools = tools.length > 0\n ? tools.map((tool) => ({\n type: 'function',\n name: tool.name,\n description: tool.description,\n parameters: normalizeToolParameters(tool.parameters),\n strict: false,\n }))\n : undefined;\n\n const request: ResponsesRequest = {\n model: options.modelName || 'gpt-4o',\n input,\n ...(compiledTools ? { tools: compiledTools } : {}),\n ...(responsesProfile !== 'codex'\n && typeof options.maxTokens === 'number'\n && Number.isFinite(options.maxTokens)\n && options.maxTokens > 0\n ? { max_output_tokens: options.maxTokens }\n : {}),\n ...(tools.length > 0\n ? {\n parallel_tool_calls: true,\n ...(responsesProfile === 'codex' ? { tool_choice: 'auto' as const } : {}),\n }\n : {}),\n ...(options.thinkingEffort && OPENAI_THINKING_EFFORTS.includes(options.thinkingEffort)\n ? {\n reasoning: {\n effort: options.thinkingEffort,\n summary: 'auto',\n },\n }\n : typeof options.thinkingBudgetTokens === 'number' && options.thinkingBudgetTokens > 0\n ? {\n reasoning: {\n effort: mapThinkingBudgetToEffort(options.thinkingBudgetTokens),\n summary: 'auto',\n },\n }\n : {}),\n ...(options.providerOptions ?? {}),\n };\n\n if (responsesProfile === 'codex') {\n // ChatGPT's Codex endpoint uses a stricter Responses contract than the\n // public API. Keep these fields runtime-owned so generic provider options\n // cannot accidentally turn a valid OAuth request back into a 400.\n request.model = options.modelName || 'gpt-4o';\n request.instructions = codexInstructionParts.join('\\n\\n').trim() || DEFAULT_CODEX_INSTRUCTIONS;\n request.input = input;\n request.store = false;\n }\n\n return request;\n}\n\nfunction compileAssistantMessageToResponsesItems(\n message: Message,\n responsesProfile: OpenAIResponsesProfile,\n): any[] {\n const items: any[] = [];\n const reasoningParts: string[] = [];\n\n if (typeof message.reasoning === 'string' && message.reasoning.trim()) {\n reasoningParts.push(message.reasoning.trim());\n }\n\n if (Array.isArray(message.thinkingBlocks)) {\n for (const block of message.thinkingBlocks) {\n if (block?.thinking?.trim()) {\n reasoningParts.push(block.thinking.trim());\n }\n }\n }\n\n // Codex reasoning summaries are output-only display data. Without the\n // server-issued encrypted_content they cannot be replayed as input items;\n // synthetic id/status fields cause a 400 on the next turn.\n if (reasoningParts.length > 0 && responsesProfile !== 'codex') {\n items.push({\n type: 'reasoning',\n id: `reasoning-${items.length}`,\n summary: reasoningParts.map((text) => ({\n type: 'summary_text',\n text,\n })),\n status: 'completed',\n });\n }\n\n if (typeof message.content === 'string' && message.content.trim()) {\n items.push({\n type: 'message',\n role: 'assistant',\n content: [\n {\n type: 'output_text',\n text: message.content,\n ...(responsesProfile === 'standard' ? { annotations: [] } : {}),\n },\n ],\n });\n }\n\n if (Array.isArray(message.toolCalls)) {\n for (const toolCall of message.toolCalls) {\n items.push({\n type: 'function_call',\n call_id: toolCall.id,\n name: toolCall.name,\n arguments: JSON.stringify(toolCall.arguments ?? {}),\n });\n }\n }\n\n if (items.length === 0 && responsesProfile === 'standard') {\n items.push({\n type: 'message',\n role: 'assistant',\n content: [],\n });\n }\n\n return items;\n}\n\nfunction parseOpenAIResponsesSnapshot(snapshot: ResponsesSnapshot): {\n content: string;\n toolCalls: ToolCall[];\n reasoning?: string;\n thinkingBlocks: ThinkingBlock[];\n usage?: UsageInfo;\n stopReason: string | null;\n} {\n const output = Array.isArray(snapshot?.output) ? snapshot.output : [];\n const contentParts: string[] = [];\n const reasoningParts: string[] = [];\n const toolCalls: ToolCall[] = [];\n const thinkingBlocks: ThinkingBlock[] = [];\n\n for (const item of output) {\n if (!item || typeof item !== 'object') continue;\n\n if (item.type === 'message' && Array.isArray(item.content)) {\n for (const part of item.content) {\n if (part?.type === 'output_text' && typeof part.text === 'string') {\n contentParts.push(part.text);\n }\n }\n continue;\n }\n\n if (item.type === 'function_call') {\n toolCalls.push({\n id: String(item.call_id || item.id || ''),\n name: String(item.name || ''),\n arguments: parseToolArguments(String(item.arguments || ''), item.name),\n });\n continue;\n }\n\n if (item.type === 'reasoning') {\n const summaryText = Array.isArray(item.summary)\n ? item.summary.map((part: any) => String(part?.text || '')).filter(Boolean).join('\\n').trim()\n : '';\n if (summaryText) {\n reasoningParts.push(summaryText);\n thinkingBlocks.push({\n signature: String(item.id || ''),\n thinking: summaryText,\n });\n }\n }\n }\n\n const usage = snapshot.usage\n ? {\n inputTokens: Number(snapshot.usage.input_tokens || 0),\n outputTokens: Number(snapshot.usage.output_tokens || 0),\n totalTokens: Number(snapshot.usage.total_tokens || 0),\n ...(Number(snapshot.usage.input_tokens_details?.cached_tokens || 0) > 0\n ? { cacheReadTokens: Number(snapshot.usage.input_tokens_details?.cached_tokens || 0) }\n : {}),\n ...(Number(snapshot.usage.output_tokens_details?.reasoning_tokens || 0) > 0\n ? { reasoningTokens: Number(snapshot.usage.output_tokens_details?.reasoning_tokens || 0) }\n : {}),\n }\n : undefined;\n\n const content = typeof snapshot.output_text === 'string' && snapshot.output_text.trim()\n ? snapshot.output_text\n : contentParts.join('');\n\n return {\n content,\n toolCalls,\n ...(reasoningParts.length > 0 ? { reasoning: reasoningParts.join('\\n') } : {}),\n thinkingBlocks,\n ...(usage ? { usage } : {}),\n stopReason: mapResponseStatusToStopReason(snapshot),\n };\n}\n\nfunction finalizeToolCalls(functionCalls: Map<string, AccumulatedFunctionCall>): ToolCall[] {\n return Array.from(functionCalls.values())\n .map((call) => ({\n id: call.call_id || call.name || `tool-${Math.random().toString(36).slice(2, 8)}`,\n name: call.name,\n arguments: parseToolArguments(call.arguments, call.name),\n }))\n .filter((call) => Boolean(call.name));\n}\n\nfunction finalizeThinkingBlocks(reasoningItems: Map<string, AccumulatedReasoning>): ThinkingBlock[] {\n return Array.from(reasoningItems.values())\n .map((item) => ({\n signature: item.id,\n thinking: item.summary.join('\\n').trim(),\n }))\n .filter((block) => Boolean(block.signature) && Boolean(block.thinking));\n}\n\nfunction recordReasoningItem(\n reasoningItems: Map<string, AccumulatedReasoning>,\n item: { id?: string; summary?: Array<{ text?: string }> },\n): void {\n const id = String(item?.id || '');\n if (!id) return;\n const summary = Array.isArray(item.summary)\n ? item.summary.map((part) => String(part?.text || '')).filter(Boolean)\n : [];\n if (!reasoningItems.has(id)) {\n reasoningItems.set(id, { id, summary: [] });\n }\n const entry = reasoningItems.get(id)!;\n if (summary.length > 0) {\n entry.summary = summary;\n }\n}\n\nfunction extractTextDelta(delta: unknown): string {\n if (typeof delta === 'string') return delta;\n if (delta && typeof delta === 'object' && 'text' in delta && typeof (delta as any).text === 'string') {\n return (delta as any).text;\n }\n return '';\n}\n\nfunction extractOutputMessageText(item: any): string {\n if (!Array.isArray(item?.content)) return '';\n return item.content\n .filter((part: any) => part?.type === 'output_text' && typeof part.text === 'string')\n .map((part: any) => part.text)\n .join('');\n}\n\nfunction mapThinkingBudgetToEffort(thinkingBudgetTokens: number): 'low' | 'medium' | 'high' {\n if (thinkingBudgetTokens >= 100000) return 'high';\n if (thinkingBudgetTokens >= 10000) return 'medium';\n return 'low';\n}\n\nfunction normalizeToolParameters(parameters: Record<string, any> | undefined): Record<string, unknown> {\n if (!parameters || typeof parameters !== 'object') {\n return { type: 'object', properties: {} };\n }\n return sanitizeToolSchema(parameters);\n}\n\nfunction parseToolArguments(raw: string, toolName?: string): Record<string, any> {\n const trimmed = String(raw || '').trim();\n if (!trimmed) return {};\n try {\n const parsed = JSON.parse(trimmed);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, any>;\n }\n } catch {\n // fall through\n }\n\n console.warn(\n `[OpenAI Responses] Failed to parse tool arguments${toolName ? ` for tool \"${toolName}\"` : ''}. ` +\n `Input length: ${trimmed.length}, preview: ${trimmed.slice(0, 200)}`,\n );\n return {};\n}\n\nfunction isEmptyResponsesStreamError(error: unknown): boolean {\n return error instanceof Error && /request ended without sending any events/i.test(error.message);\n}\n\nfunction mapResponseStatusToStopReason(snapshot: ResponsesSnapshot | null): string | null {\n if (!snapshot) return null;\n if (snapshot.status === 'incomplete') {\n const reason = snapshot.incomplete_details?.reason || 'incomplete';\n return reason === 'max_output_tokens' ? 'max_tokens' : reason;\n }\n if (snapshot.status === 'failed' || snapshot.status === 'cancelled') {\n return snapshot.status;\n }\n if (snapshot.status === 'completed') {\n if (Array.isArray(snapshot.output) && snapshot.output.some((item) => item?.type === 'function_call')) {\n return 'tool_calls';\n }\n return 'stop';\n }\n return snapshot.status || null;\n}\n\nexport function createOpenAIResponsesLLM(config: AgentConfigFile): OpenAIResponsesLLM;\nexport function createOpenAIResponsesLLM(modelConfig: ModelConfig): OpenAIResponsesLLM;\nexport function createOpenAIResponsesLLM(\n apiKey: string,\n modelName: string,\n baseUrl?: string,\n): OpenAIResponsesLLM;\nexport function createOpenAIResponsesLLM(\n configOrApiKey: AgentConfigFile | ModelConfig | string,\n modelName?: string,\n baseUrl?: string,\n): OpenAIResponsesLLM {\n if (typeof configOrApiKey === 'object' && 'defaultModel' in configOrApiKey) {\n return new OpenAIResponsesLLM(\n configOrApiKey.defaultModel.apiKey,\n configOrApiKey.defaultModel.model,\n configOrApiKey.defaultModel.baseUrl,\n configOrApiKey.defaultModel.maxTokens,\n configOrApiKey.defaultModel.thinkingEffort,\n configOrApiKey.defaultModel.thinkingBudgetTokens,\n configOrApiKey.defaultModel.providerOptions,\n configOrApiKey.defaultModel.customHeaders,\n configOrApiKey.defaultModel.vision ?? false,\n configOrApiKey.defaultModel.responsesProfile ?? 'standard',\n { maxRetries: configOrApiKey.defaultModel.maxRetries, timeoutMs: configOrApiKey.defaultModel.timeoutMs },\n );\n }\n\n if (typeof configOrApiKey === 'object') {\n return new OpenAIResponsesLLM(\n configOrApiKey.apiKey,\n configOrApiKey.model,\n configOrApiKey.baseUrl,\n configOrApiKey.maxTokens,\n configOrApiKey.thinkingEffort,\n configOrApiKey.thinkingBudgetTokens,\n configOrApiKey.providerOptions,\n configOrApiKey.customHeaders,\n configOrApiKey.vision ?? false,\n configOrApiKey.responsesProfile ?? 'standard',\n { maxRetries: configOrApiKey.maxRetries, timeoutMs: configOrApiKey.timeoutMs },\n );\n }\n\n return new OpenAIResponsesLLM(configOrApiKey, modelName!, baseUrl);\n}\n","import type { AgentConfigFile, ModelConfig } from '@agentdevjs/core';\nimport type { LLMClient } from '@agentdevjs/core';\nimport { createAnthropicLLM } from './anthropic.js';\nimport { createOpenAILLM } from './openai.js';\nimport { createOpenAIResponsesLLM } from './openai-responses.js';\n\nexport { AnthropicLLM, compileContextForAnthropic, createAnthropicLLM } from './anthropic.js';\nexport { OpenAILLM, createOpenAILLM, compileChatMessages } from './openai.js';\nexport { OpenAIResponsesLLM, compileContextForOpenAIResponses, createOpenAIResponsesLLM } from './openai-responses.js';\nexport { DEFAULT_MAX_RETRIES, getRetryDelay, parseRetryAfter, shouldRetry, sleep as retrySleep } from '@agentdevjs/core';\nexport { ClassifiedAPIError, classifyAPIError, classifyAndWrapError, extractConnectionErrorDetails, getUserFriendlyMessage } from '@agentdevjs/core';\nexport type { APIErrorType, ConnectionErrorDetails } from '@agentdevjs/core';\nexport { initHttpClient, getGlobalDispatcher } from './http-client.js';\n\nexport function createLLM(config: AgentConfigFile): LLMClient;\nexport function createLLM(modelConfig: ModelConfig): LLMClient;\nexport function createLLM(\n apiKey: string,\n modelName: string,\n provider?: string,\n baseUrl?: string,\n): LLMClient;\nexport function createLLM(\n configOrApiKey: AgentConfigFile | ModelConfig | string,\n modelName?: string,\n provider?: string,\n baseUrl?: string,\n): LLMClient {\n if (typeof configOrApiKey === 'string') {\n return provider === 'anthropic'\n ? createAnthropicLLM(configOrApiKey, modelName!, baseUrl)\n : createOpenAILLM(configOrApiKey, modelName!, baseUrl);\n }\n\n if ('defaultModel' in configOrApiKey) {\n switch (configOrApiKey.defaultModel.provider) {\n case 'anthropic':\n return createAnthropicLLM(configOrApiKey);\n case 'openai':\n return configOrApiKey.defaultModel.apiSurface === 'responses'\n ? createOpenAIResponsesLLM(configOrApiKey)\n : createOpenAILLM(configOrApiKey);\n default:\n return createOpenAILLM(configOrApiKey);\n }\n }\n\n switch (configOrApiKey.provider) {\n case 'anthropic':\n return createAnthropicLLM(configOrApiKey);\n case 'openai':\n return configOrApiKey.apiSurface === 'responses'\n ? createOpenAIResponsesLLM(configOrApiKey)\n : createOpenAILLM(configOrApiKey);\n default:\n return createOpenAILLM(configOrApiKey);\n }\n}\n"],"mappings":"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","names":["sleep","getRetryDelay","parseRetryAfter","shouldRetry","resolveModelCallPolicy","withDeadline","classifyAndWrapError","httpClientInitPromise","ensureHttpClientInitialized","resolveModelCallPolicy","withDeadline","shouldRetry","parseRetryAfter","getRetryDelay","classifyAndWrapError","OpenAI","OPENAI_THINKING_EFFORTS","getRetryDelay","parseRetryAfter","shouldRetry","resolveModelCallPolicy","withDeadline","classifyAndWrapError","httpClientInitPromise","ensureHttpClientInitialized","resolveModelCallPolicy","OpenAI","withDeadline","finalizeToolCalls","finalizeThinkingBlocks","shouldRetry","parseRetryAfter","getRetryDelay","classifyAndWrapError","OPENAI_THINKING_EFFORTS","DEFAULT_MAX_RETRIES","getRetryDelay","parseRetryAfter","shouldRetry","ClassifiedAPIError","classifyAPIError","classifyAndWrapError"]}
1
+ {"version":3,"sources":["../src/custom-headers.ts","../src/anthropic.ts","../src/http-client.ts","../src/image-resolver.ts","../src/schema-sanitizer.ts","../src/retry-observability.ts","../src/reminder.ts","../src/openai.ts","../src/openai-responses.ts","../src/index.ts"],"sourcesContent":["/**\r\n * 自定义请求头动态解析工具\r\n *\r\n * 支持 valueMode:\r\n * - 'static': 使用 value 原样\r\n * - 'uuid': 每次调用生成新的 UUID v4\r\n * - 'random': 每次调用生成新的随机整数字符串\r\n */\r\n\r\nimport { randomUUID } from 'crypto';\r\nimport type { CustomHeaderEntry } from '@agentdevjs/core';\r\n\r\n/**\r\n * 将 CustomHeaderEntry[] 解析为扁平的 Record<string,string>。\r\n * 对于 uuid / random 模式,每次调用都会生成新值。\r\n */\r\nexport function resolveCustomHeaders(\r\n headers?: CustomHeaderEntry[] | null,\r\n): Record<string, string> {\r\n if (!headers || headers.length === 0) return {};\r\n const result: Record<string, string> = {};\r\n for (const h of headers) {\r\n const key = (h.key ?? '').trim();\r\n if (!key) continue;\r\n const mode = h.valueMode ?? 'static';\r\n if (mode === 'uuid') {\r\n result[key] = randomUUID();\r\n } else if (mode === 'random') {\r\n result[key] = String(Math.floor(Math.random() * 1e16));\r\n } else {\r\n result[key] = h.value ?? '';\r\n }\r\n }\r\n return result;\r\n}\r\n","import type { AgentConfigFile, ModelConfig, CustomHeaderEntry, ThinkingEffort } from '@agentdevjs/core';\r\nimport { resolveCustomHeaders } from './custom-headers.js';\r\nimport type { LLMClient, LLMResponse, LLMChatOptions, Message, ThinkingBlock, Tool, ToolCall, UsageInfo } from '@agentdevjs/core';\r\nimport type { LLMPhase } from '@agentdevjs/core';\r\nimport { getRetryDelay, parseRetryAfter, shouldRetry, resolveModelCallPolicy, withDeadline } from '@agentdevjs/core';\r\nimport { classifyAndWrapError } from '@agentdevjs/core';\r\nimport { initHttpClient } from './http-client.js';\r\nimport { resolveImageBase64 } from './image-resolver.js';\r\nimport { sanitizeToolSchema } from './schema-sanitizer.js';\r\nimport { emitRetryObservability } from './retry-observability.js';\r\nimport { wrapReminder } from './reminder.js';\r\n\r\n// 确保 HTTP 客户端基础设施(DNS 缓存、代理、连接池)在首次 fetch 前初始化\r\nlet httpClientInitPromise: Promise<void> | null = null;\r\nfunction ensureHttpClientInitialized() {\r\n if (!httpClientInitPromise) {\r\n httpClientInitPromise = initHttpClient();\r\n }\r\n return httpClientInitPromise;\r\n}\r\n\r\ntype AnthropicTextBlock = {\r\n type: 'text';\r\n text: string;\r\n cache_control?: { type: 'ephemeral' };\r\n};\r\n\r\ntype AnthropicThinkingBlock = {\r\n type: 'thinking';\r\n thinking: string;\r\n signature: string;\r\n};\r\n\r\ntype AnthropicToolResultBlock = {\r\n type: 'tool_result';\r\n tool_use_id: string;\r\n content: string | (AnthropicTextBlock | AnthropicImageBlock)[];\r\n is_error?: boolean;\r\n};\r\n\r\ntype AnthropicToolUseBlock = {\r\n type: 'tool_use';\r\n id: string;\r\n name: string;\r\n input?: unknown;\r\n};\r\n\r\ntype AnthropicImageBlock = {\r\n type: 'image';\r\n source: {\r\n type: 'base64';\r\n media_type: string;\r\n data: string;\r\n };\r\n};\r\n\r\ntype AnthropicContentBlock = AnthropicTextBlock | AnthropicThinkingBlock | AnthropicToolResultBlock | AnthropicToolUseBlock | AnthropicImageBlock;\r\n\r\ninterface AnthropicRequestMessage {\r\n role: 'user' | 'assistant';\r\n content: string | AnthropicContentBlock[];\r\n}\r\n\r\ninterface AnthropicToolDef {\r\n name: string;\r\n description: string;\r\n input_schema: Record<string, unknown>;\r\n}\r\n\r\ninterface AnthropicStreamEvent {\r\n type?: string;\r\n index?: number;\r\n content_block?: AnthropicContentBlock;\r\n usage?: {\r\n input_tokens?: number;\r\n output_tokens?: number;\r\n cache_creation_input_tokens?: number;\r\n cache_read_input_tokens?: number;\r\n };\r\n delta?: {\r\n type?: string;\r\n text?: string;\r\n thinking?: string;\r\n partial_json?: string;\r\n stop_reason?: string | null;\r\n stop_sequence?: string | null;\r\n };\r\n message?: {\r\n id?: string;\r\n stop_reason?: string | null;\r\n stop_sequence?: string | null;\r\n usage?: {\r\n input_tokens?: number;\r\n output_tokens?: number;\r\n cache_creation_input_tokens?: number;\r\n cache_read_input_tokens?: number;\r\n };\r\n };\r\n}\r\n\r\ninterface CompiledAnthropicRequest {\r\n system?: AnthropicTextBlock[];\r\n messages: AnthropicRequestMessage[];\r\n tools?: AnthropicToolDef[];\r\n}\r\n\r\ninterface AnthropicCompatErrorPayload {\r\n code?: number;\r\n msg?: string;\r\n message?: string;\r\n success?: boolean;\r\n}\r\n\r\ninterface PendingToolUse {\r\n id: string;\r\n name: string;\r\n inputJson: string;\r\n}\r\n\r\ninterface PendingThinkingBlock {\r\n thinking: string;\r\n signature: string;\r\n}\r\n\r\nconst DEFAULT_BASE_URL = 'https://api.anthropic.com/v1';\r\nconst DEFAULT_MAX_TOKENS = 4096;\r\n\r\nexport class AnthropicLLM implements LLMClient {\r\n private initPromise: Promise<void>;\r\n private maxRetries: number;\r\n private deadlineMs: number | undefined;\r\n\r\n /** 返回当前 LLM 实例使用的模型名 */\r\n get modelName(): string { return this._modelName; }\r\n\r\n constructor(\r\n private readonly apiKey: string,\r\n private readonly _modelName: string = 'claude-sonnet-4-5-20250929',\r\n private readonly baseUrl: string = DEFAULT_BASE_URL,\r\n private readonly maxTokens: number = DEFAULT_MAX_TOKENS,\r\n private readonly thinkingEffort?: ThinkingEffort,\r\n private readonly _thinkingBudgetTokens?: number,\r\n private readonly _thinkingKeepTurns: number = 5,\r\n private readonly customHeaders?: CustomHeaderEntry[],\r\n private readonly visionEnabled: boolean = false,\r\n callPolicy?: { maxRetries?: number; timeoutMs?: number },\r\n ) {\r\n const resolved = resolveModelCallPolicy(callPolicy);\r\n this.maxRetries = resolved.maxRetries;\r\n this.deadlineMs = resolved.timeoutMs;\r\n this.initPromise = ensureHttpClientInitialized();\r\n }\r\n\r\n async chat(messages: Message[], tools: Tool[], options?: LLMChatOptions): Promise<LLMResponse> {\r\n // 确保 HTTP 客户端已初始化\r\n await this.initPromise;\r\n // 整体时限:deadline 到达以 AbortError 中止,不进入重试\r\n const signal = withDeadline(options?.signal, this.deadlineMs);\r\n const compiled = compileContextForAnthropic(messages, tools, this.visionEnabled);\r\n const noStream = options?.noStream === true;\r\n\r\n for (let attempt = 1; attempt <= this.maxRetries + 1; attempt++) {\r\n let response: Response | undefined;\r\n try {\r\n // 检查中断信号\r\n if (signal?.aborted) {\r\n throw new DOMException('Aborted', 'AbortError');\r\n }\r\n\r\n const effectiveMaxTokens = this.maxTokens;\r\n\r\n // thinkingEffort controls whether thinking is on/off:\r\n // - valid effort value + budgetTokens > 0 → thinking: { type: 'enabled', budget_tokens }\r\n // - 'none' → thinking: { type: 'disabled' }\r\n // - undefined → no thinking params (vendor decides)\r\n const effort = this.thinkingEffort;\r\n const validEfforts: ThinkingEffort[] = ['low', 'medium', 'high', 'xhigh', 'max'];\r\n const wantsThinking = effort !== undefined && validEfforts.includes(effort);\r\n const useDisabled = effort === 'none';\r\n const budget = this._thinkingBudgetTokens;\r\n const useEnabled = wantsThinking && typeof budget === 'number' && budget > 0;\r\n // Clamp budget to leave room for output (budget_tokens must be < max_tokens)\r\n const effectiveBudget = useEnabled ? Math.min(budget!, effectiveMaxTokens - 1) : undefined;\r\n\r\n response = await fetch(resolveAnthropicMessagesUrl(this.baseUrl), {\r\n method: 'POST',\r\n headers: {\r\n 'content-type': 'application/json',\r\n 'x-api-key': this.apiKey,\r\n 'anthropic-version': '2023-06-01',\r\n ...resolveCustomHeaders(this.customHeaders),\r\n },\r\n body: JSON.stringify({\r\n model: this._modelName,\r\n max_tokens: effectiveMaxTokens,\r\n ...(noStream ? {} : { stream: true }),\r\n ...(useDisabled\r\n ? { thinking: { type: 'disabled' } }\r\n : useEnabled\r\n ? { thinking: { type: 'enabled', budget_tokens: effectiveBudget } }\r\n : {}),\r\n ...(compiled.system ? { system: compiled.system } : {}),\r\n messages: compiled.messages,\r\n ...(compiled.tools && compiled.tools.length > 0 ? { tools: compiled.tools } : {}),\r\n }),\r\n signal,\r\n });\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text();\r\n const err = new Error(`Anthropic API error ${response.status}: ${errorText}`);\r\n (err as any).status = response.status;\r\n throw err;\r\n }\r\n\r\n if (noStream) {\r\n const payload = await response.json() as AnthropicCompatErrorPayload;\r\n if (isCompatErrorPayload(payload)) {\r\n const err = new Error(`Anthropic-compatible API error ${payload.code ?? 'unknown'}: ${payload.msg ?? payload.message ?? 'unknown error'}`);\r\n (err as any).status = payload.code;\r\n throw err;\r\n }\r\n return parseAnthropicJsonResponse(payload);\r\n }\r\n\r\n const contentType = response.headers.get('content-type') || '';\r\n if (contentType.includes('application/json')) {\r\n const payload = await response.json() as AnthropicCompatErrorPayload;\r\n if (isCompatErrorPayload(payload)) {\r\n const err = new Error(`Anthropic-compatible API error ${payload.code ?? 'unknown'}: ${payload.msg ?? payload.message ?? 'unknown error'}`);\r\n (err as any).status = payload.code;\r\n throw err;\r\n }\r\n throw new Error(`Anthropic streaming expected SSE but received JSON: ${JSON.stringify(payload)}`);\r\n }\r\n\r\n if (!response.body) {\r\n throw new Error('Anthropic API returned an empty response body');\r\n }\r\n\r\n return await readAnthropicStream(response.body, signal);\r\n } catch (error) {\r\n // 中断错误不重试,直接传播\r\n if (error instanceof DOMException && error.name === 'AbortError') {\r\n throw error;\r\n }\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw error;\r\n }\r\n\r\n const status = (error as any)?.status as number | undefined;\r\n if (attempt <= this.maxRetries && shouldRetry(error, status)) {\r\n const retryAfterMs = parseRetryAfter(response?.headers);\r\n const delayMs = getRetryDelay(attempt, retryAfterMs);\r\n await emitRetryObservability({\r\n attempt,\r\n maxRetries: this.maxRetries,\r\n delayMs,\r\n signal,\r\n error,\r\n status,\r\n });\r\n continue;\r\n }\r\n // 重试耗尽或不可重试 → 分类包装后抛出\r\n throw classifyAndWrapError(error, status);\r\n }\r\n }\r\n\r\n // 理论上不会到这里,但 TypeScript 需要返回值\r\n throw new Error('Anthropic API call failed after all retries');\r\n }\r\n}\r\n\r\nfunction resolveAnthropicMessagesUrl(baseUrl: string): string {\r\n const normalized = baseUrl.replace(/\\/+$/, '');\r\n if (/\\/v\\d+$/i.test(normalized)) {\r\n return `${normalized}/messages`;\r\n }\r\n return `${normalized}/v1/messages`;\r\n}\r\n\r\nfunction isCompatErrorPayload(payload: AnthropicCompatErrorPayload): boolean {\r\n if (payload.success === false) return true;\r\n if (typeof payload.code === 'number' && payload.code !== 0) return true;\r\n return false;\r\n}\r\n\r\nexport function compileContextForAnthropic(messages: Message[], tools: Tool[], visionEnabled: boolean = false): CompiledAnthropicRequest {\r\n const systemBlocks: AnthropicTextBlock[] = [];\r\n const compiledMessages: AnthropicRequestMessage[] = [];\r\n let seenFirstUser = false;\r\n let pendingUserBlocks: AnthropicContentBlock[] = [];\r\n\r\n const flushPendingUserBlocks = (): void => {\r\n if (pendingUserBlocks.length === 0) return;\r\n compiledMessages.push({ role: 'user', content: pendingUserBlocks });\r\n pendingUserBlocks = [];\r\n };\r\n\r\n for (const message of messages) {\r\n if (!seenFirstUser && message.role === 'system') {\r\n // Agent system prompt (no source) → top-level system parameter.\r\n // Feature-injected system messages (source set, e.g. 'handoff-seed',\r\n // 'partial-compact') → wrap as <reminder> and embed in the next user\r\n // turn, so they don't mix into the top-level system parameter.\r\n if (!message.source) {\r\n systemBlocks.push({\r\n type: 'text',\r\n text: message.content,\r\n cache_control: { type: 'ephemeral' },\r\n });\r\n } else {\r\n pendingUserBlocks.push({\r\n type: 'text',\r\n text: wrapReminder(message.content),\r\n });\r\n }\r\n continue;\r\n }\r\n\r\n if (!seenFirstUser && message.role !== 'user') {\r\n throw new Error(`Anthropic compilation requires the first non-system message to be user, got '${message.role}'`);\r\n }\r\n\r\n switch (message.role) {\r\n case 'system':\r\n pendingUserBlocks.push({\r\n type: 'text',\r\n text: wrapReminder(message.content),\r\n });\r\n break;\r\n case 'tool':\r\n pendingUserBlocks.push(toolMessageToAnthropicBlock(message, visionEnabled));\r\n break;\r\n case 'user': {\r\n seenFirstUser = true;\r\n const contentBlocks: AnthropicContentBlock[] = [...pendingUserBlocks];\r\n let textContent = message.content;\r\n\r\n // 处理图片\r\n if (message.images && message.images.length > 0) {\r\n if (visionEnabled) {\r\n for (const img of message.images) {\r\n const data = resolveImageBase64(img);\r\n if (data) {\r\n contentBlocks.push({\r\n type: 'image',\r\n source: {\r\n type: 'base64',\r\n media_type: img.mediaType || 'image/png',\r\n data,\r\n },\r\n });\r\n }\r\n }\r\n } else {\r\n // 非视觉模式:降级为文字占位符\r\n const placeholders = message.images\r\n .map(img => `【Image】${img.source || '(inline image)'}`)\r\n .join('\\n');\r\n textContent = `${message.content}\\n${placeholders}`;\r\n }\r\n }\r\n\r\n contentBlocks.push({ type: 'text', text: textContent });\r\n compiledMessages.push({\r\n role: 'user',\r\n content: contentBlocks.length === 1 ? textContent : contentBlocks,\r\n });\r\n pendingUserBlocks = [];\r\n break;\r\n }\r\n case 'assistant':\r\n flushPendingUserBlocks();\r\n compiledMessages.push({\r\n role: 'assistant',\r\n content: assistantMessageToAnthropicContent(message),\r\n });\r\n break;\r\n default:\r\n throw new Error(`Anthropic compilation does not support message role '${message.role}'`);\r\n }\r\n }\r\n\r\n flushPendingUserBlocks();\r\n\r\n return {\r\n ...(systemBlocks.length > 0 ? { system: systemBlocks } : {}),\r\n messages: compiledMessages,\r\n ...(tools.length > 0 ? { tools: tools.map(toolToAnthropicDefinition) } : {}),\r\n };\r\n}\r\n\r\nfunction toolToAnthropicDefinition(tool: Tool): AnthropicToolDef {\r\n return {\r\n name: tool.name,\r\n description: tool.description,\r\n input_schema: sanitizeToolSchema(tool.parameters),\r\n };\r\n}\r\n\r\nfunction assistantMessageToAnthropicContent(message: Message): string | AnthropicContentBlock[] {\r\n const blocks: AnthropicContentBlock[] = [];\r\n if (message.thinkingBlocks) {\r\n for (const thinkingBlock of message.thinkingBlocks) {\r\n blocks.push({\r\n type: 'thinking',\r\n thinking: thinkingBlock.thinking,\r\n signature: thinkingBlock.signature,\r\n });\r\n }\r\n }\r\n\r\n if (message.content) {\r\n blocks.push({ type: 'text', text: message.content });\r\n }\r\n\r\n if (message.toolCalls) {\r\n for (const toolCall of message.toolCalls) {\r\n blocks.push({\r\n type: 'tool_use',\r\n id: toolCall.id,\r\n name: toolCall.name,\r\n input: toolCall.arguments,\r\n });\r\n }\r\n }\r\n\r\n if (blocks.length === 0) {\r\n return '';\r\n }\r\n\r\n if (blocks.length === 1 && blocks[0].type === 'text') {\r\n return blocks[0].text;\r\n }\r\n\r\n return blocks;\r\n}\r\n\r\nfunction toolMessageToAnthropicBlock(message: Message, visionEnabled: boolean): AnthropicToolResultBlock {\r\n if (!message.toolCallId) {\r\n throw new Error('Anthropic compilation requires tool messages to include toolCallId');\r\n }\r\n\r\n const parsed = parseToolPayload(message.content);\r\n const isError = parsed.isError;\r\n\r\n // No images → simple string content (unchanged behavior)\r\n if (!message.images || message.images.length === 0) {\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: message.toolCallId,\r\n content: parsed.content,\r\n ...(isError ? { is_error: true } : {}),\r\n };\r\n }\r\n\r\n // Images present\r\n if (visionEnabled) {\r\n // Vision mode: embed image blocks inside tool_result.content array\r\n const contentParts: (AnthropicTextBlock | AnthropicImageBlock)[] = [\r\n { type: 'text', text: parsed.content },\r\n ];\r\n for (const img of message.images) {\r\n const data = resolveImageBase64(img);\r\n if (data) {\r\n contentParts.push({\r\n type: 'image',\r\n source: {\r\n type: 'base64',\r\n media_type: img.mediaType || 'image/png',\r\n data,\r\n },\r\n });\r\n }\r\n }\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: message.toolCallId,\r\n content: contentParts,\r\n ...(isError ? { is_error: true } : {}),\r\n };\r\n }\r\n\r\n // Non-vision mode: degrade to text placeholders appended to tool result\r\n const placeholders = message.images\r\n .map(img => `【Image】${img.source || '(inline image)'}`)\r\n .join('\\n');\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: message.toolCallId,\r\n content: `${parsed.content}\\n${placeholders}`,\r\n ...(isError ? { is_error: true } : {}),\r\n };\r\n}\r\n\r\nfunction parseToolPayload(content: string): { content: string; isError: boolean } {\r\n try {\r\n const parsed = JSON.parse(content) as { success?: boolean; result?: unknown; error?: unknown };\r\n if (parsed && typeof parsed === 'object' && ('result' in parsed || 'error' in parsed || 'success' in parsed)) {\r\n const isError = parsed.success === false || !!parsed.error;\r\n if (isError && typeof parsed.error === 'string' && parsed.error.trim()) {\r\n return { content: parsed.error, isError: true };\r\n }\r\n if (parsed.result !== undefined) {\r\n return { content: stringifyToolValue(parsed.result), isError };\r\n }\r\n return { content, isError };\r\n }\r\n } catch {\r\n // Keep raw tool content if it is not JSON.\r\n }\r\n\r\n return { content, isError: false };\r\n}\r\n\r\nfunction stringifyToolValue(value: unknown): string {\r\n if (typeof value === 'string') return value;\r\n return JSON.stringify(value);\r\n}\r\n\r\n/**\r\n * Find the index right after the first SSE event boundary in a text buffer.\r\n * Matches the Anthropic SDK's findDoubleNewlineIndex behavior — supports\r\n * \\n\\n, \\r\\r, and \\r\\n\\r\\n separators. Returns -1 if none found.\r\n */\r\nfunction findDoubleNewlineIndex(buffer: string): { index: number; separatorLen: number } {\r\n for (let i = 0; i < buffer.length - 1; i++) {\r\n const ch = buffer[i];\r\n const next = buffer[i + 1];\r\n if (ch === '\\n' && next === '\\n') return { index: i, separatorLen: 2 };\r\n if (ch === '\\r' && next === '\\r') return { index: i, separatorLen: 2 };\r\n if (ch === '\\r' && next === '\\n' && i + 3 < buffer.length && buffer[i + 2] === '\\r' && buffer[i + 3] === '\\n') {\r\n return { index: i, separatorLen: 4 };\r\n }\r\n }\r\n return { index: -1, separatorLen: 0 };\r\n}\r\n\r\n/**\r\n * Parse a non-streaming Anthropic API JSON response into LLMResponse.\r\n * Used when noStream option is set — avoids SSE fragility for one-shot calls.\r\n */\r\nfunction parseAnthropicJsonResponse(data: Record<string, any>): LLMResponse {\r\n let content = '';\r\n let reasoning = '';\r\n const toolCalls: ToolCall[] = [];\r\n const thinkingBlocks: ThinkingBlock[] = [];\r\n\r\n if (Array.isArray(data.content)) {\r\n for (const block of data.content) {\r\n if (block.type === 'text' && typeof block.text === 'string') {\r\n content += block.text;\r\n } else if (block.type === 'thinking') {\r\n const thinking = typeof block.thinking === 'string' ? block.thinking : '';\r\n const signature = typeof block.signature === 'string' ? block.signature : '';\r\n if (thinking) reasoning += thinking;\r\n if (signature.length > 0 && thinking.length > 0) {\r\n thinkingBlocks.push({ thinking, signature });\r\n }\r\n } else if (block.type === 'tool_use') {\r\n toolCalls.push({\r\n id: String(block.id ?? ''),\r\n name: String(block.name ?? ''),\r\n arguments: (block.input && typeof block.input === 'object' && !Array.isArray(block.input))\r\n ? block.input as Record<string, any>\r\n : {},\r\n });\r\n }\r\n }\r\n }\r\n\r\n const usageRaw = data.usage;\r\n let usageInfo: UsageInfo | undefined;\r\n if (usageRaw && (usageRaw.input_tokens !== undefined || usageRaw.output_tokens !== undefined)) {\r\n const realInput = (usageRaw.input_tokens || 0)\r\n + (usageRaw.cache_creation_input_tokens || 0)\r\n + (usageRaw.cache_read_input_tokens || 0);\r\n usageInfo = {\r\n inputTokens: realInput,\r\n outputTokens: usageRaw.output_tokens || 0,\r\n totalTokens: realInput + (usageRaw.output_tokens || 0),\r\n ...(usageRaw.cache_creation_input_tokens ? { cacheCreationTokens: usageRaw.cache_creation_input_tokens } : {}),\r\n ...(usageRaw.cache_read_input_tokens ? { cacheReadTokens: usageRaw.cache_read_input_tokens } : {}),\r\n };\r\n }\r\n\r\n return {\r\n content,\r\n ...(toolCalls.length > 0 ? { toolCalls } : {}),\r\n ...(reasoning ? { reasoning } : {}),\r\n ...(thinkingBlocks.length > 0 ? { thinkingBlocks } : {}),\r\n ...(usageInfo ? { usage: usageInfo } : {}),\r\n stopReason: data.stop_reason ?? null,\r\n };\r\n}\r\n\r\nasync function readAnthropicStream(body: ReadableStream<Uint8Array>, signal?: AbortSignal): Promise<LLMResponse> {\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n let content = '';\r\n let reasoning = '';\r\n const pendingThinkingBlocks = new Map<number, PendingThinkingBlock>();\r\n let charCount = 0;\r\n let currentPhase: LLMPhase = 'content';\r\n const pendingToolUses = new Map<number, PendingToolUse>();\r\n\r\n // 收集 usage 数据\r\n let usageInfo: UsageInfo | null = null;\r\n\r\n // 收集 stop_reason\r\n let stopReason: string | null = null;\r\n\r\n // 流式完整性追踪\r\n let receivedMessageStart = false;\r\n let receivedMessageStop = false;\r\n\r\n // 只注册一次 abort listener,用于中断 reader.read()。\r\n // 旧实现在 while 循环每次迭代中创建新的 abort Promise 并注册 listener,\r\n // 导致正常完成时 listener 累积不释放(MaxListenersExceededWarning)。\r\n const onStreamAbort = () => reader.cancel().catch(() => {});\r\n if (signal && !signal.aborted) {\r\n signal.addEventListener('abort', onStreamAbort, { once: true });\r\n }\r\n\r\n // 各 phase 独立计数:正文阶段不应延续思考阶段的累计值\r\n const phaseCharCount = (phase: LLMPhase): number =>\r\n phase === 'thinking' ? reasoning.length : content.length;\r\n\r\n const applyEvent = (event: AnthropicStreamEvent): void => {\r\n if (event.type === 'message_start') receivedMessageStart = true;\r\n if (event.type === 'message_stop') receivedMessageStop = true;\r\n applyAnthropicStreamEvent(event, pendingThinkingBlocks, pendingToolUses, (delta) => {\r\n content += delta.content;\r\n reasoning += delta.reasoning;\r\n charCount += delta.charCount;\r\n currentPhase = delta.phase;\r\n }, (usage) => {\r\n // Merge instead of replace: message_delta may omit input_tokens\r\n // (some Anthropic-compatible providers only send output_tokens in\r\n // deltas). Preserve inputTokens/cache tokens from message_start so\r\n // the final usageInfo accurately reflects the actual context size.\r\n if (usageInfo) {\r\n const inputTokens = usage.inputTokens || usageInfo.inputTokens;\r\n const outputTokens = usage.outputTokens || usageInfo.outputTokens;\r\n usageInfo = {\r\n ...usageInfo,\r\n ...usage,\r\n inputTokens,\r\n totalTokens: inputTokens + outputTokens,\r\n };\r\n } else {\r\n usageInfo = usage;\r\n }\r\n }, (reason) => {\r\n stopReason = reason;\r\n });\r\n };\r\n\r\n try {\r\n while (true) {\r\n // signal 已中断则立即抛出\r\n if (signal?.aborted) {\r\n throw new DOMException('Aborted', 'AbortError');\r\n }\r\n const { value, done } = await reader.read();\r\n // reader.read() 可能被 abort 中断后返回,检查是否需要提前退出\r\n if (signal?.aborted) {\r\n throw new DOMException('Aborted', 'AbortError');\r\n }\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n\r\n let sep = findDoubleNewlineIndex(buffer);\r\n while (sep.index >= 0) {\r\n const rawEvent = buffer.slice(0, sep.index);\r\n buffer = buffer.slice(sep.index + sep.separatorLen);\r\n const event = parseSSEEvent(rawEvent);\r\n if (event) {\r\n applyEvent(event);\r\n const toolNames = Array.from(pendingToolUses.values()).map(t => t.name).filter(Boolean);\r\n await emitAnthropicProgress(\r\n phaseCharCount(currentPhase),\r\n currentPhase,\r\n pendingToolUses.size,\r\n toolNames,\r\n reasoning.length,\r\n content.length,\r\n );\r\n }\r\n sep = findDoubleNewlineIndex(buffer);\r\n }\r\n }\r\n } catch (e) {\r\n // AbortError 直接传播\r\n if (e instanceof DOMException && e.name === 'AbortError') throw e;\r\n if (e instanceof Error && e.name === 'AbortError') throw e;\r\n throw e;\r\n } finally {\r\n // 确保移除 abort listener,避免泄漏\r\n signal?.removeEventListener('abort', onStreamAbort);\r\n }\r\n\r\n // 处理缓冲区中最后的残余数据\r\n if (buffer.trim()) {\r\n const event = parseSSEEvent(buffer);\r\n if (event) {\r\n applyEvent(event);\r\n const toolNames = Array.from(pendingToolUses.values()).map(t => t.name).filter(Boolean);\r\n await emitAnthropicProgress(\r\n phaseCharCount(currentPhase),\r\n currentPhase,\r\n pendingToolUses.size,\r\n toolNames,\r\n reasoning.length,\r\n content.length,\r\n );\r\n }\r\n }\r\n\r\n // 检测不完整流:收到了 message_start 但没有 message_stop,也没有任何有效内容\r\n if (receivedMessageStart && !receivedMessageStop && !content && pendingToolUses.size === 0 && !reasoning) {\r\n throw new Error('Anthropic stream ended incompletely: received message_start but no message_stop or content');\r\n }\r\n\r\n const toolCalls = finalizeToolCalls(pendingToolUses);\r\n const thinkingBlocks = finalizeThinkingBlocks(pendingThinkingBlocks);\r\n await emitAnthropicComplete(charCount);\r\n return {\r\n content,\r\n ...(toolCalls.length > 0 ? { toolCalls } : {}),\r\n ...(reasoning ? { reasoning } : {}),\r\n ...(thinkingBlocks.length > 0 ? { thinkingBlocks } : {}),\r\n ...(usageInfo ? { usage: usageInfo } : {}),\r\n stopReason,\r\n };\r\n}\r\n\r\nfunction parseSSEEvent(rawEvent: string): AnthropicStreamEvent | null {\r\n const dataLines = rawEvent\r\n .split(/\\r?\\n/)\r\n .filter(line => line.startsWith('data:'))\r\n .map(line => line.slice(5).trim());\r\n\r\n if (dataLines.length === 0) return null;\r\n const data = dataLines.join('\\n');\r\n if (data === '[DONE]') return null;\r\n\r\n try {\r\n return JSON.parse(data) as AnthropicStreamEvent;\r\n } catch {\r\n // Skip malformed SSE events instead of crashing the entire stream.\r\n console.warn(`[Anthropic] Skipping malformed SSE event: ${data.slice(0, 200)}`);\r\n return null;\r\n }\r\n}\r\n\r\nfunction applyAnthropicStreamEvent(\r\n event: AnthropicStreamEvent,\r\n pendingThinkingBlocks: Map<number, PendingThinkingBlock>,\r\n pendingToolUses: Map<number, PendingToolUse>,\r\n append: (delta: { content: string; reasoning: string; charCount: number; phase: LLMPhase }) => void,\r\n onUsage: (usage: UsageInfo) => void,\r\n onStopReason?: (stopReason: string) => void,\r\n): void {\r\n switch (event.type) {\r\n case 'content_block_start': {\r\n if (event.content_block?.type === 'thinking' && typeof event.index === 'number') {\r\n pendingThinkingBlocks.set(event.index, {\r\n thinking: event.content_block.thinking || '',\r\n signature: event.content_block.signature || '',\r\n });\r\n }\r\n if (event.content_block?.type === 'tool_use' && typeof event.index === 'number') {\r\n pendingToolUses.set(event.index, {\r\n id: event.content_block.id,\r\n name: event.content_block.name,\r\n // Always start with empty string — the API sends input: {} at\r\n // content_block_start but actual content arrives via\r\n // input_json_delta events. Initializing with a stringified\r\n // non-empty object would corrupt the accumulated JSON when\r\n // deltas are appended. (Matches Claude Code's approach.)\r\n inputJson: '',\r\n });\r\n }\r\n break;\r\n }\r\n case 'content_block_delta': {\r\n const deltaType = event.delta?.type;\r\n if (deltaType === 'text_delta') {\r\n const text = event.delta?.text ?? '';\r\n append({ content: text, reasoning: '', charCount: text.length, phase: 'content' });\r\n } else if (deltaType === 'thinking_delta') {\r\n const thinking = event.delta?.thinking ?? '';\r\n if (typeof event.index === 'number') {\r\n const block = pendingThinkingBlocks.get(event.index) ?? { thinking: '', signature: '' };\r\n block.thinking += thinking;\r\n pendingThinkingBlocks.set(event.index, block);\r\n }\r\n append({ content: '', reasoning: thinking, charCount: thinking.length, phase: 'thinking' });\r\n } else if (deltaType === 'signature_delta' && typeof event.index === 'number') {\r\n const block = pendingThinkingBlocks.get(event.index) ?? { thinking: '', signature: '' };\r\n block.signature += ((event.delta as { signature?: string }).signature ?? '');\r\n pendingThinkingBlocks.set(event.index, block);\r\n } else if (deltaType === 'input_json_delta' && typeof event.index === 'number') {\r\n const toolUse = pendingToolUses.get(event.index);\r\n if (toolUse) {\r\n const partial = event.delta?.partial_json ?? '';\r\n toolUse.inputJson = mergeToolInputJson(toolUse.inputJson, partial);\r\n append({ content: '', reasoning: '', charCount: 0, phase: 'tool_calling' });\r\n } else {\r\n console.warn(`[Anthropic] input_json_delta for unknown content block index ${event.index}, skipping`);\r\n }\r\n }\r\n break;\r\n }\r\n case 'message_start': {\r\n const usage = event.message?.usage;\r\n if (usage && (usage.input_tokens !== undefined || usage.output_tokens !== undefined)) {\r\n const realInput = (usage.input_tokens || 0) + (usage.cache_creation_input_tokens || 0) + (usage.cache_read_input_tokens || 0);\r\n onUsage({\r\n inputTokens: realInput,\r\n outputTokens: usage.output_tokens || 0,\r\n totalTokens: realInput + (usage.output_tokens || 0),\r\n ...(usage.cache_creation_input_tokens ? { cacheCreationTokens: usage.cache_creation_input_tokens } : {}),\r\n ...(usage.cache_read_input_tokens ? { cacheReadTokens: usage.cache_read_input_tokens } : {}),\r\n });\r\n }\r\n break;\r\n }\r\n case 'message_delta': {\r\n // Anthropic 的 message_delta usage 在事件顶层,不在 delta 里\r\n if (event.delta?.stop_reason && onStopReason) {\r\n onStopReason(event.delta.stop_reason);\r\n }\r\n const usage = event.usage;\r\n if (usage && (usage.input_tokens !== undefined || usage.output_tokens !== undefined)) {\r\n const realInput = (usage.input_tokens || 0) + (usage.cache_creation_input_tokens || 0) + (usage.cache_read_input_tokens || 0);\r\n onUsage({\r\n inputTokens: realInput,\r\n outputTokens: usage.output_tokens || 0,\r\n totalTokens: realInput + (usage.output_tokens || 0),\r\n ...(usage.cache_creation_input_tokens ? { cacheCreationTokens: usage.cache_creation_input_tokens } : {}),\r\n ...(usage.cache_read_input_tokens ? { cacheReadTokens: usage.cache_read_input_tokens } : {}),\r\n });\r\n }\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n}\r\n\r\nasync function emitAnthropicProgress(\r\n charCount: number,\r\n phase: LLMPhase,\r\n toolCallCount: number,\r\n toolNames?: string[],\r\n thinkingChars?: number,\r\n contentChars?: number,\r\n): Promise<void> {\r\n try {\r\n const { emitNotification, createLLMCharCount } = await import('@agentdevjs/core');\r\n if (charCount > 0 || toolCallCount > 0) {\r\n emitNotification(createLLMCharCount(charCount, phase, {\r\n toolCallCount,\r\n ...(typeof thinkingChars === 'number' ? { thinkingChars } : {}),\r\n ...(typeof contentChars === 'number' ? { contentChars } : {}),\r\n ...(Array.isArray(toolNames) && toolNames.length > 0 ? { streamToolNames: toolNames } : {}),\r\n }));\r\n }\r\n } catch {\r\n // Ignore notification failures.\r\n }\r\n}\r\n\r\nasync function emitAnthropicComplete(charCount: number): Promise<void> {\r\n try {\r\n const { emitNotification, createLLMComplete } = await import('@agentdevjs/core');\r\n emitNotification(createLLMComplete(charCount));\r\n } catch {\r\n // Ignore notification failures.\r\n }\r\n}\r\n\r\nfunction mergeToolInputJson(current: string, partial: string): string {\r\n if (!current.trim()) return partial;\r\n return current + partial;\r\n}\r\n\r\nfunction finalizeThinkingBlocks(pendingThinkingBlocks: Map<number, PendingThinkingBlock>): ThinkingBlock[] {\r\n return Array.from(pendingThinkingBlocks.entries())\r\n .sort((a, b) => a[0] - b[0])\r\n .map(([, block]) => ({\r\n signature: block.signature,\r\n thinking: block.thinking,\r\n }))\r\n .filter(block => block.signature.length > 0 && block.thinking.length > 0);\r\n}\r\n\r\nfunction finalizeToolCalls(pendingToolUses: Map<number, PendingToolUse>): ToolCall[] {\r\n return Array.from(pendingToolUses.entries())\r\n .sort((a, b) => a[0] - b[0])\r\n .map(([, toolUse]) => ({\r\n id: toolUse.id,\r\n name: toolUse.name,\r\n arguments: parseToolInput(toolUse.inputJson, toolUse.name),\r\n }));\r\n}\r\n\r\nfunction stripBOM(str: string): string {\r\n // eslint-disable-next-line no-irregular-whitespace -- BOM 字符 (U+FEFF) 是正则匹配目标\r\n return str.replace(/^/, '');\r\n}\r\n\r\nfunction safeParseJSON(json: string): unknown {\r\n if (!json) return null;\r\n try {\r\n return JSON.parse(stripBOM(json));\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction parseToolInput(inputJson: string, toolName?: string): Record<string, any> {\r\n const trimmed = inputJson.trim();\r\n if (!trimmed) return {};\r\n\r\n const parsed = safeParseJSON(trimmed);\r\n if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {\r\n return parsed as Record<string, any>;\r\n }\r\n\r\n // Fallback: some Anthropic-compatible endpoints produce tool-call input JSON\r\n // with trailing non-JSON content in streaming deltas. Try extracting the\r\n // first valid JSON object from the string.\r\n const braceStart = trimmed.indexOf('{');\r\n if (braceStart >= 0) {\r\n let depth = 0;\r\n let inString = false;\r\n let escape = false;\r\n for (let i = braceStart; i < trimmed.length; i++) {\r\n const ch = trimmed[i];\r\n if (escape) { escape = false; continue; }\r\n if (ch === '\\\\') { if (inString) escape = true; continue; }\r\n if (ch === '\"') { inString = !inString; continue; }\r\n if (inString) continue;\r\n if (ch === '{' || ch === '[') depth++;\r\n else if (ch === '}' || ch === ']') {\r\n depth--;\r\n if (depth === 0) {\r\n const candidate = trimmed.slice(braceStart, i + 1);\r\n const recovered = safeParseJSON(candidate);\r\n if (recovered !== null && typeof recovered === 'object' && !Array.isArray(recovered)) {\r\n return recovered as Record<string, any>;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Graceful degradation: never throw — return empty object and let the\r\n // downstream tool execution deal with missing arguments. This mirrors\r\n // Claude Code's approach where a parse failure falls back to `{}` so the\r\n // ReAct loop keeps running instead of crashing entirely.\r\n console.warn(\r\n `[Anthropic] Failed to parse tool input JSON${toolName ? ` for tool \"${toolName}\"` : ''}. ` +\r\n `Input length: ${trimmed.length}, preview: ${trimmed.slice(0, 200)}`,\r\n );\r\n return {};\r\n}\r\n\r\nexport function createAnthropicLLM(config: AgentConfigFile): AnthropicLLM;\r\nexport function createAnthropicLLM(modelConfig: ModelConfig): AnthropicLLM;\r\nexport function createAnthropicLLM(\r\n apiKey: string,\r\n modelName: string,\r\n baseUrl?: string,\r\n): AnthropicLLM;\r\nexport function createAnthropicLLM(\r\n configOrApiKey: AgentConfigFile | ModelConfig | string,\r\n modelName?: string,\r\n baseUrl?: string,\r\n): AnthropicLLM {\r\n if (typeof configOrApiKey === 'object' && 'defaultModel' in configOrApiKey) {\r\n return new AnthropicLLM(\r\n configOrApiKey.defaultModel.apiKey,\r\n configOrApiKey.defaultModel.model,\r\n configOrApiKey.defaultModel.baseUrl,\r\n (configOrApiKey.defaultModel.maxTokens && configOrApiKey.defaultModel.maxTokens > 0) ? configOrApiKey.defaultModel.maxTokens : DEFAULT_MAX_TOKENS,\r\n configOrApiKey.defaultModel.thinkingEffort,\r\n configOrApiKey.defaultModel.thinkingBudgetTokens,\r\n configOrApiKey.defaultModel.thinkingKeepTurns ?? 5,\r\n configOrApiKey.defaultModel.customHeaders,\r\n configOrApiKey.defaultModel.vision ?? false,\r\n { maxRetries: configOrApiKey.defaultModel.maxRetries, timeoutMs: configOrApiKey.defaultModel.timeoutMs },\r\n );\r\n }\r\n\r\n if (typeof configOrApiKey === 'object') {\r\n return new AnthropicLLM(\r\n configOrApiKey.apiKey,\r\n configOrApiKey.model,\r\n configOrApiKey.baseUrl,\r\n (configOrApiKey.maxTokens && configOrApiKey.maxTokens > 0) ? configOrApiKey.maxTokens : DEFAULT_MAX_TOKENS,\r\n configOrApiKey.thinkingEffort,\r\n configOrApiKey.thinkingBudgetTokens,\r\n configOrApiKey.thinkingKeepTurns ?? 5,\r\n configOrApiKey.customHeaders,\r\n configOrApiKey.vision ?? false,\r\n { maxRetries: configOrApiKey.maxRetries, timeoutMs: configOrApiKey.timeoutMs },\r\n );\r\n }\r\n\r\n return new AnthropicLLM(configOrApiKey, modelName!, baseUrl);\r\n}\r\n","/**\r\n * HTTP 客户端基础设施\r\n *\r\n * 复用 Claude Code 同款解决方式:\r\n * - 不手动覆写 dns.lookup,利用 undici 内置 DNS 缓存和连接池\r\n * - 使用 EnvHttpProxyAgent 自动处理 HTTPS_PROXY / NO_PROXY\r\n * - 通过 setGlobalDispatcher 全局设置(对原生 fetch 立即生效)\r\n *\r\n * 两种 fetch 的集成方式:\r\n * 1. 原生 fetch()(Anthropic 适配器) → setGlobalDispatcher 全局生效\r\n * 2. OpenAI SDK 的 node-fetch → 自带 agentkeepalive,无需额外处理\r\n */\r\n\r\nimport { createLogger } from '@agentdevjs/core';\r\n\r\nconst logger = createLogger('llm.http-client');\r\n\r\n// 动态加载 undici(兼容打包和运行时)\r\nlet undici: any;\r\nlet undiciLoadPromise: Promise<any> | null = null;\r\nlet initialGlobalDispatcher: any = null;\r\n\r\nexport const HTTP_CONNECT_TIMEOUT_MS = 10_000;\r\nexport const HTTP_HEADERS_TIMEOUT_MS = 60_000;\r\nexport const HTTP_BODY_TIMEOUT_MS = 60_000;\r\n\r\nexport function buildHttpDispatcherOptions(noProxy?: string): Record<string, unknown> {\r\n return {\r\n ...(noProxy ? { noProxy } : {}),\r\n headersTimeout: HTTP_HEADERS_TIMEOUT_MS,\r\n bodyTimeout: HTTP_BODY_TIMEOUT_MS,\r\n connect: { timeout: HTTP_CONNECT_TIMEOUT_MS },\r\n };\r\n}\r\n\r\nexport function isExternallyManagedDispatcher(current: any, initial: any): boolean {\r\n return current != null && initial != null && current !== initial;\r\n}\r\n\r\nasync function loadUndici(): Promise<any> {\r\n if (undiciLoadPromise) {\r\n return undiciLoadPromise;\r\n }\r\n\r\n undiciLoadPromise = (async () => {\r\n // 方法1: 尝试直接 ESM 导入 undici\r\n try {\r\n const mod = await import('undici');\r\n return mod;\r\n } catch {\r\n // 方法2: 使用 createRequire\r\n try {\r\n const { createRequire } = await import('module');\r\n const _require = createRequire(import.meta.url);\r\n return _require('undici');\r\n } catch {\r\n logger.warn('Failed to load undici, proxy and DNS caching will not be available');\r\n return null;\r\n }\r\n }\r\n })();\r\n\r\n return undiciLoadPromise;\r\n}\r\n\r\n// 初始化 undici 加载\r\nundici = await loadUndici();\r\ninitialGlobalDispatcher = undici?.getGlobalDispatcher?.() ?? null;\r\n\r\n// ========== 代理配置 ==========\r\n\r\n/**\r\n * 检测代理 URL\r\n *\r\n * 优先级:HTTPS_PROXY > https_proxy > HTTP_PROXY > http_proxy\r\n */\r\nfunction getProxyUrl(): string | undefined {\r\n return (\r\n process.env.HTTPS_PROXY ||\r\n process.env.https_proxy ||\r\n process.env.HTTP_PROXY ||\r\n process.env.http_proxy\r\n );\r\n}\r\n\r\n/**\r\n * 遮蔽代理 URL 中的密码\r\n */\r\nfunction maskProxyUrl(url: string): string {\r\n try {\r\n const parsed = new URL(url);\r\n if (parsed.password) {\r\n parsed.password = '***';\r\n }\r\n return parsed.toString();\r\n } catch {\r\n return url;\r\n }\r\n}\r\n\r\n// ========== Undici 全局调度器 ==========\r\n\r\nlet httpClientInitialized = false;\r\nlet _dispatcher: any = null;\r\n\r\n/**\r\n * 获取当前的 undici Dispatcher\r\n */\r\nexport function getGlobalDispatcher(): any {\r\n return _dispatcher;\r\n}\r\n\r\n/**\r\n * 初始化 HTTP 客户端\r\n *\r\n * 设置 Undici 全局调度器(同步完成):\r\n * - 有代理 → EnvHttpProxyAgent(自动处理 NO_PROXY)\r\n * - 无代理 → Agent(keep-alive + 连接池,内置 DNS 缓存)\r\n *\r\n * 此函数幂等,多次调用无副作用。\r\n */\r\nexport async function initHttpClient(): Promise<void> {\r\n if (httpClientInitialized) return;\r\n httpClientInitialized = true;\r\n\r\n // 确保 undici 已加载\r\n if (!undici) {\r\n undici = await loadUndici();\r\n if (!undici) {\r\n logger.warn('undici not available, skipping HTTP client initialization');\r\n return;\r\n }\r\n }\r\n\r\n const proxyUrl = getProxyUrl();\r\n\r\n try {\r\n // An embedding host may already own the global dispatcher (for example,\r\n // AgentDevClaw applies a runtime-switchable proxy before starting agents).\r\n // Replacing it here creates two competing proxy lifecycles and discards\r\n // the host's timeout/NO_PROXY policy. Reuse the host-owned dispatcher.\r\n const currentDispatcher = undici.getGlobalDispatcher?.() ?? null;\r\n if (isExternallyManagedDispatcher(currentDispatcher, initialGlobalDispatcher)) {\r\n _dispatcher = currentDispatcher;\r\n logger.info('Using host-managed Undici dispatcher');\r\n return;\r\n }\r\n\r\n // undici 已作为外部依赖导入,运行时由 Node.js 提供\r\n\r\n if (proxyUrl) {\r\n // EnvHttpProxyAgent 自动尊重 NO_PROXY / no_proxy 环境变量\r\n const proxyAgent = new undici.EnvHttpProxyAgent({\r\n httpProxy: proxyUrl,\r\n httpsProxy: proxyUrl,\r\n ...buildHttpDispatcherOptions(process.env.NO_PROXY || process.env.no_proxy),\r\n });\r\n undici.setGlobalDispatcher(proxyAgent);\r\n _dispatcher = proxyAgent;\r\n logger.info('Proxy Agent configured (EnvHttpProxyAgent)', {\r\n proxy: maskProxyUrl(proxyUrl),\r\n });\r\n } else {\r\n // 默认 Agent:keep-alive + 连接池\r\n // undici Agent 内置 DNS 缓存(通过 Node.js 内部的 c-ares 解析器)\r\n const agent = new undici.Agent({\r\n ...buildHttpDispatcherOptions(),\r\n keepAliveTimeout: 30_000,\r\n keepAliveMaxTimeout: 300_000,\r\n connections: 50,\r\n pipelining: 1,\r\n });\r\n undici.setGlobalDispatcher(agent);\r\n _dispatcher = agent;\r\n logger.debug('Undici Agent configured (default, with keep-alive)');\r\n }\r\n } catch (e: any) {\r\n logger.warn('Failed to set up undici dispatcher, proxy env vars will be ignored', {\r\n error: e.message || String(e),\r\n });\r\n }\r\n}\r\n","/**\r\n * Image data resolver for LLM compilers.\r\n *\r\n * Resolves an {@link ImageInput} to base64 data by either:\r\n * - Reading the inline `base64` field (backward compat with old sessions)\r\n * - Reading from `path` on disk (preferred, avoids session bloat)\r\n *\r\n * Used by compileContextForAnthropic, OpenAILLM, and OpenAIResponsesLLM.\r\n */\r\n\r\nimport { readFileSync } from 'node:fs';\r\nimport type { ImageInput } from '@agentdevjs/core';\r\n\r\n/**\r\n * Resolve an ImageInput to raw base64 data (no data-URI prefix).\r\n *\r\n * Priority: `base64` field → `path` file read.\r\n * Returns `null` if neither source yields data.\r\n */\r\nexport function resolveImageBase64(img: ImageInput): string | null {\r\n if (img.base64) return img.base64;\r\n if (img.path) {\r\n try {\r\n const buf = readFileSync(img.path);\r\n return buf.toString('base64');\r\n } catch {\r\n return null;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Build a data-URI string (e.g. \"data:image/png;base64,...\") from an ImageInput.\r\n * Returns `null` if no data can be resolved.\r\n */\r\nexport function resolveImageDataUri(img: ImageInput): string | null {\r\n const base64 = resolveImageBase64(img);\r\n if (!base64) return null;\r\n const mediaType = img.mediaType || 'image/png';\r\n return `data:${mediaType};base64,${base64}`;\r\n}\r\n","/**\r\n * Tool JSON schema sanitizer shared by LLM adapters.\r\n *\r\n * `$schema` is a documentation-only pointer to the JSON Schema dialect\r\n * (e.g. \"https://json-schema.org/draft/2020-12/schema\"). It carries no\r\n * meaning for the model, and some OpenAI/Anthropic-compatible backends\r\n * choke on it — notably, an internal DeepSeek endpoint silently disables\r\n * tool use entirely once `$schema` appears in 3+ tool definitions.\r\n * Strip it recursively before sending schemas over the wire.\r\n */\r\n\r\nexport function sanitizeToolSchema(parameters: Record<string, unknown> | undefined): Record<string, unknown> {\r\n const base = parameters && typeof parameters === 'object' ? parameters : { type: 'object', properties: {} };\r\n return stripSchemaMeta(base) as Record<string, unknown>;\r\n}\r\n\r\nfunction stripSchemaMeta(node: unknown): unknown {\r\n if (Array.isArray(node)) {\r\n return node.map(stripSchemaMeta);\r\n }\r\n if (node && typeof node === 'object') {\r\n const out: Record<string, unknown> = {};\r\n for (const [key, value] of Object.entries(node)) {\r\n if (key === '$schema') continue;\r\n out[key] = stripSchemaMeta(value);\r\n }\r\n return out;\r\n }\r\n return node;\r\n}\r\n","/**\r\n * LLM 适配器重试可观测性\r\n *\r\n * 单次模型请求内部的重试过程通知。与执行控制流解耦:\r\n * 通知发射失败(无 notification scope / 模块不可用)不影响重试本身。\r\n */\r\n\r\nimport { classifyAPIError } from '@agentdevjs/core';\r\nimport type { LLMRetryData } from '@agentdevjs/core';\r\n\r\n/**\r\n * 在适配器重试点发射 llm.retry 通知(waiting → sleep → requesting)。\r\n *\r\n * sleep 接受 AbortSignal:用户中断会同时取消退避等待并向上传播 AbortError。\r\n */\r\nexport async function emitRetryObservability(params: {\r\n attempt: number;\r\n maxRetries: number;\r\n delayMs: number;\r\n signal?: AbortSignal;\r\n error: unknown;\r\n status?: number;\r\n}): Promise<void> {\r\n const { attempt, maxRetries, delayMs, signal, error, status } = params;\r\n const base: Omit<LLMRetryData, 'phase'> = {\r\n attempt,\r\n maxRetries,\r\n ...(delayMs !== undefined ? { delayMs } : {}),\r\n ...(status !== undefined ? { statusCode: status } : {}),\r\n errorType: classifyAPIError(error, status),\r\n };\r\n await emitRetryNotification({ ...base, phase: 'waiting' });\r\n await sleepQuietly(delayMs, signal);\r\n await emitRetryNotification({ ...base, phase: 'requesting' });\r\n}\r\n\r\nasync function emitRetryNotification(data: LLMRetryData): Promise<void> {\r\n try {\r\n // 动态导入避免 llm → core 的静态依赖加重;模块缓存后开销可忽略\r\n const { emitNotification, createLLMRetry } = await import('@agentdevjs/core');\r\n emitNotification(createLLMRetry(data));\r\n } catch {\r\n // 通知失败不影响重试\r\n }\r\n}\r\n\r\nasync function sleepQuietly(ms: number, signal?: AbortSignal): Promise<void> {\r\n const { sleep } = await import('@agentdevjs/core');\r\n await sleep(ms, signal);\r\n}\r\n","/**\r\n * Feature 注入 system 消息的 reminder 包装。\r\n *\r\n * 无 source 的 system(agent 系统提示词)与有 source 的 system(Feature 注入,\r\n * 如 handoff-seed、partial-compact)在编译层分流:后者包为 <reminder> 嵌入\r\n * 最近的 user turn,而非混入顶层 system。已带 <reminder> 前缀的内容不重复包装。\r\n */\r\nexport function wrapReminder(text: string): string {\r\n const trimmed = text.trim();\r\n return /^<reminder[\\s>]/.test(trimmed) ? trimmed : `<reminder>${trimmed}</reminder>`;\r\n}\r\n","/**\r\n * OpenAI LLM 适配器\r\n * 实现 LLMClient 接口\r\n */\r\n\r\nimport type { LLMClient, Message, Tool, LLMResponse, ToolCall, UsageInfo } from '@agentdevjs/core';\r\nimport type { LLMPhase } from '@agentdevjs/core';\r\nimport type { CustomHeaderEntry, ThinkingEffort } from '@agentdevjs/core';\r\nimport { OPENAI_THINKING_EFFORTS } from '@agentdevjs/core';\r\nimport { resolveCustomHeaders } from './custom-headers.js';\r\nimport { resolveImageDataUri } from './image-resolver.js';\r\nimport { sanitizeToolSchema } from './schema-sanitizer.js';\r\nimport OpenAI from 'openai';\r\nimport { getRetryDelay, parseRetryAfter, shouldRetry, resolveModelCallPolicy, withDeadline } from '@agentdevjs/core';\r\nimport { classifyAndWrapError } from '@agentdevjs/core';\r\nimport { initHttpClient } from './http-client.js';\r\nimport { emitRetryObservability } from './retry-observability.js';\r\nimport { wrapReminder } from './reminder.js';\r\n\r\n// 确保 HTTP 客户端基础设施(DNS 缓存、代理、连接池)在首次 fetch 前初始化\r\nlet httpClientInitPromise: Promise<void> | null = null;\r\nfunction ensureHttpClientInitialized() {\r\n if (!httpClientInitPromise) {\r\n httpClientInitPromise = initHttpClient();\r\n }\r\n return httpClientInitPromise;\r\n}\r\n\r\n/**\r\n * 将内部 Message[] 编译为 OpenAI Chat Completions wire 格式。\r\n * 与 compileContextForAnthropic / compileContextForOpenAIResponses 对称的导出编译函数。\r\n *\r\n * system 消息按 source 二分处理(对齐 compileContextForAnthropic):\r\n * - 无 source(agent 系统提示词及经 context.add 注入的同级文档)→ 合并为\r\n * 开头恰好一条 system 消息。部分 OpenAI 兼容后端(vLLM Qwen chat template 等)\r\n * 仅接受一条位于开头的 system,多条返回 400 \"System message must be at the beginning.\"。\r\n * - 有 source(Feature 注入,如 handoff-seed、partial-compact)→ 包 <reminder>\r\n * 嵌入下一个 user turn(作为文本前缀);若后续无 user 消息则以独立 user\r\n * 消息落尾。不插入 assistant/tool 之间,避免破坏 tool_calls 配对。\r\n */\r\nexport function compileChatMessages(\r\n messages: Message[],\r\n visionEnabled = false,\r\n): OpenAI.Chat.ChatCompletionMessageParam[] {\r\n const systemPromptParts: string[] = [];\r\n const compiled: OpenAI.Chat.ChatCompletionMessageParam[] = [];\r\n let seenFirstUser = false;\r\n let pendingReminders: string[] = [];\r\n\r\n const flushRemindersAsUserMessage = (): void => {\r\n if (pendingReminders.length === 0) return;\r\n compiled.push({ role: 'user', content: pendingReminders.join('\\n\\n') });\r\n pendingReminders = [];\r\n };\r\n\r\n for (const m of messages) {\r\n if (m.role === 'system') {\r\n if (!seenFirstUser && !m.source) {\r\n systemPromptParts.push(m.content);\r\n } else {\r\n pendingReminders.push(wrapReminder(m.content));\r\n }\r\n continue;\r\n }\r\n\r\n // 中途 system 不能原样放入 Chat Completions messages:兼容性最差的\r\n // 后端只允许开头的 system。它们会以 user reminder 形式落地,但必须\r\n // 在下一个 assistant 之前落地,不能一直等到遇到下一个 user;否则\r\n // 历史提醒会被重新编译到整个上下文的末尾,看起来像最新状态。\r\n // tool 分支刻意在此之前不 flush,以保持 assistant(tool_calls) 与\r\n // tool(result) 的相邻配对。\r\n if (m.role === 'assistant') {\r\n flushRemindersAsUserMessage();\r\n }\r\n\r\n if (m.role === 'tool') {\r\n compiled.push({ role: 'tool', content: m.content, tool_call_id: m.toolCallId! });\r\n // tool 消息附带图片\r\n if (m.images && m.images.length > 0) {\r\n if (visionEnabled) {\r\n // 视觉模式:追加一条 user 消息携带图片\r\n const parts: OpenAI.Chat.ChatCompletionContentPart[] = [\r\n { type: 'text', text: `[Tool image result for ${m.toolCallId}]` },\r\n ];\r\n for (const img of m.images) {\r\n const url = resolveImageDataUri(img) || img.source;\r\n if (url) {\r\n parts.push({ type: 'image_url', image_url: { url } });\r\n }\r\n }\r\n compiled.push({ role: 'user', content: parts });\r\n } else {\r\n // 非视觉模式:降级为文字占位符,追加到 tool 消息后\r\n const placeholders = m.images\r\n .map(img => `【Image】${img.source || '(inline image)'}`)\r\n .join('\\n');\r\n compiled.push({ role: 'user', content: `[Tool image placeholders]\\n${placeholders}` });\r\n }\r\n }\r\n continue;\r\n }\r\n\r\n // assistant 消息携带 toolCalls 时必须序列化为 tool_calls,\r\n // 否则后续 tool 消息会成为孤儿(严格校验的 OpenAI 兼容后端会返回 400:\r\n // \"Messages with role 'tool' must be a response to a preceding message with 'tool_calls'\")\r\n if (m.role === 'assistant' && Array.isArray(m.toolCalls) && m.toolCalls.length > 0) {\r\n compiled.push({\r\n role: 'assistant' as const,\r\n content: m.content ?? '',\r\n tool_calls: m.toolCalls.map(tc => ({\r\n id: tc.id,\r\n type: 'function' as const,\r\n function: {\r\n name: tc.name,\r\n arguments: JSON.stringify(tc.arguments ?? {}),\r\n },\r\n })),\r\n });\r\n continue;\r\n }\r\n\r\n // user 消息:待嵌入的 reminder 作为文本前缀拼入 content\r\n if (m.role === 'user' && m.images && m.images.length > 0) {\r\n seenFirstUser = true;\r\n const prefix = pendingReminders.length > 0 ? `${pendingReminders.join('\\n\\n')}\\n\\n` : '';\r\n pendingReminders = [];\r\n if (visionEnabled) {\r\n const parts: OpenAI.Chat.ChatCompletionContentPart[] = [];\r\n if (m.content) {\r\n parts.push({ type: 'text', text: `${prefix}${m.content}` });\r\n } else if (prefix) {\r\n parts.push({ type: 'text', text: prefix.trimEnd() });\r\n }\r\n for (const img of m.images) {\r\n const url = resolveImageDataUri(img) || img.source;\r\n if (url) {\r\n parts.push({ type: 'image_url', image_url: { url } });\r\n }\r\n }\r\n compiled.push({ role: 'user', content: parts });\r\n } else {\r\n // 非视觉模式:将图片降级为文字占位符\r\n const placeholders = m.images\r\n .map(img => `【Image】${img.source || '(inline image)'}`)\r\n .join('\\n');\r\n compiled.push({ role: 'user', content: `${prefix}${m.content}\\n${placeholders}` });\r\n }\r\n continue;\r\n }\r\n\r\n if (m.role === 'user') {\r\n seenFirstUser = true;\r\n if (pendingReminders.length > 0) {\r\n compiled.push({ role: 'user', content: `${pendingReminders.join('\\n\\n')}\\n\\n${m.content}` });\r\n pendingReminders = [];\r\n } else {\r\n compiled.push({ role: 'user', content: m.content });\r\n }\r\n continue;\r\n }\r\n\r\n compiled.push({ role: m.role, content: m.content } as OpenAI.Chat.ChatCompletionMessageParam);\r\n }\r\n\r\n flushRemindersAsUserMessage();\r\n\r\n const result: OpenAI.Chat.ChatCompletionMessageParam[] = [];\r\n if (systemPromptParts.length > 0) {\r\n result.push({ role: 'system', content: systemPromptParts.join('\\n\\n') });\r\n }\r\n result.push(...compiled);\r\n return result;\r\n}\r\n\r\nexport class OpenAILLM implements LLMClient {\r\n private client: OpenAI;\r\n private _modelName: string;\r\n private maxTokens?: number;\r\n private thinkingEffort?: ThinkingEffort;\r\n private providerOptions?: Record<string, unknown>;\r\n private customHeaders?: CustomHeaderEntry[];\r\n private visionEnabled: boolean;\r\n private initPromise: Promise<void>;\r\n private maxRetries: number;\r\n private deadlineMs: number | undefined;\r\n\r\n /** 返回当前 LLM 实例使用的模型名 */\r\n get modelName(): string { return this._modelName; }\r\n\r\n constructor(\r\n apiKey: string,\r\n modelName: string = 'gpt-4o',\r\n baseUrl?: string,\r\n maxTokens?: number,\r\n thinkingEffort?: ThinkingEffort,\r\n providerOptions?: Record<string, unknown>,\r\n customHeaders?: CustomHeaderEntry[],\r\n visionEnabled: boolean = false,\r\n callPolicy?: { maxRetries?: number; timeoutMs?: number },\r\n ) {\r\n const resolved = resolveModelCallPolicy(callPolicy);\r\n this.maxRetries = resolved.maxRetries;\r\n this.deadlineMs = resolved.timeoutMs;\r\n this.client = new OpenAI({\r\n apiKey,\r\n baseURL: baseUrl,\r\n // 通过自定义 fetch 注入动态请求头,使 uuid / random 模式在每次请求时重新生成\r\n ...(customHeaders && customHeaders.length > 0\r\n ? {\r\n fetch: (input: any, init: any) => {\r\n init = init || {};\r\n const headers = new Headers(init.headers);\r\n for (const [k, v] of Object.entries(resolveCustomHeaders(customHeaders))) {\r\n headers.set(k, v);\r\n }\r\n // The OpenAI SDK has already serialized the body and sets its\r\n // own Content-Length. Once a custom fetch forwards that header\r\n // through Undici's ProxyAgent, Undici 7 rejects it before the\r\n // request reaches the proxy (UND_ERR_INVALID_ARG). Let the\r\n // final fetch implementation calculate it after header\r\n // injection instead.\r\n headers.delete('content-length');\r\n init.headers = headers;\r\n return globalThis.fetch(input, init);\r\n },\r\n }\r\n : {}),\r\n });\r\n this._modelName = modelName;\r\n this.maxTokens = maxTokens;\r\n this.thinkingEffort = thinkingEffort;\r\n this.providerOptions = providerOptions;\r\n this.customHeaders = customHeaders;\r\n this.visionEnabled = visionEnabled;\r\n this.initPromise = ensureHttpClientInitialized();\r\n }\r\n\r\n /**\r\n * 聊天 - 核心方法(内部使用流式处理,带重试)\r\n */\r\n async chat(messages: Message[], tools: Tool[], options?: { signal?: AbortSignal }): Promise<LLMResponse> {\r\n // 确保 HTTP 客户端已初始化\r\n await this.initPromise;\r\n // 整体时限:deadline 到达以 AbortError 中止,不进入重试\r\n const signal = withDeadline(options?.signal, this.deadlineMs);\r\n // 转换消息格式为 OpenAI 格式\r\n const chatMessages = compileChatMessages(messages, this.visionEnabled);\r\n\r\n // 转换工具格式\r\n const chatTools = tools.map(t => ({\r\n type: 'function' as const,\r\n function: {\r\n name: t.name,\r\n description: t.description,\r\n parameters: sanitizeToolSchema(t.parameters),\r\n },\r\n }));\r\n\r\n const requestBody = {\r\n model: this._modelName,\r\n messages: chatMessages,\r\n tools: chatTools.length > 0 ? chatTools : undefined,\r\n stream: true,\r\n stream_options: { include_usage: true },\r\n ...(this.maxTokens ? { max_tokens: this.maxTokens } : {}),\r\n ...(this.thinkingEffort && OPENAI_THINKING_EFFORTS.includes(this.thinkingEffort)\r\n ? { reasoning_effort: this.thinkingEffort }\r\n : {}),\r\n ...(this.providerOptions ?? {}),\r\n } as OpenAI.Chat.ChatCompletionCreateParamsStreaming;\r\n\r\n for (let attempt = 1; attempt <= this.maxRetries + 1; attempt++) {\r\n try {\r\n // 检查中断信号\r\n if (signal?.aborted) {\r\n throw new DOMException('Aborted', 'AbortError');\r\n }\r\n\r\n const stream = await this.client.chat.completions.create(requestBody, {\r\n signal,\r\n });\r\n\r\n // ========== 流式处理(内部) ==========\r\n\r\n // 累积内容\r\n let content = '';\r\n let reasoning = '';\r\n let currentPhase: LLMPhase = 'content';\r\n\r\n // 累积 tool_calls\r\n interface AccumulatedToolCall {\r\n id: string;\r\n name: string;\r\n arguments: string;\r\n }\r\n const accumulatedToolCalls: Map<number, AccumulatedToolCall> = new Map();\r\n\r\n // 收集 usage 数据\r\n let usageInfo: UsageInfo | null = null;\r\n\r\n // 收集 finish_reason\r\n let finishReason: string | null = null;\r\n\r\n // 迭代流式响应\r\n for await (const chunk of stream) {\r\n // 在流式读取中检查中断信号\r\n if (signal?.aborted) {\r\n throw new DOMException('Aborted', 'AbortError');\r\n }\r\n\r\n if (chunk.usage) {\r\n const u = chunk.usage;\r\n const extendedDetails = u as any;\r\n let reasoningTokens = 0;\r\n if (extendedDetails.prompt_tokens_details?.reasoning_tokens) {\r\n reasoningTokens += extendedDetails.prompt_tokens_details.reasoning_tokens;\r\n }\r\n if (extendedDetails.completion_tokens_details?.reasoning_tokens) {\r\n reasoningTokens += extendedDetails.completion_tokens_details.reasoning_tokens;\r\n }\r\n\r\n usageInfo = {\r\n inputTokens: u.prompt_tokens || 0,\r\n outputTokens: u.completion_tokens || 0,\r\n totalTokens: (u.prompt_tokens || 0) + (u.completion_tokens || 0),\r\n ...(reasoningTokens > 0 ? { reasoningTokens } : {}),\r\n };\r\n }\r\n\r\n const delta = chunk.choices[0]?.delta;\r\n if (!delta) {\r\n continue;\r\n }\r\n\r\n const rawDelta = delta as { reasoning_content?: string; reasoning?: string; content?: string | null };\r\n // reasoning_content(DeepSeek/GLM 等)与 reasoning(OpenRouter 等网关)是两种\r\n // 后端扩展字段,都识别为思考增量。reasoning 与 content 独立累积:过渡 chunk\r\n // 可能同包携带两者(reasoning 尾巴 + 正文开头),else-if 结构会永久丢弃正文开头片段\r\n const reasoningDelta = rawDelta.reasoning_content || rawDelta.reasoning;\r\n if (reasoningDelta) {\r\n currentPhase = 'thinking';\r\n reasoning += reasoningDelta;\r\n }\r\n if (delta.content) {\r\n currentPhase = 'content';\r\n content += delta.content;\r\n }\r\n\r\n if (delta.tool_calls) {\r\n currentPhase = 'tool_calling';\r\n for (const toolCall of delta.tool_calls) {\r\n // 兼容省略 index 的 OpenAI 兼容实现(部分网关非并行场景不回填 index):\r\n // 静默丢弃会导致工具调用整体丢失,表现为\"会话没有工具调用就被打断\"。\r\n // 带 id 的增量优先续写同 id 条目,否则开启新调用;不带 id 的增量续写最近条目。\r\n let index = toolCall.index;\r\n if (index === undefined || index === null) {\r\n if (toolCall.id) {\r\n const existingIndex = Array.from(accumulatedToolCalls.entries())\r\n .find(([, v]) => v.id === toolCall.id)?.[0];\r\n index = existingIndex ?? accumulatedToolCalls.size;\r\n } else {\r\n index = Math.max(accumulatedToolCalls.size - 1, 0);\r\n }\r\n }\r\n\r\n if (!accumulatedToolCalls.has(index)) {\r\n accumulatedToolCalls.set(index, {\r\n id: toolCall.id || '',\r\n name: toolCall.function?.name || '',\r\n arguments: toolCall.function?.arguments || '',\r\n });\r\n } else {\r\n const accumulated = accumulatedToolCalls.get(index)!;\r\n if (toolCall.id) accumulated.id = toolCall.id;\r\n if (toolCall.function?.name) accumulated.name += toolCall.function.name;\r\n if (toolCall.function?.arguments) accumulated.arguments += toolCall.function.arguments;\r\n }\r\n }\r\n }\r\n\r\n try {\r\n const { emitNotification, createLLMCharCount } = await import('@agentdevjs/core');\r\n // 各 phase 独立计数:正文阶段不应延续思考阶段的累计值\r\n const phaseCharCount = currentPhase === 'thinking' ? reasoning.length : content.length;\r\n if (phaseCharCount > 0 || accumulatedToolCalls.size > 0) {\r\n const toolNames = Array.from(accumulatedToolCalls.values()).map(tc => tc.name).filter(Boolean);\r\n emitNotification(createLLMCharCount(phaseCharCount, currentPhase, {\r\n thinkingChars: reasoning.length,\r\n contentChars: content.length,\r\n toolCallCount: accumulatedToolCalls.size,\r\n ...(toolNames.length > 0 ? { streamToolNames: toolNames } : {}),\r\n }));\r\n }\r\n } catch {\r\n // 通知模块不可用,忽略\r\n }\r\n\r\n if (chunk.choices[0]?.finish_reason) {\r\n // 仅记录,不立即中断迭代:部分网关 finish_reason 先行、增量殿后,\r\n // 提前 break 会丢失尾部 tool_calls 增量与 usage chunk。\r\n // 规范网关在 [DONE] 后迭代器自然结束,无额外等待。\r\n finishReason = chunk.choices[0].finish_reason;\r\n }\r\n }\r\n\r\n // 构建最终的 tool_calls 数组\r\n let toolCalls: ToolCall[] | undefined;\r\n if (accumulatedToolCalls.size > 0) {\r\n toolCalls = Array.from(accumulatedToolCalls.values()).map(tc => {\r\n let parsedArgs: Record<string, any> = {};\r\n const argStr = tc.arguments.trim();\r\n if (argStr) {\r\n try {\r\n parsedArgs = JSON.parse(argStr);\r\n } catch {\r\n // JSON 不完整(通常是 max_tokens 截断导致)\r\n // 返回空对象,由 react-loop 的截断防御处理\r\n console.warn(\r\n `[OpenAI] Failed to parse tool arguments for tool \"${tc.name}\". ` +\r\n `Arguments length: ${argStr.length}, preview: ${argStr.slice(0, 200)}`,\r\n );\r\n }\r\n }\r\n return {\r\n id: tc.id,\r\n name: tc.name,\r\n arguments: parsedArgs,\r\n };\r\n });\r\n }\r\n\r\n return {\r\n content,\r\n toolCalls,\r\n reasoning,\r\n ...(usageInfo ? { usage: usageInfo } : {}),\r\n stopReason: finishReason,\r\n };\r\n } catch (error) {\r\n // 中断错误不重试,直接传播\r\n if (error instanceof DOMException && error.name === 'AbortError') {\r\n throw error;\r\n }\r\n // AbortError from fetch/signal\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw error;\r\n }\r\n\r\n // OpenAI SDK 错误对象上通常有 status 和 headers\r\n const status = (error as any)?.status as number | undefined;\r\n if (attempt <= this.maxRetries && shouldRetry(error, status)) {\r\n const retryAfterMs = parseRetryAfter((error as any)?.headers);\r\n const delayMs = getRetryDelay(attempt, retryAfterMs);\r\n await emitRetryObservability({\r\n attempt,\r\n maxRetries: this.maxRetries,\r\n delayMs,\r\n signal,\r\n error,\r\n status,\r\n });\r\n continue;\r\n }\r\n // 重试耗尽或不可重试 → 分类包装后抛出\r\n throw classifyAndWrapError(error, status);\r\n }\r\n }\r\n\r\n // 理论上不会到这里\r\n throw new Error('OpenAI API call failed after all retries');\r\n }\r\n}\r\n\r\nimport type { ModelConfig, AgentConfigFile } from '@agentdevjs/core';\r\n\r\n/**\r\n * 从配置创建 OpenAI LLM 实例\r\n *\r\n * @example\r\n * // 方式1:传入配置文件对象(推荐)\r\n * const llm = createOpenAILLM(config);\r\n *\r\n * @example\r\n * // 方式2:传入模型配置\r\n * const llm = createOpenAILLM(config.defaultModel);\r\n *\r\n * @example\r\n * // 方式3:单独传参\r\n * const llm = createOpenAILLM(apiKey, 'gpt-4o', baseUrl);\r\n *\r\n * @example\r\n * // 方式4:自定义配置\r\n * const llm = createOpenAILLM({ apiKey: 'xxx', model: 'gpt-4o' });\r\n */\r\nexport function createOpenAILLM(config: AgentConfigFile): OpenAILLM;\r\nexport function createOpenAILLM(modelConfig: ModelConfig): OpenAILLM;\r\nexport function createOpenAILLM(\r\n apiKey: string,\r\n modelName: string,\r\n baseUrl?: string\r\n): OpenAILLM;\r\nexport function createOpenAILLM(\r\n configOrApiKey: AgentConfigFile | ModelConfig | string,\r\n modelName?: string,\r\n baseUrl?: string\r\n): OpenAILLM {\r\n // 处理 AgentConfigFile\r\n if (typeof configOrApiKey === 'object' && 'defaultModel' in configOrApiKey) {\r\n return new OpenAILLM(\r\n configOrApiKey.defaultModel.apiKey,\r\n configOrApiKey.defaultModel.model,\r\n configOrApiKey.defaultModel.baseUrl,\r\n configOrApiKey.defaultModel.maxTokens,\r\n configOrApiKey.defaultModel.thinkingEffort,\r\n configOrApiKey.defaultModel.providerOptions,\r\n configOrApiKey.defaultModel.customHeaders,\r\n configOrApiKey.defaultModel.vision ?? false,\r\n { maxRetries: configOrApiKey.defaultModel.maxRetries, timeoutMs: configOrApiKey.defaultModel.timeoutMs },\r\n );\r\n }\r\n // 处理 ModelConfig\r\n if (typeof configOrApiKey === 'object') {\r\n return new OpenAILLM(\r\n configOrApiKey.apiKey,\r\n configOrApiKey.model,\r\n configOrApiKey.baseUrl,\r\n configOrApiKey.maxTokens,\r\n configOrApiKey.thinkingEffort,\r\n configOrApiKey.providerOptions,\r\n configOrApiKey.customHeaders,\r\n configOrApiKey.vision ?? false,\r\n { maxRetries: configOrApiKey.maxRetries, timeoutMs: configOrApiKey.timeoutMs },\r\n );\r\n }\r\n // 处理单独传参\r\n return new OpenAILLM(configOrApiKey, modelName!, baseUrl);\r\n}\r\n","/**\r\n * OpenAI Responses LLM 适配器\r\n *\r\n * 只负责把框架的 Message / Tool 编译为 Responses 输入,\r\n * 再把 Responses 输出收敛回 LLMResponse。\r\n */\r\n\r\nimport OpenAI from 'openai';\r\nimport type { AgentConfigFile, ModelConfig, CustomHeaderEntry, ThinkingEffort } from '@agentdevjs/core';\r\nimport { OPENAI_THINKING_EFFORTS } from '@agentdevjs/core';\r\nimport type { LLMClient, LLMResponse, LLMPhase, Message, Tool, ToolCall, UsageInfo, ThinkingBlock } from '@agentdevjs/core';\r\nimport { resolveCustomHeaders } from './custom-headers.js';\r\nimport { resolveImageDataUri } from './image-resolver.js';\r\nimport { sanitizeToolSchema } from './schema-sanitizer.js';\r\nimport { getRetryDelay, parseRetryAfter, shouldRetry, resolveModelCallPolicy, withDeadline } from '@agentdevjs/core';\r\nimport { classifyAndWrapError } from '@agentdevjs/core';\r\nimport { initHttpClient } from './http-client.js';\r\nimport { emitRetryObservability } from './retry-observability.js';\r\n\r\n// 确保 HTTP 客户端基础设施(DNS 缓存、代理、连接池)在首次 fetch 前初始化\r\nlet httpClientInitPromise: Promise<void> | null = null;\r\nfunction ensureHttpClientInitialized() {\r\n if (!httpClientInitPromise) {\r\n httpClientInitPromise = initHttpClient();\r\n }\r\n return httpClientInitPromise;\r\n}\r\n\r\ntype ResponsesRequest = {\r\n model: string;\r\n instructions?: string;\r\n input: any[];\r\n tools?: Array<Record<string, unknown>>;\r\n tool_choice?: 'auto';\r\n max_output_tokens?: number;\r\n parallel_tool_calls?: boolean;\r\n reasoning?: Record<string, unknown>;\r\n previous_response_id?: string;\r\n store?: boolean;\r\n text?: Record<string, unknown>;\r\n include?: Array<string>;\r\n [key: string]: unknown;\r\n};\r\n\r\nexport type OpenAIResponsesProfile = 'standard' | 'codex';\r\n\r\nconst DEFAULT_CODEX_INSTRUCTIONS = 'You are a helpful assistant.';\r\n\r\ntype ResponsesSnapshot = {\r\n output?: any[];\r\n output_text?: string;\r\n usage?: {\r\n input_tokens?: number;\r\n output_tokens?: number;\r\n total_tokens?: number;\r\n input_tokens_details?: { cached_tokens?: number };\r\n output_tokens_details?: { reasoning_tokens?: number };\r\n };\r\n status?: string;\r\n incomplete_details?: { reason?: string } | null;\r\n};\r\n\r\ninterface AccumulatedFunctionCall {\r\n call_id: string;\r\n name: string;\r\n arguments: string;\r\n}\r\n\r\ninterface AccumulatedReasoning {\r\n id: string;\r\n summary: string[];\r\n}\r\n\r\nexport class OpenAIResponsesLLM implements LLMClient {\r\n private client: OpenAI;\r\n private _modelName: string;\r\n private maxTokens?: number;\r\n private thinkingEffort?: ThinkingEffort;\r\n private thinkingBudgetTokens?: number;\r\n private providerOptions?: Record<string, unknown>;\r\n private customHeaders?: CustomHeaderEntry[];\r\n private visionEnabled: boolean;\r\n private responsesProfile: OpenAIResponsesProfile;\r\n private initPromise: Promise<void>;\r\n private maxRetries: number;\r\n private deadlineMs: number | undefined;\r\n\r\n /** 返回当前 LLM 实例使用的模型名 */\r\n get modelName(): string { return this._modelName; }\r\n\r\n constructor(\r\n apiKey: string,\r\n modelName: string = 'gpt-4o',\r\n baseUrl?: string,\r\n maxTokens?: number,\r\n thinkingEffort?: ThinkingEffort,\r\n thinkingBudgetTokens?: number,\r\n providerOptions?: Record<string, unknown>,\r\n customHeaders?: CustomHeaderEntry[],\r\n visionEnabled: boolean = false,\r\n responsesProfile: OpenAIResponsesProfile = 'standard',\r\n callPolicy?: { maxRetries?: number; timeoutMs?: number },\r\n ) {\r\n const resolved = resolveModelCallPolicy(callPolicy);\r\n this.maxRetries = resolved.maxRetries;\r\n this.deadlineMs = resolved.timeoutMs;\r\n this.client = new OpenAI({\r\n apiKey,\r\n baseURL: baseUrl,\r\n ...(customHeaders && customHeaders.length > 0\r\n ? {\r\n fetch: (input: any, init: any) => {\r\n init = init || {};\r\n const headers = new Headers(init.headers);\r\n for (const [k, v] of Object.entries(resolveCustomHeaders(customHeaders))) {\r\n headers.set(k, v);\r\n }\r\n // The OpenAI SDK has already serialized the body and sets its\r\n // own Content-Length. Once a custom fetch forwards that header\r\n // through Undici's ProxyAgent, Undici 7 rejects it before the\r\n // request reaches the proxy (UND_ERR_INVALID_ARG). Let the\r\n // final fetch implementation calculate it after header\r\n // injection instead.\r\n headers.delete('content-length');\r\n init.headers = headers;\r\n return globalThis.fetch(input, init);\r\n },\r\n }\r\n : {}),\r\n });\r\n this._modelName = modelName;\r\n this.maxTokens = maxTokens;\r\n this.thinkingEffort = thinkingEffort;\r\n this.thinkingBudgetTokens = thinkingBudgetTokens;\r\n this.providerOptions = providerOptions;\r\n this.customHeaders = customHeaders;\r\n this.visionEnabled = visionEnabled;\r\n this.responsesProfile = responsesProfile;\r\n this.initPromise = ensureHttpClientInitialized();\r\n }\r\n\r\n async chat(messages: Message[], tools: Tool[], options?: { signal?: AbortSignal }): Promise<LLMResponse> {\r\n await this.initPromise;\r\n\r\n const compiled = compileContextForOpenAIResponses(messages, tools, {\r\n modelName: this._modelName,\r\n maxTokens: this.maxTokens,\r\n thinkingEffort: this.thinkingEffort,\r\n thinkingBudgetTokens: this.thinkingBudgetTokens,\r\n providerOptions: this.providerOptions,\r\n visionEnabled: this.visionEnabled,\r\n responsesProfile: this.responsesProfile,\r\n });\r\n let preferNonStreaming = false;\r\n const signal = withDeadline(options?.signal, this.deadlineMs);\r\n\r\n for (let attempt = 1; attempt <= this.maxRetries + 1; attempt++) {\r\n let sawAnyStreamEvent = false;\r\n try {\r\n if (signal?.aborted) {\r\n throw new DOMException('Aborted', 'AbortError');\r\n }\r\n\r\n if (preferNonStreaming) {\r\n return await this.createResponsesCompletion(compiled, options);\r\n }\r\n\r\n const stream = this.client.responses.stream(\r\n {\r\n ...compiled,\r\n stream: true,\r\n } as any,\r\n { signal },\r\n );\r\n\r\n let content = '';\r\n let reasoning = '';\r\n let currentPhase: LLMPhase = 'content';\r\n let stopReason: string | null = null;\r\n let usageInfo: UsageInfo | null = null;\r\n let completedSnapshot: ResponsesSnapshot | null = null;\r\n let completedText = '';\r\n\r\n const functionCalls = new Map<string, AccumulatedFunctionCall>();\r\n const reasoningItems = new Map<string, AccumulatedReasoning>();\r\n\r\n for await (const event of stream) {\r\n sawAnyStreamEvent = true;\r\n if (signal?.aborted) {\r\n throw new DOMException('Aborted', 'AbortError');\r\n }\r\n\r\n switch (event.type) {\r\n case 'response.output_text.delta': {\r\n const delta = String(event.delta || '');\r\n if (delta) {\r\n currentPhase = 'content';\r\n content += delta;\r\n }\r\n break;\r\n }\r\n case 'response.output_text.done': {\r\n completedText = String(event.text || completedText || '');\r\n break;\r\n }\r\n case 'response.function_call_arguments.delta': {\r\n const key = String(event.item_id || event.output_index);\r\n currentPhase = 'tool_calling';\r\n if (!functionCalls.has(key)) {\r\n functionCalls.set(key, {\r\n call_id: '',\r\n name: '',\r\n arguments: '',\r\n });\r\n }\r\n functionCalls.get(key)!.arguments += String(event.delta || '');\r\n break;\r\n }\r\n case 'response.function_call_arguments.done': {\r\n const key = String(event.item_id || event.output_index);\r\n if (!functionCalls.has(key)) {\r\n functionCalls.set(key, {\r\n call_id: '',\r\n name: '',\r\n arguments: '',\r\n });\r\n }\r\n functionCalls.get(key)!.arguments = String(event.arguments || functionCalls.get(key)!.arguments || '');\r\n break;\r\n }\r\n case 'response.output_item.added':\r\n case 'response.output_item.done': {\r\n const item = event.item || {};\r\n if (item.type === 'function_call') {\r\n const key = String(item.id || event.output_index);\r\n currentPhase = 'tool_calling';\r\n functionCalls.set(key, {\r\n call_id: String(item.call_id || ''),\r\n name: String(item.name || ''),\r\n arguments: String(item.arguments || ''),\r\n });\r\n } else if (item.type === 'reasoning') {\r\n recordReasoningItem(reasoningItems, item);\r\n } else if (item.type === 'message' && event.type === 'response.output_item.done') {\r\n completedText = extractOutputMessageText(item) || completedText;\r\n }\r\n break;\r\n }\r\n case 'response.reasoning_summary.delta':\r\n case 'response.reasoning_summary_text.delta': {\r\n const key = String(event.item_id || event.output_index);\r\n if (!reasoningItems.has(key)) {\r\n reasoningItems.set(key, { id: String(event.item_id || ''), summary: [] });\r\n }\r\n const delta = extractTextDelta(event.delta);\r\n if (delta) {\r\n const entry = reasoningItems.get(key)!;\r\n if (entry.summary.length === 0) {\r\n entry.summary.push(delta);\r\n } else {\r\n entry.summary[entry.summary.length - 1] += delta;\r\n }\r\n currentPhase = 'thinking';\r\n reasoning += delta;\r\n }\r\n break;\r\n }\r\n case 'response.reasoning_summary.done': {\r\n const key = String(event.item_id || event.output_index);\r\n const text = String(event.text || '');\r\n if (!reasoningItems.has(key)) {\r\n reasoningItems.set(key, { id: String(event.item_id || ''), summary: [] });\r\n }\r\n const entry = reasoningItems.get(key)!;\r\n if (text) {\r\n entry.summary = [text];\r\n currentPhase = 'thinking';\r\n reasoning += text;\r\n }\r\n break;\r\n }\r\n case 'response.reasoning_summary_text.done': {\r\n const key = String(event.item_id || event.output_index);\r\n const text = String(event.text || '');\r\n if (!reasoningItems.has(key)) {\r\n reasoningItems.set(key, { id: String(event.item_id || ''), summary: [] });\r\n }\r\n const entry = reasoningItems.get(key)!;\r\n if (text) {\r\n entry.summary = [text];\r\n currentPhase = 'thinking';\r\n reasoning += text;\r\n }\r\n break;\r\n }\r\n case 'response.completed': {\r\n completedSnapshot = event.response as ResponsesSnapshot | null;\r\n stopReason = mapResponseStatusToStopReason(completedSnapshot);\r\n break;\r\n }\r\n case 'response.failed': {\r\n completedSnapshot = event.response as ResponsesSnapshot | null;\r\n stopReason = 'failed';\r\n break;\r\n }\r\n case 'response.incomplete': {\r\n completedSnapshot = event.response as ResponsesSnapshot | null;\r\n stopReason = mapResponseStatusToStopReason(completedSnapshot);\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n\r\n try {\r\n const { emitNotification, createLLMCharCount } = await import('@agentdevjs/core');\r\n // 各 phase 独立计数:正文阶段不应延续思考阶段的累计值\r\n const phaseCharCount = currentPhase === 'thinking' ? reasoning.length : content.length;\r\n if (phaseCharCount > 0 || functionCalls.size > 0) {\r\n const toolNames = Array.from(functionCalls.values()).map(fc => fc.name).filter(Boolean);\r\n emitNotification(createLLMCharCount(phaseCharCount, currentPhase, {\r\n thinkingChars: reasoning.length,\r\n contentChars: content.length,\r\n toolCallCount: functionCalls.size,\r\n ...(toolNames.length > 0 ? { streamToolNames: toolNames } : {}),\r\n }));\r\n }\r\n } catch {\r\n // Ignore notification failures.\r\n }\r\n }\r\n\r\n const parsedSnapshot = completedSnapshot ? parseOpenAIResponsesSnapshot(completedSnapshot) : null;\r\n if (parsedSnapshot?.usage) {\r\n usageInfo = parsedSnapshot.usage;\r\n }\r\n\r\n const parsedToolCalls = parsedSnapshot?.toolCalls?.length\r\n ? parsedSnapshot.toolCalls\r\n : finalizeToolCalls(functionCalls);\r\n const parsedThinkingBlocks = parsedSnapshot?.thinkingBlocks?.length\r\n ? parsedSnapshot.thinkingBlocks\r\n : finalizeThinkingBlocks(reasoningItems);\r\n // ChatGPT's Codex backend currently emits the actual message through\r\n // stream events but returns response.completed with output: []. Never\r\n // let that sparse terminal snapshot erase text already received.\r\n const finalContent = parsedSnapshot?.content || content || completedText;\r\n const finalReasoning = parsedSnapshot?.reasoning || reasoning;\r\n const finalStopReason = parsedSnapshot?.stopReason ?? stopReason;\r\n\r\n return {\r\n content: finalContent,\r\n ...(parsedToolCalls.length > 0 ? { toolCalls: parsedToolCalls } : {}),\r\n ...(finalReasoning ? { reasoning: finalReasoning } : {}),\r\n ...(parsedThinkingBlocks.length > 0 ? { thinkingBlocks: parsedThinkingBlocks } : {}),\r\n ...(usageInfo ? { usage: usageInfo } : {}),\r\n stopReason: finalStopReason,\r\n };\r\n } catch (error) {\r\n if (error instanceof DOMException && error.name === 'AbortError') {\r\n throw error;\r\n }\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw error;\r\n }\r\n\r\n if (isEmptyResponsesStreamError(error) && !sawAnyStreamEvent) {\r\n preferNonStreaming = true;\r\n try {\r\n return await this.createResponsesCompletion(compiled, options);\r\n } catch (fallbackError) {\r\n if (fallbackError instanceof DOMException && fallbackError.name === 'AbortError') {\r\n throw fallbackError;\r\n }\r\n if (fallbackError instanceof Error && fallbackError.name === 'AbortError') {\r\n throw fallbackError;\r\n }\r\n\r\n const fallbackStatus = (fallbackError as any)?.status as number | undefined;\r\n if (attempt <= this.maxRetries && shouldRetry(fallbackError, fallbackStatus)) {\r\n const retryAfterMs = parseRetryAfter((fallbackError as any)?.headers);\r\n const delayMs = getRetryDelay(attempt, retryAfterMs);\r\n await emitRetryObservability({\r\n attempt,\r\n maxRetries: this.maxRetries,\r\n delayMs,\r\n signal,\r\n error: fallbackError,\r\n status: fallbackStatus,\r\n });\r\n continue;\r\n }\r\n\r\n throw classifyAndWrapError(fallbackError, fallbackStatus);\r\n }\r\n }\r\n\r\n const status = (error as any)?.status as number | undefined;\r\n if (attempt <= this.maxRetries && shouldRetry(error, status)) {\r\n const retryAfterMs = parseRetryAfter((error as any)?.headers);\r\n const delayMs = getRetryDelay(attempt, retryAfterMs);\r\n await emitRetryObservability({\r\n attempt,\r\n maxRetries: this.maxRetries,\r\n delayMs,\r\n signal,\r\n error,\r\n status,\r\n });\r\n continue;\r\n }\r\n\r\n throw classifyAndWrapError(error, status);\r\n }\r\n }\r\n\r\n throw new Error('OpenAI Responses API call failed after all retries');\r\n }\r\n\r\n private async createResponsesCompletion(\r\n compiled: ResponsesRequest,\r\n options?: { signal?: AbortSignal },\r\n ): Promise<LLMResponse> {\r\n const response = await this.client.responses.create(compiled as any, { signal: options?.signal } as any);\r\n const parsedSnapshot = parseOpenAIResponsesSnapshot(response as ResponsesSnapshot);\r\n\r\n return {\r\n content: parsedSnapshot.content,\r\n ...(parsedSnapshot.toolCalls.length > 0 ? { toolCalls: parsedSnapshot.toolCalls } : {}),\r\n ...(parsedSnapshot.reasoning ? { reasoning: parsedSnapshot.reasoning } : {}),\r\n ...(parsedSnapshot.thinkingBlocks.length > 0 ? { thinkingBlocks: parsedSnapshot.thinkingBlocks } : {}),\r\n ...(parsedSnapshot.usage ? { usage: parsedSnapshot.usage } : {}),\r\n stopReason: parsedSnapshot.stopReason,\r\n };\r\n }\r\n}\r\n\r\nexport interface CompileOpenAIResponsesOptions {\r\n modelName?: string;\r\n maxTokens?: number;\r\n thinkingEffort?: ThinkingEffort;\r\n thinkingBudgetTokens?: number;\r\n providerOptions?: Record<string, unknown>;\r\n visionEnabled?: boolean;\r\n responsesProfile?: OpenAIResponsesProfile;\r\n}\r\n\r\nexport function compileContextForOpenAIResponses(\r\n messages: Message[],\r\n tools: Tool[],\r\n options: CompileOpenAIResponsesOptions = {},\r\n): ResponsesRequest {\r\n const input: any[] = [];\r\n const responsesProfile = options.responsesProfile ?? 'standard';\r\n const codexInstructionParts: string[] = [];\r\n let reachedConversation = false;\r\n\r\n for (const message of messages) {\r\n if (!message) continue;\r\n\r\n if (message.role === 'system') {\r\n if (responsesProfile === 'codex' && !reachedConversation && !message.source) {\r\n const instruction = String(message.content ?? '').trim();\r\n if (instruction) codexInstructionParts.push(instruction);\r\n continue;\r\n }\r\n\r\n input.push({\r\n type: 'message',\r\n // ChatGPT's Codex endpoint only accepts the stable, leading system\r\n // identity through `instructions`. Runtime reminders can be injected\r\n // after the conversation starts without a `source` marker, so every\r\n // remaining system message must be replayed as user input.\r\n role: responsesProfile === 'codex' ? 'user' : 'system',\r\n content: [\r\n {\r\n type: 'input_text',\r\n text: String(message.content ?? ''),\r\n },\r\n ],\r\n });\r\n if (responsesProfile === 'codex') reachedConversation = true;\r\n continue;\r\n }\r\n\r\n reachedConversation = true;\r\n\r\n if (message.role === 'user') {\r\n const visionEnabled = options.visionEnabled ?? false;\r\n let textContent = String(message.content ?? '');\r\n\r\n // 处理图片\r\n if (message.images && message.images.length > 0) {\r\n if (visionEnabled) {\r\n // 视觉模式:生成 input_image 内容块\r\n const contentParts: any[] = [\r\n { type: 'input_text', text: textContent },\r\n ];\r\n for (const img of message.images) {\r\n const url = resolveImageDataUri(img) || img.source;\r\n if (url) {\r\n contentParts.push({ type: 'input_image', image_url: url, detail: 'auto' });\r\n }\r\n }\r\n input.push({ type: 'message', role: 'user', content: contentParts });\r\n continue;\r\n }\r\n // 非视觉模式:降级为文字占位符\r\n const placeholders = message.images\r\n .map(img => `【Image】${img.source || '(inline image)'}`)\r\n .join('\\n');\r\n textContent = `${textContent}\\n${placeholders}`;\r\n }\r\n\r\n input.push({\r\n type: 'message',\r\n role: 'user',\r\n content: [{ type: 'input_text', text: textContent }],\r\n });\r\n continue;\r\n }\r\n\r\n if (message.role === 'assistant') {\r\n const assistantItems = compileAssistantMessageToResponsesItems(message, responsesProfile);\r\n input.push(...assistantItems);\r\n continue;\r\n }\r\n\r\n if (message.role === 'tool') {\r\n if (!message.toolCallId) {\r\n throw new Error('OpenAI Responses compilation requires tool messages to include toolCallId');\r\n }\r\n input.push({\r\n type: 'function_call_output',\r\n call_id: message.toolCallId,\r\n output: String(message.content ?? ''),\r\n });\r\n // tool 消息附带图片:保守策略——追加一条 user 消息携带图片\r\n if (message.images && message.images.length > 0) {\r\n const visionEnabled = options.visionEnabled ?? false;\r\n if (visionEnabled) {\r\n const contentParts: any[] = [\r\n { type: 'input_text', text: `[Tool image result for ${message.toolCallId}]` },\r\n ];\r\n for (const img of message.images) {\r\n const url = resolveImageDataUri(img) || img.source;\r\n if (url) {\r\n contentParts.push({ type: 'input_image', image_url: url, detail: 'auto' });\r\n }\r\n }\r\n input.push({ type: 'message', role: 'user', content: contentParts });\r\n } else {\r\n const placeholders = message.images\r\n .map(img => `【Image】${img.source || '(inline image)'}`)\r\n .join('\\n');\r\n input.push({\r\n type: 'message',\r\n role: 'user',\r\n content: [{ type: 'input_text', text: `[Tool image placeholders]\\n${placeholders}` }],\r\n });\r\n }\r\n }\r\n continue;\r\n }\r\n\r\n input.push({\r\n type: 'message',\r\n role: 'user',\r\n content: [\r\n {\r\n type: 'input_text',\r\n text: String(message.content ?? ''),\r\n },\r\n ],\r\n });\r\n }\r\n\r\n const compiledTools = tools.length > 0\r\n ? tools.map((tool) => ({\r\n type: 'function',\r\n name: tool.name,\r\n description: tool.description,\r\n parameters: normalizeToolParameters(tool.parameters),\r\n strict: false,\r\n }))\r\n : undefined;\r\n\r\n const request: ResponsesRequest = {\r\n model: options.modelName || 'gpt-4o',\r\n input,\r\n ...(compiledTools ? { tools: compiledTools } : {}),\r\n ...(responsesProfile !== 'codex'\r\n && typeof options.maxTokens === 'number'\r\n && Number.isFinite(options.maxTokens)\r\n && options.maxTokens > 0\r\n ? { max_output_tokens: options.maxTokens }\r\n : {}),\r\n ...(tools.length > 0\r\n ? {\r\n parallel_tool_calls: true,\r\n ...(responsesProfile === 'codex' ? { tool_choice: 'auto' as const } : {}),\r\n }\r\n : {}),\r\n ...(options.thinkingEffort && OPENAI_THINKING_EFFORTS.includes(options.thinkingEffort)\r\n ? {\r\n reasoning: {\r\n effort: options.thinkingEffort,\r\n summary: 'auto',\r\n },\r\n }\r\n : typeof options.thinkingBudgetTokens === 'number' && options.thinkingBudgetTokens > 0\r\n ? {\r\n reasoning: {\r\n effort: mapThinkingBudgetToEffort(options.thinkingBudgetTokens),\r\n summary: 'auto',\r\n },\r\n }\r\n : {}),\r\n ...(options.providerOptions ?? {}),\r\n };\r\n\r\n if (responsesProfile === 'codex') {\r\n // ChatGPT's Codex endpoint uses a stricter Responses contract than the\r\n // public API. Keep these fields runtime-owned so generic provider options\r\n // cannot accidentally turn a valid OAuth request back into a 400.\r\n request.model = options.modelName || 'gpt-4o';\r\n request.instructions = codexInstructionParts.join('\\n\\n').trim() || DEFAULT_CODEX_INSTRUCTIONS;\r\n request.input = input;\r\n request.store = false;\r\n }\r\n\r\n return request;\r\n}\r\n\r\nfunction compileAssistantMessageToResponsesItems(\r\n message: Message,\r\n responsesProfile: OpenAIResponsesProfile,\r\n): any[] {\r\n const items: any[] = [];\r\n const reasoningParts: string[] = [];\r\n\r\n if (typeof message.reasoning === 'string' && message.reasoning.trim()) {\r\n reasoningParts.push(message.reasoning.trim());\r\n }\r\n\r\n if (Array.isArray(message.thinkingBlocks)) {\r\n for (const block of message.thinkingBlocks) {\r\n if (block?.thinking?.trim()) {\r\n reasoningParts.push(block.thinking.trim());\r\n }\r\n }\r\n }\r\n\r\n // Codex reasoning summaries are output-only display data. Without the\r\n // server-issued encrypted_content they cannot be replayed as input items;\r\n // synthetic id/status fields cause a 400 on the next turn.\r\n if (reasoningParts.length > 0 && responsesProfile !== 'codex') {\r\n items.push({\r\n type: 'reasoning',\r\n id: `reasoning-${items.length}`,\r\n summary: reasoningParts.map((text) => ({\r\n type: 'summary_text',\r\n text,\r\n })),\r\n status: 'completed',\r\n });\r\n }\r\n\r\n if (typeof message.content === 'string' && message.content.trim()) {\r\n items.push({\r\n type: 'message',\r\n role: 'assistant',\r\n content: [\r\n {\r\n type: 'output_text',\r\n text: message.content,\r\n ...(responsesProfile === 'standard' ? { annotations: [] } : {}),\r\n },\r\n ],\r\n });\r\n }\r\n\r\n if (Array.isArray(message.toolCalls)) {\r\n for (const toolCall of message.toolCalls) {\r\n items.push({\r\n type: 'function_call',\r\n call_id: toolCall.id,\r\n name: toolCall.name,\r\n arguments: JSON.stringify(toolCall.arguments ?? {}),\r\n });\r\n }\r\n }\r\n\r\n if (items.length === 0 && responsesProfile === 'standard') {\r\n items.push({\r\n type: 'message',\r\n role: 'assistant',\r\n content: [],\r\n });\r\n }\r\n\r\n return items;\r\n}\r\n\r\nfunction parseOpenAIResponsesSnapshot(snapshot: ResponsesSnapshot): {\r\n content: string;\r\n toolCalls: ToolCall[];\r\n reasoning?: string;\r\n thinkingBlocks: ThinkingBlock[];\r\n usage?: UsageInfo;\r\n stopReason: string | null;\r\n} {\r\n const output = Array.isArray(snapshot?.output) ? snapshot.output : [];\r\n const contentParts: string[] = [];\r\n const reasoningParts: string[] = [];\r\n const toolCalls: ToolCall[] = [];\r\n const thinkingBlocks: ThinkingBlock[] = [];\r\n\r\n for (const item of output) {\r\n if (!item || typeof item !== 'object') continue;\r\n\r\n if (item.type === 'message' && Array.isArray(item.content)) {\r\n for (const part of item.content) {\r\n if (part?.type === 'output_text' && typeof part.text === 'string') {\r\n contentParts.push(part.text);\r\n }\r\n }\r\n continue;\r\n }\r\n\r\n if (item.type === 'function_call') {\r\n toolCalls.push({\r\n id: String(item.call_id || item.id || ''),\r\n name: String(item.name || ''),\r\n arguments: parseToolArguments(String(item.arguments || ''), item.name),\r\n });\r\n continue;\r\n }\r\n\r\n if (item.type === 'reasoning') {\r\n const summaryText = Array.isArray(item.summary)\r\n ? item.summary.map((part: any) => String(part?.text || '')).filter(Boolean).join('\\n').trim()\r\n : '';\r\n if (summaryText) {\r\n reasoningParts.push(summaryText);\r\n thinkingBlocks.push({\r\n signature: String(item.id || ''),\r\n thinking: summaryText,\r\n });\r\n }\r\n }\r\n }\r\n\r\n const usage = snapshot.usage\r\n ? {\r\n inputTokens: Number(snapshot.usage.input_tokens || 0),\r\n outputTokens: Number(snapshot.usage.output_tokens || 0),\r\n totalTokens: Number(snapshot.usage.total_tokens || 0),\r\n ...(Number(snapshot.usage.input_tokens_details?.cached_tokens || 0) > 0\r\n ? { cacheReadTokens: Number(snapshot.usage.input_tokens_details?.cached_tokens || 0) }\r\n : {}),\r\n ...(Number(snapshot.usage.output_tokens_details?.reasoning_tokens || 0) > 0\r\n ? { reasoningTokens: Number(snapshot.usage.output_tokens_details?.reasoning_tokens || 0) }\r\n : {}),\r\n }\r\n : undefined;\r\n\r\n const content = typeof snapshot.output_text === 'string' && snapshot.output_text.trim()\r\n ? snapshot.output_text\r\n : contentParts.join('');\r\n\r\n return {\r\n content,\r\n toolCalls,\r\n ...(reasoningParts.length > 0 ? { reasoning: reasoningParts.join('\\n') } : {}),\r\n thinkingBlocks,\r\n ...(usage ? { usage } : {}),\r\n stopReason: mapResponseStatusToStopReason(snapshot),\r\n };\r\n}\r\n\r\nfunction finalizeToolCalls(functionCalls: Map<string, AccumulatedFunctionCall>): ToolCall[] {\r\n return Array.from(functionCalls.values())\r\n .map((call) => ({\r\n id: call.call_id || call.name || `tool-${Math.random().toString(36).slice(2, 8)}`,\r\n name: call.name,\r\n arguments: parseToolArguments(call.arguments, call.name),\r\n }))\r\n .filter((call) => Boolean(call.name));\r\n}\r\n\r\nfunction finalizeThinkingBlocks(reasoningItems: Map<string, AccumulatedReasoning>): ThinkingBlock[] {\r\n return Array.from(reasoningItems.values())\r\n .map((item) => ({\r\n signature: item.id,\r\n thinking: item.summary.join('\\n').trim(),\r\n }))\r\n .filter((block) => Boolean(block.signature) && Boolean(block.thinking));\r\n}\r\n\r\nfunction recordReasoningItem(\r\n reasoningItems: Map<string, AccumulatedReasoning>,\r\n item: { id?: string; summary?: Array<{ text?: string }> },\r\n): void {\r\n const id = String(item?.id || '');\r\n if (!id) return;\r\n const summary = Array.isArray(item.summary)\r\n ? item.summary.map((part) => String(part?.text || '')).filter(Boolean)\r\n : [];\r\n if (!reasoningItems.has(id)) {\r\n reasoningItems.set(id, { id, summary: [] });\r\n }\r\n const entry = reasoningItems.get(id)!;\r\n if (summary.length > 0) {\r\n entry.summary = summary;\r\n }\r\n}\r\n\r\nfunction extractTextDelta(delta: unknown): string {\r\n if (typeof delta === 'string') return delta;\r\n if (delta && typeof delta === 'object' && 'text' in delta && typeof (delta as any).text === 'string') {\r\n return (delta as any).text;\r\n }\r\n return '';\r\n}\r\n\r\nfunction extractOutputMessageText(item: any): string {\r\n if (!Array.isArray(item?.content)) return '';\r\n return item.content\r\n .filter((part: any) => part?.type === 'output_text' && typeof part.text === 'string')\r\n .map((part: any) => part.text)\r\n .join('');\r\n}\r\n\r\nfunction mapThinkingBudgetToEffort(thinkingBudgetTokens: number): 'low' | 'medium' | 'high' {\r\n if (thinkingBudgetTokens >= 100000) return 'high';\r\n if (thinkingBudgetTokens >= 10000) return 'medium';\r\n return 'low';\r\n}\r\n\r\nfunction normalizeToolParameters(parameters: Record<string, any> | undefined): Record<string, unknown> {\r\n if (!parameters || typeof parameters !== 'object') {\r\n return { type: 'object', properties: {} };\r\n }\r\n return sanitizeToolSchema(parameters);\r\n}\r\n\r\nfunction parseToolArguments(raw: string, toolName?: string): Record<string, any> {\r\n const trimmed = String(raw || '').trim();\r\n if (!trimmed) return {};\r\n try {\r\n const parsed = JSON.parse(trimmed);\r\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\r\n return parsed as Record<string, any>;\r\n }\r\n } catch {\r\n // fall through\r\n }\r\n\r\n console.warn(\r\n `[OpenAI Responses] Failed to parse tool arguments${toolName ? ` for tool \"${toolName}\"` : ''}. ` +\r\n `Input length: ${trimmed.length}, preview: ${trimmed.slice(0, 200)}`,\r\n );\r\n return {};\r\n}\r\n\r\nfunction isEmptyResponsesStreamError(error: unknown): boolean {\r\n return error instanceof Error && /request ended without sending any events/i.test(error.message);\r\n}\r\n\r\nfunction mapResponseStatusToStopReason(snapshot: ResponsesSnapshot | null): string | null {\r\n if (!snapshot) return null;\r\n if (snapshot.status === 'incomplete') {\r\n const reason = snapshot.incomplete_details?.reason || 'incomplete';\r\n return reason === 'max_output_tokens' ? 'max_tokens' : reason;\r\n }\r\n if (snapshot.status === 'failed' || snapshot.status === 'cancelled') {\r\n return snapshot.status;\r\n }\r\n if (snapshot.status === 'completed') {\r\n if (Array.isArray(snapshot.output) && snapshot.output.some((item) => item?.type === 'function_call')) {\r\n return 'tool_calls';\r\n }\r\n return 'stop';\r\n }\r\n return snapshot.status || null;\r\n}\r\n\r\nexport function createOpenAIResponsesLLM(config: AgentConfigFile): OpenAIResponsesLLM;\r\nexport function createOpenAIResponsesLLM(modelConfig: ModelConfig): OpenAIResponsesLLM;\r\nexport function createOpenAIResponsesLLM(\r\n apiKey: string,\r\n modelName: string,\r\n baseUrl?: string,\r\n): OpenAIResponsesLLM;\r\nexport function createOpenAIResponsesLLM(\r\n configOrApiKey: AgentConfigFile | ModelConfig | string,\r\n modelName?: string,\r\n baseUrl?: string,\r\n): OpenAIResponsesLLM {\r\n if (typeof configOrApiKey === 'object' && 'defaultModel' in configOrApiKey) {\r\n return new OpenAIResponsesLLM(\r\n configOrApiKey.defaultModel.apiKey,\r\n configOrApiKey.defaultModel.model,\r\n configOrApiKey.defaultModel.baseUrl,\r\n configOrApiKey.defaultModel.maxTokens,\r\n configOrApiKey.defaultModel.thinkingEffort,\r\n configOrApiKey.defaultModel.thinkingBudgetTokens,\r\n configOrApiKey.defaultModel.providerOptions,\r\n configOrApiKey.defaultModel.customHeaders,\r\n configOrApiKey.defaultModel.vision ?? false,\r\n configOrApiKey.defaultModel.responsesProfile ?? 'standard',\r\n { maxRetries: configOrApiKey.defaultModel.maxRetries, timeoutMs: configOrApiKey.defaultModel.timeoutMs },\r\n );\r\n }\r\n\r\n if (typeof configOrApiKey === 'object') {\r\n return new OpenAIResponsesLLM(\r\n configOrApiKey.apiKey,\r\n configOrApiKey.model,\r\n configOrApiKey.baseUrl,\r\n configOrApiKey.maxTokens,\r\n configOrApiKey.thinkingEffort,\r\n configOrApiKey.thinkingBudgetTokens,\r\n configOrApiKey.providerOptions,\r\n configOrApiKey.customHeaders,\r\n configOrApiKey.vision ?? false,\r\n configOrApiKey.responsesProfile ?? 'standard',\r\n { maxRetries: configOrApiKey.maxRetries, timeoutMs: configOrApiKey.timeoutMs },\r\n );\r\n }\r\n\r\n return new OpenAIResponsesLLM(configOrApiKey, modelName!, baseUrl);\r\n}\r\n","import type { AgentConfigFile, ModelConfig } from '@agentdevjs/core';\r\nimport type { LLMClient } from '@agentdevjs/core';\r\nimport { createAnthropicLLM } from './anthropic.js';\r\nimport { createOpenAILLM } from './openai.js';\r\nimport { createOpenAIResponsesLLM } from './openai-responses.js';\r\n\r\nexport { AnthropicLLM, compileContextForAnthropic, createAnthropicLLM } from './anthropic.js';\r\nexport { OpenAILLM, createOpenAILLM, compileChatMessages } from './openai.js';\r\nexport { OpenAIResponsesLLM, compileContextForOpenAIResponses, createOpenAIResponsesLLM } from './openai-responses.js';\r\nexport { DEFAULT_MAX_RETRIES, getRetryDelay, parseRetryAfter, shouldRetry, sleep as retrySleep } from '@agentdevjs/core';\r\nexport { ClassifiedAPIError, classifyAPIError, classifyAndWrapError, extractConnectionErrorDetails, getUserFriendlyMessage } from '@agentdevjs/core';\r\nexport type { APIErrorType, ConnectionErrorDetails } from '@agentdevjs/core';\r\nexport { initHttpClient, getGlobalDispatcher } from './http-client.js';\r\n\r\nexport function createLLM(config: AgentConfigFile): LLMClient;\r\nexport function createLLM(modelConfig: ModelConfig): LLMClient;\r\nexport function createLLM(\r\n apiKey: string,\r\n modelName: string,\r\n provider?: string,\r\n baseUrl?: string,\r\n): LLMClient;\r\nexport function createLLM(\r\n configOrApiKey: AgentConfigFile | ModelConfig | string,\r\n modelName?: string,\r\n provider?: string,\r\n baseUrl?: string,\r\n): LLMClient {\r\n if (typeof configOrApiKey === 'string') {\r\n return provider === 'anthropic'\r\n ? createAnthropicLLM(configOrApiKey, modelName!, baseUrl)\r\n : createOpenAILLM(configOrApiKey, modelName!, baseUrl);\r\n }\r\n\r\n if ('defaultModel' in configOrApiKey) {\r\n switch (configOrApiKey.defaultModel.provider) {\r\n case 'anthropic':\r\n return createAnthropicLLM(configOrApiKey);\r\n case 'openai':\r\n return configOrApiKey.defaultModel.apiSurface === 'responses'\r\n ? createOpenAIResponsesLLM(configOrApiKey)\r\n : createOpenAILLM(configOrApiKey);\r\n default:\r\n return createOpenAILLM(configOrApiKey);\r\n }\r\n }\r\n\r\n switch (configOrApiKey.provider) {\r\n case 'anthropic':\r\n return createAnthropicLLM(configOrApiKey);\r\n case 'openai':\r\n return configOrApiKey.apiSurface === 'responses'\r\n ? createOpenAIResponsesLLM(configOrApiKey)\r\n : createOpenAILLM(configOrApiKey);\r\n default:\r\n return createOpenAILLM(configOrApiKey);\r\n }\r\n}\r\n"],"mappings":"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","names":["sleep","getRetryDelay","parseRetryAfter","shouldRetry","resolveModelCallPolicy","withDeadline","classifyAndWrapError","httpClientInitPromise","ensureHttpClientInitialized","resolveModelCallPolicy","withDeadline","shouldRetry","parseRetryAfter","getRetryDelay","classifyAndWrapError","OpenAI","OPENAI_THINKING_EFFORTS","getRetryDelay","parseRetryAfter","shouldRetry","resolveModelCallPolicy","withDeadline","classifyAndWrapError","httpClientInitPromise","ensureHttpClientInitialized","resolveModelCallPolicy","OpenAI","withDeadline","finalizeToolCalls","finalizeThinkingBlocks","shouldRetry","parseRetryAfter","getRetryDelay","classifyAndWrapError","OPENAI_THINKING_EFFORTS","getRetryDelay","parseRetryAfter","shouldRetry","classifyAPIError","classifyAndWrapError"]}
package/package.json CHANGED
@@ -1,52 +1,52 @@
1
- {
2
- "name": "@agentdevjs/llm",
3
- "version": "0.1.0",
4
- "description": "AgentDev LLM adapters: AnthropicLLM / OpenAILLM / OpenAIResponsesLLM / createLLM / message compilation",
5
- "type": "module",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./dist/index.d.ts",
11
- "import": "./dist/index.js"
12
- }
13
- },
14
- "files": [
15
- "dist",
16
- "README.md"
17
- ],
18
- "scripts": {
19
- "build": "tsup",
20
- "dev": "tsup --watch",
21
- "test": "vitest run",
22
- "test:watch": "vitest",
23
- "typecheck": "tsc --noEmit",
24
- "prepublishOnly": "npm run build"
25
- },
26
- "dependencies": {
27
- "@agentdevjs/core": "^0.1.0",
28
- "openai": "^4.73.0",
29
- "undici": "^7.25.0"
30
- },
31
- "devDependencies": {
32
- "@types/node": "^20.11.0",
33
- "tsup": "^8.3.5",
34
- "tsx": "^4.7.0",
35
- "typescript": "^5.3.3",
36
- "vitest": "^4.1.10"
37
- },
38
- "engines": {
39
- "node": ">=18.0.0"
40
- },
41
- "keywords": [
42
- "agentdev",
43
- "llm",
44
- "anthropic",
45
- "openai"
46
- ],
47
- "repository": {
48
- "type": "git",
49
- "url": "git+https://github.com/your-org/agentdev.git"
50
- },
51
- "license": "MIT"
52
- }
1
+ {
2
+ "name": "@agentdevjs/llm",
3
+ "version": "0.1.1",
4
+ "description": "AgentDev LLM adapters: AnthropicLLM / OpenAILLM / OpenAIResponsesLLM / createLLM / message compilation",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsup",
20
+ "dev": "tsup --watch",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest",
23
+ "typecheck": "tsc --noEmit",
24
+ "prepublishOnly": "npm run build"
25
+ },
26
+ "dependencies": {
27
+ "@agentdevjs/core": "0.1.1",
28
+ "openai": "^4.73.0",
29
+ "undici": "^7.25.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^20.11.0",
33
+ "tsup": "^8.3.5",
34
+ "tsx": "^4.7.0",
35
+ "typescript": "^5.3.3",
36
+ "vitest": "^4.1.10"
37
+ },
38
+ "engines": {
39
+ "node": ">=18.0.0"
40
+ },
41
+ "keywords": [
42
+ "agentdev",
43
+ "llm",
44
+ "anthropic",
45
+ "openai"
46
+ ],
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "git+https://github.com/your-org/agentdev.git"
50
+ },
51
+ "license": "MIT"
52
+ }