@codehz/ai 0.4.2 → 0.4.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["mapper","mapper","mapper"],"sources":["../src/core/errors.ts","../src/core/validation.ts","../src/core/normalize.ts","../src/core/client.ts","../src/core/event-factory.ts","../src/core/merge-auxiliary.ts","../src/core/aggregator.ts","../src/core/collect-stream.ts","../src/helpers/mapping.ts","../src/helpers/auxiliary-collector.ts","../src/helpers/adapter-auxiliary.ts","../src/helpers/adapter-base.ts","../src/helpers/adapter-security.ts","../src/helpers/usage-mapping.ts","../src/helpers/synthetic-stream.ts","../src/helpers/incremental-stream-parser.ts","../src/helpers/provider-stream.ts","../src/helpers/request-mapper.ts","../src/adapters/responses.ts","../src/adapters/messages.ts","../src/adapters/chat-completions.ts","../src/adapters/ollama.ts","../src/adapters/mock.ts"],"sourcesContent":["/**\n * 公共错误模型\n *\n * 把失败、降级、断流三类情况明确区分:\n * - 致命错误 → 同步抛错或迭代器抛错\n * - 非致命差异 → warning 通道\n * - 流中断 → 不伪造 response.completed\n */\n\n// ── 错误类型 ──────────────────────────────────────────────────\n\nexport type ErrorCode =\n | \"INPUT_EMPTY\"\n | \"TEMPERATURE_OUT_OF_RANGE\"\n | \"MAX_OUTPUT_TOKENS_INVALID\"\n | \"TOOL_CHOICE_NO_TOOLS\"\n | \"TOOL_CHOICE_UNKNOWN_TOOL\"\n | \"PROVIDER_ERROR\"\n | \"AUTH_ERROR\"\n | \"STREAM_ERROR\"\n | \"MAPPING_ERROR\"\n | \"STREAM_INCOMPLETE\"\n | \"LOOKUP_FAILED\"\n | \"LOOKUP_TIMEOUT\"\n | string;\n\nexport class AIError extends Error {\n override readonly name: string;\n\n constructor(\n message: string,\n public readonly code: ErrorCode,\n name?: string,\n ) {\n super(message);\n this.name = name ?? \"AIError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 请求构造失败 — 参数校验不通过。在进入 adapter 前同步抛错。 */\nexport class AIRequestError extends AIError {\n constructor(\n message: string,\n code: ErrorCode,\n public readonly issues?: readonly { field: string; code: string; message: string }[],\n ) {\n super(message, code, \"AIRequestError\");\n }\n}\n\n/** Provider 调用失败 — HTTP 非 2xx、网络错误。由 AdapterBase 捕获转为 warning。 */\nexport class AIProviderError extends AIError {\n constructor(\n message: string,\n code: ErrorCode,\n public readonly statusCode?: number,\n public readonly responseBody?: string,\n ) {\n super(message, code, \"AIProviderError\");\n }\n}\n\n/** 流协议损坏 — SSE 解析失败、chunk 格式异常。 */\nexport class AIStreamError extends AIError {\n constructor(message: string, code: ErrorCode) {\n super(message, code, \"AIStreamError\");\n }\n}\n\n/** Canonical 映射失败 — 无法将 provider 响应映射到 canonical 类型。 */\nexport class AIMappingError extends AIError {\n constructor(message: string, code: ErrorCode) {\n super(message, code, \"AIMappingError\");\n }\n}\n\n// ── Warning 辅助 ──────────────────────────────────────────────\n\n/**\n * 标准 warning 代码列表。\n * 用于非致命差异的记录。\n */\nexport const WarningCode = {\n /** replay fidelity 低于预期 */\n REPLAY_FIDELITY_LOW: \"REPLAY_FIDELITY_LOW\",\n /** usage 字段缺失 */\n USAGE_MISSING: \"USAGE_MISSING\",\n /** billing 字段缺失 */\n BILLING_MISSING: \"BILLING_MISSING\",\n /** billing 只能给估算值 */\n BILLING_ESTIMATED: \"BILLING_ESTIMATED\",\n /** follow-up lookup 失败 */\n LOOKUP_FAILED: \"LOOKUP_FAILED\",\n /** lookup 超时 */\n LOOKUP_TIMEOUT: \"LOOKUP_TIMEOUT\",\n /** 流提前中断 */\n STREAM_INCOMPLETE: \"STREAM_INCOMPLETE\",\n /** 能力降级 */\n CAPABILITY_DOWNGRADE: \"CAPABILITY_DOWNGRADE\",\n /** 模拟流式 */\n SYNTHETIC_STREAM: \"SYNTHETIC_STREAM\",\n /** 工具调用以批量方式到达(非 token 级流式) */\n TOOL_CALL_BATCHED: \"TOOL_CALL_BATCHED\",\n} as const;\n","/**\n * 请求校验\n *\n * 在请求进入 adapter 前对参数合法性做基础检查。\n * 校验失败时抛 AIRequestError。\n */\n\nimport type { AIRequest } from \"../types/index.js\";\nimport { AIRequestError } from \"./errors.js\";\n\nexport type ValidationIssue = {\n field: string;\n code: string;\n message: string;\n};\n\nconst MESSAGE_ROLES = new Set([\"user\", \"assistant\"]);\nconst REASONING_VISIBILITIES = new Set([\"full\", \"summary\", \"redacted\", \"opaque\"]);\nconst TOOL_RESULT_OUTCOMES = new Set([\"success\", \"error\", \"rejected\"]);\nconst INCLUDE_MODES = new Set([\"off\", \"best_effort\"]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction pushIssue(issues: ValidationIssue[], field: string, code: string, message: string): void {\n issues.push({ field, code, message });\n}\n\nfunction validateContentBlock(block: unknown, field: string, issues: ValidationIssue[]): void {\n if (!isRecord(block) || typeof block.type !== \"string\") {\n pushIssue(issues, field, \"CONTENT_BLOCK_INVALID\", `${field} must be a valid ContentBlock`);\n return;\n }\n\n switch (block.type) {\n case \"text\":\n if (typeof block.text !== \"string\") {\n pushIssue(issues, field, \"CONTENT_BLOCK_INVALID\", `${field}.text must be a string`);\n }\n return;\n case \"json\":\n if (!(\"json\" in block)) {\n pushIssue(issues, field, \"CONTENT_BLOCK_INVALID\", `${field}.json must be present`);\n }\n return;\n case \"image\":\n if (typeof block.imageUrl !== \"string\" || block.imageUrl.length === 0) {\n pushIssue(issues, field, \"CONTENT_BLOCK_INVALID\", `${field}.imageUrl must be a non-empty string`);\n }\n return;\n case \"binary_ref\":\n if (typeof block.ref !== \"string\" || block.ref.length === 0) {\n pushIssue(issues, field, \"CONTENT_BLOCK_INVALID\", `${field}.ref must be a non-empty string`);\n }\n return;\n case \"opaque\":\n if (!(\"payload\" in block)) {\n pushIssue(issues, field, \"CONTENT_BLOCK_INVALID\", `${field}.payload must be present`);\n }\n return;\n default:\n pushIssue(issues, field, \"CONTENT_BLOCK_INVALID\", `${field}.type \"${block.type}\" is not supported`);\n }\n}\n\nfunction validateContentArray(content: unknown, field: string, issues: ValidationIssue[], code: string): void {\n if (!Array.isArray(content)) {\n pushIssue(issues, field, code, `${field} must be a ContentBlock[]`);\n return;\n }\n\n for (let i = 0; i < content.length; i++) {\n validateContentBlock(content[i], `${field}[${i}]`, issues);\n }\n}\n\nfunction validateInstructionArray(content: unknown, field: string, issues: ValidationIssue[]): void {\n if (!Array.isArray(content)) {\n pushIssue(issues, field, \"INSTRUCTIONS_INVALID\", `${field} must be an InstructionBlock[]`);\n return;\n }\n\n for (let i = 0; i < content.length; i++) {\n const block = content[i];\n const blockField = `${field}[${i}]`;\n validateContentBlock(block, blockField, issues);\n\n if (!isRecord(block) || typeof block.type !== \"string\") continue;\n if (block.type !== \"text\" && block.type !== \"json\") {\n pushIssue(issues, blockField, \"INSTRUCTIONS_INVALID\", `${blockField} only supports text/json blocks`);\n }\n }\n}\n\nfunction validateInputItem(item: unknown, field: string, issues: ValidationIssue[]): void {\n if (!isRecord(item)) {\n pushIssue(issues, field, \"INPUT_INVALID_ITEM\", `${field} must be a valid InputItem`);\n return;\n }\n\n if (typeof item.type !== \"string\") {\n pushIssue(issues, field, \"INPUT_ITEM_UNKNOWN_TYPE\", `${field}.type must be a supported InputItem type`);\n return;\n }\n\n switch (item.type) {\n case \"message\":\n if (typeof item.role !== \"string\" || !MESSAGE_ROLES.has(item.role)) {\n pushIssue(issues, `${field}.role`, \"MESSAGE_ROLE_INVALID\", `${field}.role must be a valid message role`);\n }\n validateContentArray(item.content, `${field}.content`, issues, \"MESSAGE_CONTENT_INVALID\");\n return;\n case \"reasoning\":\n if (typeof item.visibility !== \"string\" || !REASONING_VISIBILITIES.has(item.visibility)) {\n pushIssue(\n issues,\n `${field}.visibility`,\n \"REASONING_VISIBILITY_INVALID\",\n `${field}.visibility must be a valid reasoning visibility`,\n );\n }\n validateContentArray(item.content, `${field}.content`, issues, \"REASONING_CONTENT_INVALID\");\n return;\n case \"tool_call\":\n if (typeof item.id !== \"string\" || item.id.length === 0) {\n pushIssue(issues, `${field}.id`, \"TOOL_CALL_ID_INVALID\", `${field}.id must be a non-empty string`);\n }\n if (typeof item.name !== \"string\" || item.name.length === 0) {\n pushIssue(issues, `${field}.name`, \"TOOL_CALL_NAME_INVALID\", `${field}.name must be a non-empty string`);\n }\n if (typeof item.argumentsText !== \"string\") {\n pushIssue(\n issues,\n `${field}.argumentsText`,\n \"TOOL_CALL_ARGUMENTS_INVALID\",\n `${field}.argumentsText must be a string`,\n );\n } else {\n try {\n const parsed: unknown = JSON.parse(item.argumentsText);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n pushIssue(\n issues,\n `${field}.argumentsText`,\n \"TOOL_CALL_ARGUMENTS_INVALID\",\n `${field}.argumentsText must encode a JSON object`,\n );\n }\n } catch {\n pushIssue(\n issues,\n `${field}.argumentsText`,\n \"TOOL_CALL_ARGUMENTS_INVALID\",\n `${field}.argumentsText must encode a JSON object`,\n );\n }\n }\n return;\n case \"tool_result\":\n if (typeof item.callId !== \"string\" || item.callId.length === 0) {\n pushIssue(\n issues,\n `${field}.callId`,\n \"TOOL_RESULT_CALL_ID_INVALID\",\n `${field}.callId must be a non-empty string`,\n );\n }\n if (typeof item.toolName !== \"string\" || item.toolName.length === 0) {\n pushIssue(\n issues,\n `${field}.toolName`,\n \"TOOL_RESULT_NAME_INVALID\",\n `${field}.toolName must be a non-empty string`,\n );\n }\n if (typeof item.outcome !== \"string\" || !TOOL_RESULT_OUTCOMES.has(item.outcome)) {\n pushIssue(\n issues,\n `${field}.outcome`,\n \"TOOL_RESULT_OUTCOME_INVALID\",\n `${field}.outcome must be success, error, or rejected`,\n );\n }\n validateContentArray(item.content, `${field}.content`, issues, \"TOOL_RESULT_CONTENT_INVALID\");\n return;\n case \"opaque\":\n if (typeof item.source !== \"string\" || item.source.length === 0) {\n pushIssue(issues, `${field}.source`, \"OPAQUE_SOURCE_INVALID\", `${field}.source must be a non-empty string`);\n }\n if (typeof item.purpose !== \"string\" || item.purpose.length === 0) {\n pushIssue(issues, `${field}.purpose`, \"OPAQUE_PURPOSE_INVALID\", `${field}.purpose must be a non-empty string`);\n }\n return;\n default:\n pushIssue(issues, `${field}.type`, \"INPUT_ITEM_UNKNOWN_TYPE\", `${field}.type \"${item.type}\" is not supported`);\n }\n}\n\nfunction validateTools(tools: unknown, issues: ValidationIssue[]): void {\n if (tools === undefined) return;\n if (!Array.isArray(tools)) {\n pushIssue(issues, \"tools\", \"TOOLS_INVALID\", \"tools must be an array\");\n return;\n }\n\n const seenNames = new Set<string>();\n for (let i = 0; i < tools.length; i++) {\n const tool = tools[i];\n const field = `tools[${i}]`;\n if (!isRecord(tool)) {\n pushIssue(issues, field, \"TOOL_INVALID\", `${field} must be a valid ToolDefinition`);\n continue;\n }\n\n if (typeof tool.name !== \"string\" || tool.name.length === 0) {\n pushIssue(issues, `${field}.name`, \"TOOL_NAME_INVALID\", `${field}.name must be a non-empty string`);\n } else {\n if (seenNames.has(tool.name)) {\n pushIssue(issues, `${field}.name`, \"TOOLS_DUPLICATE_NAME\", `tool name \"${tool.name}\" is duplicated`);\n }\n seenNames.add(tool.name);\n }\n\n if (tool.description !== undefined && typeof tool.description !== \"string\") {\n pushIssue(issues, `${field}.description`, \"TOOL_DESCRIPTION_INVALID\", `${field}.description must be a string`);\n }\n\n if (!isRecord(tool.inputSchema)) {\n pushIssue(issues, `${field}.inputSchema`, \"TOOL_INPUT_SCHEMA_INVALID\", `${field}.inputSchema must be an object`);\n }\n }\n}\n\nfunction validateToolChoice(toolChoice: unknown, issues: ValidationIssue[]): void {\n if (toolChoice === undefined) return;\n if (toolChoice === \"auto\" || toolChoice === \"none\") return;\n if (\n !isRecord(toolChoice) ||\n toolChoice.type !== \"tool\" ||\n typeof toolChoice.name !== \"string\" ||\n toolChoice.name.length === 0\n ) {\n pushIssue(issues, \"toolChoice\", \"TOOL_CHOICE_INVALID\", 'toolChoice must be auto, none, or { type: \"tool\", name }');\n }\n}\n\n/** Validate include settings, appending issues to the given array. */\nexport function validateInclude(include: unknown, issues: ValidationIssue[]): void {\n if (!isRecord(include)) {\n pushIssue(issues, \"include\", \"INCLUDE_INVALID\", \"include must be an object\");\n return;\n }\n if (include.usage !== undefined && (typeof include.usage !== \"string\" || !INCLUDE_MODES.has(include.usage))) {\n pushIssue(issues, \"include.usage\", \"INCLUDE_USAGE_INVALID\", \"include.usage must be off or best_effort\");\n }\n if (include.billing !== undefined && (typeof include.billing !== \"string\" || !INCLUDE_MODES.has(include.billing))) {\n pushIssue(issues, \"include.billing\", \"INCLUDE_BILLING_INVALID\", \"include.billing must be off or best_effort\");\n }\n if (\n include.providerMetadata !== undefined &&\n (typeof include.providerMetadata !== \"string\" || !INCLUDE_MODES.has(include.providerMetadata))\n ) {\n pushIssue(\n issues,\n \"include.providerMetadata\",\n \"INCLUDE_PROVIDER_METADATA_INVALID\",\n \"include.providerMetadata must be off or best_effort\",\n );\n }\n}\n\n/**\n * 校验 AIRequest,返回校验问题列表。\n * 空数组表示无问题。\n */\nexport function validateRequest(request: AIRequest): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n if (request.instructions !== undefined) {\n if (typeof request.instructions === \"string\") {\n // no-op\n } else if (Array.isArray(request.instructions)) {\n validateInstructionArray(request.instructions, \"instructions\", issues);\n } else {\n pushIssue(issues, \"instructions\", \"INSTRUCTIONS_INVALID\", \"instructions must be a string or InstructionBlock[]\");\n }\n }\n\n // input 非空约束\n if (!Array.isArray(request.input) || request.input.length === 0) {\n pushIssue(issues, \"input\", \"INPUT_EMPTY\", \"input must be a non-empty array\");\n }\n\n // input 元素类型检查\n if (Array.isArray(request.input)) {\n for (let i = 0; i < request.input.length; i++) {\n validateInputItem(request.input[i], `input[${i}]`, issues);\n }\n }\n\n // temperature 范围\n if (request.temperature !== undefined) {\n if (typeof request.temperature !== \"number\" || !Number.isFinite(request.temperature)) {\n issues.push({\n field: \"temperature\",\n code: \"TEMPERATURE_NOT_NUMBER\",\n message: \"temperature must be a number\",\n });\n } else if (request.temperature < 0 || request.temperature > 2) {\n issues.push({\n field: \"temperature\",\n code: \"TEMPERATURE_OUT_OF_RANGE\",\n message: \"temperature must be between 0 and 2\",\n });\n }\n }\n\n // maxOutputTokens 合法性\n if (request.maxOutputTokens !== undefined) {\n if (typeof request.maxOutputTokens !== \"number\" || !Number.isFinite(request.maxOutputTokens)) {\n issues.push({\n field: \"maxOutputTokens\",\n code: \"MAX_OUTPUT_TOKENS_NOT_NUMBER\",\n message: \"maxOutputTokens must be a number\",\n });\n } else if (!Number.isInteger(request.maxOutputTokens) || request.maxOutputTokens < 1) {\n issues.push({\n field: \"maxOutputTokens\",\n code: \"MAX_OUTPUT_TOKENS_INVALID\",\n message: \"maxOutputTokens must be a positive integer\",\n });\n }\n }\n\n if (request.include !== undefined) {\n validateInclude(request.include, issues);\n }\n\n if (request.metadata !== undefined) {\n if (!isRecord(request.metadata)) {\n pushIssue(issues, \"metadata\", \"METADATA_INVALID\", \"metadata must be an object\");\n } else {\n for (const [key, value] of Object.entries(request.metadata)) {\n if (typeof value !== \"string\") {\n pushIssue(issues, `metadata.${key}`, \"METADATA_VALUE_INVALID\", `metadata.${key} must be a string`);\n }\n }\n }\n }\n\n validateTools(request.tools, issues);\n validateToolChoice(request.toolChoice, issues);\n\n // toolChoice 与 tools 的一致性\n if (\n request.toolChoice &&\n typeof request.toolChoice === \"object\" &&\n \"type\" in request.toolChoice &&\n request.toolChoice.type === \"tool\"\n ) {\n const chosenName = request.toolChoice.name;\n if (!request.tools || request.tools.length === 0) {\n issues.push({\n field: \"toolChoice\",\n code: \"TOOL_CHOICE_NO_TOOLS\",\n message: `toolChoice specifies tool \"${chosenName}\" but no tools are defined`,\n });\n } else if (!request.tools.some((t) => t.name === chosenName)) {\n issues.push({\n field: \"toolChoice\",\n code: \"TOOL_CHOICE_UNKNOWN_TOOL\",\n message: `toolChoice specifies tool \"${chosenName}\" which is not in tools array`,\n });\n }\n }\n\n return issues;\n}\n\n/**\n * 校验请求并抛出首个问题。\n * 适用于客户端入口的快速失败检查。\n */\nexport function assertValidRequest(request: AIRequest): void {\n const issues = validateRequest(request);\n const first = issues[0];\n if (first) {\n throw new AIRequestError(first.message, first.code, issues);\n }\n}\n","/**\n * 请求归一化\n *\n * 将 AIRequest + client 配置归一化为 NormalizedRequest,\n * 包括默认值合并、requestId 生成、include 默认值填充。\n */\n\nimport type { AIRequest, NormalizedRequest } from \"../types/index.js\";\nimport { assertValidRequest, validateInclude } from \"./validation.js\";\nimport { AIRequestError } from \"./errors.js\";\n\nexport type NormalizeOptions = {\n model: string;\n defaults?: Partial<AIRequest>;\n};\n\nconst DEFAULT_INCLUDE = {\n usage: \"best_effort\" as const,\n billing: \"best_effort\" as const,\n providerMetadata: \"best_effort\" as const,\n};\n\n/**\n * 归一化请求:\n * 1. 合并 defaults\n * 2. 填充 include 默认值\n * 3. 生成 requestId\n * 4. 校验请求合法性\n */\nexport function normalizeRequest(request: AIRequest, options: NormalizeOptions): NormalizedRequest {\n const { model, defaults } = options;\n\n // 在展开 include 前先校验,防止非法值被合并掩盖\n const earlyIncludeIssues: { field: string; code: string; message: string }[] = [];\n if (request.include !== undefined) {\n validateInclude(request.include, earlyIncludeIssues);\n }\n if (defaults?.include !== undefined) {\n validateInclude(defaults.include, earlyIncludeIssues);\n }\n const firstIncludeIssue = earlyIncludeIssues[0];\n if (firstIncludeIssue) {\n throw new AIRequestError(firstIncludeIssue.message, firstIncludeIssue.code, earlyIncludeIssues);\n }\n\n // 合并 defaults(浅合并,input/tools 由 request 完全覆盖)\n const merged: AIRequest = {\n ...defaults,\n ...request,\n include: {\n ...DEFAULT_INCLUDE,\n ...defaults?.include,\n ...request.include,\n },\n };\n\n // 校验\n assertValidRequest(merged);\n\n return {\n ...merged,\n model,\n requestId: crypto.randomUUID(),\n };\n}\n","/**\n * AI 客户端入口\n *\n * 打通 createAIClient() 到 adapter 调用之间的公共入口。\n */\n\nimport type { AIRequest, AIStreamEvent, AIClient, CreateAIClientOptions } from \"../types/index.js\";\nimport { normalizeRequest } from \"./normalize.js\";\n\nexport function createAIClient(options: CreateAIClientOptions): AIClient {\n const { adapter, model, defaults, signal: defaultSignal } = options;\n\n const client: AIClient = {\n stream(request: AIRequest): AsyncIterable<AIStreamEvent> {\n // 合并 client 级别的默认 signal 和请求级别的 signal\n const signal = mergeAbortSignals(defaultSignal, request.signal);\n const normalized = normalizeRequest({ ...request, signal }, { model, defaults });\n return adapter.stream(normalized);\n },\n };\n\n return client;\n}\n\n/**\n * 合并多个 AbortSignal:任一 signal abort 即触发。\n * 如果没有 signal 需要合并则返回 undefined。\n */\nfunction mergeAbortSignals(...signals: (AbortSignal | undefined)[]): AbortSignal | undefined {\n const valid = signals.filter((s): s is AbortSignal => s != null);\n if (valid.length === 0) return undefined;\n if (valid.length === 1) return valid[0];\n return AbortSignal.any(valid);\n}\n\nexport type { AIClient, CreateAIClientOptions } from \"../types/index.js\";\n","/**\n * 共享事件工厂\n *\n * 负责创建带有统一 sequence / timestamp / responseId / backend 的事件对象。\n * 每个 factory 实例管理一个单调递增的 sequence 计数器。\n */\n\nimport type {\n ResponseStartedEvent,\n ResponseWarningEvent,\n ResponseAuxiliaryEvent,\n ResponseCompletedEvent,\n MessageStartedEvent,\n MessageDeltaEvent,\n MessageCompletedEvent,\n ReasoningStartedEvent,\n ReasoningDeltaEvent,\n ReasoningCompletedEvent,\n ToolCallStartedEvent,\n ToolCallDeltaEvent,\n ToolCallCompletedEvent,\n ContentBlock,\n Usage,\n BillingInfo,\n AuxiliaryInfo,\n ReplayItem,\n StopReason,\n BackendTrace,\n OpaqueItem,\n ReasoningItem,\n} from \"../types/index.js\";\n\nexport type EventFactoryBackend = {\n kind: \"chat-completions\" | \"messages\" | \"responses\" | \"ollama\" | \"mock\";\n isSynthetic: boolean;\n};\n\nexport type EventFactoryState = {\n responseId: string;\n backend: EventFactoryBackend;\n};\n\nfunction timestamp(): string {\n return new Date().toISOString();\n}\n\nexport function createEventFactory(state: EventFactoryState) {\n let seq = 0;\n const warnings: string[] = [];\n\n function next(): number {\n return seq++;\n }\n\n function base(): Pick<ResponseStartedEvent, \"responseId\" | \"sequence\" | \"timestamp\" | \"backend\"> {\n return {\n responseId: state.responseId,\n sequence: next(),\n timestamp: timestamp(),\n backend: { ...state.backend },\n };\n }\n\n return {\n // ── 响应级事件 ──────────────────────────────────────────\n\n responseStarted(model: string): ResponseStartedEvent {\n return { ...base(), type: \"response.started\", model };\n },\n\n responseWarning(message: string, code?: string): ResponseWarningEvent {\n warnings.push(message);\n return { ...base(), type: \"response.warning\", message, code };\n },\n\n responseAuxiliary(data: {\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: Partial<AuxiliaryInfo>;\n }): ResponseAuxiliaryEvent {\n return { ...base(), type: \"response.auxiliary\", ...data };\n },\n\n responseCompleted(completion: {\n replay: ReplayItem[];\n stopReason?: StopReason;\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: AuxiliaryInfo;\n warnings?: string[];\n opaqueOutput?: OpaqueItem[];\n trace?: Partial<BackendTrace>;\n }): ResponseCompletedEvent {\n return { ...base(), type: \"response.completed\", ...completion };\n },\n\n // ── 消息流事件 ──────────────────────────────────────────\n\n messageStarted(id: string): MessageStartedEvent {\n return { ...base(), type: \"message.started\", item: { id, role: \"assistant\" } };\n },\n\n messageDelta(itemId: string, delta: ContentBlock): MessageDeltaEvent {\n return { ...base(), type: \"message.delta\", itemId, delta };\n },\n\n messageCompleted(itemId: string): MessageCompletedEvent {\n return { ...base(), type: \"message.completed\", itemId };\n },\n\n // ── 思维链流事件 ────────────────────────────────────────\n\n reasoningStarted(id: string, visibility: ReasoningItem[\"visibility\"]): ReasoningStartedEvent {\n return { ...base(), type: \"reasoning.started\", item: { id, visibility } };\n },\n\n reasoningDelta(itemId: string, delta: ContentBlock): ReasoningDeltaEvent {\n return { ...base(), type: \"reasoning.delta\", itemId, delta };\n },\n\n reasoningCompleted(itemId: string): ReasoningCompletedEvent {\n return { ...base(), type: \"reasoning.completed\", itemId };\n },\n\n // ── 工具调用流事件 ──────────────────────────────────────\n\n toolCallStarted(id: string, name: string): ToolCallStartedEvent {\n return { ...base(), type: \"tool_call.started\", item: { id, name } };\n },\n\n toolCallDelta(itemId: string, delta: { argumentsText?: string }): ToolCallDeltaEvent {\n return { ...base(), type: \"tool_call.delta\", itemId, delta };\n },\n\n toolCallCompleted(itemId: string): ToolCallCompletedEvent {\n return { ...base(), type: \"tool_call.completed\", itemId };\n },\n\n /** 返回当前已发出的 sequence 计数(用于断言) */\n get sequence(): number {\n return seq;\n },\n\n /** 返回当前已记录的 warning 副本。 */\n get warnings(): string[] {\n return [...warnings];\n },\n };\n}\n\nexport type EventFactory = ReturnType<typeof createEventFactory>;\n","import type { AuxiliaryInfo } from \"../types/index.js\";\n\nexport function mergeAuxiliary(\n base?: Partial<AuxiliaryInfo>,\n patch?: Partial<AuxiliaryInfo>,\n): AuxiliaryInfo | undefined {\n if (!base && !patch) return undefined;\n\n const merged: AuxiliaryInfo = {\n ...base,\n ...patch,\n };\n\n if (base?.providerMetadata || patch?.providerMetadata) {\n merged.providerMetadata = {\n ...base?.providerMetadata,\n ...patch?.providerMetadata,\n };\n }\n\n return merged;\n}\n","/**\n * 流聚合器\n *\n * 将 AIStreamEvent 序列聚合为统一的 AIResponse。\n *\n * 职责:\n * - 严格 item 状态机:started 创建 active item,delta 累积,completed 构建 OutputItem\n * - 校验:未 started 的 delta/completed、ID 重用、类型错配、response.completed 时 active items 非空\n * - 响应级 sequence/responseId/started/completed 校验\n * - usage/billing/auxiliary 仅来自 response.auxiliary\n * - warning 仅来自 response.warning\n * - 最终 AIResponse 由聚合器唯一构建\n *\n * 约束:\n * - replay 由 adapter 显式提供,聚合器不猜测\n * - 不伪造 reasoning\n * - 不解释 opaque payload\n */\n\nimport type {\n AIStreamEvent,\n AIResponse,\n MessageItem,\n ToolCallItem,\n OutputItem,\n Usage,\n BillingInfo,\n AuxiliaryInfo,\n BackendTrace,\n StopReason,\n ContentBlock,\n} from \"../types/index.js\";\nimport { AIStreamError } from \"./errors.js\";\nimport { mergeAuxiliary } from \"./merge-auxiliary.js\";\n\n// ── Active item types ─────────────────────────────────────────\n\ntype ActiveMessage = {\n type: \"message\";\n id: string;\n role: \"assistant\";\n content: ContentBlock[];\n};\n\ntype ActiveReasoning = {\n type: \"reasoning\";\n id: string;\n visibility: \"full\" | \"summary\" | \"redacted\" | \"opaque\";\n content: ContentBlock[];\n};\n\ntype ActiveToolCall = {\n type: \"tool_call\";\n id: string;\n name: string;\n argumentsText: string;\n};\n\ntype ActiveItem = ActiveMessage | ActiveReasoning | ActiveToolCall;\n\n// ── 聚合器状态 ────────────────────────────────────────────────\n\nexport interface AggregatorState {\n responseId?: string;\n model?: string;\n backendInfo?: { kind: BackendTrace[\"adapter\"]; isSynthetic: boolean };\n\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary: AuxiliaryInfo;\n warnings: string[];\n warningSet: Set<string>;\n output: OutputItem[];\n textParts: string[];\n toolCalls: ToolCallItem[];\n lastEventType?: AIStreamEvent[\"type\"];\n started: boolean;\n completed: boolean;\n nextSequence?: number;\n activeItems: Map<string, ActiveItem>;\n itemOrder: string[];\n completedItems: Map<string, OutputItem>;\n\n /** adapter 在 response.completed 中提供的 replay */\n replayFromAdapter?: import(\"../types/index.js\").ReplayItem[];\n stopReasonFromAdapter?: StopReason;\n backendFromAdapter?: Partial<BackendTrace>;\n}\n\nexport function createAggregatorState(): AggregatorState {\n return {\n auxiliary: {},\n warnings: [],\n warningSet: new Set(),\n output: [],\n textParts: [],\n toolCalls: [],\n started: false,\n completed: false,\n activeItems: new Map(),\n itemOrder: [],\n completedItems: new Map(),\n };\n}\n\n// ── Active item helpers ───────────────────────────────────────\n\nfunction getActiveItem(state: AggregatorState, itemId: string, expectedType: ActiveItem[\"type\"]): ActiveItem {\n const item = state.activeItems.get(itemId);\n if (!item) {\n throw streamProtocolError(`Received ${expectedType} delta/completed for unknown item: ${itemId}`);\n }\n if (item.type !== expectedType) {\n throw streamProtocolError(`Item ${itemId} started as ${item.type} but received ${expectedType} event`);\n }\n return item;\n}\n\nfunction coalesceContentBlocks(blocks: readonly ContentBlock[]): ContentBlock[] {\n const result: ContentBlock[] = [];\n for (const block of blocks) {\n const previous = result[result.length - 1];\n if (block.type === \"text\" && previous?.type === \"text\") {\n previous.text += block.text;\n } else {\n result.push({ ...block });\n }\n }\n return result;\n}\n\nfunction finalizeMessage(active: ActiveMessage): MessageItem {\n return {\n type: \"message\",\n id: active.id,\n role: active.role,\n content: coalesceContentBlocks(active.content),\n };\n}\n\nfunction finalizeReasoning(active: ActiveReasoning): import(\"../types/index.js\").ReasoningItem {\n return {\n type: \"reasoning\",\n id: active.id,\n visibility: active.visibility,\n content: coalesceContentBlocks(active.content),\n };\n}\n\nfunction finalizeToolCall(active: ActiveToolCall): ToolCallItem {\n return {\n type: \"tool_call\",\n id: active.id,\n name: active.name,\n argumentsText: active.argumentsText,\n };\n}\n\n// ── Event handlers ────────────────────────────────────────────\n\nfunction handleResponseStarted(state: AggregatorState, event: AIStreamEvent & { type: \"response.started\" }): void {\n if (state.started) {\n throw streamProtocolError(\"Stream must contain exactly one response.started event\");\n }\n state.started = true;\n state.responseId = event.responseId;\n state.model = event.model;\n state.backendInfo = event.backend;\n}\n\nfunction handleResponseWarning(state: AggregatorState, event: AIStreamEvent & { type: \"response.warning\" }): void {\n pushWarnings(state, [event.message]);\n}\n\nfunction handleResponseAuxiliary(state: AggregatorState, event: AIStreamEvent & { type: \"response.auxiliary\" }): void {\n if (event.usage) {\n state.usage = { ...state.usage, ...event.usage };\n }\n if (event.billing) {\n state.billing = { ...state.billing, ...event.billing };\n }\n if (event.auxiliary) {\n state.auxiliary = mergeAuxiliary(state.auxiliary, event.auxiliary) ?? {};\n }\n}\n\nfunction handleMessageStarted(state: AggregatorState, event: AIStreamEvent & { type: \"message.started\" }): void {\n const id = event.item.id;\n if (state.activeItems.has(id)) {\n throw streamProtocolError(`Item with id ${id} is already active`);\n }\n state.activeItems.set(id, {\n type: \"message\",\n id,\n role: event.item.role,\n content: [],\n });\n state.itemOrder.push(id);\n}\n\nfunction handleMessageDelta(state: AggregatorState, event: AIStreamEvent & { type: \"message.delta\" }): void {\n const active = getActiveItem(state, event.itemId, \"message\") as ActiveMessage;\n active.content.push(event.delta);\n}\n\nfunction handleMessageCompleted(state: AggregatorState, event: AIStreamEvent & { type: \"message.completed\" }): void {\n const active = getActiveItem(state, event.itemId, \"message\") as ActiveMessage;\n state.activeItems.delete(event.itemId);\n const item = finalizeMessage(active);\n state.completedItems.set(event.itemId, item);\n pushMessageText(state, item);\n}\n\nfunction handleReasoningStarted(state: AggregatorState, event: AIStreamEvent & { type: \"reasoning.started\" }): void {\n const id = event.item.id;\n if (state.activeItems.has(id)) {\n throw streamProtocolError(`Item with id ${id} is already active`);\n }\n state.activeItems.set(id, {\n type: \"reasoning\",\n id,\n visibility: event.item.visibility,\n content: [],\n });\n state.itemOrder.push(id);\n}\n\nfunction handleReasoningDelta(state: AggregatorState, event: AIStreamEvent & { type: \"reasoning.delta\" }): void {\n const active = getActiveItem(state, event.itemId, \"reasoning\") as ActiveReasoning;\n active.content.push(event.delta);\n}\n\nfunction handleReasoningCompleted(\n state: AggregatorState,\n event: AIStreamEvent & { type: \"reasoning.completed\" },\n): void {\n const active = getActiveItem(state, event.itemId, \"reasoning\") as ActiveReasoning;\n state.activeItems.delete(event.itemId);\n state.completedItems.set(event.itemId, finalizeReasoning(active));\n}\n\nfunction handleToolCallStarted(state: AggregatorState, event: AIStreamEvent & { type: \"tool_call.started\" }): void {\n const id = event.item.id;\n if (state.activeItems.has(id)) {\n throw streamProtocolError(`Item with id ${id} is already active`);\n }\n state.activeItems.set(id, {\n type: \"tool_call\",\n id,\n name: event.item.name,\n argumentsText: \"\",\n });\n state.itemOrder.push(id);\n}\n\nfunction handleToolCallDelta(state: AggregatorState, event: AIStreamEvent & { type: \"tool_call.delta\" }): void {\n const active = getActiveItem(state, event.itemId, \"tool_call\") as ActiveToolCall;\n if (event.delta.argumentsText) {\n active.argumentsText += event.delta.argumentsText;\n }\n}\n\nfunction handleToolCallCompleted(state: AggregatorState, event: AIStreamEvent & { type: \"tool_call.completed\" }): void {\n const active = getActiveItem(state, event.itemId, \"tool_call\") as ActiveToolCall;\n state.activeItems.delete(event.itemId);\n const item = finalizeToolCall(active);\n state.completedItems.set(event.itemId, item);\n state.toolCalls.push(item);\n}\n\nfunction handleResponseCompleted(state: AggregatorState, event: AIStreamEvent & { type: \"response.completed\" }): void {\n if (state.activeItems.size > 0) {\n throw streamProtocolError(\"response.completed received while active items still pending\");\n }\n state.completed = true;\n state.replayFromAdapter = event.replay;\n state.stopReasonFromAdapter = event.stopReason;\n state.backendFromAdapter = event.trace;\n if (event.usage) state.usage = { ...state.usage, ...event.usage };\n if (event.billing) state.billing = { ...state.billing, ...event.billing };\n if (event.auxiliary) state.auxiliary = mergeAuxiliary(state.auxiliary, event.auxiliary) ?? {};\n if (event.warnings) pushWarnings(state, event.warnings);\n if (event.opaqueOutput) state.output.push(...event.opaqueOutput);\n}\n\n// ── 从聚合状态构建最终 AIResponse ─────────────────────────────\n\nfunction buildResponse(state: AggregatorState): AIResponse {\n const backendFromCompleted = state.backendFromAdapter;\n const backend: BackendTrace = {\n adapter: backendFromCompleted?.adapter ?? state.backendInfo?.kind ?? (\"unknown\" as BackendTrace[\"adapter\"]),\n isSyntheticStream: backendFromCompleted?.isSyntheticStream ?? state.backendInfo?.isSynthetic ?? false,\n requestId: backendFromCompleted?.requestId ?? state.responseId,\n rawResponseId: backendFromCompleted?.rawResponseId,\n metadataSources: backendFromCompleted?.metadataSources,\n warnings: backendFromCompleted?.warnings,\n };\n const orderedOutput = state.itemOrder.map((id) => {\n const item = state.completedItems.get(id);\n if (!item) {\n throw streamProtocolError(`Item ${id} was started but not completed`);\n }\n return item;\n });\n\n return {\n id: state.responseId,\n output: [...orderedOutput, ...state.output],\n replay: state.replayFromAdapter ?? [],\n text: state.textParts.join(\"\"),\n toolCalls: state.toolCalls,\n stopReason: state.stopReasonFromAdapter,\n usage: state.usage,\n billing: state.billing,\n auxiliary: state.auxiliary,\n warnings: state.warnings.length > 0 ? state.warnings : undefined,\n backend,\n };\n}\n\n// ── 公开 API ──────────────────────────────────────────────────\n\n/**\n * 将事件数组聚合为 AIResponse。\n * 适用于测试和离线处理场景。\n */\nexport function aggregateEvents(events: readonly AIStreamEvent[]): AIResponse {\n const state = createAggregatorState();\n for (const event of events) {\n aggregateEvent(state, event);\n }\n return finalizeAggregation(state);\n}\n\nexport function aggregateEvent(state: AggregatorState, event: AIStreamEvent): void {\n validateEventEnvelope(state, event);\n state.lastEventType = event.type;\n\n switch (event.type) {\n case \"response.started\":\n handleResponseStarted(state, event);\n break;\n case \"response.warning\":\n handleResponseWarning(state, event);\n break;\n case \"response.auxiliary\":\n handleResponseAuxiliary(state, event);\n break;\n case \"message.started\":\n handleMessageStarted(state, event);\n break;\n case \"message.delta\":\n handleMessageDelta(state, event);\n break;\n case \"message.completed\":\n handleMessageCompleted(state, event);\n break;\n case \"reasoning.started\":\n handleReasoningStarted(state, event);\n break;\n case \"reasoning.delta\":\n handleReasoningDelta(state, event);\n break;\n case \"reasoning.completed\":\n handleReasoningCompleted(state, event);\n break;\n case \"tool_call.started\":\n handleToolCallStarted(state, event);\n break;\n case \"tool_call.delta\":\n handleToolCallDelta(state, event);\n break;\n case \"tool_call.completed\":\n handleToolCallCompleted(state, event);\n break;\n case \"response.completed\":\n handleResponseCompleted(state, event);\n break;\n }\n}\n\nexport function finalizeAggregation(state: AggregatorState): AIResponse {\n if (!state.started) {\n throw streamProtocolError(\"Stream must start with response.started event\");\n }\n if (!state.completed || state.lastEventType !== \"response.completed\") {\n throw streamProtocolError(\"Stream must end with response.completed event to produce a valid AIResponse\");\n }\n\n return buildResponse(state);\n}\n\nfunction pushWarnings(state: AggregatorState, warnings: readonly string[]): void {\n for (const warning of warnings) {\n if (!state.warningSet.has(warning)) {\n state.warningSet.add(warning);\n state.warnings.push(warning);\n }\n }\n}\n\nfunction pushMessageText(state: AggregatorState, item: MessageItem): void {\n for (const block of item.content) {\n if (block.type === \"text\") {\n state.textParts.push(block.text);\n }\n }\n}\n\nfunction validateEventEnvelope(state: AggregatorState, event: AIStreamEvent): void {\n if (state.completed) {\n throw streamProtocolError(\"response.completed must be the final stream event\");\n }\n if (!state.started && event.type !== \"response.started\") {\n throw streamProtocolError(\"Stream must start with response.started event\");\n }\n if (state.responseId !== undefined && event.responseId !== state.responseId) {\n throw streamProtocolError(\"All stream events must use the same responseId\");\n }\n if (state.nextSequence !== undefined && event.sequence !== state.nextSequence) {\n throw streamProtocolError(`Expected event sequence ${state.nextSequence}, received ${event.sequence}`);\n }\n state.nextSequence = event.sequence + 1;\n}\n\nfunction streamProtocolError(message: string): AIStreamError {\n return new AIStreamError(message, \"STREAM_PROTOCOL_ERROR\");\n}\n","/**\n * collectStream — 流收集 helper\n *\n * 将 AsyncIterable<AIStreamEvent> 消费完毕并聚合力 AIResponse。\n * 适用于不需要逐事件处理的调用方。\n */\n\nimport type { AIStreamEvent, AIResponse } from \"../types/index.js\";\nimport { aggregateEvent, createAggregatorState, finalizeAggregation } from \"./aggregator.js\";\n\nexport async function collectStream(stream: AsyncIterable<AIStreamEvent>): Promise<AIResponse> {\n const state = createAggregatorState();\n\n for await (const event of stream) {\n aggregateEvent(state, event);\n }\n\n return finalizeAggregation(state);\n}\n","/**\n * Adapter 共享映射 helper\n *\n * 提供 adapter 间通用的类型映射函数:\n * - stop reason 映射\n * - content block 映射\n * - item 映射\n * - warning 记录\n * - replay 构造工具\n */\n\nimport type {\n StopReason,\n ContentBlock,\n MessageItem,\n ReasoningItem,\n ToolCallItem,\n ToolResultItem,\n OpaqueItem,\n InputItem,\n OutputItem,\n ReplayItem,\n} from \"../types/index.js\";\n\n// ── Stop reason 映射 ──────────────────────────────────────────\n\n/**\n * 常见 provider stop_reason / finish_reason 到 canonical StopReason 的映射表。\n * adapter 可先查此表,未覆盖时走 fallback 规则。\n */\nconst STOP_REASON_MAP: Record<string, StopReason> = {\n // OpenAI / Azure\n stop: \"end_turn\",\n length: \"max_output_tokens\",\n content_filter: \"content_filter\",\n tool_calls: \"tool_call\",\n // Anthropic\n end_turn: \"end_turn\",\n max_tokens: \"max_output_tokens\",\n tool_use: \"tool_call\",\n // Generic\n error: \"error\",\n};\n\nexport function mapStopReason(providerReason: string): StopReason {\n return STOP_REASON_MAP[providerReason] ?? \"unknown\";\n}\n\n// ── Reasoning visibility 映射 ──────────────────────────────────\n\nexport function mapReasoningVisibility(hasThinking: boolean, hasRedacted: boolean): ReasoningItem[\"visibility\"] {\n if (hasRedacted) return \"redacted\";\n if (hasThinking) return \"full\";\n return \"opaque\";\n}\n\n// ── Content block 构造 helper ─────────────────────────────────\n\nexport function textBlock(text: string): ContentBlock & { type: \"text\" } {\n return { type: \"text\", text };\n}\n\nexport function jsonBlock(json: unknown): ContentBlock & { type: \"json\" } {\n return { type: \"json\", json };\n}\n\nexport function imageBlock(imageUrl: string): ContentBlock & { type: \"image\" } {\n return { type: \"image\", imageUrl };\n}\n\nexport function opaqueBlock(payload: unknown): ContentBlock & { type: \"opaque\" } {\n return { type: \"opaque\", payload };\n}\n\n// ── Item 构造 helper ──────────────────────────────────────────\n\nexport function messageItem(\n content: ContentBlock[],\n overrides?: Partial<Omit<MessageItem, \"type\" | \"content\">>,\n): MessageItem {\n return {\n type: \"message\",\n role: \"assistant\",\n ...overrides,\n content,\n };\n}\n\nexport function reasoningItem(\n content: ContentBlock[],\n visibility: ReasoningItem[\"visibility\"] = \"full\",\n id?: string,\n): ReasoningItem {\n return {\n type: \"reasoning\",\n id,\n visibility,\n content,\n };\n}\n\nexport function toolCallItem(id: string, name: string, argumentsText: string): ToolCallItem {\n return {\n type: \"tool_call\",\n id,\n name,\n argumentsText,\n };\n}\n\nexport function toolResultItem(\n callId: string,\n toolName: string,\n outcome: ToolResultItem[\"outcome\"],\n content: ContentBlock[],\n): ToolResultItem {\n return {\n type: \"tool_result\",\n callId,\n toolName,\n outcome,\n content,\n };\n}\n\nexport function opaqueItem(\n source: OpaqueItem[\"source\"],\n purpose: OpaqueItem[\"purpose\"],\n payload: unknown,\n id?: string,\n): OpaqueItem {\n return {\n type: \"opaque\",\n id,\n source,\n purpose,\n payload,\n };\n}\n\n// ── Replay 构造工具 ──────────────────────────────────────────\n\n/**\n * 从 output items 构建标准 replay items。\n * 简单场景下 replay 与 output 一致。\n * 复杂场景(需要 opaque continuation)由 adapter 自行扩展。\n */\nexport function replayFromOutput(output: readonly OutputItem[]): ReplayItem[] {\n return output.map((item): InputItem => {\n switch (item.type) {\n case \"message\":\n case \"reasoning\":\n case \"tool_call\":\n return item as InputItem;\n case \"opaque\":\n return item;\n }\n });\n}\n\n// ── Content block 提取 helper ──────────────────────────────────\n\n/**\n * 将单个 ContentBlock 转为纯文本。\n * text 块直接返回文本,json 块序列化,其余返回空串。\n */\nexport function blockToText(b: ContentBlock): string {\n if (b.type === \"text\") return b.text;\n if (b.type === \"json\") return JSON.stringify(b.json);\n return \"\";\n}\n\n/**\n * 将 ContentBlock 数组拼接为纯文本,块间以换行符分隔。\n */\nexport function contentBlocksToText(blocks: ContentBlock[]): string {\n return blocks.map(blockToText).join(\"\\n\");\n}\n\n// ── Output 文本提取 ───────────────────────────────────────────\n\n/**\n * 从 OutputItem 数组中提取所有 message 类型 item 的文本内容。\n */\nexport function extractText(output: OutputItem[]): string {\n return output\n .filter((item): item is MessageItem => item.type === \"message\")\n .flatMap((m) => m.content)\n .filter((b): b is ContentBlock & { type: \"text\" } => b.type === \"text\")\n .map((b) => b.text)\n .join(\"\");\n}\n","/**\n * 辅助信息采集器 (AuxiliaryCollector)\n *\n * 为 usage、billing、providerMetadata 提供统一的 best-effort 采集。\n *\n * 采集优先级(分层):\n * 1. 主响应 body / terminal event\n * 2. headers / trailers\n * 3. SDK metadata\n * 4. 一次 follow-up lookup\n * 5. derived estimate\n *\n * 约束:\n * - lookup 最多一次有界补查\n * - lookup 失败只记录 warning\n * - 不阻断主生成链路\n */\n\nimport type { Usage, BillingInfo, AuxiliaryInfo } from \"../types/index.js\";\n\n// ── 来源类型 ──────────────────────────────────────────────────\n\nexport type UsageSource = NonNullable<AuxiliaryInfo[\"usageSource\"]>;\nexport type BillingSource = NonNullable<AuxiliaryInfo[\"billingSource\"]>;\n\nexport type LookupResult = {\n usage?: Partial<Usage>;\n billing?: Partial<BillingInfo>;\n providerMetadata?: Record<string, unknown>;\n};\n\n// ── Collector ─────────────────────────────────────────────────\n\nexport class AuxiliaryCollector {\n private usage: Partial<Usage> = {};\n private usageSource: UsageSource | undefined;\n private billing: Partial<BillingInfo> | undefined;\n private billingSource: BillingSource | undefined;\n private providerMetadata: Record<string, unknown> = {};\n private providerUsage: unknown;\n private providerBilling: unknown;\n private warnings: string[] = [];\n private lookupAttempted = false;\n\n // ── 记录方法 ──────────────────────────────────────────────\n\n /**\n * 记录 usage 信息。\n * 后调用的覆盖先调用的(优先级由调用方控制)。\n */\n recordUsage(usage: Partial<Usage>, source: UsageSource, raw?: unknown): this {\n this.usage = { ...this.usage, ...usage };\n this.usageSource = source;\n if (raw !== undefined) this.providerUsage = raw;\n return this;\n }\n\n /**\n * 记录 billing 信息。\n * 后调用的覆盖先调用的。\n */\n recordBilling(billing: Partial<BillingInfo>, source: BillingSource, raw?: unknown): this {\n this.billing = { ...this.billing, ...billing };\n this.billingSource = source;\n if (raw !== undefined) this.providerBilling = raw;\n return this;\n }\n\n /**\n * 记录 provider 元数据(非 canonical 的 key-value 信息)。\n */\n recordMetadata(metadata: Record<string, unknown>): this {\n this.providerMetadata = { ...this.providerMetadata, ...metadata };\n return this;\n }\n\n /**\n * 记录一条 warning。\n */\n recordWarning(message: string): this {\n this.warnings.push(message);\n return this;\n }\n\n // ── 有界 Lookup ───────────────────────────────────────────\n\n /**\n * 执行一次有界 follow-up lookup。\n * 最多调用一次;后续调用被忽略。\n * lookup 失败(抛错)仅记录 warning,不传播异常。\n */\n async tryLookup(lookupFn: () => Promise<LookupResult>, timeoutMs = 5_000): Promise<void> {\n if (this.lookupAttempted) return;\n this.lookupAttempted = true;\n\n try {\n const result = await withTimeout(lookupFn(), timeoutMs);\n if (result.usage) {\n this.recordUsage(result.usage, \"lookup\", result.usage);\n }\n if (result.billing) {\n const bill: Partial<BillingInfo> = {\n ...result.billing,\n source: result.billing?.source ?? \"lookup\",\n };\n this.recordBilling(bill, \"lookup\", result.billing);\n }\n if (result.providerMetadata) {\n this.recordMetadata(result.providerMetadata);\n }\n } catch (err) {\n this.recordWarning(`Auxiliary lookup failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // ── 构建最终结果 ──────────────────────────────────────────\n\n /**\n * 构建最终的 usage / billing / auxiliary。\n * 所有字段均为可选的 — 拿不到就不给。\n */\n build(): { usage?: Usage; billing?: BillingInfo; auxiliary?: AuxiliaryInfo; warnings?: string[] } {\n const result: { usage?: Usage; billing?: BillingInfo; auxiliary?: AuxiliaryInfo; warnings?: string[] } = {};\n\n if (Object.keys(this.usage).length > 0) {\n result.usage = this.usage as Usage;\n }\n\n if (this.billing) {\n result.billing = this.billing as BillingInfo;\n }\n\n const aux: AuxiliaryInfo = {};\n if (this.usageSource) aux.usageSource = this.usageSource;\n if (this.billingSource) aux.billingSource = this.billingSource;\n if (this.providerUsage !== undefined) aux.providerUsage = this.providerUsage;\n if (this.providerBilling !== undefined) aux.providerBilling = this.providerBilling;\n if (Object.keys(this.providerMetadata).length > 0) aux.providerMetadata = this.providerMetadata;\n\n if (Object.keys(aux).length > 0) {\n result.auxiliary = aux;\n }\n\n if (this.warnings.length > 0) {\n result.warnings = [...this.warnings];\n }\n\n return result;\n }\n\n /**\n * 已使用的来源列表(用于 debugging)。\n */\n get sources(): { usage?: UsageSource; billing?: BillingSource } {\n return { usage: this.usageSource, billing: this.billingSource };\n }\n}\n\n// ── Helper ────────────────────────────────────────────────────\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) => setTimeout(() => reject(new Error(`Lookup timed out after ${ms}ms`)), ms)),\n ]);\n}\n","import { WarningCode } from \"../core/errors.js\";\nimport type { EventFactory } from \"../core/event-factory.js\";\nimport type { AIStreamEvent, BillingInfo, NormalizedRequest, Usage, AuxiliaryInfo } from \"../types/index.js\";\nimport { AuxiliaryCollector, type BillingSource, type LookupResult, type UsageSource } from \"./auxiliary-collector.js\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type BillingPostprocessHook = (context: {\n request: NormalizedRequest;\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: AuxiliaryInfo;\n}) => MaybePromise<Partial<BillingInfo> | undefined>;\n\nexport type AuxiliaryFinalizeOptions = {\n lookup?: () => Promise<LookupResult>;\n lookupTimeoutMs?: number;\n postprocessBilling?: BillingPostprocessHook;\n postprocessBillingSource?: BillingSource;\n};\n\nexport type AuxiliaryFinalizeResult = {\n events: AIStreamEvent[];\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: AuxiliaryInfo;\n warnings?: string[];\n metadataSources?: string[];\n};\n\nexport class AdapterAuxiliaryState {\n private readonly collector = new AuxiliaryCollector();\n private readonly metadataSources = new Set<string>();\n\n constructor(private readonly request: NormalizedRequest) {}\n\n recordUsage(usage: Partial<Usage>, source: UsageSource, raw?: unknown): void {\n if (this.request.include?.usage === \"off\" || isEmptyRecord(usage)) return;\n this.collector.recordUsage(usage, source, raw);\n }\n\n recordBilling(billing: Partial<BillingInfo>, source: BillingSource, raw?: unknown): void {\n if (this.request.include?.billing === \"off\" || isEmptyRecord(billing)) return;\n this.collector.recordBilling(billing, source, raw);\n }\n\n recordProviderMetadata(source: string, metadata: Record<string, unknown> | undefined): void {\n if (this.request.include?.providerMetadata === \"off\" || !metadata || isEmptyRecord(metadata)) return;\n this.collector.recordMetadata(metadata);\n this.metadataSources.add(source);\n }\n\n async finalize(factory: EventFactory, options: AuxiliaryFinalizeOptions = {}): Promise<AuxiliaryFinalizeResult> {\n if (options.lookup && this.shouldAttemptLookup()) {\n await this.collector.tryLookup(options.lookup, options.lookupTimeoutMs);\n }\n\n if (this.request.include?.billing !== \"off\" && options.postprocessBilling) {\n const snapshot = this.collector.build();\n if (!snapshot.billing) {\n const derived = await options.postprocessBilling({\n request: this.request,\n usage: snapshot.usage,\n billing: snapshot.billing,\n auxiliary: snapshot.auxiliary,\n });\n if (derived && !isEmptyRecord(derived)) {\n this.collector.recordBilling(\n {\n ...derived,\n isEstimated: derived.isEstimated ?? true,\n source: derived.source ?? \"derived\",\n },\n options.postprocessBillingSource ?? \"derived\",\n derived,\n );\n }\n }\n }\n\n const built = this.collector.build();\n const events: AIStreamEvent[] = [];\n\n if (built.usage || built.billing || built.auxiliary) {\n events.push(\n factory.responseAuxiliary({\n usage: built.usage,\n billing: built.billing,\n auxiliary: built.auxiliary,\n }),\n );\n }\n\n if (this.request.include?.usage !== \"off\" && !built.usage) {\n events.push(\n factory.responseWarning(\"Usage information was not provided by the provider\", WarningCode.USAGE_MISSING),\n );\n }\n\n if (this.request.include?.billing !== \"off\") {\n if (!built.billing) {\n events.push(\n factory.responseWarning(\"Billing information was not provided by the provider\", WarningCode.BILLING_MISSING),\n );\n } else if (built.billing.isEstimated) {\n events.push(factory.responseWarning(\"Billing amount is an estimate\", WarningCode.BILLING_ESTIMATED));\n }\n }\n\n return {\n events,\n usage: built.usage,\n billing: built.billing,\n auxiliary: built.auxiliary,\n warnings: built.warnings,\n metadataSources: this.metadataSources.size > 0 ? [...this.metadataSources] : undefined,\n };\n }\n\n private shouldAttemptLookup(): boolean {\n if (\n this.request.include?.usage === \"off\" &&\n this.request.include?.billing === \"off\" &&\n this.request.include?.providerMetadata === \"off\"\n ) {\n return false;\n }\n\n const snapshot = this.collector.build();\n return (\n (this.request.include?.usage !== \"off\" && !snapshot.usage) ||\n (this.request.include?.billing !== \"off\" && !snapshot.billing) ||\n (this.request.include?.providerMetadata !== \"off\" && !snapshot.auxiliary?.providerMetadata)\n );\n }\n}\n\nexport function emitMalformedStreamWarning(\n factory: EventFactory,\n options: {\n count: number;\n providerLabel: string;\n transportLabel: string;\n },\n): AIStreamEvent | undefined {\n if (options.count < 1) return undefined;\n return factory.responseWarning(\n `Skipped ${options.count} malformed ${options.providerLabel} ${options.transportLabel}`,\n \"STREAM_ERROR\",\n );\n}\n\nfunction isEmptyRecord(value: object): boolean {\n return Object.keys(value).length === 0;\n}\n","/**\n * Adapter 抽象基类\n *\n * 约定 adapter 的内部职责分层(build / invoke / parse / emit):\n * 1. buildRequest — 将 NormalizedRequest 转换为 provider 请求格式\n * 2. invokeProvider — 调用 provider API\n * 3. parseResponse — 解析 provider 响应为 canonical 中间态\n * 4. emitEvents — 产出 canonical 事件流\n *\n * 子类实现 buildRequest() 和 runStream(),\n * runStream 返回 AsyncIterable,事件实时发射给消费者。\n */\n\nimport type {\n NormalizedRequest,\n BackendAdapter,\n AIStreamEvent,\n AIResponse,\n AuxiliaryInfo,\n OutputItem,\n ReplayItem,\n StopReason,\n Usage,\n BillingInfo,\n ToolCallItem,\n} from \"../types/index.js\";\nimport { createEventFactory } from \"../core/event-factory.js\";\nimport { AIMappingError, AIProviderError, AIRequestError, AIStreamError } from \"../core/errors.js\";\nimport type { EventFactory } from \"../core/event-factory.js\";\nimport { extractText } from \"./mapping.js\";\nimport { AdapterAuxiliaryState } from \"./adapter-auxiliary.js\";\nimport { mergeAuxiliary } from \"../core/merge-auxiliary.js\";\n\n// ── Adapter 解析中间结果 ──────────────────────────────────────\n\nexport type ProviderResponse = unknown;\n\n/**\n * adapter 完成一轮处理后返回的最终结果。\n * 用于 buildResponse() 构建 AIResponse。\n */\nexport type StreamResult = {\n output: OutputItem[];\n replay: ReplayItem[];\n stopReason?: StopReason;\n usage?: Usage;\n billing?: BillingInfo;\n providerMetadata?: Record<string, unknown>;\n auxiliary?: Partial<AuxiliaryInfo>;\n warnings?: string[];\n metadataSources?: string[];\n rawResponseId?: string;\n};\n\n// ── 抽象基类 ──────────────────────────────────────────────────\n\nexport abstract class AdapterBase implements BackendAdapter {\n abstract readonly kind: \"chat-completions\" | \"messages\" | \"responses\" | \"ollama\" | \"mock\";\n abstract readonly isSyntheticStream: boolean;\n\n /**\n * stream 模板方法:\n * 1. 创建事件工厂,发射 response.started\n * 2. 构建 provider 请求\n * 3. 委托 runStream 发射全部流事件(含 response.completed)\n */\n async *stream(request: NormalizedRequest): AsyncIterable<AIStreamEvent> {\n // 若请求已被 abort,不发出任何事件\n request.signal?.throwIfAborted();\n\n const factory = createEventFactory({\n responseId: request.requestId,\n backend: { kind: this.kind, isSynthetic: this.isSyntheticStream },\n });\n\n yield factory.responseStarted(request.model);\n\n try {\n const providerRequest = await this.buildRequest(request);\n yield* this.runStream(providerRequest, factory, request);\n } catch (err) {\n if (err instanceof AIRequestError || err instanceof AIProviderError || err instanceof AIStreamError) {\n throw err;\n }\n\n if (err instanceof AIMappingError) {\n yield factory.responseWarning(err.message, \"MAPPING_ERROR\");\n const errorResp = this.buildResponse(request, { output: [], replay: [] }, factory);\n yield factory.responseCompleted({\n replay: errorResp.replay,\n stopReason: errorResp.stopReason,\n trace: errorResp.backend,\n usage: errorResp.usage,\n billing: errorResp.billing,\n auxiliary: errorResp.auxiliary,\n warnings: errorResp.warnings,\n });\n return;\n }\n\n throw err;\n }\n }\n\n // ── 子类必须实现 ──────────────────────────────────────────\n\n /** 将 NormalizedRequest 转换为 provider 请求格式。 */\n protected abstract buildRequest(request: NormalizedRequest): ProviderResponse | Promise<ProviderResponse>;\n\n /**\n * 执行流式请求,发射全部事件(含 response.completed)。\n * 子类负责:\n * - 调用 provider\n * - 解析每个 chunk\n * - 通过 factory 发射 item 事件\n * - 构建 StreamResult\n * - 发射 factory.responseCompleted(buildResponse(…))\n */\n protected abstract runStream(\n providerRequest: ProviderResponse,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent>;\n\n // ── 共享构造方法 ──────────────────────────────────────────\n\n /**\n * 从 StreamResult 构建完整 AIResponse。\n * 子类可在返回前自定义覆盖。\n */\n protected buildResponse(request: NormalizedRequest, result: StreamResult, _factory: EventFactory): AIResponse {\n const text = extractText(result.output);\n const warnings = mergeWarnings(result.warnings, _factory.warnings);\n const auxiliary = mergeAuxiliary(\n result.auxiliary,\n result.providerMetadata ? { providerMetadata: result.providerMetadata } : undefined,\n );\n\n return {\n id: request.requestId,\n output: result.output,\n replay: result.replay,\n text,\n toolCalls: result.output.filter((item): item is ToolCallItem => item.type === \"tool_call\"),\n stopReason: result.stopReason,\n usage: result.usage,\n billing: result.billing,\n auxiliary,\n warnings,\n backend: {\n requestId: request.requestId,\n rawResponseId: result.rawResponseId,\n adapter: this.kind,\n isSyntheticStream: this.isSyntheticStream,\n metadataSources: result.metadataSources,\n warnings,\n },\n };\n }\n\n /**\n * 统一 finalize auxiliary → response.completed。\n * adapter 在调用前组装 output / replay / stopReason 等业务字段。\n */\n protected async *emitStreamCompleted(\n factory: EventFactory,\n request: NormalizedRequest,\n auxiliary: AdapterAuxiliaryState,\n result: StreamResult,\n ): AsyncIterable<AIStreamEvent> {\n const auxiliaryResult = await auxiliary.finalize(factory);\n for (const event of auxiliaryResult.events) {\n yield event;\n }\n\n const finalResponse = this.buildResponse(\n request,\n {\n ...result,\n usage: result.usage ?? auxiliaryResult.usage,\n billing: result.billing ?? auxiliaryResult.billing,\n auxiliary: mergeAuxiliary(result.auxiliary, auxiliaryResult.auxiliary),\n warnings: mergeWarnings(result.warnings, auxiliaryResult.warnings),\n metadataSources: result.metadataSources ?? auxiliaryResult.metadataSources,\n },\n factory,\n );\n\n yield factory.responseCompleted({\n replay: finalResponse.replay,\n stopReason: finalResponse.stopReason,\n trace: finalResponse.backend,\n usage: finalResponse.usage,\n billing: finalResponse.billing,\n auxiliary: finalResponse.auxiliary,\n warnings: finalResponse.warnings,\n });\n }\n\n protected createAuxiliaryState(request: NormalizedRequest): AdapterAuxiliaryState {\n return new AdapterAuxiliaryState(request);\n }\n}\n\nfunction mergeWarnings(...groups: Array<string[] | undefined>): string[] | undefined {\n const merged: string[] = [];\n\n for (const group of groups) {\n if (!group) continue;\n for (const warning of group) {\n if (!merged.includes(warning)) {\n merged.push(warning);\n }\n }\n }\n\n return merged.length > 0 ? merged : undefined;\n}\n","/**\n * Adapter 边界安全辅助\n *\n * - opaque replay 入站 envelope(大小 / 深度)\n * - provider HTTP 错误 body 出站脱敏\n */\n\nimport { AIProviderError, AIRequestError } from \"../core/errors.js\";\n\nexport const MAX_OPAQUE_PAYLOAD_BYTES = 65536;\nexport const MAX_OPAQUE_JSON_DEPTH = 8;\nexport const PROVIDER_ERROR_MESSAGE_MAX_LEN = 500;\nexport const PROVIDER_ERROR_RAW_BODY_THRESHOLD = 200;\n\nexport type OpaqueEnvelopeResult = { ok: true } | { ok: false; reason: string };\n\n/** 测量 JSON 值嵌套深度(对象/数组);循环引用按已访问节点深度计。 */\nexport function measureJsonDepth(value: unknown, seen = new WeakSet<object>()): number {\n if (value === null || typeof value !== \"object\") {\n return 0;\n }\n\n if (seen.has(value)) {\n return 0;\n }\n seen.add(value);\n\n let maxChild = 0;\n if (Array.isArray(value)) {\n for (const item of value) {\n maxChild = Math.max(maxChild, measureJsonDepth(item, seen));\n }\n } else {\n for (const key of Object.keys(value as Record<string, unknown>)) {\n maxChild = Math.max(maxChild, measureJsonDepth((value as Record<string, unknown>)[key], seen));\n }\n }\n\n return 1 + maxChild;\n}\n\n/**\n * Opaque replay 通用 envelope:必须是 object、体积 ≤ 64KB、深度 ≤ 8。\n * 不校验 adapter 专用字段形状。\n */\nexport function validateOpaqueReplayEnvelope(payload: unknown): OpaqueEnvelopeResult {\n if (typeof payload !== \"object\" || payload === null) {\n return { ok: false, reason: \"payload must be an object\" };\n }\n\n let raw: string;\n try {\n raw = JSON.stringify(payload);\n } catch {\n return { ok: false, reason: \"payload is not JSON-serializable\" };\n }\n\n if (raw === undefined) {\n return { ok: false, reason: \"payload is not JSON-serializable\" };\n }\n\n if (raw.length > MAX_OPAQUE_PAYLOAD_BYTES) {\n return {\n ok: false,\n reason: `opaque payload exceeds max size (${raw.length} > ${MAX_OPAQUE_PAYLOAD_BYTES})`,\n };\n }\n\n const depth = measureJsonDepth(payload);\n if (depth > MAX_OPAQUE_JSON_DEPTH) {\n return {\n ok: false,\n reason: `opaque payload nesting depth (${depth}) exceeds max (${MAX_OPAQUE_JSON_DEPTH})`,\n };\n }\n\n return { ok: true };\n}\n\n/** envelope 失败时抛 AIRequestError。 */\nexport function assertOpaqueReplayEnvelope(payload: unknown): void {\n const result = validateOpaqueReplayEnvelope(payload);\n if (!result.ok) {\n throw new AIRequestError(`Invalid opaque replay payload: ${result.reason}`, \"INVALID_OPAQUE_REPLAY\");\n }\n}\n\n/**\n * 从 provider HTTP 错误 body 提取可对外暴露的短消息,避免泄漏 HTML / 内部路径等。\n */\nexport function extractProviderErrorMessage(body: string, status: number): string {\n if (!body) return `HTTP ${status}`;\n\n try {\n const parsed: unknown = JSON.parse(body);\n if (parsed && typeof parsed === \"object\") {\n const record = parsed as Record<string, unknown>;\n const errorField = record.error;\n let msg: unknown;\n if (errorField && typeof errorField === \"object\" && errorField !== null) {\n msg = (errorField as Record<string, unknown>).message;\n }\n if (typeof msg !== \"string\") {\n msg = typeof errorField === \"string\" ? errorField : record.message;\n }\n if (typeof msg === \"string\" && msg.length > 0) {\n return msg.slice(0, PROVIDER_ERROR_MESSAGE_MAX_LEN);\n }\n }\n } catch {\n // not JSON\n }\n\n const trimmed = body.trimStart();\n if (trimmed.startsWith(\"<!\") || trimmed.startsWith(\"<html\") || body.length > PROVIDER_ERROR_RAW_BODY_THRESHOLD) {\n return `HTTP ${status}. Body omitted (${body.length} bytes)`;\n }\n\n return body.slice(0, PROVIDER_ERROR_MESSAGE_MAX_LEN);\n}\n\n/** 统一构造脱敏后的 AIProviderError。 */\nexport function providerHttpError(status: number, body: string): AIProviderError {\n const safe = extractProviderErrorMessage(body, status);\n return new AIProviderError(`Provider returned ${status}: ${safe}`, \"PROVIDER_ERROR\", status, safe);\n}\n","/**\n * Provider usage → canonical Usage 映射\n *\n * best-effort 提取 reasoning / cache 等扩展字段。\n */\n\nimport type { Usage } from \"../types/index.js\";\n\nfunction num(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction record(obj: Record<string, number | undefined>): Partial<Usage> {\n const out: Partial<Usage> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n (out as Record<string, number>)[key] = value;\n }\n }\n return out;\n}\n\nfunction withDerivedTotal(usage: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cachedInputTokens?: number;\n reasoningTokens?: number;\n cacheWriteInputTokens?: number;\n}): Partial<Usage> {\n const { inputTokens, outputTokens, totalTokens, cachedInputTokens, reasoningTokens, cacheWriteInputTokens } = usage;\n return record({\n inputTokens,\n outputTokens,\n totalTokens:\n totalTokens ?? (inputTokens !== undefined && outputTokens !== undefined ? inputTokens + outputTokens : undefined),\n cachedInputTokens,\n reasoningTokens,\n cacheWriteInputTokens,\n });\n}\n\n/** OpenAI Chat Completions `usage` */\nexport function usageFromChatCompletions(raw: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number; [key: string]: unknown };\n completion_tokens_details?: { reasoning_tokens?: number; [key: string]: unknown };\n}): Partial<Usage> {\n return withDerivedTotal({\n inputTokens: num(raw.prompt_tokens),\n outputTokens: num(raw.completion_tokens),\n totalTokens: num(raw.total_tokens),\n cachedInputTokens: num(raw.prompt_tokens_details?.cached_tokens),\n reasoningTokens: num(raw.completion_tokens_details?.reasoning_tokens),\n });\n}\n\n/** OpenAI Responses API `usage` */\nexport function usageFromOpenAIResponses(raw: {\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n input_tokens_details?: { cached_tokens?: number; [key: string]: unknown };\n output_tokens_details?: { reasoning_tokens?: number; [key: string]: unknown };\n [key: string]: unknown;\n}): Partial<Usage> {\n return withDerivedTotal({\n inputTokens: num(raw.input_tokens),\n outputTokens: num(raw.output_tokens),\n totalTokens: num(raw.total_tokens),\n cachedInputTokens: num(raw.input_tokens_details?.cached_tokens),\n reasoningTokens: num(raw.output_tokens_details?.reasoning_tokens),\n });\n}\n\n/** Anthropic Messages `usage`(message_start / message_delta) */\nexport function usageFromAnthropicMessages(raw: {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n [key: string]: unknown;\n}): Partial<Usage> {\n const uncachedInputTokens = num(raw.input_tokens);\n const outputTokens = num(raw.output_tokens);\n const cacheWriteInputTokens = num(raw.cache_creation_input_tokens);\n const cachedInputTokens = num(raw.cache_read_input_tokens);\n\n const inputParts = [uncachedInputTokens, cacheWriteInputTokens, cachedInputTokens].filter(\n (n): n is number => n !== undefined,\n );\n const inputTokens = inputParts.length > 0 ? inputParts.reduce((sum, n) => sum + n, 0) : undefined;\n\n return withDerivedTotal({\n inputTokens,\n outputTokens,\n cachedInputTokens,\n cacheWriteInputTokens,\n });\n}\n\n/** Ollama 流式 chunk */\nexport function usageFromOllama(raw: { prompt_eval_count?: number; eval_count?: number }): Partial<Usage> {\n return withDerivedTotal({\n inputTokens: num(raw.prompt_eval_count),\n outputTokens: num(raw.eval_count),\n });\n}\n","/**\n * 模拟流式 (Synthetic Streaming)\n *\n * 将一组已解析的 canonical OutputItem 包装为规范事件流。\n * 适用于非原生流式后端:adapter 拿到完整响应后,调用此函数\n * 即可产出一致的事件序列,无需自己逐事件组装。\n *\n * 约束:\n * - 每个 item 只发一块完整 delta(不模拟逐 token)\n * - 保持 item 边界\n * - 保持后端原始顺序\n * - 不发明 reasoning\n * - 不改写工具参数\n */\n\nimport { createEventFactory } from \"../core/event-factory.js\";\nimport { replayFromOutput } from \"./mapping.js\";\n\nimport type {\n OutputItem,\n ReplayItem,\n StopReason,\n Usage,\n BillingInfo,\n AIStreamEvent,\n MessageItem,\n ReasoningItem,\n ToolCallItem,\n OpaqueItem,\n} from \"../types/index.js\";\n\n// ── 输入参数 ──────────────────────────────────────────────────\n\nexport type SyntheticStreamOptions = {\n model: string;\n responseId: string;\n backend: {\n kind: \"chat-completions\" | \"messages\" | \"responses\" | \"mock\";\n /** syntheticStream 强制设为 true */\n };\n output: OutputItem[];\n replay?: ReplayItem[];\n stopReason?: StopReason;\n usage?: Usage;\n billing?: BillingInfo;\n providerMetadata?: Record<string, unknown>;\n rawResponseId?: string;\n warnings?: string[];\n};\n\n// ── Synthetic Stream ──────────────────────────────────────────\n\n/**\n * 将已解析的 output items 包装为完整规范事件流。\n *\n * 用法示例(在 adapter 的 runStream 中):\n * ```ts\n * const result = parseNonStreamingResponse(data);\n * yield* syntheticStream({\n * model: request.model,\n * responseId: request.requestId,\n * backend: { kind: \"chat-completions\" },\n * output: result.output,\n * stopReason: result.stopReason,\n * usage: result.usage,\n * });\n * ```\n */\nexport async function* syntheticStream(options: SyntheticStreamOptions): AsyncIterable<AIStreamEvent> {\n const {\n model,\n responseId,\n backend,\n output,\n replay,\n stopReason,\n usage,\n billing,\n providerMetadata,\n rawResponseId,\n warnings: extraWarnings,\n } = options;\n\n const factory = createEventFactory({\n responseId,\n backend: { kind: backend.kind, isSynthetic: true },\n });\n\n // 1. 响应开始\n yield factory.responseStarted(model);\n\n // 2. item 级事件 — 每个 item 只发一块完整 delta\n for (const item of output) {\n yield* emitItemEvents(item, factory);\n }\n\n // 3. auxiliary 事件(如有)\n if (usage || billing) {\n yield factory.responseAuxiliary({ usage, billing });\n }\n\n // 4. 构建最终 completion 并发射\n const finalReplay = replay ?? replayFromOutput(output);\n\n // 收集警告\n const allWarnings: string[] = [];\n allWarnings.push(\"Response is synthetically streamed; delta granularity may differ from native streaming\");\n if (extraWarnings) allWarnings.push(...extraWarnings);\n\n yield factory.responseCompleted({\n replay: finalReplay,\n stopReason,\n usage,\n billing,\n auxiliary: providerMetadata ? { providerMetadata } : undefined,\n opaqueOutput: output.filter((item): item is OpaqueItem => item.type === \"opaque\"),\n warnings: allWarnings.length > 0 ? allWarnings : undefined,\n trace: {\n requestId: responseId,\n rawResponseId,\n adapter: backend.kind,\n isSyntheticStream: true,\n warnings: allWarnings.length > 0 ? allWarnings : undefined,\n },\n });\n}\n\n// ── Item 事件发射 ─────────────────────────────────────────────\n\nfunction* emitItemEvents(item: OutputItem, factory: ReturnType<typeof createEventFactory>): Generator<AIStreamEvent> {\n switch (item.type) {\n case \"message\":\n yield* emitMessageEvents(item, factory);\n break;\n case \"reasoning\":\n yield* emitReasoningEvents(item, factory);\n break;\n case \"tool_call\":\n yield* emitToolCallEvents(item, factory);\n break;\n case \"opaque\":\n // Opaque items in output have no streaming events\n break;\n }\n}\n\nfunction* emitMessageEvents(\n item: MessageItem,\n factory: ReturnType<typeof createEventFactory>,\n): Generator<AIStreamEvent> {\n const id = item.id ?? `syn-msg-${crypto.randomUUID()}`;\n yield factory.messageStarted(id);\n\n for (const block of item.content) {\n yield factory.messageDelta(id, block);\n }\n\n yield factory.messageCompleted(id);\n}\n\nfunction* emitReasoningEvents(\n item: ReasoningItem,\n factory: ReturnType<typeof createEventFactory>,\n): Generator<AIStreamEvent> {\n const id = item.id ?? `syn-reason-${crypto.randomUUID()}`;\n yield factory.reasoningStarted(id, item.visibility);\n\n for (const block of item.content) {\n yield factory.reasoningDelta(id, block);\n }\n\n yield factory.reasoningCompleted(id);\n}\n\nfunction* emitToolCallEvents(\n item: ToolCallItem,\n factory: ReturnType<typeof createEventFactory>,\n): Generator<AIStreamEvent> {\n yield factory.toolCallStarted(item.id, item.name);\n\n if (item.argumentsText) {\n yield factory.toolCallDelta(item.id, { argumentsText: item.argumentsText });\n }\n\n yield factory.toolCallCompleted(item.id);\n}\n\n// ── Helper ────────────────────────────────────────────────────\n","export type StreamSplitResult = {\n items: string[];\n rest: string;\n};\n\nexport type StreamParseResult<T> = { status: \"parsed\"; value: T } | { status: \"ignored\" } | { status: \"malformed\" };\n\nexport class IncrementalStreamParser<T> {\n private buffer = \"\";\n private readonly decoder = new TextDecoder();\n\n constructor(\n private readonly split: (buffer: string, allowEOF: boolean) => StreamSplitResult,\n private readonly parse: (item: string) => StreamParseResult<T>,\n ) {}\n\n feed(value: Uint8Array): { items: T[]; malformed: number } {\n this.buffer += this.decoder.decode(value, { stream: true });\n return this.consume(false);\n }\n\n flush(): { items: T[]; malformed: number } {\n this.buffer += this.decoder.decode();\n return this.consume(true);\n }\n\n getRemaining(): string {\n return this.buffer;\n }\n\n private consume(allowEOF: boolean): { items: T[]; malformed: number } {\n const split = this.split(this.buffer, allowEOF);\n this.buffer = split.rest;\n const items: T[] = [];\n let malformed = 0;\n\n for (const rawItem of split.items) {\n const result = this.parse(rawItem);\n if (result.status === \"parsed\") items.push(result.value);\n else if (result.status === \"malformed\") malformed++;\n }\n\n return { items, malformed };\n }\n}\n\nexport function splitLines(buffer: string, allowEOF: boolean): StreamSplitResult {\n const items: string[] = [];\n let cursor = 0;\n\n while (true) {\n const lineEnd = buffer.indexOf(\"\\n\", cursor);\n if (lineEnd === -1) break;\n items.push(buffer.slice(cursor, lineEnd));\n cursor = lineEnd + 1;\n }\n\n if (allowEOF && cursor < buffer.length) {\n items.push(buffer.slice(cursor));\n cursor = buffer.length;\n }\n\n return { items, rest: buffer.slice(cursor) };\n}\n\nexport function splitSSEFrames(buffer: string, allowEOF: boolean): StreamSplitResult {\n const normalized = buffer.replaceAll(\"\\r\\n\", \"\\n\");\n const items: string[] = [];\n let cursor = 0;\n\n while (true) {\n const frameEnd = normalized.indexOf(\"\\n\\n\", cursor);\n if (frameEnd === -1) break;\n items.push(normalized.slice(cursor, frameEnd));\n cursor = frameEnd + 2;\n }\n\n if (allowEOF && cursor < normalized.length) {\n items.push(normalized.slice(cursor));\n cursor = normalized.length;\n }\n\n return { items, rest: normalized.slice(cursor) };\n}\n\n// ── 常用 parse 工厂 ───────────────────────────────────────────\n\nexport type SseJsonEvent = { type: string; data: unknown };\n\n/** 解析标准 SSE frame(event: + data:),用于 Messages / Responses。 */\nexport function parseSseJsonFrame(frame: string): StreamParseResult<SseJsonEvent> {\n let eventType = \"\";\n let dataStr = \"\";\n for (const rawLine of frame.split(\"\\n\")) {\n const line = rawLine.trim();\n if (line.startsWith(\"event: \")) eventType = line.slice(7).trim();\n else if (line.startsWith(\"data: \")) dataStr += line.slice(6);\n }\n if (!eventType) return { status: \"ignored\" };\n try {\n const data: unknown = JSON.parse(dataStr);\n return { status: \"parsed\", value: { type: eventType, data } };\n } catch {\n return { status: \"malformed\" };\n }\n}\n\nexport function createSseJsonParser<T extends SseJsonEvent = SseJsonEvent>(): IncrementalStreamParser<T> {\n return new IncrementalStreamParser(splitSSEFrames, (frame) => parseSseJsonFrame(frame) as StreamParseResult<T>);\n}\n\n/** OpenAI Chat Completions 简化 SSE:仅 `data: ...` 行,忽略 `[DONE]`。 */\nexport function parseChatCompletionsDataLine(item: string): StreamParseResult<unknown> {\n const trimmed = item.trim();\n if (!trimmed.startsWith(\"data: \")) return { status: \"ignored\" };\n const data = trimmed.slice(6).trim();\n if (data === \"[DONE]\") return { status: \"ignored\" };\n try {\n return { status: \"parsed\", value: JSON.parse(data) as unknown };\n } catch {\n return { status: \"malformed\" };\n }\n}\n\nexport function createChatCompletionsSseParser<T>(): IncrementalStreamParser<T> {\n return new IncrementalStreamParser(splitLines, (item) => parseChatCompletionsDataLine(item) as StreamParseResult<T>);\n}\n\n/** NDJSON 行解析(Ollama 等):空行忽略,JSON 失败为 malformed。 */\nexport function createNdjsonLineParser<T>(isValid: (value: unknown) => value is T): IncrementalStreamParser<T> {\n return new IncrementalStreamParser<T>(splitLines, (item: string): StreamParseResult<T> => {\n const trimmed = item.trim();\n if (!trimmed) return { status: \"ignored\" };\n try {\n const parsed: unknown = JSON.parse(trimmed);\n if (isValid(parsed)) return { status: \"parsed\", value: parsed };\n return { status: \"malformed\" };\n } catch {\n return { status: \"malformed\" };\n }\n });\n}\n","/**\n * Provider HTTP 流公共脚手架\n *\n * 收敛 adapter 间重复的:\n * - JSON POST + 错误映射\n * - ReadableStream reader 生命周期\n * - IncrementalStreamParser feed/flush + malformed warning\n * - 不完整尾帧 warning\n */\n\nimport { AIProviderError, AIStreamError } from \"../core/errors.js\";\nimport type { EventFactory } from \"../core/event-factory.js\";\nimport type { AIStreamEvent, FetchFn } from \"../types/index.js\";\nimport { emitMalformedStreamWarning } from \"./adapter-auxiliary.js\";\nimport { providerHttpError } from \"./adapter-security.js\";\nimport type { IncrementalStreamParser } from \"./incremental-stream-parser.js\";\n\nexport type OpenProviderJsonStreamOptions = {\n fetchFn: FetchFn;\n url: string;\n headers: Record<string, string>;\n body: unknown;\n signal?: AbortSignal;\n};\n\nexport type OpenedProviderStream = {\n reader: ReadableStreamDefaultReader<Uint8Array>;\n headers: Headers;\n};\n\n/** POST JSON 并返回可读 body reader + response headers;统一网络/HTTP/空 body 错误。 */\nexport async function openProviderJsonStream(options: OpenProviderJsonStreamOptions): Promise<OpenedProviderStream> {\n const { fetchFn, url, headers, body, signal } = options;\n\n let response: Response;\n try {\n response = await fetchFn(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal,\n });\n } catch (err) {\n throw new AIProviderError(err instanceof Error ? err.message : String(err), \"PROVIDER_ERROR\");\n }\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => \"\");\n throw providerHttpError(response.status, errorBody);\n }\n\n const bodyStream = response.body;\n if (!bodyStream) {\n throw new AIStreamError(\"Response body is not readable\", \"STREAM_ERROR\");\n }\n\n // Bun/DOM ReadableStreamDefaultReader 类型略有差异,按最小接口使用\n return {\n reader: bodyStream.getReader() as ReadableStreamDefaultReader<Uint8Array>,\n headers: response.headers,\n };\n}\n\nexport type ProviderStreamBatchOptions<T> = {\n reader: ReadableStreamDefaultReader<Uint8Array>;\n parser: IncrementalStreamParser<T>;\n factory: EventFactory;\n providerLabel: string;\n transportLabel: string;\n incompleteMessage: string;\n};\n\nexport type ProviderStreamBatch<T> = {\n items: T[];\n warnings: AIStreamEvent[];\n};\n\n/**\n * 读取并解析 provider 流。\n * 每个 batch 携带本轮解析出的 items 与(可选)malformed / incomplete warning。\n * 调用方应 `for await` 消费完毕;reader 在迭代结束时 cancel/release。\n */\nexport async function* iterateProviderStreamBatches<T>(\n options: ProviderStreamBatchOptions<T>,\n): AsyncGenerator<ProviderStreamBatch<T>, void, undefined> {\n const { reader, parser, factory, providerLabel, transportLabel, incompleteMessage } = options;\n let streamDone = false;\n\n try {\n while (true) {\n const readResult = await reader.read().catch((err: unknown) => {\n throw new AIStreamError(\n `Failed to read response stream: ${err instanceof Error ? err.message : String(err)}`,\n \"STREAM_ERROR\",\n );\n });\n const { done, value } = readResult;\n const { items, malformed } = done ? parser.flush() : parser.feed(value as Uint8Array);\n\n const warnings: AIStreamEvent[] = [];\n const malformedWarning = emitMalformedStreamWarning(factory, {\n count: malformed,\n providerLabel,\n transportLabel,\n });\n if (malformedWarning) warnings.push(malformedWarning);\n\n yield { items, warnings };\n\n if (done) {\n streamDone = true;\n break;\n }\n }\n } finally {\n try {\n if (!streamDone) await reader.cancel().catch(() => undefined);\n } finally {\n reader.releaseLock();\n }\n }\n\n if (parser.getRemaining().trim().length > 0) {\n yield {\n items: [],\n warnings: [factory.responseWarning(incompleteMessage, \"STREAM_ERROR\")],\n };\n }\n}\n\n/** 一次性 complete 守卫:首次成功,后续返回 false。 */\nexport function createCompletionGate(): {\n readonly completed: boolean;\n tryComplete(): boolean;\n} {\n let completed = false;\n return {\n get completed() {\n return completed;\n },\n tryComplete() {\n if (completed) return false;\n completed = true;\n return true;\n },\n };\n}\n","import { AIRequestError } from \"../core/errors.js\";\nimport { contentBlocksToText } from \"./mapping.js\";\n\nimport type { ContentBlock, InstructionBlock, ToolCallItem, ToolChoice, ToolDefinition } from \"../types/index.js\";\n\nexport class NormalizedRequestMapper {\n constructor(readonly kind: string) {}\n\n mapInstructions(instructions: string | InstructionBlock[]): string {\n return typeof instructions === \"string\"\n ? instructions\n : contentBlocksToText(this.ensureTextBlocks(instructions, \"instructions\"));\n }\n\n ensureTextBlocks(blocks: ContentBlock[], field: string): ContentBlock[] {\n return this.ensureBlocks(blocks, field, [\"text\", \"json\"], \"only text/json blocks are supported\");\n }\n\n ensureReasoningBlocks(blocks: ContentBlock[], field: string): Array<Extract<ContentBlock, { type: \"text\" }>> {\n return this.ensureBlocks(blocks, field, [\"text\"], \"reasoning only supports text blocks\") as Array<\n Extract<ContentBlock, { type: \"text\" }>\n >;\n }\n\n /** ensureTextBlocks + contentBlocksToText 的常见组合。 */\n textFromBlocks(blocks: ContentBlock[], field: string): string {\n return contentBlocksToText(this.ensureTextBlocks(blocks, field));\n }\n\n parseToolArguments(item: ToolCallItem): Record<string, unknown> {\n try {\n const parsed: unknown = JSON.parse(item.argumentsText);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // handled below\n }\n\n throw new AIRequestError(\n `${this.kind} requires tool_call argumentsText to be a valid JSON object`,\n \"TOOL_CALL_ARGUMENTS_INVALID\",\n );\n }\n\n rollbackTrailingAssistantMessages<T extends { role: string }>(messages: T[]): void {\n while (messages.length > 0 && messages[messages.length - 1]?.role === \"assistant\") {\n messages.pop();\n }\n }\n\n mapToolsIfPresent<T>(tools: ToolDefinition[] | undefined, map: (tool: ToolDefinition) => T): T[] | undefined {\n if (!tools || tools.length === 0) return undefined;\n return tools.map(map);\n }\n\n /**\n * 将 canonical toolChoice 映射为 provider 形状。\n * 返回 undefined 表示调用方无需写入 body 字段。\n */\n mapToolChoice<T>(\n toolChoice: ToolChoice | undefined,\n mappers: {\n auto: T;\n none: T;\n tool: (name: string) => T;\n },\n ): T | undefined {\n if (!toolChoice) return undefined;\n if (toolChoice === \"auto\") return mappers.auto;\n if (toolChoice === \"none\") return mappers.none;\n if (toolChoice.type === \"tool\") return mappers.tool(toolChoice.name);\n return undefined;\n }\n\n private ensureBlocks(\n blocks: ContentBlock[],\n field: string,\n supportedTypes: ReadonlyArray<ContentBlock[\"type\"]>,\n description: string,\n ): ContentBlock[] {\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i];\n if (block && !supportedTypes.includes(block.type)) {\n throw new AIRequestError(\n `${this.kind} does not support ${field}[${i}] of type \"${block.type}\"; ${description}`,\n \"UNSUPPORTED_CONTENT_BLOCK\",\n );\n }\n }\n\n return blocks;\n }\n}\n","/**\n * Responses Adapter\n *\n * 接入 OpenAI Responses API (responses 端点)。\n * 职责分层:\n * 1. buildRequest — 将 NormalizedRequest 转换为 Responses API 请求\n * 2. runStream — 调用 API、解析 SSE、发射 canonical 事件\n *\n * 支持消息流 / reasoning 流 / tool_call 流及高保真 replay。\n */\n\nimport { AdapterBase } from \"../helpers/adapter-base.js\";\nimport { AIRequestError } from \"../core/errors.js\";\nimport {\n textBlock,\n messageItem,\n reasoningItem,\n toolCallItem,\n opaqueItem,\n replayFromOutput,\n} from \"../helpers/mapping.js\";\nimport { assertOpaqueReplayEnvelope } from \"../helpers/adapter-security.js\";\nimport { usageFromOpenAIResponses } from \"../helpers/usage-mapping.js\";\nimport {\n NormalizedRequestMapper,\n createSseJsonParser,\n openProviderJsonStream,\n iterateProviderStreamBatches,\n createCompletionGate,\n} from \"../helpers/index.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, EventFactory, OutputItem, FetchFn } from \"../index.js\";\n\n// ── 类型 ──────────────────────────────────────────────────────\n\nexport type ResponsesAdapterOptions = {\n apiKey: string;\n baseUrl?: string;\n /** 可注入自定义 fetch 实现(用于测试/代理) */\n fetch?: FetchFn;\n};\n\n// ── Responses API 请求类型 ────────────────────────────────────\n\ntype ResponsesAPIRequest = {\n model: string;\n input: ResponsesInputItem[];\n instructions?: string;\n tools?: ResponsesTool[];\n tool_choice?: \"auto\" | \"none\" | { type: \"function\"; name: string };\n metadata?: Record<string, string>;\n temperature?: number;\n max_output_tokens?: number;\n stream: true;\n};\n\ntype ResponsesInputItem =\n | { type: \"message\"; role: \"user\" | \"assistant\"; content: string }\n | { type: \"message\"; role: \"assistant\"; content: ResponsesContentBlock[] }\n | { type: \"function_call\"; id: string; name: string; arguments: string; call_id?: string }\n | { type: \"function_call_output\"; call_id: string; output: string }\n | { type: \"reasoning\"; content: ResponsesContentBlock[] }\n | { type: \"item_reference\"; id: string };\n\ntype ResponsesContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"reasoning\"; text: string }\n | { type: \"refusal\"; refusal: string };\n\ntype ResponsesTool = {\n type: \"function\";\n name: string;\n description?: string;\n parameters: Record<string, unknown>;\n};\n\nconst mapper = new NormalizedRequestMapper(\"responses\");\n\n// ── SSE 事件类型 ──────────────────────────────────────────────\n\ntype ResponsesSSEEvent =\n | { type: \"response.output_item.added\"; data: { item: { id: string; type: string; [key: string]: unknown } } }\n | { type: \"response.output_text.delta\"; data: { item_id: string; delta: string } }\n | { type: \"response.output_text.done\"; data: { item_id: string; text: string } }\n | { type: \"response.reasoning.delta\"; data: { item_id: string; delta: string } }\n | { type: \"response.reasoning.done\"; data: { item_id: string; text: string } }\n | { type: \"response.function_call_arguments.delta\"; data: { item_id: string; delta: string } }\n | { type: \"response.function_call_arguments.done\"; data: { item_id: string; arguments: string } }\n | { type: \"response.completed\"; data: { response: ResponsesAPIResponse } }\n | { type: \"response.failed\"; data: { response: ResponsesAPIResponse } }\n | { type: \"response.incomplete\"; data: { response: ResponsesAPIResponse } }\n | { type: \"error\"; data: { message: string; code?: string } }\n | { type: string; data: Record<string, unknown> };\n\n/** 已处理或可安全忽略的 Responses SSE 类型(未知类型会 warning 一次)。 */\nconst KNOWN_RESPONSES_SSE_TYPES = new Set([\n \"response.output_item.added\",\n \"response.output_item.done\",\n \"response.output_text.delta\",\n \"response.output_text.done\",\n \"response.reasoning.delta\",\n \"response.reasoning.done\",\n \"response.function_call_arguments.delta\",\n \"response.function_call_arguments.done\",\n \"response.content_part.added\",\n \"response.content_part.done\",\n \"response.refusal.delta\",\n \"response.refusal.done\",\n \"response.in_progress\",\n \"response.created\",\n \"response.completed\",\n \"response.failed\",\n \"response.incomplete\",\n \"error\",\n]);\n\ntype ResponsesAPIResponse = {\n id: string;\n model: string;\n output: ResponsesAPIOutputItem[];\n status?: \"completed\" | \"failed\" | \"in_progress\" | \"cancelled\" | \"queued\" | \"incomplete\" | string;\n incomplete_details?: { reason?: string | null } | null;\n error?: { message?: string; code?: string } | null;\n failure?: { message?: string; code?: string } | null;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n};\n\ntype ResponsesAPIOutputItem = {\n id: string;\n type: \"message\" | \"reasoning\" | \"function_call\";\n role?: string;\n content?: ResponsesContentBlock[];\n name?: string;\n arguments?: string;\n status?: string;\n};\n\nfunction isReplayCanonicalInput(item: ResponsesInputItem): boolean {\n return (\n (item.type === \"message\" && item.role === \"assistant\") || item.type === \"reasoning\" || item.type === \"function_call\"\n );\n}\n\nfunction hasReplayCanonicalInput(input: ResponsesInputItem[]): boolean {\n return input.some(isReplayCanonicalInput);\n}\n\nfunction extractFailureMessage(response: ResponsesAPIResponse): string {\n return response.error?.message ?? response.failure?.message ?? \"unknown\";\n}\n\n// ── Content block 映射 ─────────────────────────────────────────\n\nfunction canonicalToResponsesBlock(b: import(\"../index.js\").ContentBlock): ResponsesContentBlock {\n if (b.type === \"text\") return { type: \"text\", text: b.text };\n if (b.type === \"json\") return { type: \"text\", text: JSON.stringify(b.json) };\n throw new AIRequestError(\n `responses does not support content block type \"${b.type}\" in canonical mapping`,\n \"UNSUPPORTED_CONTENT_BLOCK\",\n );\n}\n\n// ── Adapter ───────────────────────────────────────────────────\n\nexport class ResponsesAdapter extends AdapterBase {\n readonly kind = \"responses\" as const;\n readonly isSyntheticStream = false;\n\n private apiKey: string;\n private baseUrl: string;\n private fetchFn: FetchFn;\n\n constructor(options: ResponsesAdapterOptions) {\n super();\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://api.openai.com/v1\";\n this.fetchFn = options.fetch ?? globalThis.fetch;\n }\n\n // ── buildRequest ──────────────────────────────────────────\n\n protected buildRequest(request: NormalizedRequest): ResponsesAPIRequest {\n const input: ResponsesInputItem[] = [];\n\n for (const item of request.input) {\n switch (item.type) {\n case \"message\": {\n // Responses API 中只有 assistant 角色支持 content blocks\n if (item.role === \"assistant\") {\n const blocks = mapper\n .ensureTextBlocks(item.content, `assistant message (${item.role}) content`)\n .map(canonicalToResponsesBlock);\n input.push({ type: \"message\", role: item.role, content: blocks });\n } else {\n input.push({\n type: \"message\",\n role: item.role,\n content: mapper.textFromBlocks(item.content, `input message (${item.role}) content`),\n });\n }\n break;\n }\n case \"reasoning\": {\n const blocks = mapper\n .ensureReasoningBlocks(item.content, \"reasoning content\")\n .map((b): ResponsesContentBlock => ({ type: \"reasoning\", text: b.text }));\n input.push({ type: \"reasoning\", content: blocks });\n break;\n }\n case \"tool_call\": {\n input.push({\n type: \"function_call\",\n id: item.id,\n name: item.name,\n arguments: item.argumentsText,\n });\n break;\n }\n case \"tool_result\": {\n const output = mapper.textFromBlocks(item.content, `tool_result ${item.callId} content`);\n input.push({\n type: \"function_call_output\",\n call_id: item.callId,\n output,\n });\n break;\n }\n case \"opaque\": {\n // Canonical replay items take priority; item_reference is only a fallback\n // when the consumer kept only the provider continuation id.\n if (item.source !== \"responses\" || item.purpose !== \"replay\") break;\n assertOpaqueReplayEnvelope(item.payload);\n const payload = item.payload as Record<string, unknown>;\n if (\"id\" in payload) {\n if (typeof payload.id !== \"string\" || payload.id.length === 0 || payload.id.length > 256) {\n throw new AIRequestError(\n \"Invalid opaque replay payload: id must be a non-empty string (max 256)\",\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n if (!hasReplayCanonicalInput(input)) {\n input.push({ type: \"item_reference\", id: payload.id });\n }\n }\n break;\n }\n }\n }\n\n const body: ResponsesAPIRequest = {\n model: request.model,\n input,\n stream: true,\n };\n\n if (request.instructions) {\n body.instructions = mapper.mapInstructions(request.instructions);\n }\n\n body.tools = mapper.mapToolsIfPresent(\n request.tools,\n (t): ResponsesTool => ({\n type: \"function\",\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n }),\n );\n\n body.tool_choice = mapper.mapToolChoice<Exclude<ResponsesAPIRequest[\"tool_choice\"], undefined>>(\n request.toolChoice,\n {\n auto: \"auto\",\n none: \"none\",\n tool: (name) => ({ type: \"function\" as const, name }),\n },\n );\n\n if (request.temperature !== undefined) body.temperature = request.temperature;\n if (request.maxOutputTokens !== undefined) body.max_output_tokens = request.maxOutputTokens;\n if (request.metadata) body.metadata = request.metadata;\n\n return body;\n }\n\n // ── runStream ─────────────────────────────────────────────\n\n protected async *runStream(\n providerRequest: ResponsesAPIRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n const auxiliary = this.createAuxiliaryState(request);\n const gate = createCompletionGate();\n\n const { reader } = await openProviderJsonStream({\n fetchFn: this.fetchFn,\n url: `${this.baseUrl}/responses`,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: providerRequest,\n signal: request.signal,\n });\n\n const parser = createSseJsonParser<ResponsesSSEEvent>();\n const output: OutputItem[] = [];\n let completedResponse: ResponsesAPIResponse | undefined;\n let unknownEventsWarned = false;\n const messageItemsWithDelta = new Set<string>();\n const toolCallNames = new Map<string, string>();\n\n for await (const batch of iterateProviderStreamBatches({\n reader,\n parser,\n factory,\n providerLabel: \"Responses\",\n transportLabel: \"SSE event(s)\",\n incompleteMessage: \"Stream ended with an incomplete Responses SSE frame\",\n })) {\n for (const warning of batch.warnings) yield warning;\n\n for (const sseEvent of batch.items) {\n if (sseEvent.type === \"error\") {\n const data = sseEvent.data as { message?: string; code?: string };\n yield factory.responseWarning(data.message ?? \"Provider error event\", data.code);\n continue;\n }\n\n if (sseEvent.type === \"response.output_item.added\") {\n const item = (sseEvent.data as { item: { id: string; type: string; [key: string]: unknown } }).item;\n switch (item.type) {\n case \"message\":\n yield factory.messageStarted(item.id);\n break;\n case \"reasoning\":\n yield factory.reasoningStarted(item.id, \"full\");\n break;\n case \"function_call\": {\n const name = typeof item.name === \"string\" ? item.name : \"unknown\";\n toolCallNames.set(item.id, name);\n yield factory.toolCallStarted(item.id, name);\n break;\n }\n }\n continue;\n }\n\n if (sseEvent.type === \"response.output_text.delta\") {\n const data = sseEvent.data as { item_id: string; delta: string };\n yield factory.messageDelta(data.item_id, textBlock(data.delta));\n messageItemsWithDelta.add(data.item_id);\n continue;\n }\n\n if (sseEvent.type === \"response.output_text.done\") {\n const data = sseEvent.data as { item_id: string; text: string };\n if (!messageItemsWithDelta.has(data.item_id) && data.text) {\n yield factory.messageDelta(data.item_id, textBlock(data.text));\n }\n yield factory.messageCompleted(data.item_id);\n output.push(messageItem([textBlock(data.text)], { id: data.item_id }));\n continue;\n }\n\n if (sseEvent.type === \"response.reasoning.delta\") {\n const data = sseEvent.data as { item_id: string; delta: string };\n yield factory.reasoningDelta(data.item_id, textBlock(data.delta));\n continue;\n }\n\n if (sseEvent.type === \"response.reasoning.done\") {\n const data = sseEvent.data as { item_id: string; text: string };\n yield factory.reasoningCompleted(data.item_id);\n output.push(reasoningItem([textBlock(data.text)], \"full\", data.item_id));\n continue;\n }\n\n if (sseEvent.type === \"response.function_call_arguments.delta\") {\n const data = sseEvent.data as { item_id: string; delta: string };\n if (data.delta) yield factory.toolCallDelta(data.item_id, { argumentsText: data.delta });\n continue;\n }\n\n if (sseEvent.type === \"response.function_call_arguments.done\") {\n const data = sseEvent.data as { item_id: string; arguments: string };\n const tcItem = toolCallItem(data.item_id, toolCallNames.get(data.item_id) ?? \"unknown\", data.arguments);\n yield factory.toolCallCompleted(data.item_id);\n output.push(tcItem);\n continue;\n }\n\n if (\n sseEvent.type === \"response.completed\" ||\n sseEvent.type === \"response.failed\" ||\n sseEvent.type === \"response.incomplete\"\n ) {\n const data = sseEvent.data as { response: ResponsesAPIResponse };\n if (completedResponse) {\n yield factory.responseWarning(\"Duplicate finish signal ignored\", \"DUPLICATE_FINISH\");\n continue;\n }\n\n completedResponse = data.response;\n\n if (sseEvent.type === \"response.failed\") {\n yield factory.responseWarning(\n `Response failed: ${extractFailureMessage(data.response)}`,\n \"PROVIDER_FAILURE\",\n );\n }\n continue;\n }\n\n if (!KNOWN_RESPONSES_SSE_TYPES.has(sseEvent.type) && !unknownEventsWarned) {\n unknownEventsWarned = true;\n yield factory.responseWarning(\n `Responses API sent unknown event type \"${sseEvent.type}\"; this may indicate an incomplete integration`,\n \"UNKNOWN_PROVIDER_EVENT\",\n );\n }\n }\n }\n\n let rawResponseId: string | undefined;\n if (completedResponse) {\n rawResponseId = completedResponse.id;\n if (completedResponse.usage) {\n auxiliary.recordUsage(usageFromOpenAIResponses(completedResponse.usage), \"final\", completedResponse.usage);\n }\n }\n\n const replay = [...replayFromOutput(output)];\n if (completedResponse?.id) {\n replay.push(opaqueItem(\"responses\", \"replay\", { id: completedResponse.id }));\n }\n\n const stopReason = completedResponse ? this.inferStopReason(completedResponse) : undefined;\n\n if (gate.tryComplete()) {\n yield* this.emitStreamCompleted(factory, request, auxiliary, {\n output,\n replay,\n stopReason,\n rawResponseId,\n });\n }\n }\n\n // ── 辅助方法 ──────────────────────────────────────────────\n\n private inferStopReason(response: ResponsesAPIResponse): import(\"../index.js\").StopReason {\n if (response.status === \"failed\") return \"error\";\n\n if (response.status === \"incomplete\") {\n const reason = response.incomplete_details?.reason;\n if (reason === \"content_filter\") return \"content_filter\";\n if (reason === \"max_output_tokens\") return \"max_output_tokens\";\n return \"max_output_tokens\";\n }\n\n const output = response.output;\n if (!output || output.length === 0) {\n return response.status === \"completed\" ? \"end_turn\" : \"unknown\";\n }\n\n const hasFunctionCall = output.some((item) => item.type === \"function_call\");\n if (hasFunctionCall) return \"tool_call\";\n\n const lastItem = output[output.length - 1];\n if (lastItem?.status === \"failed\") return \"error\";\n if (lastItem?.status === \"incomplete\") return \"max_output_tokens\";\n\n return \"end_turn\";\n }\n}\n","/**\n * Messages Adapter\n *\n * 接入 Anthropic Messages API (messages 端点)。\n * 支持:\n * - 文本消息流 (text content block)\n * - 思维链流 (thinking content block)\n * - 工具调用流 (tool_use content block)\n * - 高保真 replay(含 opaque continuation)\n * - 能力降级 warning\n */\n\nimport { AdapterBase } from \"../helpers/adapter-base.js\";\nimport { AIRequestError } from \"../core/errors.js\";\nimport {\n textBlock,\n messageItem,\n reasoningItem,\n toolCallItem,\n opaqueItem,\n replayFromOutput,\n mapStopReason,\n contentBlocksToText,\n} from \"../helpers/mapping.js\";\nimport { assertOpaqueReplayEnvelope } from \"../helpers/adapter-security.js\";\nimport { usageFromAnthropicMessages } from \"../helpers/usage-mapping.js\";\nimport {\n NormalizedRequestMapper,\n createSseJsonParser,\n openProviderJsonStream,\n iterateProviderStreamBatches,\n createCompletionGate,\n} from \"../helpers/index.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, EventFactory, OutputItem, FetchFn } from \"../index.js\";\n\n// ── 类型 ──────────────────────────────────────────────────────\n\nexport type MessagesAdapterOptions = {\n apiKey: string;\n apiVersion?: string;\n baseUrl?: string;\n /** 可注入自定义 fetch 实现(用于测试/代理) */\n fetch?: FetchFn;\n};\n\n// ── Messages API 请求类型 ────────────────────────────────────\n\ntype MessagesAPIRequest = {\n model: string;\n max_tokens: number;\n messages: MessagesAPIMessage[];\n system?: string;\n tools?: MessagesAPITool[];\n tool_choice?: { type: \"auto\" | \"none\" } | { type: \"tool\"; name: string };\n temperature?: number;\n thinking?: { type: \"enabled\"; budget_tokens: number };\n stream: true;\n};\n\ntype MessagesAPIMessage = {\n role: \"user\" | \"assistant\";\n content: string | MessagesAPIContentBlock[];\n};\n\ntype MessagesAPIContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"thinking\"; thinking: string; signature?: string }\n | { type: \"redacted_thinking\"; data: string }\n | { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> }\n | { type: \"tool_result\"; tool_use_id: string; content: string | MessagesAPIContentBlock[]; is_error?: boolean };\n\ntype MessagesAPITool = {\n name: string;\n description?: string;\n input_schema: Record<string, unknown>;\n};\n\nconst mapper = new NormalizedRequestMapper(\"messages\");\n\nfunction isMessagesReplayContentBlock(value: unknown): value is MessagesAPIContentBlock {\n if (!value || typeof value !== \"object\" || !(\"type\" in value)) return false;\n const block = value as Record<string, unknown>;\n switch (block.type) {\n case \"text\":\n return typeof block.text === \"string\";\n case \"thinking\":\n return (\n typeof block.thinking === \"string\" && (block.signature === undefined || typeof block.signature === \"string\")\n );\n case \"redacted_thinking\":\n return typeof block.data === \"string\";\n case \"tool_use\":\n return (\n typeof block.id === \"string\" &&\n typeof block.name === \"string\" &&\n !!block.input &&\n typeof block.input === \"object\" &&\n !Array.isArray(block.input)\n );\n case \"tool_result\": {\n if (typeof block.tool_use_id !== \"string\") return false;\n if (block.is_error !== undefined && typeof block.is_error !== \"boolean\") return false;\n if (typeof block.content === \"string\") return true;\n if (!Array.isArray(block.content)) return false;\n return block.content.every(isMessagesReplayContentBlock);\n }\n default:\n return false;\n }\n}\n\nfunction assertMessagesReplayContent(content: unknown): asserts content is MessagesAPIContentBlock[] {\n if (!Array.isArray(content)) {\n throw new AIRequestError(\"Invalid opaque replay payload: content must be an array\", \"INVALID_OPAQUE_REPLAY\");\n }\n for (let i = 0; i < content.length; i++) {\n if (!isMessagesReplayContentBlock(content[i])) {\n throw new AIRequestError(\n `Invalid opaque replay payload: content[${i}] is not a valid Messages content block`,\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n }\n}\n\n// ── SSE 事件类型 ──────────────────────────────────────────────\n\ntype MessagesSSEEvent =\n | { type: \"message_start\"; data: { message: MessagesAPIMessageResponse } }\n | { type: \"content_block_start\"; data: { index: number; content_block: { type: string; [key: string]: unknown } } }\n | { type: \"content_block_delta\"; data: { index: number; delta: { type: string; [key: string]: unknown } } }\n | { type: \"content_block_stop\"; data: { index: number } }\n | {\n type: \"message_delta\";\n data: {\n delta: { stop_reason?: string; 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 | { type: \"message_stop\"; data: Record<string, never> }\n | { type: \"ping\"; data: Record<string, never> }\n | { type: \"error\"; data: { error: { type: string; message: string } } };\n\ntype MessagesAPIMessageResponse = {\n id: string;\n type: string;\n role: \"assistant\";\n model: string;\n content: MessagesAPIContentBlock[];\n stop_reason?: \"end_turn\" | \"max_tokens\" | \"tool_use\" | string;\n stop_sequence?: string | null;\n usage: { input_tokens: number; output_tokens: number };\n};\n\n/** 用 response 级别的命名空间合成 content block 的 item ID,避免多轮工具循环 ID 碰撞 */\nfunction synthesizeItemId(kind: \"msg\" | \"reason\" | \"reason-redacted\", blockIndex: number, responseId: string): string {\n return `${kind}-${blockIndex}-${responseId}`;\n}\n\nfunction parseProviderToolUseInput(input: string): Record<string, unknown> {\n try {\n const parsed: unknown = JSON.parse(input);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed) ? (parsed as Record<string, unknown>) : {};\n } catch {\n return {};\n }\n}\n\n// ── Content block 映射 ─────────────────────────────────────────\n\nfunction canonicalToMessagesBlock(b: import(\"../index.js\").ContentBlock): MessagesAPIContentBlock {\n if (b.type === \"text\") return { type: \"text\", text: b.text };\n if (b.type === \"json\") return { type: \"text\", text: JSON.stringify(b.json) };\n throw new AIRequestError(\n `messages does not support content block type \"${b.type}\" in canonical mapping`,\n \"UNSUPPORTED_CONTENT_BLOCK\",\n );\n}\n\nfunction pickProviderHeaders(headers: Headers): Record<string, string> {\n const metadata: Record<string, string> = {};\n\n headers.forEach((value, key) => {\n const normalizedKey = key.toLowerCase();\n if (\n normalizedKey === \"request-id\" ||\n normalizedKey === \"x-request-id\" ||\n normalizedKey === \"anthropic-organization-id\" ||\n normalizedKey === \"anthropic-beta\" ||\n normalizedKey === \"retry-after\" ||\n normalizedKey.startsWith(\"anthropic-ratelimit-\")\n ) {\n metadata[normalizedKey] = value;\n }\n });\n\n return metadata;\n}\n\nfunction buildStreamMetadata(options: {\n apiVersion: string;\n message?: MessagesAPIMessageResponse;\n stopReason?: string;\n stopSequence?: string | null;\n}): Record<string, unknown> {\n const { apiVersion, message, stopReason, stopSequence } = options;\n const metadata: Record<string, unknown> = {\n apiVersion,\n };\n\n if (message) {\n metadata.message = {\n id: message.id,\n type: message.type,\n role: message.role,\n model: message.model,\n };\n }\n\n if (stopReason !== undefined || stopSequence !== undefined) {\n metadata.stop = {\n reason: stopReason,\n sequence: stopSequence,\n };\n }\n\n return metadata;\n}\n\n// ── Adapter ───────────────────────────────────────────────────\n\nexport class MessagesAdapter extends AdapterBase {\n readonly kind = \"messages\" as const;\n readonly isSyntheticStream = false;\n\n private apiKey: string;\n private apiVersion: string;\n private baseUrl: string;\n private fetchFn: FetchFn;\n\n constructor(options: MessagesAdapterOptions) {\n super();\n this.apiKey = options.apiKey;\n this.apiVersion = options.apiVersion ?? \"2023-06-01\";\n this.baseUrl = options.baseUrl ?? \"https://api.anthropic.com/v1\";\n this.fetchFn = options.fetch ?? globalThis.fetch;\n }\n\n // ── buildRequest ──────────────────────────────────────────\n\n protected buildRequest(request: NormalizedRequest): MessagesAPIRequest {\n const messages: MessagesAPIMessage[] = [];\n let systemPrompt: string | undefined;\n let pendingToolResultMessage: MessagesAPIMessage | undefined;\n\n // 处理 instructions → system prompt\n if (request.instructions) {\n systemPrompt = mapper.mapInstructions(request.instructions);\n }\n\n // 处理 input items\n for (const item of request.input) {\n if (item.type !== \"tool_result\") {\n pendingToolResultMessage = undefined;\n }\n\n switch (item.type) {\n case \"message\": {\n const role = item.role === \"user\" ? \"user\" : \"assistant\";\n const supportedContent = mapper.ensureTextBlocks(item.content, `input message (${item.role}) content`);\n if (supportedContent.length === 1 && supportedContent[0]?.type === \"text\") {\n messages.push({ role, content: supportedContent[0].text });\n } else {\n messages.push({ role, content: supportedContent.map(canonicalToMessagesBlock) });\n }\n break;\n }\n case \"tool_call\": {\n // Anthropic 使用 tool_use block 在 assistant message 中\n const lastMsg = messages[messages.length - 1];\n const toolBlock: MessagesAPIContentBlock = {\n type: \"tool_use\",\n id: item.id,\n name: item.name,\n input: mapper.parseToolArguments(item),\n };\n\n if (lastMsg && lastMsg.role === \"assistant\" && typeof lastMsg.content !== \"string\") {\n lastMsg.content.push(toolBlock);\n } else {\n messages.push({ role: \"assistant\", content: [toolBlock] });\n }\n break;\n }\n case \"tool_result\": {\n const content = mapper.textFromBlocks(item.content, `tool_result ${item.callId} content`);\n const block: MessagesAPIContentBlock = {\n type: \"tool_result\",\n tool_use_id: item.callId,\n content,\n is_error: item.outcome !== \"success\",\n };\n if (pendingToolResultMessage && typeof pendingToolResultMessage.content !== \"string\") {\n pendingToolResultMessage.content.push(block);\n } else {\n pendingToolResultMessage = { role: \"user\", content: [block] };\n messages.push(pendingToolResultMessage);\n }\n break;\n }\n case \"reasoning\": {\n // 将 reasoning item 转为 thinking block 在 assistant message 中\n const text = contentBlocksToText(mapper.ensureReasoningBlocks(item.content, \"reasoning content\"));\n const block: MessagesAPIContentBlock = { type: \"thinking\", thinking: text };\n const lastMsg = messages[messages.length - 1];\n if (lastMsg && lastMsg.role === \"assistant\" && typeof lastMsg.content !== \"string\") {\n lastMsg.content.push(block);\n } else {\n messages.push({ role: \"assistant\", content: [block] });\n }\n break;\n }\n case \"opaque\": {\n // 尝试从 opaque replay item 中提取 assistant message\n if (item.source !== \"messages\" || item.purpose !== \"replay\") break;\n assertOpaqueReplayEnvelope(item.payload);\n const payload = item.payload as Record<string, unknown>;\n if (payload.role === \"assistant\" && \"content\" in payload) {\n assertMessagesReplayContent(payload.content);\n mapper.rollbackTrailingAssistantMessages(messages);\n messages.push({\n role: \"assistant\",\n content: payload.content,\n });\n }\n break;\n }\n }\n }\n\n const body: MessagesAPIRequest = {\n model: request.model,\n max_tokens: request.maxOutputTokens ?? 4096,\n messages,\n stream: true,\n };\n\n if (systemPrompt) body.system = systemPrompt;\n\n body.tools = mapper.mapToolsIfPresent(\n request.tools,\n (t): MessagesAPITool => ({\n name: t.name,\n description: t.description,\n input_schema: t.inputSchema,\n }),\n );\n\n body.tool_choice = mapper.mapToolChoice<Exclude<MessagesAPIRequest[\"tool_choice\"], undefined>>(request.toolChoice, {\n auto: { type: \"auto\" } as const,\n none: { type: \"none\" } as const,\n tool: (name) => ({ type: \"tool\" as const, name }),\n });\n\n if (request.temperature !== undefined) body.temperature = request.temperature;\n\n return body;\n }\n\n // ── runStream ─────────────────────────────────────────────\n\n protected async *runStream(\n providerRequest: MessagesAPIRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n const auxiliary = this.createAuxiliaryState(request);\n const gate = createCompletionGate();\n\n if (request.metadata) {\n yield factory.responseWarning(\n \"Request metadata is not supported by the Messages adapter\",\n \"UNSUPPORTED_METADATA\",\n );\n }\n\n const { reader, headers } = await openProviderJsonStream({\n fetchFn: this.fetchFn,\n url: `${this.baseUrl}/messages`,\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n \"anthropic-version\": this.apiVersion,\n },\n body: providerRequest,\n signal: request.signal,\n });\n\n const parser = createSseJsonParser<MessagesSSEEvent>();\n const output: OutputItem[] = [];\n let messageResponse: MessagesAPIMessageResponse | undefined;\n let currentContentBlockIndex = -1;\n let currentItemType: \"message\" | \"reasoning\" | \"tool_call\" | null = null;\n let currentItemId = \"\";\n let currentToolName = \"\";\n let currentArgsText = \"\";\n let currentThinkingVisibility: \"full\" | \"redacted\" = \"full\";\n const rawReplayContent: MessagesAPIContentBlock[] = [];\n\n let textBuffer = \"\";\n let thinkingBuffer = \"\";\n let argsBuffer = \"\";\n\n let stopReason: string | undefined;\n let stopSequence: string | null | undefined;\n let rawResponseId = \"\";\n\n if (request.include?.providerMetadata !== \"off\") {\n const headerMetadata = pickProviderHeaders(headers);\n auxiliary.recordProviderMetadata(\n \"header\",\n Object.keys(headerMetadata).length > 0 ? { headers: headerMetadata } : undefined,\n );\n }\n\n for await (const batch of iterateProviderStreamBatches({\n reader,\n parser,\n factory,\n providerLabel: \"Messages\",\n transportLabel: \"SSE event(s)\",\n incompleteMessage: \"Stream ended with an incomplete Messages SSE frame\",\n })) {\n for (const warning of batch.warnings) yield warning;\n\n for (const sseEvent of batch.items) {\n switch (sseEvent.type) {\n case \"ping\":\n continue;\n\n case \"error\": {\n const err = sseEvent.data.error;\n yield factory.responseWarning(err.message, err.type);\n continue;\n }\n\n case \"message_start\": {\n messageResponse = sseEvent.data.message;\n rawResponseId = messageResponse.id;\n continue;\n }\n\n case \"content_block_start\": {\n const block = sseEvent.data.content_block;\n currentContentBlockIndex = sseEvent.data.index;\n\n switch (block.type) {\n case \"text\": {\n currentItemType = \"message\";\n currentItemId = synthesizeItemId(\"msg\", currentContentBlockIndex, rawResponseId);\n textBuffer = \"\";\n yield factory.messageStarted(currentItemId);\n break;\n }\n case \"thinking\": {\n currentItemType = \"reasoning\";\n currentItemId = synthesizeItemId(\"reason\", currentContentBlockIndex, rawResponseId);\n currentThinkingVisibility = \"full\";\n thinkingBuffer = \"\";\n yield factory.reasoningStarted(currentItemId, \"full\");\n break;\n }\n case \"redacted_thinking\": {\n currentItemType = \"reasoning\";\n currentItemId = synthesizeItemId(\"reason-redacted\", currentContentBlockIndex, rawResponseId);\n currentThinkingVisibility = \"redacted\";\n const data = (block as unknown as { data: string }).data;\n yield factory.reasoningStarted(currentItemId, \"redacted\");\n yield factory.reasoningDelta(currentItemId, textBlock(data));\n const redactedItem = reasoningItem([textBlock(data)], \"redacted\", currentItemId);\n yield factory.reasoningCompleted(currentItemId);\n output.push(redactedItem);\n rawReplayContent.push({ type: \"redacted_thinking\", data });\n currentItemType = null;\n break;\n }\n case \"tool_use\": {\n const tuBlock = block as unknown as { id: string; name: string };\n currentItemType = \"tool_call\";\n currentItemId = tuBlock.id;\n currentToolName = tuBlock.name;\n currentArgsText = \"\";\n argsBuffer = \"\";\n yield factory.toolCallStarted(currentItemId, currentToolName);\n break;\n }\n }\n continue;\n }\n\n case \"content_block_delta\": {\n const delta = sseEvent.data.delta;\n\n switch (delta.type) {\n case \"text_delta\": {\n if (currentItemType === \"message\" && currentItemId) {\n const txt = (delta as unknown as { text: string }).text;\n textBuffer += txt;\n yield factory.messageDelta(currentItemId, textBlock(txt));\n }\n break;\n }\n case \"thinking_delta\": {\n if (currentItemType === \"reasoning\" && currentItemId) {\n const txt = (delta as unknown as { thinking: string }).thinking;\n thinkingBuffer += txt;\n yield factory.reasoningDelta(currentItemId, textBlock(txt));\n }\n break;\n }\n case \"input_json_delta\": {\n if (currentItemType === \"tool_call\" && currentItemId) {\n const partial = (delta as unknown as { partial_json: string }).partial_json;\n argsBuffer += partial;\n yield factory.toolCallDelta(currentItemId, { argumentsText: partial });\n }\n break;\n }\n }\n continue;\n }\n\n case \"content_block_stop\": {\n if (currentItemType === \"message\" && currentItemId) {\n yield factory.messageCompleted(currentItemId);\n output.push(messageItem([textBlock(textBuffer)], { id: currentItemId }));\n rawReplayContent.push({ type: \"text\", text: textBuffer });\n } else if (currentItemType === \"reasoning\" && currentItemId && currentThinkingVisibility !== \"redacted\") {\n yield factory.reasoningCompleted(currentItemId);\n output.push(reasoningItem([textBlock(thinkingBuffer)], currentThinkingVisibility, currentItemId));\n rawReplayContent.push({ type: \"thinking\", thinking: thinkingBuffer });\n } else if (currentItemType === \"tool_call\" && currentItemId) {\n const tcItem = toolCallItem(currentItemId, currentToolName, currentArgsText || argsBuffer);\n yield factory.toolCallCompleted(currentItemId);\n output.push(tcItem);\n rawReplayContent.push({\n type: \"tool_use\",\n id: currentItemId,\n name: currentToolName,\n input: parseProviderToolUseInput(currentArgsText || argsBuffer),\n });\n }\n\n currentItemType = null;\n currentItemId = \"\";\n continue;\n }\n\n case \"message_delta\": {\n stopReason = sseEvent.data.delta.stop_reason;\n stopSequence = sseEvent.data.delta.stop_sequence;\n const u = sseEvent.data.usage;\n if (u) {\n auxiliary.recordUsage(usageFromAnthropicMessages(u), \"stream\", u);\n }\n continue;\n }\n\n case \"message_stop\": {\n break;\n }\n }\n }\n }\n\n const replay = [...replayFromOutput(output)];\n\n if (messageResponse) {\n const replayContent = rawReplayContent.length > 0 ? rawReplayContent : messageResponse.content;\n replay.push(\n opaqueItem(\"messages\", \"replay\", {\n replaceCanonical: true,\n role: messageResponse.role,\n content: replayContent,\n messageId: messageResponse.id,\n stopReason: stopReason ?? messageResponse.stop_reason,\n }),\n );\n }\n\n if (request.include?.providerMetadata !== \"off\") {\n auxiliary.recordProviderMetadata(\n \"stream\",\n buildStreamMetadata({\n apiVersion: this.apiVersion,\n message: messageResponse,\n stopReason,\n stopSequence,\n }),\n );\n }\n\n if (gate.tryComplete()) {\n yield* this.emitStreamCompleted(factory, request, auxiliary, {\n output,\n replay,\n stopReason: stopReason ? mapStopReason(stopReason) : undefined,\n rawResponseId,\n });\n }\n }\n}\n","/**\n * Chat Completions Adapter\n *\n * 接入 OpenAI Chat Completions API (chat/completions 端点)。\n * 弱能力兼容层:\n * - third-party reasoning 字段仅做 best-effort 提取\n * - 工具调用通常整块到达(非逐 token 流)\n * - replay fidelity 依赖 provider 是否暴露可回放的 assistant turn 字段\n */\n\nimport { AdapterBase } from \"../helpers/adapter-base.js\";\nimport { AIRequestError, WarningCode } from \"../core/errors.js\";\nimport {\n textBlock,\n messageItem,\n reasoningItem,\n toolCallItem,\n opaqueItem,\n replayFromOutput,\n mapStopReason,\n} from \"../helpers/mapping.js\";\nimport { assertOpaqueReplayEnvelope } from \"../helpers/adapter-security.js\";\nimport { usageFromChatCompletions } from \"../helpers/usage-mapping.js\";\nimport {\n NormalizedRequestMapper,\n createChatCompletionsSseParser,\n openProviderJsonStream,\n iterateProviderStreamBatches,\n createCompletionGate,\n} from \"../helpers/index.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, EventFactory, OutputItem, FetchFn, StopReason } from \"../index.js\";\n\n// ── 类型 ──────────────────────────────────────────────────────\n\nexport type ChatCompletionsAdapterOptions = {\n apiKey: string;\n baseUrl?: string;\n fetch?: FetchFn;\n};\n\n// ── Chat API 请求类型 ─────────────────────────────────────────\n\ntype ChatRequest = {\n model: string;\n messages: ChatMessage[];\n tools?: ChatTool[];\n tool_choice?: \"auto\" | \"none\" | { type: \"function\"; function: { name: string } };\n metadata?: Record<string, string>;\n temperature?: number;\n max_tokens?: number;\n stream: true;\n n: 1;\n};\n\ntype ChatMessage = {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | null;\n tool_calls?: ChatToolCall[];\n tool_call_id?: string;\n name?: string;\n [key: string]: unknown;\n};\n\ntype ChatToolCall = {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n};\n\ntype ChatTool = {\n type: \"function\";\n function: { name: string; description?: string; parameters: Record<string, unknown> };\n};\n\n// ── SSE chunk 类型 ────────────────────────────────────────────\n\ntype ChatChunk = {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: ChatChunkChoice[];\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_tokens_details?: { cached_tokens?: number };\n completion_tokens_details?: { reasoning_tokens?: number };\n };\n};\n\ntype ChatChunkChoice = {\n index: number;\n delta: {\n role?: string;\n content?: string | null;\n reasoning?: unknown;\n reasoning_content?: unknown;\n tool_calls?: ChatChunkToolCall[];\n function_call?: { name?: string; arguments?: string };\n [key: string]: unknown;\n };\n finish_reason?: string | null;\n};\n\ntype ChatChunkToolCall = {\n index: number;\n id?: string;\n type?: string;\n function?: { name?: string; arguments?: string };\n};\n\ntype PendingToolCall = {\n id: string;\n name: string;\n args: string;\n};\n\ntype ReasoningFieldName = \"reasoning\" | \"reasoning_content\";\n\nconst REASONING_FIELDS: readonly ReasoningFieldName[] = [\"reasoning_content\", \"reasoning\"];\n\nconst mapper = new NormalizedRequestMapper(\"chat-completions\");\n\nfunction extractReasoningText(value: unknown): string {\n if (typeof value === \"string\") return value;\n\n if (Array.isArray(value)) {\n return value.map(extractReasoningText).join(\"\");\n }\n\n if (value && typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n for (const key of [\"text\", \"content\", \"reasoning\", \"reasoning_content\", \"thinking\", \"value\"]) {\n const nested = extractReasoningText(record[key]);\n if (nested) return nested;\n }\n }\n\n return \"\";\n}\n\nfunction extractReasoningDeltas(delta: ChatChunkChoice[\"delta\"]): Array<{ field: ReasoningFieldName; text: string }> {\n const deltas: Array<{ field: ReasoningFieldName; text: string }> = [];\n\n for (const field of REASONING_FIELDS) {\n const text = extractReasoningText(delta[field]);\n if (text) {\n deltas.push({ field, text });\n }\n }\n\n return deltas;\n}\n\nfunction isChatReplayToolCall(value: unknown): value is ChatToolCall {\n if (!value || typeof value !== \"object\") return false;\n const entry = value as Record<string, unknown>;\n if (typeof entry.id !== \"string\" || entry.type !== \"function\") return false;\n const fn = entry.function;\n if (!fn || typeof fn !== \"object\") return false;\n const f = fn as Record<string, unknown>;\n return typeof f.name === \"string\" && typeof f.arguments === \"string\";\n}\n\nfunction isChatReplayMessage(value: unknown): value is ChatMessage {\n if (!value || typeof value !== \"object\") return false;\n const msg = value as Record<string, unknown>;\n const role = msg.role;\n if (role !== \"system\" && role !== \"user\" && role !== \"assistant\" && role !== \"tool\") {\n return false;\n }\n if (!(msg.content === null || typeof msg.content === \"string\")) {\n return false;\n }\n if (msg.tool_calls !== undefined) {\n if (!Array.isArray(msg.tool_calls) || !msg.tool_calls.every(isChatReplayToolCall)) {\n return false;\n }\n }\n if (msg.tool_call_id !== undefined && typeof msg.tool_call_id !== \"string\") {\n return false;\n }\n if (msg.name !== undefined && typeof msg.name !== \"string\") {\n return false;\n }\n return true;\n}\n\nfunction assertChatReplayMessages(messages: unknown, field: string): asserts messages is ChatMessage[] {\n if (!Array.isArray(messages)) {\n throw new AIRequestError(`Invalid opaque replay payload: ${field} must be an array`, \"INVALID_OPAQUE_REPLAY\");\n }\n for (let i = 0; i < messages.length; i++) {\n if (!isChatReplayMessage(messages[i])) {\n throw new AIRequestError(\n `Invalid opaque replay payload: ${field}[${i}] is not a valid chat message`,\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n }\n}\n\nfunction buildAssistantReplayMessage(params: {\n content: string;\n reasoningByField: ReadonlyMap<ReasoningFieldName, string>;\n toolCalls: readonly PendingToolCall[];\n}): ChatMessage | null {\n const { content, reasoningByField, toolCalls } = params;\n if (!content && reasoningByField.size === 0 && toolCalls.length === 0) return null;\n\n const replayMessage: ChatMessage = {\n role: \"assistant\",\n content: content || null,\n };\n\n for (const [field, text] of reasoningByField) {\n replayMessage[field] = text;\n }\n\n if (toolCalls.length > 0) {\n replayMessage.tool_calls = toolCalls.map((toolCall) => ({\n id: toolCall.id,\n type: \"function\",\n function: {\n name: toolCall.name,\n arguments: toolCall.args,\n },\n }));\n }\n\n return replayMessage;\n}\n\n// ── Adapter ───────────────────────────────────────────────────\n\nexport class ChatCompletionsAdapter extends AdapterBase {\n readonly kind = \"chat-completions\" as const;\n readonly isSyntheticStream = false;\n\n private apiKey: string;\n private baseUrl: string;\n private fetchFn: FetchFn;\n\n constructor(options: ChatCompletionsAdapterOptions) {\n super();\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://api.openai.com/v1\";\n this.fetchFn = options.fetch ?? globalThis.fetch;\n }\n\n // ── buildRequest ──────────────────────────────────────────\n\n protected buildRequest(request: NormalizedRequest): ChatRequest {\n const messages: ChatMessage[] = [];\n\n // handle instructions → system message\n if (request.instructions) {\n messages.push({ role: \"system\", content: mapper.mapInstructions(request.instructions) });\n }\n\n for (const item of request.input) {\n switch (item.type) {\n case \"message\": {\n const role = item.role;\n const text = mapper.textFromBlocks(item.content, `input message (${item.role}) content`);\n messages.push({ role, content: text || null });\n break;\n }\n case \"tool_call\": {\n // 只允许附着到尾部 assistant turn,否则新建一个\n const lastAssistant =\n messages.length > 0 && messages[messages.length - 1]?.role === \"assistant\"\n ? messages[messages.length - 1]\n : null;\n const tc: ChatToolCall = {\n id: item.id,\n type: \"function\",\n function: { name: item.name, arguments: item.argumentsText },\n };\n if (lastAssistant) {\n lastAssistant.tool_calls = [...(lastAssistant.tool_calls ?? []), tc];\n } else {\n messages.push({ role: \"assistant\", content: null, tool_calls: [tc] });\n }\n break;\n }\n case \"tool_result\": {\n messages.push({\n role: \"tool\",\n tool_call_id: item.callId,\n name: item.toolName,\n content: mapper.textFromBlocks(item.content, `tool_result ${item.callId} content`),\n });\n break;\n }\n case \"reasoning\": {\n // chat.completions doesn't support reasoning items in input\n // Convert to a text message for best-effort\n messages.push({\n role: \"assistant\",\n content: mapper.textFromBlocks(item.content, \"reasoning content\"),\n });\n break;\n }\n case \"opaque\": {\n // Try to restore from opaque replay\n if (item.source !== \"chat.completions\" || item.purpose !== \"replay\") break;\n assertOpaqueReplayEnvelope(item.payload);\n const payload = item.payload as Record<string, unknown>;\n if (payload.role === \"assistant\" && typeof payload.content === \"string\") {\n messages.push({ role: \"assistant\", content: payload.content });\n } else if (payload.replaceCanonical === true && \"messages\" in payload) {\n assertChatReplayMessages(payload.messages, \"messages\");\n mapper.rollbackTrailingAssistantMessages(messages);\n for (const m of payload.messages) {\n messages.push(m);\n }\n } else if (\"messages\" in payload) {\n assertChatReplayMessages(payload.messages, \"messages\");\n for (const m of payload.messages) {\n messages.push(m);\n }\n }\n break;\n }\n }\n }\n\n const body: ChatRequest = {\n model: request.model,\n messages,\n stream: true,\n n: 1,\n };\n\n body.tools = mapper.mapToolsIfPresent(\n request.tools,\n (t): ChatTool => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema as Record<string, unknown>,\n },\n }),\n );\n\n body.tool_choice = mapper.mapToolChoice<Exclude<ChatRequest[\"tool_choice\"], undefined>>(request.toolChoice, {\n auto: \"auto\",\n none: \"none\",\n tool: (name) => ({ type: \"function\" as const, function: { name } }),\n });\n\n if (request.temperature !== undefined) body.temperature = request.temperature;\n if (request.maxOutputTokens !== undefined) body.max_tokens = request.maxOutputTokens;\n if (request.metadata) body.metadata = request.metadata;\n\n return body;\n }\n\n // ── runStream ─────────────────────────────────────────────\n\n protected async *runStream(\n providerRequest: ChatRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n const auxiliary = this.createAuxiliaryState(request);\n const gate = createCompletionGate();\n\n const { reader } = await openProviderJsonStream({\n fetchFn: this.fetchFn,\n url: `${this.baseUrl}/chat/completions`,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: providerRequest,\n signal: request.signal,\n });\n\n const parser = createChatCompletionsSseParser<ChatChunk>();\n const output: OutputItem[] = [];\n\n // 累积状态 — 支持多 choice,此处只取 index 0\n let responseId: string | undefined;\n let accumulatedContent = \"\";\n let accumulatedReasoning = \"\";\n let currentMessageId = \"\";\n let currentReasoningId = \"\";\n let hasMessageStarted = false;\n let hasReasoningStarted = false;\n let warnedNonZeroChoice = false;\n\n // tool_calls 累积: tool call index → { id, name, args }\n const pendingToolCalls = new Map<number, PendingToolCall>();\n const reasoningByField = new Map<ReasoningFieldName, string>();\n\n const finalizePendingTurn = (): { events: AIStreamEvent[]; assistantReplayMessage: ChatMessage | null } => {\n const events: AIStreamEvent[] = [];\n const finalizedToolCalls = [...pendingToolCalls.values()];\n const finalizedReasoningByField = new Map(reasoningByField);\n\n if (hasReasoningStarted && accumulatedReasoning) {\n const reasoning = reasoningItem([textBlock(accumulatedReasoning)], \"full\", currentReasoningId);\n events.push(factory.reasoningCompleted(currentReasoningId));\n output.push(reasoning);\n }\n\n if (hasMessageStarted) {\n const message = messageItem([textBlock(accumulatedContent)], { id: currentMessageId });\n events.push(factory.messageCompleted(currentMessageId));\n output.push(message);\n }\n\n for (const pending of finalizedToolCalls) {\n const toolCall = toolCallItem(pending.id, pending.name, pending.args);\n events.push(factory.toolCallCompleted(pending.id));\n output.push(toolCall);\n }\n\n const assistantReplayMessage = buildAssistantReplayMessage({\n content: accumulatedContent,\n reasoningByField: finalizedReasoningByField,\n toolCalls: finalizedToolCalls,\n });\n\n accumulatedContent = \"\";\n accumulatedReasoning = \"\";\n currentMessageId = \"\";\n currentReasoningId = \"\";\n hasMessageStarted = false;\n hasReasoningStarted = false;\n pendingToolCalls.clear();\n reasoningByField.clear();\n\n return { events, assistantReplayMessage };\n };\n\n const emitCompleted = async function* (\n this: ChatCompletionsAdapter,\n stopReason: StopReason | undefined,\n assistantReplayMessage: ChatMessage | null,\n rawResponseId: string | undefined,\n ): AsyncIterable<AIStreamEvent> {\n if (!gate.tryComplete()) {\n yield factory.responseWarning(\"Duplicate finish signal ignored\", \"DUPLICATE_FINISH\");\n return;\n }\n\n const replay = [...replayFromOutput(output)];\n if (assistantReplayMessage) {\n replay.push(\n opaqueItem(\"chat.completions\", \"replay\", {\n replaceCanonical: true,\n messages: [assistantReplayMessage],\n }),\n );\n }\n\n yield* this.emitStreamCompleted(factory, request, auxiliary, {\n output,\n replay,\n stopReason,\n rawResponseId,\n });\n }.bind(this);\n\n for await (const batch of iterateProviderStreamBatches({\n reader,\n parser,\n factory,\n providerLabel: \"Chat Completions\",\n transportLabel: \"SSE event(s)\",\n incompleteMessage: \"Stream ended with an incomplete Chat Completions SSE frame\",\n })) {\n for (const warning of batch.warnings) yield warning;\n\n for (const chunk of batch.items) {\n responseId = chunk.id;\n\n if (chunk.usage) {\n auxiliary.recordUsage(usageFromChatCompletions(chunk.usage), \"final\", chunk.usage);\n }\n\n for (const choice of chunk.choices) {\n if (choice.index !== 0) {\n if (!warnedNonZeroChoice) {\n yield factory.responseWarning(\n `Chat Completions returned choice index ${choice.index}; only the first choice (index 0) is supported. This choice is ignored.`,\n \"MULTIPLE_CHOICES_IGNORED\",\n );\n warnedNonZeroChoice = true;\n }\n continue;\n }\n\n if (gate.completed) {\n if (choice.finish_reason) {\n yield factory.responseWarning(\"Duplicate finish signal ignored\", \"DUPLICATE_FINISH\");\n }\n continue;\n }\n\n const delta = choice.delta;\n const finishReason = choice.finish_reason;\n const reasoningDeltas = extractReasoningDeltas(delta);\n\n const ensureMessageStarted = (): void => {\n if (hasMessageStarted) return;\n currentMessageId = `msg-${chunk.id}`;\n hasMessageStarted = true;\n accumulatedContent = \"\";\n };\n\n if (reasoningDeltas.length > 0) {\n if (!hasReasoningStarted) {\n currentReasoningId = `reason-${chunk.id}`;\n hasReasoningStarted = true;\n accumulatedReasoning = \"\";\n yield factory.reasoningStarted(currentReasoningId, \"full\");\n }\n\n for (const reasoningDelta of reasoningDeltas) {\n accumulatedReasoning += reasoningDelta.text;\n reasoningByField.set(\n reasoningDelta.field,\n (reasoningByField.get(reasoningDelta.field) ?? \"\") + reasoningDelta.text,\n );\n yield factory.reasoningDelta(currentReasoningId, textBlock(reasoningDelta.text));\n }\n }\n\n if (delta.content) {\n if (!hasMessageStarted) {\n ensureMessageStarted();\n yield factory.messageStarted(currentMessageId);\n }\n accumulatedContent += delta.content;\n yield factory.messageDelta(currentMessageId, textBlock(delta.content));\n }\n\n if (delta.tool_calls) {\n if (!hasMessageStarted) {\n ensureMessageStarted();\n yield factory.messageStarted(currentMessageId);\n }\n\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n\n if (tc.id) {\n pendingToolCalls.set(idx, { id: tc.id, name: tc.function?.name ?? \"\", args: \"\" });\n yield factory.toolCallStarted(tc.id, tc.function?.name ?? \"\");\n }\n\n if (tc.function?.arguments) {\n const pending = pendingToolCalls.get(idx);\n if (pending) {\n pending.args += tc.function.arguments;\n yield factory.toolCallDelta(pending.id, { argumentsText: tc.function.arguments });\n }\n }\n }\n }\n\n if (delta.function_call) {\n if (!hasMessageStarted) {\n ensureMessageStarted();\n yield factory.messageStarted(currentMessageId);\n }\n\n if (delta.function_call.name) {\n const fcId = `fc-${chunk.id}-0`;\n pendingToolCalls.set(0, { id: fcId, name: delta.function_call.name, args: \"\" });\n yield factory.toolCallStarted(fcId, delta.function_call.name);\n }\n if (delta.function_call.arguments) {\n const pending = pendingToolCalls.get(0);\n if (pending) {\n pending.args += delta.function_call.arguments;\n yield factory.toolCallDelta(pending.id, { argumentsText: delta.function_call.arguments });\n }\n }\n }\n\n if (finishReason && finishReason !== null) {\n const { events, assistantReplayMessage } = finalizePendingTurn();\n for (const event of events) yield event;\n yield* emitCompleted(mapStopReason(finishReason), assistantReplayMessage, chunk.id);\n }\n }\n }\n }\n\n if (!gate.completed && (hasMessageStarted || hasReasoningStarted || pendingToolCalls.size > 0)) {\n yield factory.responseWarning(\"Stream ended without a finish_reason\", WarningCode.STREAM_INCOMPLETE);\n const { events, assistantReplayMessage } = finalizePendingTurn();\n for (const event of events) yield event;\n yield* emitCompleted(undefined, assistantReplayMessage, responseId);\n }\n }\n}\n","/**\n * Ollama Adapter\n *\n * 接入 Ollama 原生 Chat API (/api/chat)。\n * 与 Chat Completions 兼容层不同,此处直接使用 Ollama 的 NDJSON 流格式。\n *\n * 能力:\n * - 消息流(完整 content 逐块到达)\n * - 工具调用(整块到达,非逐 token)\n * - 用量信息(仅 prompt_eval_count / eval_count)\n *\n * 限制:\n * - 不流式输出 reasoning(Ollama 原生 API 无独立思考字段)\n * - tool_call 不支持逐 token 流式\n * - replay 保真度低(无 opaque continuation 机制)\n */\n\nimport { AdapterBase } from \"../helpers/adapter-base.js\";\nimport { AIRequestError, WarningCode } from \"../core/errors.js\";\nimport {\n textBlock,\n messageItem,\n toolCallItem,\n opaqueItem,\n replayFromOutput,\n mapStopReason,\n contentBlocksToText,\n} from \"../helpers/mapping.js\";\nimport { assertOpaqueReplayEnvelope } from \"../helpers/adapter-security.js\";\nimport { usageFromOllama } from \"../helpers/usage-mapping.js\";\nimport {\n NormalizedRequestMapper,\n createNdjsonLineParser,\n openProviderJsonStream,\n iterateProviderStreamBatches,\n createCompletionGate,\n} from \"../helpers/index.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, EventFactory, OutputItem, FetchFn, StopReason } from \"../index.js\";\n\n// ── 选项类型 ──────────────────────────────────────────────────\n\nexport type OllamaAdapterOptions = {\n /** Ollama 服务地址,默认 http://localhost:11434 */\n baseUrl?: string;\n /** 可选 API key(用于需要认证的代理场景) */\n apiKey?: string;\n /** 可注入自定义 fetch 实现 */\n fetch?: FetchFn;\n};\n\n// ── Ollama Chat API 类型 ──────────────────────────────────────\n\ntype OllamaChatRequest = {\n model: string;\n messages: OllamaMessage[];\n stream: true;\n tools?: OllamaTool[];\n options?: {\n temperature?: number;\n num_predict?: number;\n [key: string]: unknown;\n };\n};\n\ntype OllamaMessage = {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n images?: string[];\n tool_calls?: OllamaToolCall[];\n};\n\ntype OllamaToolCall = {\n function: {\n name: string;\n arguments: Record<string, unknown>;\n };\n};\n\ntype OllamaTool = {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters: Record<string, unknown>;\n };\n};\n\nconst mapper = new NormalizedRequestMapper(\"ollama\");\n\n// ── Ollama 流式 chunk ─────────────────────────────────────────\n\ntype OllamaChatChunk = {\n model: string;\n created_at: string;\n message: {\n role: string;\n content: string;\n tool_calls?: OllamaToolCall[];\n };\n done: boolean;\n done_reason?: string;\n // 计时与用量(仅 final chunk 有值)\n total_duration?: number;\n load_duration?: number;\n prompt_eval_count?: number;\n prompt_eval_duration?: number;\n eval_count?: number;\n eval_duration?: number;\n};\n\n/** Opaque replay may carry optional local `id`s; wire tool_calls never include them. */\ntype OllamaReplayToolCall = OllamaToolCall & { id?: string };\n\nfunction isOllamaReplayToolCalls(value: unknown): value is OllamaReplayToolCall[] {\n return (\n Array.isArray(value) &&\n value.every((entry) => {\n if (!entry || typeof entry !== \"object\" || !(\"function\" in entry)) return false;\n const fn = (entry as { function?: unknown }).function;\n const id = (entry as { id?: unknown }).id;\n if (id !== undefined && typeof id !== \"string\") return false;\n return (\n !!fn &&\n typeof fn === \"object\" &&\n \"name\" in fn &&\n typeof (fn as { name?: unknown }).name === \"string\" &&\n \"arguments\" in fn &&\n typeof (fn as { arguments?: unknown }).arguments === \"object\" &&\n (fn as { arguments?: unknown }).arguments !== null\n );\n })\n );\n}\n\nfunction toWireOllamaToolCalls(toolCalls: OllamaReplayToolCall[]): OllamaToolCall[] {\n return toolCalls.map((tc) => ({\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n }));\n}\n\n// ── Adapter ───────────────────────────────────────────────────\n\nexport class OllamaAdapter extends AdapterBase {\n readonly kind = \"ollama\" as const;\n readonly isSyntheticStream = false;\n\n private baseUrl: string;\n private apiKey: string | undefined;\n private fetchFn: FetchFn;\n\n constructor(options: OllamaAdapterOptions = {}) {\n super();\n this.baseUrl = options.baseUrl ?? \"http://localhost:11434\";\n this.apiKey = options.apiKey;\n this.fetchFn = options.fetch ?? globalThis.fetch;\n }\n\n // ── buildRequest ──────────────────────────────────────────\n\n protected buildRequest(request: NormalizedRequest): OllamaChatRequest {\n const messages: OllamaMessage[] = [];\n /** Local-only name → call id queue for best-effort tool_result association (not sent to Ollama). */\n const callIdsByName = new Map<string, string[]>();\n\n // handle instructions → system message\n if (request.instructions) {\n messages.push({ role: \"system\", content: mapper.mapInstructions(request.instructions) });\n }\n\n for (const item of request.input) {\n switch (item.type) {\n case \"message\": {\n const role = item.role;\n messages.push({\n role,\n content: mapper.textFromBlocks(item.content, `input message (${item.role}) content`),\n });\n break;\n }\n case \"tool_call\": {\n // Ollama expects tool_calls on the last assistant message\n const lastAssistant = messages.findLast((m) => m.role === \"assistant\");\n const tc: OllamaToolCall = {\n function: {\n name: item.name,\n arguments: mapper.parseToolArguments(item),\n },\n };\n const queue = callIdsByName.get(item.name) ?? [];\n queue.push(item.id);\n callIdsByName.set(item.name, queue);\n if (lastAssistant) {\n lastAssistant.tool_calls = [...(lastAssistant.tool_calls ?? []), tc];\n } else {\n messages.push({ role: \"assistant\", content: \"\", tool_calls: [tc] });\n }\n break;\n }\n case \"tool_result\": {\n // Best-effort: consume matching id from name queue when present (no wire call_id)\n const queue = callIdsByName.get(item.toolName);\n if (queue && queue.length > 0) {\n queue.shift();\n }\n messages.push({\n role: \"tool\",\n content: mapper.textFromBlocks(item.content, `tool_result ${item.callId} content`),\n });\n break;\n }\n case \"reasoning\": {\n // Ollama doesn't support reasoning in input; convert to text message\n messages.push({\n role: \"assistant\",\n content: contentBlocksToText(mapper.ensureReasoningBlocks(item.content, \"reasoning content\")),\n });\n break;\n }\n case \"opaque\": {\n // Best-effort restore from opaque replay (local ids stripped before wire)\n if (item.source !== \"ollama\" || item.purpose !== \"replay\") break;\n assertOpaqueReplayEnvelope(item.payload);\n const payload = item.payload as Record<string, unknown>;\n if (payload.role === \"assistant\" && typeof payload.content === \"string\") {\n mapper.rollbackTrailingAssistantMessages(messages);\n let replayToolCalls: OllamaReplayToolCall[] | undefined;\n if (\"tool_calls\" in payload && payload.tool_calls !== undefined) {\n if (!isOllamaReplayToolCalls(payload.tool_calls)) {\n throw new AIRequestError(\n \"Invalid opaque replay payload: tool_calls is not a valid ollama tool_calls array\",\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n replayToolCalls = payload.tool_calls;\n }\n // Record name → id order for best-effort tool_result correlation (local only)\n if (replayToolCalls) {\n for (const tc of replayToolCalls) {\n if (tc.id) {\n const queue = callIdsByName.get(tc.function.name) ?? [];\n queue.push(tc.id);\n callIdsByName.set(tc.function.name, queue);\n }\n }\n }\n messages.push({\n role: \"assistant\",\n content: payload.content,\n tool_calls: replayToolCalls ? toWireOllamaToolCalls(replayToolCalls) : undefined,\n });\n }\n break;\n }\n }\n }\n\n const body: OllamaChatRequest = {\n model: request.model,\n messages,\n stream: true,\n };\n\n const toolChoice = request.toolChoice;\n const selectedTools =\n toolChoice === \"none\"\n ? []\n : toolChoice && typeof toolChoice === \"object\"\n ? request.tools?.filter((tool) => tool.name === toolChoice.name)\n : request.tools;\n\n if (selectedTools && selectedTools.length > 0) {\n body.tools = selectedTools.map(\n (t): OllamaTool => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema as Record<string, unknown>,\n },\n }),\n );\n }\n\n if (request.temperature !== undefined || request.maxOutputTokens !== undefined) {\n body.options = {};\n if (request.temperature !== undefined) body.options.temperature = request.temperature;\n if (request.maxOutputTokens !== undefined) body.options.num_predict = request.maxOutputTokens;\n }\n\n return body;\n }\n\n // ── runStream ─────────────────────────────────────────────\n\n protected async *runStream(\n providerRequest: OllamaChatRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n const auxiliary = this.createAuxiliaryState(request);\n const gate = createCompletionGate();\n\n if (request.toolChoice && request.toolChoice !== \"auto\") {\n yield factory.responseWarning(\n request.toolChoice === \"none\"\n ? \"Ollama toolChoice none was mapped by omitting tools\"\n : `Ollama cannot force tool choice; only tool \"${request.toolChoice.name}\" was provided as a best-effort constraint`,\n WarningCode.CAPABILITY_DOWNGRADE,\n );\n }\n if (request.metadata) {\n yield factory.responseWarning(\"Request metadata is not supported by the Ollama adapter\", \"UNSUPPORTED_METADATA\");\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const { reader } = await openProviderJsonStream({\n fetchFn: this.fetchFn,\n url: `${this.baseUrl}/api/chat`,\n headers,\n body: providerRequest,\n signal: request.signal,\n });\n\n const parser = createNdjsonLineParser<OllamaChatChunk>(\n (value): value is OllamaChatChunk => !!value && typeof value === \"object\" && \"message\" in value,\n );\n\n const output: OutputItem[] = [];\n let responseId: string | undefined;\n let accumulatedContent = \"\";\n let currentMessageId = \"\";\n let hasMessageStarted = false;\n let pendingToolCalls: Array<{ id: string; name: string; argumentsText: string }> = [];\n let toolCallIndex = 0;\n\n const emitCompleted = async function* (\n this: OllamaAdapter,\n stopReason: StopReason | undefined,\n rawResponseId: string | undefined,\n ): AsyncIterable<AIStreamEvent> {\n if (!gate.tryComplete()) {\n yield factory.responseWarning(\"Duplicate finish signal ignored\", \"DUPLICATE_FINISH\");\n return;\n }\n\n const replay = replayFromOutput(output);\n if (accumulatedContent || pendingToolCalls.length > 0) {\n replay.push(\n opaqueItem(\"ollama\", \"replay\", {\n role: \"assistant\",\n content: accumulatedContent,\n tool_calls: pendingToolCalls.map((tc) => ({\n id: tc.id,\n function: { name: tc.name, arguments: JSON.parse(tc.argumentsText) as Record<string, unknown> },\n })),\n }),\n );\n }\n\n yield* this.emitStreamCompleted(factory, request, auxiliary, {\n output,\n replay,\n stopReason,\n rawResponseId,\n });\n }.bind(this);\n\n for await (const batch of iterateProviderStreamBatches({\n reader,\n parser,\n factory,\n providerLabel: \"Ollama\",\n transportLabel: \"NDJSON line(s)\",\n incompleteMessage: \"Stream ended with an incomplete Ollama NDJSON line\",\n })) {\n for (const warning of batch.warnings) yield warning;\n\n for (const chunk of batch.items) {\n responseId = chunk.created_at;\n\n if (gate.completed) {\n if (chunk.done) {\n yield factory.responseWarning(\"Duplicate finish signal ignored\", \"DUPLICATE_FINISH\");\n }\n continue;\n }\n\n const msg = chunk.message;\n\n if (msg.content) {\n if (!hasMessageStarted) {\n currentMessageId = `msg-${chunk.created_at}`;\n hasMessageStarted = true;\n yield factory.messageStarted(currentMessageId);\n }\n accumulatedContent += msg.content;\n yield factory.messageDelta(currentMessageId, textBlock(msg.content));\n }\n\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n for (const tc of msg.tool_calls) {\n const tcId = `ollama-tc-${request.requestId}-${toolCallIndex++}`;\n const argsText = JSON.stringify(tc.function.arguments);\n pendingToolCalls.push({\n id: tcId,\n name: tc.function.name,\n argumentsText: argsText,\n });\n }\n }\n\n if (chunk.done) {\n if (accumulatedContent === \"\" && pendingToolCalls.length > 0 && !hasMessageStarted) {\n currentMessageId = `msg-${chunk.created_at}`;\n hasMessageStarted = true;\n yield factory.messageStarted(currentMessageId);\n }\n\n if (hasMessageStarted) {\n const message = messageItem([textBlock(accumulatedContent)], { id: currentMessageId });\n yield factory.messageCompleted(currentMessageId);\n if (accumulatedContent) {\n output.push(message);\n }\n }\n\n if (pendingToolCalls.length > 0) {\n yield factory.responseWarning(\n `Ollama delivered ${pendingToolCalls.length} tool call(s) as a batch; tool_call streaming is not supported`,\n WarningCode.TOOL_CALL_BATCHED,\n );\n }\n\n for (const pending of pendingToolCalls) {\n const toolCall = toolCallItem(pending.id, pending.name, pending.argumentsText);\n yield factory.toolCallStarted(pending.id, pending.name);\n yield factory.toolCallDelta(pending.id, { argumentsText: pending.argumentsText });\n yield factory.toolCallCompleted(pending.id);\n output.push(toolCall);\n }\n\n if (\n request.include?.usage !== \"off\" &&\n (chunk.prompt_eval_count !== undefined || chunk.eval_count !== undefined)\n ) {\n auxiliary.recordUsage(\n usageFromOllama({\n prompt_eval_count: chunk.prompt_eval_count,\n eval_count: chunk.eval_count,\n }),\n \"final\",\n {\n prompt_eval_count: chunk.prompt_eval_count,\n eval_count: chunk.eval_count,\n },\n );\n }\n\n const stopReason = chunk.done_reason ? mapStopReason(chunk.done_reason) : undefined;\n yield* emitCompleted(stopReason, chunk.created_at);\n\n accumulatedContent = \"\";\n currentMessageId = \"\";\n hasMessageStarted = false;\n pendingToolCalls = [];\n }\n }\n }\n\n if (!gate.completed && (hasMessageStarted || pendingToolCalls.length > 0)) {\n yield factory.responseWarning(\"Stream ended without a done signal\", WarningCode.STREAM_INCOMPLETE);\n\n if (hasMessageStarted) {\n const message = messageItem([textBlock(accumulatedContent)], { id: currentMessageId });\n yield factory.messageCompleted(currentMessageId);\n if (accumulatedContent) {\n output.push(message);\n }\n }\n\n if (pendingToolCalls.length > 0) {\n yield factory.responseWarning(\n `Ollama delivered ${pendingToolCalls.length} tool call(s) as a batch; tool_call streaming is not supported`,\n WarningCode.TOOL_CALL_BATCHED,\n );\n }\n\n for (const pending of pendingToolCalls) {\n const toolCall = toolCallItem(pending.id, pending.name, pending.argumentsText);\n yield factory.toolCallStarted(pending.id, pending.name);\n yield factory.toolCallDelta(pending.id, { argumentsText: pending.argumentsText });\n yield factory.toolCallCompleted(pending.id);\n output.push(toolCall);\n }\n\n yield* emitCompleted(undefined, responseId);\n }\n }\n}\n","/**\n * Mock Adapter\n *\n * 面向测试的回调驱动 adapter:\n * - 每次请求执行用户提供的 handler\n * - 验证调用方是否正确续接 replay / tool_result\n * - 发出可控的 message / reasoning / tool_call 流\n * - 注入 warning / auxiliary / content_filter / 中断 / provider error\n *\n * 这不是通用“假模型”,而是测试工具调用编排与错误路径的测试夹具。\n */\n\nimport { AIRequestError } from \"../core/errors.js\";\nimport { AdapterBase } from \"../helpers/adapter-base.js\";\nimport { messageItem, reasoningItem, replayFromOutput, textBlock } from \"../helpers/mapping.js\";\n\nimport type {\n AIStreamEvent,\n AuxiliaryInfo,\n BillingInfo,\n ContentBlock,\n EventFactory,\n InputItem,\n MessageItem,\n NormalizedRequest,\n OutputItem,\n ReplayItem,\n StopReason,\n ToolCallItem,\n ToolResultItem,\n Usage,\n} from \"../index.js\";\n\nexport type MockInputExpectation = {\n type: InputItem[\"type\"];\n id?: string;\n role?: MessageItem[\"role\"];\n name?: string;\n toolName?: string;\n callId?: string;\n outcome?: ToolResultItem[\"outcome\"];\n visibility?: Extract<InputItem, { type: \"reasoning\" }>[\"visibility\"];\n source?: Extract<InputItem, { type: \"opaque\" }>[\"source\"];\n purpose?: Extract<InputItem, { type: \"opaque\" }>[\"purpose\"];\n textIncludes?: string;\n};\n\nexport type MockRequestExpectation = {\n minItems?: number;\n maxItems?: number;\n ordered?: boolean;\n requireReplayFromPreviousTurn?: boolean;\n requireToolResultsForPendingCalls?: boolean;\n tools?: \"ignore\" | \"present\" | \"absent\";\n toolChoice?: \"ignore\" | \"present\" | \"absent\";\n items?: MockInputExpectation[];\n};\n\nexport type MockHistoryRecord = {\n turnIndex: number;\n requestId: string;\n replay: ReplayItem[];\n toolCalls: ToolCallItem[];\n};\n\nexport type MockHandlerContext = {\n turnIndex: number;\n previousReplay: ReplayItem[];\n pendingToolCalls: readonly ToolCallItem[];\n history: readonly MockHistoryRecord[];\n /** 请求的 AbortSignal,handler 可检查 signal.aborted 提前退出。 */\n signal?: AbortSignal;\n};\n\nexport type MockWarningStep = {\n type: \"warning\";\n message: string;\n code?: string;\n};\n\nexport type MockAuxiliaryStep = {\n type: \"auxiliary\";\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: Partial<AuxiliaryInfo>;\n};\n\nexport type MockTextStreamOptions = {\n /**\n * 每秒吐出的字符数。未设置时仍会按 chunk 拆分,但不会额外等待。\n */\n charsPerSecond?: number;\n /**\n * 每个 delta 最多包含多少个字符,默认 1。\n */\n chunkSize?: number;\n /**\n * 首个 delta 发出前的延迟。\n */\n initialDelayMs?: number;\n};\n\nexport type MockMessageStep = {\n type: \"message\";\n id?: string;\n content: string | ContentBlock[];\n stream?: MockTextStreamOptions | false;\n};\n\nexport type MockReasoningStep = {\n type: \"reasoning\";\n id?: string;\n visibility?: Extract<OutputItem, { type: \"reasoning\" }>[\"visibility\"];\n content: string | ContentBlock[];\n stream?: MockTextStreamOptions | false;\n};\n\nexport type MockToolCallStep = {\n type: \"tool_call\";\n id: string;\n name: string;\n argumentsText: string;\n streamArguments?: boolean;\n stream?: MockTextStreamOptions | false;\n};\n\nexport type MockOutputStep = {\n type: \"output\";\n item: Extract<OutputItem, { type: \"message\" | \"reasoning\" | \"tool_call\" }>;\n stream?: MockTextStreamOptions | false;\n};\n\nexport type MockCompleteStep = {\n type: \"complete\";\n stopReason?: StopReason;\n replay?: ReplayItem[];\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: Partial<AuxiliaryInfo>;\n providerMetadata?: Record<string, unknown>;\n rawResponseId?: string;\n warnings?: string[];\n};\n\nexport type MockErrorStep = {\n type: \"error\";\n message: string;\n code?: string;\n stopReason?: StopReason;\n providerMetadata?: Record<string, unknown>;\n};\n\nexport type MockInterruptStep = {\n type: \"interrupt\";\n};\n\nexport type MockThrowStep = {\n type: \"throw\";\n error: string | Error;\n};\n\nexport type MockStep =\n | MockWarningStep\n | MockAuxiliaryStep\n | MockMessageStep\n | MockReasoningStep\n | MockToolCallStep\n | MockOutputStep\n | MockCompleteStep\n | MockErrorStep\n | MockInterruptStep\n | MockThrowStep;\n\nexport type MockHandler = (request: NormalizedRequest, context: MockHandlerContext) => AsyncIterable<MockStep>;\n\ntype MockHandlerSource = Iterable<MockStep> | AsyncIterable<MockStep>;\n\nexport type MockStaticHandler = (\n request: NormalizedRequest,\n context: MockHandlerContext,\n) => MockHandlerSource | Promise<MockHandlerSource>;\n\nexport type MockAdapterOptions = {\n handler: MockHandler;\n providerMetadata?: Record<string, unknown>;\n};\n\ntype MockProviderRequest = {\n request: NormalizedRequest;\n handlerResult: AsyncIterable<MockStep>;\n turnIndex: number;\n remainingPendingToolCalls: ToolCallItem[];\n};\n\ntype ResolvedMockTextStreamOptions = {\n charsPerSecond?: number;\n chunkSize: number;\n initialDelayMs: number;\n};\n\nexport function assertMockRequest(\n request: NormalizedRequest,\n expectation: MockRequestExpectation,\n context: MockHandlerContext,\n): void {\n const prefix = `MockAdapter turn ${context.turnIndex + 1} expectation failed`;\n\n if (expectation.minItems !== undefined && request.input.length < expectation.minItems) {\n throw new AIRequestError(\n `${prefix}: expected at least ${expectation.minItems} input item(s)`,\n \"MOCK_EXPECTATION_FAILED\",\n );\n }\n\n if (expectation.maxItems !== undefined && request.input.length > expectation.maxItems) {\n throw new AIRequestError(\n `${prefix}: expected at most ${expectation.maxItems} input item(s)`,\n \"MOCK_EXPECTATION_FAILED\",\n );\n }\n\n if (expectation.tools === \"present\" && (!request.tools || request.tools.length === 0)) {\n throw new AIRequestError(`${prefix}: expected tools to be present`, \"MOCK_EXPECTATION_FAILED\");\n }\n\n if (expectation.tools === \"absent\" && request.tools && request.tools.length > 0) {\n throw new AIRequestError(`${prefix}: expected tools to be absent`, \"MOCK_EXPECTATION_FAILED\");\n }\n\n if (expectation.toolChoice === \"present\" && request.toolChoice === undefined) {\n throw new AIRequestError(`${prefix}: expected toolChoice to be present`, \"MOCK_EXPECTATION_FAILED\");\n }\n\n if (expectation.toolChoice === \"absent\" && request.toolChoice !== undefined) {\n throw new AIRequestError(`${prefix}: expected toolChoice to be absent`, \"MOCK_EXPECTATION_FAILED\");\n }\n\n if (expectation.requireReplayFromPreviousTurn && context.previousReplay.length > 0) {\n assertReplayIncluded(request.input, context.previousReplay, prefix);\n }\n\n if (expectation.requireToolResultsForPendingCalls && context.pendingToolCalls.length > 0) {\n const toolResultIds = new Set(\n request.input.filter((item): item is ToolResultItem => item.type === \"tool_result\").map((item) => item.callId),\n );\n\n for (const call of context.pendingToolCalls) {\n if (!toolResultIds.has(call.id)) {\n throw new AIRequestError(\n `${prefix}: expected tool_result for pending tool call \"${call.id}\"`,\n \"MOCK_EXPECTATION_FAILED\",\n );\n }\n }\n }\n\n if (expectation.items && expectation.items.length > 0) {\n if (expectation.ordered) {\n assertOrderedItems(request.input, expectation.items, prefix);\n } else {\n assertUnorderedItems(request.input, expectation.items, prefix);\n }\n }\n}\n\nexport class MockAdapter extends AdapterBase {\n readonly kind = \"mock\" as const;\n readonly isSyntheticStream = true;\n\n private readonly handler: MockHandler;\n private readonly providerMetadata?: Record<string, unknown>;\n\n private cursor = 0;\n private previousReplay: ReplayItem[] = [];\n private pendingToolCalls: ToolCallItem[] = [];\n private history: MockHistoryRecord[] = [];\n private activeStream = false;\n\n constructor(options: MockAdapterOptions) {\n super();\n this.handler = options.handler;\n this.providerMetadata = options.providerMetadata;\n }\n\n protected async buildRequest(request: NormalizedRequest): Promise<MockProviderRequest> {\n const turnIndex = this.cursor;\n const context = this.buildHandlerContext(turnIndex, request.signal);\n const remainingPendingToolCalls = consumePendingToolCalls(this.pendingToolCalls, request.input);\n const handlerResult = this.handler(request, context);\n\n this.cursor += 1;\n\n return {\n request,\n handlerResult,\n turnIndex,\n remainingPendingToolCalls,\n };\n }\n\n protected async *runStream(\n providerRequest: unknown,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n if (this.activeStream) {\n throw new AIRequestError(\"MockAdapter does not support concurrent streams\", \"MOCK_CONCURRENT_STREAM\");\n }\n\n this.activeStream = true;\n\n try {\n const mockRequest = providerRequest as MockProviderRequest;\n const output: OutputItem[] = [];\n let stepCount = 0;\n\n for await (const step of mockRequest.handlerResult) {\n // 若 signal 已 abort,停止消费 handler 并返回\n if (request.signal?.aborted) return;\n\n stepCount += 1;\n\n switch (step.type) {\n case \"warning\":\n yield factory.responseWarning(step.message, step.code);\n break;\n case \"auxiliary\":\n yield factory.responseAuxiliary({\n usage: step.usage,\n billing: step.billing,\n auxiliary: step.auxiliary,\n });\n break;\n case \"message\": {\n const item = createMessageFromStep(step, request, mockRequest.turnIndex, stepCount - 1);\n yield* emitMessage(factory, item, resolveStepStreamOptions(undefined, step.stream, \"message\"));\n output.push(item);\n break;\n }\n case \"reasoning\": {\n const item = createReasoningFromStep(step, request, mockRequest.turnIndex, stepCount - 1);\n yield* emitReasoning(factory, item, resolveStepStreamOptions(undefined, step.stream, \"reasoning\"));\n output.push(item);\n break;\n }\n case \"tool_call\": {\n const item = createToolCallFromStep(step);\n yield* emitToolCall(\n factory,\n item,\n step.streamArguments ?? true,\n resolveStepStreamOptions(undefined, step.stream, \"tool_call\"),\n );\n output.push(item);\n break;\n }\n case \"output\": {\n assertSupportedOutputItem(step.item);\n const item = attachSyntheticId(step.item, request, mockRequest.turnIndex, stepCount - 1);\n yield* emitOutputItem(factory, item, resolveStepStreamOptions(undefined, step.stream, \"output\"));\n output.push(item);\n break;\n }\n case \"complete\": {\n const finalResponse = this.finalizeTurn(request, factory, mockRequest, output, step, stepCount);\n yield factory.responseCompleted({\n replay: finalResponse.replay,\n stopReason: finalResponse.stopReason,\n trace: finalResponse.backend,\n usage: finalResponse.usage,\n billing: finalResponse.billing,\n auxiliary: finalResponse.auxiliary,\n warnings: finalResponse.warnings,\n });\n return;\n }\n case \"error\": {\n yield factory.responseWarning(step.message, step.code);\n const finalResponse = this.finalizeTurn(\n request,\n factory,\n mockRequest,\n output,\n {\n type: \"complete\",\n stopReason: step.stopReason ?? \"error\",\n providerMetadata: step.providerMetadata,\n },\n stepCount,\n );\n yield factory.responseCompleted({\n replay: finalResponse.replay,\n stopReason: finalResponse.stopReason,\n trace: finalResponse.backend,\n usage: finalResponse.usage,\n billing: finalResponse.billing,\n auxiliary: finalResponse.auxiliary,\n warnings: finalResponse.warnings,\n });\n return;\n }\n case \"interrupt\":\n this.pendingToolCalls = mockRequest.remainingPendingToolCalls;\n return;\n case \"throw\":\n throw typeof step.error === \"string\" ? new Error(step.error) : step.error;\n }\n }\n\n const finalResponse = this.finalizeTurn(\n request,\n factory,\n mockRequest,\n output,\n {\n type: \"complete\",\n },\n stepCount,\n );\n yield factory.responseCompleted({\n replay: finalResponse.replay,\n stopReason: finalResponse.stopReason,\n trace: finalResponse.backend,\n usage: finalResponse.usage,\n billing: finalResponse.billing,\n auxiliary: finalResponse.auxiliary,\n warnings: finalResponse.warnings,\n });\n } finally {\n this.activeStream = false;\n }\n }\n\n private finalizeTurn(\n request: NormalizedRequest,\n factory: EventFactory,\n mockRequest: MockProviderRequest,\n output: OutputItem[],\n completion: MockCompleteStep,\n stepCount: number,\n ) {\n const replay = completion.replay ?? replayFromOutput(output);\n const toolCalls = output.filter((item): item is ToolCallItem => item.type === \"tool_call\");\n\n this.previousReplay = replay;\n this.pendingToolCalls = [...mockRequest.remainingPendingToolCalls, ...toolCalls];\n this.history.push({\n turnIndex: mockRequest.turnIndex,\n requestId: request.requestId,\n replay,\n toolCalls,\n });\n\n return this.buildResponse(\n request,\n {\n output,\n replay,\n stopReason: completion.stopReason ?? resolveStopReason(output),\n usage: completion.usage,\n billing: completion.billing,\n auxiliary: completion.auxiliary,\n providerMetadata: {\n turnIndex: mockRequest.turnIndex,\n stepCount,\n pendingToolCallIds: this.pendingToolCalls.map((item) => item.id),\n historyLength: this.history.length,\n ...this.providerMetadata,\n ...completion.providerMetadata,\n },\n warnings: completion.warnings,\n metadataSources: [\"mock\"],\n rawResponseId: completion.rawResponseId,\n },\n factory,\n );\n }\n\n private buildHandlerContext(turnIndex: number, signal?: AbortSignal): MockHandlerContext {\n return {\n turnIndex,\n previousReplay: this.previousReplay.map(cloneItem),\n pendingToolCalls: this.pendingToolCalls.map(cloneItem),\n history: this.history.map((record) => ({\n ...record,\n replay: record.replay.map(cloneItem),\n toolCalls: record.toolCalls.map(cloneItem),\n })),\n signal,\n };\n }\n}\n\nexport function withMockStreaming(handler: MockStaticHandler, options: MockTextStreamOptions): MockHandler {\n const defaults = resolveMockTextStreamOptions(options, \"mock stream wrapper\");\n if (!defaults) {\n throw new AIRequestError(\"mock stream wrapper requires streaming options\", \"MOCK_STREAM_CONFIG_INVALID\");\n }\n\n return async function* streamWrappedHandler(\n request: NormalizedRequest,\n context: MockHandlerContext,\n ): AsyncIterable<MockStep> {\n const source = await handler(request, context);\n\n for await (const step of source) {\n yield applyDefaultStreaming(step, defaults);\n }\n };\n}\n\nfunction applyDefaultStreaming(step: MockStep, defaults: ResolvedMockTextStreamOptions): MockStep {\n switch (step.type) {\n case \"message\":\n case \"reasoning\":\n case \"tool_call\":\n case \"output\":\n if (step.stream !== undefined) {\n return step;\n }\n return {\n ...step,\n stream: {\n charsPerSecond: defaults.charsPerSecond,\n chunkSize: defaults.chunkSize,\n initialDelayMs: defaults.initialDelayMs,\n },\n };\n default:\n return step;\n }\n}\n\nfunction createMessageFromStep(\n step: MockMessageStep,\n request: NormalizedRequest,\n turnIndex: number,\n stepIndex: number,\n): MessageItem {\n return {\n ...messageItem(normalizeBlocks(step.content), {\n id: step.id ?? `mock-msg-${request.requestId}-${turnIndex}-${stepIndex}`,\n }),\n role: \"assistant\",\n };\n}\n\nfunction createReasoningFromStep(\n step: MockReasoningStep,\n request: NormalizedRequest,\n turnIndex: number,\n stepIndex: number,\n): Extract<OutputItem, { type: \"reasoning\" }> {\n return reasoningItem(\n normalizeBlocks(step.content),\n step.visibility ?? \"full\",\n step.id ?? `mock-reason-${request.requestId}-${turnIndex}-${stepIndex}`,\n );\n}\n\nfunction createToolCallFromStep(step: MockToolCallStep): ToolCallItem {\n return {\n type: \"tool_call\",\n id: step.id,\n name: step.name,\n argumentsText: step.argumentsText,\n };\n}\n\nfunction normalizeBlocks(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === \"string\" ? [textBlock(content)] : content;\n}\n\nfunction assertSupportedOutputItem(item: OutputItem): void {\n if (item.type === \"opaque\") {\n throw new AIRequestError(\n \"MockAdapter does not stream opaque output items; use complete.replay if needed\",\n \"MOCK_OPAQUE_OUTPUT\",\n );\n }\n}\n\nfunction attachSyntheticId(\n item: Extract<OutputItem, { type: \"message\" | \"reasoning\" | \"tool_call\" }>,\n request: NormalizedRequest,\n turnIndex: number,\n stepIndex: number,\n): Extract<OutputItem, { type: \"message\" | \"reasoning\" | \"tool_call\" }> {\n if (item.type === \"message\") {\n return {\n ...item,\n id: item.id ?? `mock-msg-${request.requestId}-${turnIndex}-${stepIndex}`,\n role: \"assistant\",\n };\n }\n\n if (item.type === \"reasoning\") {\n return {\n ...item,\n id: item.id ?? `mock-reason-${request.requestId}-${turnIndex}-${stepIndex}`,\n };\n }\n\n return item;\n}\n\nasync function* emitOutputItem(\n factory: EventFactory,\n item: Extract<OutputItem, { type: \"message\" | \"reasoning\" | \"tool_call\" }>,\n stream?: ResolvedMockTextStreamOptions,\n): AsyncIterable<AIStreamEvent> {\n if (item.type === \"message\") {\n yield* emitMessage(factory, item, stream);\n return;\n }\n\n if (item.type === \"reasoning\") {\n yield* emitReasoning(factory, item, stream);\n return;\n }\n\n yield* emitToolCall(factory, item, true, stream);\n}\n\nasync function* emitMessage(\n factory: EventFactory,\n item: MessageItem,\n stream?: ResolvedMockTextStreamOptions,\n): AsyncIterable<AIStreamEvent> {\n if (!item.id) {\n throw new AIRequestError(\"Mock message output requires an id after normalization\", \"MOCK_MESSAGE_ID_MISSING\");\n }\n\n yield factory.messageStarted(item.id);\n\n let chunkIndex = 0;\n for (const block of item.content) {\n if (block.type === \"text\") {\n for (const chunk of chunkText(block.text, stream)) {\n await delayForChunk(stream, chunkIndex, chunk.length);\n yield factory.messageDelta(item.id, textBlock(chunk));\n chunkIndex += 1;\n }\n } else {\n yield factory.messageDelta(item.id, block);\n }\n }\n\n yield factory.messageCompleted(item.id);\n}\n\nasync function* emitReasoning(\n factory: EventFactory,\n item: Extract<OutputItem, { type: \"reasoning\" }>,\n stream?: ResolvedMockTextStreamOptions,\n): AsyncIterable<AIStreamEvent> {\n if (!item.id) {\n throw new AIRequestError(\"Mock reasoning output requires an id after normalization\", \"MOCK_REASONING_ID_MISSING\");\n }\n\n yield factory.reasoningStarted(item.id, item.visibility);\n\n let chunkIndex = 0;\n for (const block of item.content) {\n if (block.type !== \"text\") {\n yield factory.reasoningDelta(item.id, block);\n continue;\n }\n\n for (const chunk of chunkText(block.text, stream)) {\n await delayForChunk(stream, chunkIndex, chunk.length);\n yield factory.reasoningDelta(item.id, textBlock(chunk));\n chunkIndex += 1;\n }\n }\n\n yield factory.reasoningCompleted(item.id);\n}\n\nasync function* emitToolCall(\n factory: EventFactory,\n item: ToolCallItem,\n streamArguments: boolean,\n stream?: ResolvedMockTextStreamOptions,\n): AsyncIterable<AIStreamEvent> {\n yield factory.toolCallStarted(item.id, item.name);\n\n if (streamArguments && item.argumentsText) {\n let chunkIndex = 0;\n for (const chunk of chunkText(item.argumentsText, stream)) {\n await delayForChunk(stream, chunkIndex, chunk.length);\n yield factory.toolCallDelta(item.id, { argumentsText: chunk });\n chunkIndex += 1;\n }\n }\n\n yield factory.toolCallCompleted(item.id);\n}\n\nfunction resolveStepStreamOptions(\n defaults: ResolvedMockTextStreamOptions | undefined,\n override: MockTextStreamOptions | false | undefined,\n label: string,\n): ResolvedMockTextStreamOptions | undefined {\n if (override === false) {\n return undefined;\n }\n\n return resolveMockTextStreamOptions(override, `${label} stream`, defaults);\n}\n\nfunction resolveMockTextStreamOptions(\n options: MockTextStreamOptions | undefined,\n label: string,\n defaults?: ResolvedMockTextStreamOptions,\n): ResolvedMockTextStreamOptions | undefined {\n if (options === undefined) {\n return defaults;\n }\n\n const chunkSize = options.chunkSize ?? defaults?.chunkSize ?? 1;\n const initialDelayMs = options.initialDelayMs ?? defaults?.initialDelayMs ?? 0;\n const charsPerSecond = options.charsPerSecond ?? defaults?.charsPerSecond;\n\n if (!Number.isInteger(chunkSize) || chunkSize < 1) {\n throw new AIRequestError(`${label}: chunkSize must be a positive integer`, \"MOCK_STREAM_CONFIG_INVALID\");\n }\n\n if (!Number.isFinite(initialDelayMs) || initialDelayMs < 0) {\n throw new AIRequestError(`${label}: initialDelayMs must be a non-negative number`, \"MOCK_STREAM_CONFIG_INVALID\");\n }\n\n if (charsPerSecond !== undefined && (!Number.isFinite(charsPerSecond) || charsPerSecond <= 0)) {\n throw new AIRequestError(`${label}: charsPerSecond must be a positive number`, \"MOCK_STREAM_CONFIG_INVALID\");\n }\n\n return {\n chunkSize,\n initialDelayMs,\n charsPerSecond,\n };\n}\n\nfunction chunkText(text: string, stream?: ResolvedMockTextStreamOptions): string[] {\n if (!text) {\n return [];\n }\n\n if (!stream) {\n return [text];\n }\n\n const chars = Array.from(text);\n const chunks: string[] = [];\n\n for (let index = 0; index < chars.length; index += stream.chunkSize) {\n chunks.push(chars.slice(index, index + stream.chunkSize).join(\"\"));\n }\n\n return chunks;\n}\n\nasync function delayForChunk(\n stream: ResolvedMockTextStreamOptions | undefined,\n chunkIndex: number,\n chunkLength: number,\n): Promise<void> {\n if (!stream) {\n return;\n }\n\n if (chunkIndex === 0 && stream.initialDelayMs > 0) {\n await sleep(stream.initialDelayMs);\n return;\n }\n\n if (chunkIndex > 0 && stream.charsPerSecond !== undefined) {\n await sleep((chunkLength / stream.charsPerSecond) * 1000);\n }\n}\n\nasync function sleep(ms: number): Promise<void> {\n if (ms <= 0) {\n return;\n }\n\n await new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction resolveStopReason(output: OutputItem[]): StopReason {\n return output.some((item) => item.type === \"tool_call\") ? \"tool_call\" : \"end_turn\";\n}\n\nfunction consumePendingToolCalls(pending: readonly ToolCallItem[], input: readonly InputItem[]): ToolCallItem[] {\n const fulfilledIds = new Set(\n input.filter((item): item is ToolResultItem => item.type === \"tool_result\").map((item) => item.callId),\n );\n\n return pending.filter((item) => !fulfilledIds.has(item.id)).map(cloneItem);\n}\n\nfunction assertReplayIncluded(input: readonly InputItem[], replay: readonly ReplayItem[], prefix: string): void {\n const fingerprints = input.map(fingerprintItem);\n let cursor = 0;\n\n for (const replayItem of replay) {\n const target = fingerprintItem(replayItem);\n const foundIndex = fingerprints.indexOf(target, cursor);\n if (foundIndex === -1) {\n throw new AIRequestError(\n `${prefix}: previous replay item was not carried into the next request`,\n \"MOCK_EXPECTATION_FAILED\",\n );\n }\n cursor = foundIndex + 1;\n }\n}\n\nfunction assertOrderedItems(\n input: readonly InputItem[],\n expectations: readonly MockInputExpectation[],\n prefix: string,\n): void {\n let cursor = 0;\n\n for (const expected of expectations) {\n let matched = false;\n while (cursor < input.length) {\n const item = input[cursor];\n if (item !== undefined && matchesItemExpectation(item, expected)) {\n matched = true;\n cursor += 1;\n break;\n }\n cursor += 1;\n }\n\n if (!matched) {\n throw new AIRequestError(\n `${prefix}: missing ordered input item ${describeExpectation(expected)}`,\n \"MOCK_EXPECTATION_FAILED\",\n );\n }\n }\n}\n\nfunction assertUnorderedItems(\n input: readonly InputItem[],\n expectations: readonly MockInputExpectation[],\n prefix: string,\n): void {\n for (const expected of expectations) {\n const matched = input.some((item) => matchesItemExpectation(item, expected));\n if (!matched) {\n throw new AIRequestError(\n `${prefix}: missing input item ${describeExpectation(expected)}`,\n \"MOCK_EXPECTATION_FAILED\",\n );\n }\n }\n}\n\nfunction matchesItemExpectation(item: InputItem, expected: MockInputExpectation): boolean {\n if (item.type !== expected.type) {\n return false;\n }\n\n if (expected.id !== undefined && \"id\" in item && item.id !== expected.id) {\n return false;\n }\n\n switch (item.type) {\n case \"message\":\n return (\n (expected.role === undefined || item.role === expected.role) && matchesText(item.content, expected.textIncludes)\n );\n case \"reasoning\":\n return (\n (expected.visibility === undefined || item.visibility === expected.visibility) &&\n matchesText(item.content, expected.textIncludes)\n );\n case \"tool_call\":\n return (\n (expected.name === undefined || item.name === expected.name) &&\n (expected.textIncludes === undefined || item.argumentsText.includes(expected.textIncludes))\n );\n case \"tool_result\":\n return (\n (expected.toolName === undefined || item.toolName === expected.toolName) &&\n (expected.callId === undefined || item.callId === expected.callId) &&\n (expected.outcome === undefined || item.outcome === expected.outcome) &&\n matchesText(item.content, expected.textIncludes)\n );\n case \"opaque\":\n return (\n (expected.source === undefined || item.source === expected.source) &&\n (expected.purpose === undefined || item.purpose === expected.purpose)\n );\n }\n}\n\nfunction matchesText(blocks: readonly ContentBlock[], textIncludes: string | undefined): boolean {\n if (textIncludes === undefined) {\n return true;\n }\n\n return blocks.some((block) => {\n if (block.type === \"text\") return block.text.includes(textIncludes);\n if (block.type === \"json\") return JSON.stringify(block.json).includes(textIncludes);\n return false;\n });\n}\n\nfunction fingerprintItem(item: InputItem): string {\n return JSON.stringify(item);\n}\n\nfunction describeExpectation(expectation: MockInputExpectation): string {\n const parts = [`type=${expectation.type}`];\n if (expectation.role) parts.push(`role=${expectation.role}`);\n if (expectation.name) parts.push(`name=${expectation.name}`);\n if (expectation.toolName) parts.push(`toolName=${expectation.toolName}`);\n if (expectation.callId) parts.push(`callId=${expectation.callId}`);\n if (expectation.textIncludes) parts.push(`textIncludes=${JSON.stringify(expectation.textIncludes)}`);\n return `{ ${parts.join(\", \")} }`;\n}\n\nfunction cloneItem<T>(item: T): T {\n return structuredClone(item);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["mapper","mapper","mapper"],"sources":["../src/core/errors.ts","../src/core/validation.ts","../src/core/normalize.ts","../src/core/client.ts","../src/core/event-factory.ts","../src/core/merge-auxiliary.ts","../src/core/aggregator.ts","../src/core/collect-stream.ts","../src/helpers/mapping.ts","../src/helpers/auxiliary-collector.ts","../src/helpers/adapter-auxiliary.ts","../src/helpers/adapter-base.ts","../src/helpers/adapter-security.ts","../src/helpers/usage-mapping.ts","../src/helpers/synthetic-stream.ts","../src/helpers/incremental-stream-parser.ts","../src/helpers/provider-stream.ts","../src/helpers/request-mapper.ts","../src/adapters/responses.ts","../src/adapters/messages.ts","../src/adapters/chat-completions.ts","../src/adapters/ollama.ts","../src/adapters/mock.ts"],"sourcesContent":["/**\n * 公共错误模型\n *\n * 把失败、降级、断流三类情况明确区分:\n * - 致命错误 → 同步抛错或迭代器抛错\n * - 非致命差异 → warning 通道\n * - 流中断 → 不伪造 response.completed\n */\n\n// ── 错误类型 ──────────────────────────────────────────────────\n\nexport type ErrorCode =\n | \"INPUT_EMPTY\"\n | \"TEMPERATURE_OUT_OF_RANGE\"\n | \"MAX_OUTPUT_TOKENS_INVALID\"\n | \"TOOL_CHOICE_NO_TOOLS\"\n | \"TOOL_CHOICE_UNKNOWN_TOOL\"\n | \"PROVIDER_ERROR\"\n | \"AUTH_ERROR\"\n | \"STREAM_ERROR\"\n | \"MAPPING_ERROR\"\n | \"STREAM_INCOMPLETE\"\n | \"LOOKUP_FAILED\"\n | \"LOOKUP_TIMEOUT\"\n | string;\n\nexport class AIError extends Error {\n override readonly name: string;\n\n constructor(\n message: string,\n public readonly code: ErrorCode,\n name?: string,\n ) {\n super(message);\n this.name = name ?? \"AIError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** 请求构造失败 — 参数校验不通过。在进入 adapter 前同步抛错。 */\nexport class AIRequestError extends AIError {\n constructor(\n message: string,\n code: ErrorCode,\n public readonly issues?: readonly { field: string; code: string; message: string }[],\n ) {\n super(message, code, \"AIRequestError\");\n }\n}\n\n/** Provider 调用失败 — HTTP 非 2xx、网络错误。由 AdapterBase 捕获转为 warning。 */\nexport class AIProviderError extends AIError {\n constructor(\n message: string,\n code: ErrorCode,\n public readonly statusCode?: number,\n public readonly responseBody?: string,\n ) {\n super(message, code, \"AIProviderError\");\n }\n}\n\n/** 流协议损坏 — SSE 解析失败、chunk 格式异常。 */\nexport class AIStreamError extends AIError {\n constructor(message: string, code: ErrorCode) {\n super(message, code, \"AIStreamError\");\n }\n}\n\n/** Canonical 映射失败 — 无法将 provider 响应映射到 canonical 类型。 */\nexport class AIMappingError extends AIError {\n constructor(message: string, code: ErrorCode) {\n super(message, code, \"AIMappingError\");\n }\n}\n\n// ── Warning 辅助 ──────────────────────────────────────────────\n\n/**\n * 标准 warning 代码列表。\n * 用于非致命差异的记录。\n */\nexport const WarningCode = {\n /** replay fidelity 低于预期 */\n REPLAY_FIDELITY_LOW: \"REPLAY_FIDELITY_LOW\",\n /** usage 字段缺失 */\n USAGE_MISSING: \"USAGE_MISSING\",\n /** billing 字段缺失 */\n BILLING_MISSING: \"BILLING_MISSING\",\n /** billing 只能给估算值 */\n BILLING_ESTIMATED: \"BILLING_ESTIMATED\",\n /** follow-up lookup 失败 */\n LOOKUP_FAILED: \"LOOKUP_FAILED\",\n /** lookup 超时 */\n LOOKUP_TIMEOUT: \"LOOKUP_TIMEOUT\",\n /** 流提前中断 */\n STREAM_INCOMPLETE: \"STREAM_INCOMPLETE\",\n /** 能力降级 */\n CAPABILITY_DOWNGRADE: \"CAPABILITY_DOWNGRADE\",\n /** 模拟流式 */\n SYNTHETIC_STREAM: \"SYNTHETIC_STREAM\",\n /** 工具调用以批量方式到达(非 token 级流式) */\n TOOL_CALL_BATCHED: \"TOOL_CALL_BATCHED\",\n} as const;\n","/**\n * 请求校验\n *\n * 在请求进入 adapter 前对参数合法性做基础检查。\n * 校验失败时抛 AIRequestError。\n */\n\nimport type { AIRequest } from \"../types/index.js\";\nimport { AIRequestError } from \"./errors.js\";\n\nexport type ValidationIssue = {\n field: string;\n code: string;\n message: string;\n};\n\nconst MESSAGE_ROLES = new Set([\"user\", \"assistant\"]);\nconst REASONING_VISIBILITIES = new Set([\"full\", \"summary\", \"redacted\", \"opaque\"]);\nconst TOOL_RESULT_OUTCOMES = new Set([\"success\", \"error\", \"rejected\"]);\nconst INCLUDE_MODES = new Set([\"off\", \"best_effort\"]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction pushIssue(issues: ValidationIssue[], field: string, code: string, message: string): void {\n issues.push({ field, code, message });\n}\n\nfunction validateContentBlock(block: unknown, field: string, issues: ValidationIssue[]): void {\n if (!isRecord(block) || typeof block.type !== \"string\") {\n pushIssue(issues, field, \"CONTENT_BLOCK_INVALID\", `${field} must be a valid ContentBlock`);\n return;\n }\n\n switch (block.type) {\n case \"text\":\n if (typeof block.text !== \"string\") {\n pushIssue(issues, field, \"CONTENT_BLOCK_INVALID\", `${field}.text must be a string`);\n }\n return;\n case \"json\":\n if (!(\"json\" in block)) {\n pushIssue(issues, field, \"CONTENT_BLOCK_INVALID\", `${field}.json must be present`);\n }\n return;\n case \"image\":\n if (typeof block.imageUrl !== \"string\" || block.imageUrl.length === 0) {\n pushIssue(issues, field, \"CONTENT_BLOCK_INVALID\", `${field}.imageUrl must be a non-empty string`);\n }\n return;\n case \"binary_ref\":\n if (typeof block.ref !== \"string\" || block.ref.length === 0) {\n pushIssue(issues, field, \"CONTENT_BLOCK_INVALID\", `${field}.ref must be a non-empty string`);\n }\n return;\n case \"opaque\":\n if (!(\"payload\" in block)) {\n pushIssue(issues, field, \"CONTENT_BLOCK_INVALID\", `${field}.payload must be present`);\n }\n return;\n default:\n pushIssue(issues, field, \"CONTENT_BLOCK_INVALID\", `${field}.type \"${block.type}\" is not supported`);\n }\n}\n\nfunction validateContentArray(content: unknown, field: string, issues: ValidationIssue[], code: string): void {\n if (!Array.isArray(content)) {\n pushIssue(issues, field, code, `${field} must be a ContentBlock[]`);\n return;\n }\n\n for (let i = 0; i < content.length; i++) {\n validateContentBlock(content[i], `${field}[${i}]`, issues);\n }\n}\n\nfunction validateInstructionArray(content: unknown, field: string, issues: ValidationIssue[]): void {\n if (!Array.isArray(content)) {\n pushIssue(issues, field, \"INSTRUCTIONS_INVALID\", `${field} must be an InstructionBlock[]`);\n return;\n }\n\n for (let i = 0; i < content.length; i++) {\n const block = content[i];\n const blockField = `${field}[${i}]`;\n validateContentBlock(block, blockField, issues);\n\n if (!isRecord(block) || typeof block.type !== \"string\") continue;\n if (block.type !== \"text\" && block.type !== \"json\") {\n pushIssue(issues, blockField, \"INSTRUCTIONS_INVALID\", `${blockField} only supports text/json blocks`);\n }\n }\n}\n\nfunction validateInputItem(item: unknown, field: string, issues: ValidationIssue[]): void {\n if (!isRecord(item)) {\n pushIssue(issues, field, \"INPUT_INVALID_ITEM\", `${field} must be a valid InputItem`);\n return;\n }\n\n if (typeof item.type !== \"string\") {\n pushIssue(issues, field, \"INPUT_ITEM_UNKNOWN_TYPE\", `${field}.type must be a supported InputItem type`);\n return;\n }\n\n switch (item.type) {\n case \"message\":\n if (typeof item.role !== \"string\" || !MESSAGE_ROLES.has(item.role)) {\n pushIssue(issues, `${field}.role`, \"MESSAGE_ROLE_INVALID\", `${field}.role must be a valid message role`);\n }\n validateContentArray(item.content, `${field}.content`, issues, \"MESSAGE_CONTENT_INVALID\");\n return;\n case \"reasoning\":\n if (typeof item.visibility !== \"string\" || !REASONING_VISIBILITIES.has(item.visibility)) {\n pushIssue(\n issues,\n `${field}.visibility`,\n \"REASONING_VISIBILITY_INVALID\",\n `${field}.visibility must be a valid reasoning visibility`,\n );\n }\n validateContentArray(item.content, `${field}.content`, issues, \"REASONING_CONTENT_INVALID\");\n return;\n case \"tool_call\":\n if (typeof item.id !== \"string\" || item.id.length === 0) {\n pushIssue(issues, `${field}.id`, \"TOOL_CALL_ID_INVALID\", `${field}.id must be a non-empty string`);\n }\n if (typeof item.name !== \"string\" || item.name.length === 0) {\n pushIssue(issues, `${field}.name`, \"TOOL_CALL_NAME_INVALID\", `${field}.name must be a non-empty string`);\n }\n if (typeof item.argumentsText !== \"string\") {\n pushIssue(\n issues,\n `${field}.argumentsText`,\n \"TOOL_CALL_ARGUMENTS_INVALID\",\n `${field}.argumentsText must be a string`,\n );\n } else {\n try {\n const parsed: unknown = JSON.parse(item.argumentsText);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n pushIssue(\n issues,\n `${field}.argumentsText`,\n \"TOOL_CALL_ARGUMENTS_INVALID\",\n `${field}.argumentsText must encode a JSON object`,\n );\n }\n } catch {\n pushIssue(\n issues,\n `${field}.argumentsText`,\n \"TOOL_CALL_ARGUMENTS_INVALID\",\n `${field}.argumentsText must encode a JSON object`,\n );\n }\n }\n return;\n case \"tool_result\":\n if (typeof item.callId !== \"string\" || item.callId.length === 0) {\n pushIssue(\n issues,\n `${field}.callId`,\n \"TOOL_RESULT_CALL_ID_INVALID\",\n `${field}.callId must be a non-empty string`,\n );\n }\n if (typeof item.toolName !== \"string\" || item.toolName.length === 0) {\n pushIssue(\n issues,\n `${field}.toolName`,\n \"TOOL_RESULT_NAME_INVALID\",\n `${field}.toolName must be a non-empty string`,\n );\n }\n if (typeof item.outcome !== \"string\" || !TOOL_RESULT_OUTCOMES.has(item.outcome)) {\n pushIssue(\n issues,\n `${field}.outcome`,\n \"TOOL_RESULT_OUTCOME_INVALID\",\n `${field}.outcome must be success, error, or rejected`,\n );\n }\n validateContentArray(item.content, `${field}.content`, issues, \"TOOL_RESULT_CONTENT_INVALID\");\n return;\n case \"opaque\":\n if (typeof item.source !== \"string\" || item.source.length === 0) {\n pushIssue(issues, `${field}.source`, \"OPAQUE_SOURCE_INVALID\", `${field}.source must be a non-empty string`);\n }\n if (typeof item.purpose !== \"string\" || item.purpose.length === 0) {\n pushIssue(issues, `${field}.purpose`, \"OPAQUE_PURPOSE_INVALID\", `${field}.purpose must be a non-empty string`);\n }\n return;\n default:\n pushIssue(issues, `${field}.type`, \"INPUT_ITEM_UNKNOWN_TYPE\", `${field}.type \"${item.type}\" is not supported`);\n }\n}\n\nfunction validateTools(tools: unknown, issues: ValidationIssue[]): void {\n if (tools === undefined) return;\n if (!Array.isArray(tools)) {\n pushIssue(issues, \"tools\", \"TOOLS_INVALID\", \"tools must be an array\");\n return;\n }\n\n const seenNames = new Set<string>();\n for (let i = 0; i < tools.length; i++) {\n const tool = tools[i];\n const field = `tools[${i}]`;\n if (!isRecord(tool)) {\n pushIssue(issues, field, \"TOOL_INVALID\", `${field} must be a valid ToolDefinition`);\n continue;\n }\n\n if (typeof tool.name !== \"string\" || tool.name.length === 0) {\n pushIssue(issues, `${field}.name`, \"TOOL_NAME_INVALID\", `${field}.name must be a non-empty string`);\n } else {\n if (seenNames.has(tool.name)) {\n pushIssue(issues, `${field}.name`, \"TOOLS_DUPLICATE_NAME\", `tool name \"${tool.name}\" is duplicated`);\n }\n seenNames.add(tool.name);\n }\n\n if (tool.description !== undefined && typeof tool.description !== \"string\") {\n pushIssue(issues, `${field}.description`, \"TOOL_DESCRIPTION_INVALID\", `${field}.description must be a string`);\n }\n\n if (!isRecord(tool.inputSchema)) {\n pushIssue(issues, `${field}.inputSchema`, \"TOOL_INPUT_SCHEMA_INVALID\", `${field}.inputSchema must be an object`);\n }\n }\n}\n\nfunction validateToolChoice(toolChoice: unknown, issues: ValidationIssue[]): void {\n if (toolChoice === undefined) return;\n if (toolChoice === \"auto\" || toolChoice === \"none\") return;\n if (\n !isRecord(toolChoice) ||\n toolChoice.type !== \"tool\" ||\n typeof toolChoice.name !== \"string\" ||\n toolChoice.name.length === 0\n ) {\n pushIssue(issues, \"toolChoice\", \"TOOL_CHOICE_INVALID\", 'toolChoice must be auto, none, or { type: \"tool\", name }');\n }\n}\n\n/** Validate include settings, appending issues to the given array. */\nexport function validateInclude(include: unknown, issues: ValidationIssue[]): void {\n if (!isRecord(include)) {\n pushIssue(issues, \"include\", \"INCLUDE_INVALID\", \"include must be an object\");\n return;\n }\n if (include.usage !== undefined && (typeof include.usage !== \"string\" || !INCLUDE_MODES.has(include.usage))) {\n pushIssue(issues, \"include.usage\", \"INCLUDE_USAGE_INVALID\", \"include.usage must be off or best_effort\");\n }\n if (include.billing !== undefined && (typeof include.billing !== \"string\" || !INCLUDE_MODES.has(include.billing))) {\n pushIssue(issues, \"include.billing\", \"INCLUDE_BILLING_INVALID\", \"include.billing must be off or best_effort\");\n }\n if (\n include.providerMetadata !== undefined &&\n (typeof include.providerMetadata !== \"string\" || !INCLUDE_MODES.has(include.providerMetadata))\n ) {\n pushIssue(\n issues,\n \"include.providerMetadata\",\n \"INCLUDE_PROVIDER_METADATA_INVALID\",\n \"include.providerMetadata must be off or best_effort\",\n );\n }\n}\n\n/**\n * 校验 AIRequest,返回校验问题列表。\n * 空数组表示无问题。\n */\nexport function validateRequest(request: AIRequest): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n if (request.instructions !== undefined) {\n if (typeof request.instructions === \"string\") {\n // no-op\n } else if (Array.isArray(request.instructions)) {\n validateInstructionArray(request.instructions, \"instructions\", issues);\n } else {\n pushIssue(issues, \"instructions\", \"INSTRUCTIONS_INVALID\", \"instructions must be a string or InstructionBlock[]\");\n }\n }\n\n // input 非空约束\n if (!Array.isArray(request.input) || request.input.length === 0) {\n pushIssue(issues, \"input\", \"INPUT_EMPTY\", \"input must be a non-empty array\");\n }\n\n // input 元素类型检查\n if (Array.isArray(request.input)) {\n for (let i = 0; i < request.input.length; i++) {\n validateInputItem(request.input[i], `input[${i}]`, issues);\n }\n }\n\n // temperature 范围\n if (request.temperature !== undefined) {\n if (typeof request.temperature !== \"number\" || !Number.isFinite(request.temperature)) {\n issues.push({\n field: \"temperature\",\n code: \"TEMPERATURE_NOT_NUMBER\",\n message: \"temperature must be a number\",\n });\n } else if (request.temperature < 0 || request.temperature > 2) {\n issues.push({\n field: \"temperature\",\n code: \"TEMPERATURE_OUT_OF_RANGE\",\n message: \"temperature must be between 0 and 2\",\n });\n }\n }\n\n // maxOutputTokens 合法性\n if (request.maxOutputTokens !== undefined) {\n if (typeof request.maxOutputTokens !== \"number\" || !Number.isFinite(request.maxOutputTokens)) {\n issues.push({\n field: \"maxOutputTokens\",\n code: \"MAX_OUTPUT_TOKENS_NOT_NUMBER\",\n message: \"maxOutputTokens must be a number\",\n });\n } else if (!Number.isInteger(request.maxOutputTokens) || request.maxOutputTokens < 1) {\n issues.push({\n field: \"maxOutputTokens\",\n code: \"MAX_OUTPUT_TOKENS_INVALID\",\n message: \"maxOutputTokens must be a positive integer\",\n });\n }\n }\n\n if (request.include !== undefined) {\n validateInclude(request.include, issues);\n }\n\n if (request.metadata !== undefined) {\n if (!isRecord(request.metadata)) {\n pushIssue(issues, \"metadata\", \"METADATA_INVALID\", \"metadata must be an object\");\n } else {\n for (const [key, value] of Object.entries(request.metadata)) {\n if (typeof value !== \"string\") {\n pushIssue(issues, `metadata.${key}`, \"METADATA_VALUE_INVALID\", `metadata.${key} must be a string`);\n }\n }\n }\n }\n\n validateTools(request.tools, issues);\n validateToolChoice(request.toolChoice, issues);\n\n // toolChoice 与 tools 的一致性\n if (\n request.toolChoice &&\n typeof request.toolChoice === \"object\" &&\n \"type\" in request.toolChoice &&\n request.toolChoice.type === \"tool\"\n ) {\n const chosenName = request.toolChoice.name;\n if (!request.tools || request.tools.length === 0) {\n issues.push({\n field: \"toolChoice\",\n code: \"TOOL_CHOICE_NO_TOOLS\",\n message: `toolChoice specifies tool \"${chosenName}\" but no tools are defined`,\n });\n } else if (!request.tools.some((t) => t.name === chosenName)) {\n issues.push({\n field: \"toolChoice\",\n code: \"TOOL_CHOICE_UNKNOWN_TOOL\",\n message: `toolChoice specifies tool \"${chosenName}\" which is not in tools array`,\n });\n }\n }\n\n return issues;\n}\n\n/**\n * 校验请求并抛出首个问题。\n * 适用于客户端入口的快速失败检查。\n */\nexport function assertValidRequest(request: AIRequest): void {\n const issues = validateRequest(request);\n const first = issues[0];\n if (first) {\n throw new AIRequestError(first.message, first.code, issues);\n }\n}\n","/**\n * 请求归一化\n *\n * 将 AIRequest + client 配置归一化为 NormalizedRequest,\n * 包括默认值合并、requestId 生成、include 默认值填充。\n */\n\nimport type { AIRequest, NormalizedRequest } from \"../types/index.js\";\nimport { assertValidRequest, validateInclude } from \"./validation.js\";\nimport { AIRequestError } from \"./errors.js\";\n\nexport type NormalizeOptions = {\n model: string;\n defaults?: Partial<AIRequest>;\n};\n\nconst DEFAULT_INCLUDE = {\n usage: \"best_effort\" as const,\n billing: \"best_effort\" as const,\n providerMetadata: \"best_effort\" as const,\n};\n\n/**\n * 归一化请求:\n * 1. 合并 defaults\n * 2. 填充 include 默认值\n * 3. 生成 requestId\n * 4. 校验请求合法性\n */\nexport function normalizeRequest(request: AIRequest, options: NormalizeOptions): NormalizedRequest {\n const { model, defaults } = options;\n\n // 在展开 include 前先校验,防止非法值被合并掩盖\n const earlyIncludeIssues: { field: string; code: string; message: string }[] = [];\n if (request.include !== undefined) {\n validateInclude(request.include, earlyIncludeIssues);\n }\n if (defaults?.include !== undefined) {\n validateInclude(defaults.include, earlyIncludeIssues);\n }\n const firstIncludeIssue = earlyIncludeIssues[0];\n if (firstIncludeIssue) {\n throw new AIRequestError(firstIncludeIssue.message, firstIncludeIssue.code, earlyIncludeIssues);\n }\n\n // 合并 defaults(浅合并,input/tools 由 request 完全覆盖)\n const merged: AIRequest = {\n ...defaults,\n ...request,\n include: {\n ...DEFAULT_INCLUDE,\n ...defaults?.include,\n ...request.include,\n },\n };\n\n // 校验\n assertValidRequest(merged);\n\n return {\n ...merged,\n model,\n requestId: crypto.randomUUID(),\n };\n}\n","/**\n * AI 客户端入口\n *\n * 打通 createAIClient() 到 adapter 调用之间的公共入口。\n */\n\nimport type { AIRequest, AIStreamEvent, AIClient, CreateAIClientOptions } from \"../types/index.js\";\nimport { normalizeRequest } from \"./normalize.js\";\n\nexport function createAIClient(options: CreateAIClientOptions): AIClient {\n const { adapter, model, defaults, signal: defaultSignal } = options;\n\n const client: AIClient = {\n stream(request: AIRequest): AsyncIterable<AIStreamEvent> {\n // 合并 client 级别的默认 signal 和请求级别的 signal\n const signal = mergeAbortSignals(defaultSignal, request.signal);\n const normalized = normalizeRequest({ ...request, signal }, { model, defaults });\n return adapter.stream(normalized);\n },\n };\n\n return client;\n}\n\n/**\n * 合并多个 AbortSignal:任一 signal abort 即触发。\n * 如果没有 signal 需要合并则返回 undefined。\n */\nfunction mergeAbortSignals(...signals: (AbortSignal | undefined)[]): AbortSignal | undefined {\n const valid = signals.filter((s): s is AbortSignal => s != null);\n if (valid.length === 0) return undefined;\n if (valid.length === 1) return valid[0];\n return AbortSignal.any(valid);\n}\n\nexport type { AIClient, CreateAIClientOptions } from \"../types/index.js\";\n","/**\n * 共享事件工厂\n *\n * 负责创建带有统一 sequence / timestamp / responseId / backend 的事件对象。\n * 每个 factory 实例管理一个单调递增的 sequence 计数器。\n */\n\nimport type {\n ResponseStartedEvent,\n ResponseWarningEvent,\n ResponseAuxiliaryEvent,\n ResponseCompletedEvent,\n MessageStartedEvent,\n MessageDeltaEvent,\n MessageCompletedEvent,\n ReasoningStartedEvent,\n ReasoningDeltaEvent,\n ReasoningCompletedEvent,\n ToolCallStartedEvent,\n ToolCallDeltaEvent,\n ToolCallCompletedEvent,\n ContentBlock,\n Usage,\n BillingInfo,\n AuxiliaryInfo,\n ReplayItem,\n StopReason,\n BackendTrace,\n OpaqueItem,\n ReasoningItem,\n} from \"../types/index.js\";\n\nexport type EventFactoryBackend = {\n kind: \"chat-completions\" | \"messages\" | \"responses\" | \"ollama\" | \"mock\";\n isSynthetic: boolean;\n};\n\nexport type EventFactoryState = {\n responseId: string;\n backend: EventFactoryBackend;\n};\n\nfunction timestamp(): string {\n return new Date().toISOString();\n}\n\nexport function createEventFactory(state: EventFactoryState) {\n let seq = 0;\n const warnings: string[] = [];\n\n function next(): number {\n return seq++;\n }\n\n function base(): Pick<ResponseStartedEvent, \"responseId\" | \"sequence\" | \"timestamp\" | \"backend\"> {\n return {\n responseId: state.responseId,\n sequence: next(),\n timestamp: timestamp(),\n backend: { ...state.backend },\n };\n }\n\n return {\n // ── 响应级事件 ──────────────────────────────────────────\n\n responseStarted(model: string): ResponseStartedEvent {\n return { ...base(), type: \"response.started\", model };\n },\n\n responseWarning(message: string, code?: string): ResponseWarningEvent {\n warnings.push(message);\n return { ...base(), type: \"response.warning\", message, code };\n },\n\n responseAuxiliary(data: {\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: Partial<AuxiliaryInfo>;\n }): ResponseAuxiliaryEvent {\n return { ...base(), type: \"response.auxiliary\", ...data };\n },\n\n responseCompleted(completion: {\n replay: ReplayItem[];\n stopReason?: StopReason;\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: AuxiliaryInfo;\n warnings?: string[];\n opaqueOutput?: OpaqueItem[];\n trace?: Partial<BackendTrace>;\n }): ResponseCompletedEvent {\n return { ...base(), type: \"response.completed\", ...completion };\n },\n\n // ── 消息流事件 ──────────────────────────────────────────\n\n messageStarted(id: string): MessageStartedEvent {\n return { ...base(), type: \"message.started\", item: { id, role: \"assistant\" } };\n },\n\n messageDelta(itemId: string, delta: ContentBlock): MessageDeltaEvent {\n return { ...base(), type: \"message.delta\", itemId, delta };\n },\n\n messageCompleted(itemId: string): MessageCompletedEvent {\n return { ...base(), type: \"message.completed\", itemId };\n },\n\n // ── 思维链流事件 ────────────────────────────────────────\n\n reasoningStarted(id: string, visibility: ReasoningItem[\"visibility\"]): ReasoningStartedEvent {\n return { ...base(), type: \"reasoning.started\", item: { id, visibility } };\n },\n\n reasoningDelta(itemId: string, delta: ContentBlock): ReasoningDeltaEvent {\n return { ...base(), type: \"reasoning.delta\", itemId, delta };\n },\n\n reasoningCompleted(itemId: string): ReasoningCompletedEvent {\n return { ...base(), type: \"reasoning.completed\", itemId };\n },\n\n // ── 工具调用流事件 ──────────────────────────────────────\n\n toolCallStarted(id: string, name: string): ToolCallStartedEvent {\n return { ...base(), type: \"tool_call.started\", item: { id, name } };\n },\n\n toolCallDelta(itemId: string, delta: { argumentsText?: string }): ToolCallDeltaEvent {\n return { ...base(), type: \"tool_call.delta\", itemId, delta };\n },\n\n toolCallCompleted(itemId: string): ToolCallCompletedEvent {\n return { ...base(), type: \"tool_call.completed\", itemId };\n },\n\n /** 返回当前已发出的 sequence 计数(用于断言) */\n get sequence(): number {\n return seq;\n },\n\n /** 返回当前已记录的 warning 副本。 */\n get warnings(): string[] {\n return [...warnings];\n },\n };\n}\n\nexport type EventFactory = ReturnType<typeof createEventFactory>;\n","import type { AuxiliaryInfo } from \"../types/index.js\";\n\nexport function mergeAuxiliary(\n base?: Partial<AuxiliaryInfo>,\n patch?: Partial<AuxiliaryInfo>,\n): AuxiliaryInfo | undefined {\n if (!base && !patch) return undefined;\n\n const merged: AuxiliaryInfo = {\n ...base,\n ...patch,\n };\n\n if (base?.providerMetadata || patch?.providerMetadata) {\n merged.providerMetadata = {\n ...base?.providerMetadata,\n ...patch?.providerMetadata,\n };\n }\n\n return merged;\n}\n","/**\n * 流聚合器\n *\n * 将 AIStreamEvent 序列聚合为统一的 AIResponse。\n *\n * 职责:\n * - 严格 item 状态机:started 创建 active item,delta 累积,completed 构建 OutputItem\n * - 校验:未 started 的 delta/completed、ID 重用、类型错配、response.completed 时 active items 非空\n * - 响应级 sequence/responseId/started/completed 校验\n * - usage/billing/auxiliary 仅来自 response.auxiliary\n * - warning 仅来自 response.warning\n * - 最终 AIResponse 由聚合器唯一构建\n *\n * 约束:\n * - replay 由 adapter 显式提供,聚合器不猜测\n * - 不伪造 reasoning\n * - 不解释 opaque payload\n */\n\nimport type {\n AIStreamEvent,\n AIResponse,\n MessageItem,\n ToolCallItem,\n OutputItem,\n Usage,\n BillingInfo,\n AuxiliaryInfo,\n BackendTrace,\n StopReason,\n ContentBlock,\n} from \"../types/index.js\";\nimport { AIStreamError } from \"./errors.js\";\nimport { mergeAuxiliary } from \"./merge-auxiliary.js\";\n\n// ── Active item types ─────────────────────────────────────────\n\ntype ActiveMessage = {\n type: \"message\";\n id: string;\n role: \"assistant\";\n content: ContentBlock[];\n};\n\ntype ActiveReasoning = {\n type: \"reasoning\";\n id: string;\n visibility: \"full\" | \"summary\" | \"redacted\" | \"opaque\";\n content: ContentBlock[];\n};\n\ntype ActiveToolCall = {\n type: \"tool_call\";\n id: string;\n name: string;\n argumentsText: string;\n};\n\ntype ActiveItem = ActiveMessage | ActiveReasoning | ActiveToolCall;\n\n// ── 聚合器状态 ────────────────────────────────────────────────\n\nexport interface AggregatorState {\n responseId?: string;\n model?: string;\n backendInfo?: { kind: BackendTrace[\"adapter\"]; isSynthetic: boolean };\n\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary: AuxiliaryInfo;\n warnings: string[];\n warningSet: Set<string>;\n output: OutputItem[];\n textParts: string[];\n toolCalls: ToolCallItem[];\n lastEventType?: AIStreamEvent[\"type\"];\n started: boolean;\n completed: boolean;\n nextSequence?: number;\n activeItems: Map<string, ActiveItem>;\n itemOrder: string[];\n completedItems: Map<string, OutputItem>;\n\n /** adapter 在 response.completed 中提供的 replay */\n replayFromAdapter?: import(\"../types/index.js\").ReplayItem[];\n stopReasonFromAdapter?: StopReason;\n backendFromAdapter?: Partial<BackendTrace>;\n}\n\nexport function createAggregatorState(): AggregatorState {\n return {\n auxiliary: {},\n warnings: [],\n warningSet: new Set(),\n output: [],\n textParts: [],\n toolCalls: [],\n started: false,\n completed: false,\n activeItems: new Map(),\n itemOrder: [],\n completedItems: new Map(),\n };\n}\n\n// ── Active item helpers ───────────────────────────────────────\n\nfunction getActiveItem(state: AggregatorState, itemId: string, expectedType: ActiveItem[\"type\"]): ActiveItem {\n const item = state.activeItems.get(itemId);\n if (!item) {\n throw streamProtocolError(`Received ${expectedType} delta/completed for unknown item: ${itemId}`);\n }\n if (item.type !== expectedType) {\n throw streamProtocolError(`Item ${itemId} started as ${item.type} but received ${expectedType} event`);\n }\n return item;\n}\n\nfunction coalesceContentBlocks(blocks: readonly ContentBlock[]): ContentBlock[] {\n const result: ContentBlock[] = [];\n for (const block of blocks) {\n const previous = result[result.length - 1];\n if (block.type === \"text\" && previous?.type === \"text\") {\n previous.text += block.text;\n } else {\n result.push({ ...block });\n }\n }\n return result;\n}\n\nfunction finalizeMessage(active: ActiveMessage): MessageItem {\n return {\n type: \"message\",\n id: active.id,\n role: active.role,\n content: coalesceContentBlocks(active.content),\n };\n}\n\nfunction finalizeReasoning(active: ActiveReasoning): import(\"../types/index.js\").ReasoningItem {\n return {\n type: \"reasoning\",\n id: active.id,\n visibility: active.visibility,\n content: coalesceContentBlocks(active.content),\n };\n}\n\nfunction finalizeToolCall(active: ActiveToolCall): ToolCallItem {\n return {\n type: \"tool_call\",\n id: active.id,\n name: active.name,\n argumentsText: active.argumentsText,\n };\n}\n\n// ── Event handlers ────────────────────────────────────────────\n\nfunction handleResponseStarted(state: AggregatorState, event: AIStreamEvent & { type: \"response.started\" }): void {\n if (state.started) {\n throw streamProtocolError(\"Stream must contain exactly one response.started event\");\n }\n state.started = true;\n state.responseId = event.responseId;\n state.model = event.model;\n state.backendInfo = event.backend;\n}\n\nfunction handleResponseWarning(state: AggregatorState, event: AIStreamEvent & { type: \"response.warning\" }): void {\n pushWarnings(state, [event.message]);\n}\n\nfunction handleResponseAuxiliary(state: AggregatorState, event: AIStreamEvent & { type: \"response.auxiliary\" }): void {\n if (event.usage) {\n state.usage = { ...state.usage, ...event.usage };\n }\n if (event.billing) {\n state.billing = { ...state.billing, ...event.billing };\n }\n if (event.auxiliary) {\n state.auxiliary = mergeAuxiliary(state.auxiliary, event.auxiliary) ?? {};\n }\n}\n\nfunction handleMessageStarted(state: AggregatorState, event: AIStreamEvent & { type: \"message.started\" }): void {\n const id = event.item.id;\n if (state.activeItems.has(id)) {\n throw streamProtocolError(`Item with id ${id} is already active`);\n }\n state.activeItems.set(id, {\n type: \"message\",\n id,\n role: event.item.role,\n content: [],\n });\n state.itemOrder.push(id);\n}\n\nfunction handleMessageDelta(state: AggregatorState, event: AIStreamEvent & { type: \"message.delta\" }): void {\n const active = getActiveItem(state, event.itemId, \"message\") as ActiveMessage;\n active.content.push(event.delta);\n}\n\nfunction handleMessageCompleted(state: AggregatorState, event: AIStreamEvent & { type: \"message.completed\" }): void {\n const active = getActiveItem(state, event.itemId, \"message\") as ActiveMessage;\n state.activeItems.delete(event.itemId);\n const item = finalizeMessage(active);\n state.completedItems.set(event.itemId, item);\n pushMessageText(state, item);\n}\n\nfunction handleReasoningStarted(state: AggregatorState, event: AIStreamEvent & { type: \"reasoning.started\" }): void {\n const id = event.item.id;\n if (state.activeItems.has(id)) {\n throw streamProtocolError(`Item with id ${id} is already active`);\n }\n state.activeItems.set(id, {\n type: \"reasoning\",\n id,\n visibility: event.item.visibility,\n content: [],\n });\n state.itemOrder.push(id);\n}\n\nfunction handleReasoningDelta(state: AggregatorState, event: AIStreamEvent & { type: \"reasoning.delta\" }): void {\n const active = getActiveItem(state, event.itemId, \"reasoning\") as ActiveReasoning;\n active.content.push(event.delta);\n}\n\nfunction handleReasoningCompleted(\n state: AggregatorState,\n event: AIStreamEvent & { type: \"reasoning.completed\" },\n): void {\n const active = getActiveItem(state, event.itemId, \"reasoning\") as ActiveReasoning;\n state.activeItems.delete(event.itemId);\n state.completedItems.set(event.itemId, finalizeReasoning(active));\n}\n\nfunction handleToolCallStarted(state: AggregatorState, event: AIStreamEvent & { type: \"tool_call.started\" }): void {\n const id = event.item.id;\n if (state.activeItems.has(id)) {\n throw streamProtocolError(`Item with id ${id} is already active`);\n }\n state.activeItems.set(id, {\n type: \"tool_call\",\n id,\n name: event.item.name,\n argumentsText: \"\",\n });\n state.itemOrder.push(id);\n}\n\nfunction handleToolCallDelta(state: AggregatorState, event: AIStreamEvent & { type: \"tool_call.delta\" }): void {\n const active = getActiveItem(state, event.itemId, \"tool_call\") as ActiveToolCall;\n if (event.delta.argumentsText) {\n active.argumentsText += event.delta.argumentsText;\n }\n}\n\nfunction handleToolCallCompleted(state: AggregatorState, event: AIStreamEvent & { type: \"tool_call.completed\" }): void {\n const active = getActiveItem(state, event.itemId, \"tool_call\") as ActiveToolCall;\n state.activeItems.delete(event.itemId);\n const item = finalizeToolCall(active);\n state.completedItems.set(event.itemId, item);\n state.toolCalls.push(item);\n}\n\nfunction handleResponseCompleted(state: AggregatorState, event: AIStreamEvent & { type: \"response.completed\" }): void {\n if (state.activeItems.size > 0) {\n throw streamProtocolError(\"response.completed received while active items still pending\");\n }\n state.completed = true;\n state.replayFromAdapter = event.replay;\n state.stopReasonFromAdapter = event.stopReason;\n state.backendFromAdapter = event.trace;\n if (event.usage) state.usage = { ...state.usage, ...event.usage };\n if (event.billing) state.billing = { ...state.billing, ...event.billing };\n if (event.auxiliary) state.auxiliary = mergeAuxiliary(state.auxiliary, event.auxiliary) ?? {};\n if (event.warnings) pushWarnings(state, event.warnings);\n if (event.opaqueOutput) state.output.push(...event.opaqueOutput);\n}\n\n// ── 从聚合状态构建最终 AIResponse ─────────────────────────────\n\nfunction buildResponse(state: AggregatorState): AIResponse {\n const backendFromCompleted = state.backendFromAdapter;\n const backend: BackendTrace = {\n adapter: backendFromCompleted?.adapter ?? state.backendInfo?.kind ?? (\"unknown\" as BackendTrace[\"adapter\"]),\n isSyntheticStream: backendFromCompleted?.isSyntheticStream ?? state.backendInfo?.isSynthetic ?? false,\n requestId: backendFromCompleted?.requestId ?? state.responseId,\n rawResponseId: backendFromCompleted?.rawResponseId,\n metadataSources: backendFromCompleted?.metadataSources,\n warnings: backendFromCompleted?.warnings,\n };\n const orderedOutput = state.itemOrder.map((id) => {\n const item = state.completedItems.get(id);\n if (!item) {\n throw streamProtocolError(`Item ${id} was started but not completed`);\n }\n return item;\n });\n\n return {\n id: state.responseId,\n output: [...orderedOutput, ...state.output],\n replay: state.replayFromAdapter ?? [],\n text: state.textParts.join(\"\"),\n toolCalls: state.toolCalls,\n stopReason: state.stopReasonFromAdapter,\n usage: state.usage,\n billing: state.billing,\n auxiliary: state.auxiliary,\n warnings: state.warnings.length > 0 ? state.warnings : undefined,\n backend,\n };\n}\n\n// ── 公开 API ──────────────────────────────────────────────────\n\n/**\n * 将事件数组聚合为 AIResponse。\n * 适用于测试和离线处理场景。\n */\nexport function aggregateEvents(events: readonly AIStreamEvent[]): AIResponse {\n const state = createAggregatorState();\n for (const event of events) {\n aggregateEvent(state, event);\n }\n return finalizeAggregation(state);\n}\n\nexport function aggregateEvent(state: AggregatorState, event: AIStreamEvent): void {\n validateEventEnvelope(state, event);\n state.lastEventType = event.type;\n\n switch (event.type) {\n case \"response.started\":\n handleResponseStarted(state, event);\n break;\n case \"response.warning\":\n handleResponseWarning(state, event);\n break;\n case \"response.auxiliary\":\n handleResponseAuxiliary(state, event);\n break;\n case \"message.started\":\n handleMessageStarted(state, event);\n break;\n case \"message.delta\":\n handleMessageDelta(state, event);\n break;\n case \"message.completed\":\n handleMessageCompleted(state, event);\n break;\n case \"reasoning.started\":\n handleReasoningStarted(state, event);\n break;\n case \"reasoning.delta\":\n handleReasoningDelta(state, event);\n break;\n case \"reasoning.completed\":\n handleReasoningCompleted(state, event);\n break;\n case \"tool_call.started\":\n handleToolCallStarted(state, event);\n break;\n case \"tool_call.delta\":\n handleToolCallDelta(state, event);\n break;\n case \"tool_call.completed\":\n handleToolCallCompleted(state, event);\n break;\n case \"response.completed\":\n handleResponseCompleted(state, event);\n break;\n }\n}\n\nexport function finalizeAggregation(state: AggregatorState): AIResponse {\n if (!state.started) {\n throw streamProtocolError(\"Stream must start with response.started event\");\n }\n if (!state.completed || state.lastEventType !== \"response.completed\") {\n throw streamProtocolError(\"Stream must end with response.completed event to produce a valid AIResponse\");\n }\n\n return buildResponse(state);\n}\n\nfunction pushWarnings(state: AggregatorState, warnings: readonly string[]): void {\n for (const warning of warnings) {\n if (!state.warningSet.has(warning)) {\n state.warningSet.add(warning);\n state.warnings.push(warning);\n }\n }\n}\n\nfunction pushMessageText(state: AggregatorState, item: MessageItem): void {\n for (const block of item.content) {\n if (block.type === \"text\") {\n state.textParts.push(block.text);\n }\n }\n}\n\nfunction validateEventEnvelope(state: AggregatorState, event: AIStreamEvent): void {\n if (state.completed) {\n throw streamProtocolError(\"response.completed must be the final stream event\");\n }\n if (!state.started && event.type !== \"response.started\") {\n throw streamProtocolError(\"Stream must start with response.started event\");\n }\n if (state.responseId !== undefined && event.responseId !== state.responseId) {\n throw streamProtocolError(\"All stream events must use the same responseId\");\n }\n if (state.nextSequence !== undefined && event.sequence !== state.nextSequence) {\n throw streamProtocolError(`Expected event sequence ${state.nextSequence}, received ${event.sequence}`);\n }\n state.nextSequence = event.sequence + 1;\n}\n\nfunction streamProtocolError(message: string): AIStreamError {\n return new AIStreamError(message, \"STREAM_PROTOCOL_ERROR\");\n}\n","/**\n * collectStream — 流收集 helper\n *\n * 将 AsyncIterable<AIStreamEvent> 消费完毕并聚合力 AIResponse。\n * 适用于不需要逐事件处理的调用方。\n */\n\nimport type { AIStreamEvent, AIResponse } from \"../types/index.js\";\nimport { aggregateEvent, createAggregatorState, finalizeAggregation } from \"./aggregator.js\";\n\nexport async function collectStream(stream: AsyncIterable<AIStreamEvent>): Promise<AIResponse> {\n const state = createAggregatorState();\n\n for await (const event of stream) {\n aggregateEvent(state, event);\n }\n\n return finalizeAggregation(state);\n}\n","/**\n * Adapter 共享映射 helper\n *\n * 提供 adapter 间通用的类型映射函数:\n * - stop reason 映射\n * - content block 映射\n * - item 映射\n * - warning 记录\n * - replay 构造工具\n */\n\nimport type {\n StopReason,\n ContentBlock,\n MessageItem,\n ReasoningItem,\n ToolCallItem,\n ToolResultItem,\n OpaqueItem,\n InputItem,\n OutputItem,\n ReplayItem,\n} from \"../types/index.js\";\n\n// ── Stop reason 映射 ──────────────────────────────────────────\n\n/**\n * 常见 provider stop_reason / finish_reason 到 canonical StopReason 的映射表。\n * adapter 可先查此表,未覆盖时走 fallback 规则。\n */\nconst STOP_REASON_MAP: Record<string, StopReason> = {\n // OpenAI / Azure\n stop: \"end_turn\",\n length: \"max_output_tokens\",\n content_filter: \"content_filter\",\n tool_calls: \"tool_call\",\n // Anthropic\n end_turn: \"end_turn\",\n max_tokens: \"max_output_tokens\",\n tool_use: \"tool_call\",\n // Generic\n error: \"error\",\n};\n\nexport function mapStopReason(providerReason: string): StopReason {\n return STOP_REASON_MAP[providerReason] ?? \"unknown\";\n}\n\n// ── Reasoning visibility 映射 ──────────────────────────────────\n\nexport function mapReasoningVisibility(hasThinking: boolean, hasRedacted: boolean): ReasoningItem[\"visibility\"] {\n if (hasRedacted) return \"redacted\";\n if (hasThinking) return \"full\";\n return \"opaque\";\n}\n\n// ── Content block 构造 helper ─────────────────────────────────\n\nexport function textBlock(text: string): ContentBlock & { type: \"text\" } {\n return { type: \"text\", text };\n}\n\nexport function jsonBlock(json: unknown): ContentBlock & { type: \"json\" } {\n return { type: \"json\", json };\n}\n\nexport function imageBlock(imageUrl: string): ContentBlock & { type: \"image\" } {\n return { type: \"image\", imageUrl };\n}\n\nexport function opaqueBlock(payload: unknown): ContentBlock & { type: \"opaque\" } {\n return { type: \"opaque\", payload };\n}\n\n// ── Item 构造 helper ──────────────────────────────────────────\n\nexport function messageItem(\n content: ContentBlock[],\n overrides?: Partial<Omit<MessageItem, \"type\" | \"content\">>,\n): MessageItem {\n return {\n type: \"message\",\n role: \"assistant\",\n ...overrides,\n content,\n };\n}\n\nexport function reasoningItem(\n content: ContentBlock[],\n visibility: ReasoningItem[\"visibility\"] = \"full\",\n id?: string,\n): ReasoningItem {\n return {\n type: \"reasoning\",\n id,\n visibility,\n content,\n };\n}\n\nexport function toolCallItem(id: string, name: string, argumentsText: string): ToolCallItem {\n return {\n type: \"tool_call\",\n id,\n name,\n argumentsText,\n };\n}\n\nexport function toolResultItem(\n callId: string,\n toolName: string,\n outcome: ToolResultItem[\"outcome\"],\n content: ContentBlock[],\n): ToolResultItem {\n return {\n type: \"tool_result\",\n callId,\n toolName,\n outcome,\n content,\n };\n}\n\nexport function opaqueItem(\n source: OpaqueItem[\"source\"],\n purpose: OpaqueItem[\"purpose\"],\n payload: unknown,\n id?: string,\n): OpaqueItem {\n return {\n type: \"opaque\",\n id,\n source,\n purpose,\n payload,\n };\n}\n\n// ── Replay 构造工具 ──────────────────────────────────────────\n\n/**\n * 从 output items 构建标准 replay items。\n * 简单场景下 replay 与 output 一致。\n * 复杂场景(需要 opaque continuation)由 adapter 自行扩展。\n */\nexport function replayFromOutput(output: readonly OutputItem[]): ReplayItem[] {\n return output.map((item): InputItem => {\n switch (item.type) {\n case \"message\":\n case \"reasoning\":\n case \"tool_call\":\n return item as InputItem;\n case \"opaque\":\n return item;\n }\n });\n}\n\n// ── Content block 提取 helper ──────────────────────────────────\n\n/**\n * 将单个 ContentBlock 转为纯文本。\n * text 块直接返回文本,json 块序列化,其余返回空串。\n */\nexport function blockToText(b: ContentBlock): string {\n if (b.type === \"text\") return b.text;\n if (b.type === \"json\") return JSON.stringify(b.json);\n return \"\";\n}\n\n/**\n * 将 ContentBlock 数组拼接为纯文本,块间以换行符分隔。\n */\nexport function contentBlocksToText(blocks: ContentBlock[]): string {\n return blocks.map(blockToText).join(\"\\n\");\n}\n\n// ── Output 文本提取 ───────────────────────────────────────────\n\n/**\n * 从 OutputItem 数组中提取所有 message 类型 item 的文本内容。\n */\nexport function extractText(output: OutputItem[]): string {\n return output\n .filter((item): item is MessageItem => item.type === \"message\")\n .flatMap((m) => m.content)\n .filter((b): b is ContentBlock & { type: \"text\" } => b.type === \"text\")\n .map((b) => b.text)\n .join(\"\");\n}\n","/**\n * 辅助信息采集器 (AuxiliaryCollector)\n *\n * 为 usage、billing、providerMetadata 提供统一的 best-effort 采集。\n *\n * 采集优先级(分层):\n * 1. 主响应 body / terminal event\n * 2. headers / trailers\n * 3. SDK metadata\n * 4. 一次 follow-up lookup\n * 5. derived estimate\n *\n * 约束:\n * - lookup 最多一次有界补查\n * - lookup 失败只记录 warning\n * - 不阻断主生成链路\n */\n\nimport type { Usage, BillingInfo, AuxiliaryInfo } from \"../types/index.js\";\n\n// ── 来源类型 ──────────────────────────────────────────────────\n\nexport type UsageSource = NonNullable<AuxiliaryInfo[\"usageSource\"]>;\nexport type BillingSource = NonNullable<AuxiliaryInfo[\"billingSource\"]>;\n\nexport type LookupResult = {\n usage?: Partial<Usage>;\n billing?: Partial<BillingInfo>;\n providerMetadata?: Record<string, unknown>;\n};\n\n// ── Collector ─────────────────────────────────────────────────\n\nexport class AuxiliaryCollector {\n private usage: Partial<Usage> = {};\n private usageSource: UsageSource | undefined;\n private billing: Partial<BillingInfo> | undefined;\n private billingSource: BillingSource | undefined;\n private providerMetadata: Record<string, unknown> = {};\n private providerUsage: unknown;\n private providerBilling: unknown;\n private warnings: string[] = [];\n private lookupAttempted = false;\n\n // ── 记录方法 ──────────────────────────────────────────────\n\n /**\n * 记录 usage 信息。\n * 后调用的覆盖先调用的(优先级由调用方控制)。\n */\n recordUsage(usage: Partial<Usage>, source: UsageSource, raw?: unknown): this {\n this.usage = { ...this.usage, ...usage };\n this.usageSource = source;\n if (raw !== undefined) this.providerUsage = raw;\n return this;\n }\n\n /**\n * 记录 billing 信息。\n * 后调用的覆盖先调用的。\n */\n recordBilling(billing: Partial<BillingInfo>, source: BillingSource, raw?: unknown): this {\n this.billing = { ...this.billing, ...billing };\n this.billingSource = source;\n if (raw !== undefined) this.providerBilling = raw;\n return this;\n }\n\n /**\n * 记录 provider 元数据(非 canonical 的 key-value 信息)。\n */\n recordMetadata(metadata: Record<string, unknown>): this {\n this.providerMetadata = { ...this.providerMetadata, ...metadata };\n return this;\n }\n\n /**\n * 记录一条 warning。\n */\n recordWarning(message: string): this {\n this.warnings.push(message);\n return this;\n }\n\n // ── 有界 Lookup ───────────────────────────────────────────\n\n /**\n * 执行一次有界 follow-up lookup。\n * 最多调用一次;后续调用被忽略。\n * lookup 失败(抛错)仅记录 warning,不传播异常。\n */\n async tryLookup(lookupFn: () => Promise<LookupResult>, timeoutMs = 5_000): Promise<void> {\n if (this.lookupAttempted) return;\n this.lookupAttempted = true;\n\n try {\n const result = await withTimeout(lookupFn(), timeoutMs);\n if (result.usage) {\n this.recordUsage(result.usage, \"lookup\", result.usage);\n }\n if (result.billing) {\n const bill: Partial<BillingInfo> = {\n ...result.billing,\n source: result.billing?.source ?? \"lookup\",\n };\n this.recordBilling(bill, \"lookup\", result.billing);\n }\n if (result.providerMetadata) {\n this.recordMetadata(result.providerMetadata);\n }\n } catch (err) {\n this.recordWarning(`Auxiliary lookup failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // ── 构建最终结果 ──────────────────────────────────────────\n\n /**\n * 构建最终的 usage / billing / auxiliary。\n * 所有字段均为可选的 — 拿不到就不给。\n */\n build(): { usage?: Usage; billing?: BillingInfo; auxiliary?: AuxiliaryInfo; warnings?: string[] } {\n const result: { usage?: Usage; billing?: BillingInfo; auxiliary?: AuxiliaryInfo; warnings?: string[] } = {};\n\n if (Object.keys(this.usage).length > 0) {\n result.usage = this.usage as Usage;\n }\n\n if (this.billing) {\n result.billing = this.billing as BillingInfo;\n }\n\n const aux: AuxiliaryInfo = {};\n if (this.usageSource) aux.usageSource = this.usageSource;\n if (this.billingSource) aux.billingSource = this.billingSource;\n if (this.providerUsage !== undefined) aux.providerUsage = this.providerUsage;\n if (this.providerBilling !== undefined) aux.providerBilling = this.providerBilling;\n if (Object.keys(this.providerMetadata).length > 0) aux.providerMetadata = this.providerMetadata;\n\n if (Object.keys(aux).length > 0) {\n result.auxiliary = aux;\n }\n\n if (this.warnings.length > 0) {\n result.warnings = [...this.warnings];\n }\n\n return result;\n }\n\n /**\n * 已使用的来源列表(用于 debugging)。\n */\n get sources(): { usage?: UsageSource; billing?: BillingSource } {\n return { usage: this.usageSource, billing: this.billingSource };\n }\n}\n\n// ── Helper ────────────────────────────────────────────────────\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n return Promise.race([\n promise,\n new Promise<T>((_, reject) => setTimeout(() => reject(new Error(`Lookup timed out after ${ms}ms`)), ms)),\n ]);\n}\n","import { WarningCode } from \"../core/errors.js\";\nimport type { EventFactory } from \"../core/event-factory.js\";\nimport type { AIStreamEvent, BillingInfo, NormalizedRequest, Usage, AuxiliaryInfo } from \"../types/index.js\";\nimport { AuxiliaryCollector, type BillingSource, type LookupResult, type UsageSource } from \"./auxiliary-collector.js\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type BillingPostprocessHook = (context: {\n request: NormalizedRequest;\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: AuxiliaryInfo;\n}) => MaybePromise<Partial<BillingInfo> | undefined>;\n\nexport type AuxiliaryFinalizeOptions = {\n lookup?: () => Promise<LookupResult>;\n lookupTimeoutMs?: number;\n postprocessBilling?: BillingPostprocessHook;\n postprocessBillingSource?: BillingSource;\n};\n\nexport type AuxiliaryFinalizeResult = {\n events: AIStreamEvent[];\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: AuxiliaryInfo;\n warnings?: string[];\n metadataSources?: string[];\n};\n\nexport class AdapterAuxiliaryState {\n private readonly collector = new AuxiliaryCollector();\n private readonly metadataSources = new Set<string>();\n\n constructor(private readonly request: NormalizedRequest) {}\n\n recordUsage(usage: Partial<Usage>, source: UsageSource, raw?: unknown): void {\n if (this.request.include?.usage === \"off\" || isEmptyRecord(usage)) return;\n this.collector.recordUsage(usage, source, raw);\n }\n\n recordBilling(billing: Partial<BillingInfo>, source: BillingSource, raw?: unknown): void {\n if (this.request.include?.billing === \"off\" || isEmptyRecord(billing)) return;\n this.collector.recordBilling(billing, source, raw);\n }\n\n recordProviderMetadata(source: string, metadata: Record<string, unknown> | undefined): void {\n if (this.request.include?.providerMetadata === \"off\" || !metadata || isEmptyRecord(metadata)) return;\n this.collector.recordMetadata(metadata);\n this.metadataSources.add(source);\n }\n\n async finalize(factory: EventFactory, options: AuxiliaryFinalizeOptions = {}): Promise<AuxiliaryFinalizeResult> {\n if (options.lookup && this.shouldAttemptLookup()) {\n await this.collector.tryLookup(options.lookup, options.lookupTimeoutMs);\n }\n\n if (this.request.include?.billing !== \"off\" && options.postprocessBilling) {\n const snapshot = this.collector.build();\n if (!snapshot.billing) {\n const derived = await options.postprocessBilling({\n request: this.request,\n usage: snapshot.usage,\n billing: snapshot.billing,\n auxiliary: snapshot.auxiliary,\n });\n if (derived && !isEmptyRecord(derived)) {\n this.collector.recordBilling(\n {\n ...derived,\n isEstimated: derived.isEstimated ?? true,\n source: derived.source ?? \"derived\",\n },\n options.postprocessBillingSource ?? \"derived\",\n derived,\n );\n }\n }\n }\n\n const built = this.collector.build();\n const events: AIStreamEvent[] = [];\n\n if (built.usage || built.billing || built.auxiliary) {\n events.push(\n factory.responseAuxiliary({\n usage: built.usage,\n billing: built.billing,\n auxiliary: built.auxiliary,\n }),\n );\n }\n\n if (this.request.include?.usage !== \"off\" && !built.usage) {\n events.push(\n factory.responseWarning(\"Usage information was not provided by the provider\", WarningCode.USAGE_MISSING),\n );\n }\n\n if (this.request.include?.billing !== \"off\") {\n if (!built.billing) {\n events.push(\n factory.responseWarning(\"Billing information was not provided by the provider\", WarningCode.BILLING_MISSING),\n );\n } else if (built.billing.isEstimated) {\n events.push(factory.responseWarning(\"Billing amount is an estimate\", WarningCode.BILLING_ESTIMATED));\n }\n }\n\n return {\n events,\n usage: built.usage,\n billing: built.billing,\n auxiliary: built.auxiliary,\n warnings: built.warnings,\n metadataSources: this.metadataSources.size > 0 ? [...this.metadataSources] : undefined,\n };\n }\n\n private shouldAttemptLookup(): boolean {\n if (\n this.request.include?.usage === \"off\" &&\n this.request.include?.billing === \"off\" &&\n this.request.include?.providerMetadata === \"off\"\n ) {\n return false;\n }\n\n const snapshot = this.collector.build();\n return (\n (this.request.include?.usage !== \"off\" && !snapshot.usage) ||\n (this.request.include?.billing !== \"off\" && !snapshot.billing) ||\n (this.request.include?.providerMetadata !== \"off\" && !snapshot.auxiliary?.providerMetadata)\n );\n }\n}\n\nexport function emitMalformedStreamWarning(\n factory: EventFactory,\n options: {\n count: number;\n providerLabel: string;\n transportLabel: string;\n },\n): AIStreamEvent | undefined {\n if (options.count < 1) return undefined;\n return factory.responseWarning(\n `Skipped ${options.count} malformed ${options.providerLabel} ${options.transportLabel}`,\n \"STREAM_ERROR\",\n );\n}\n\nfunction isEmptyRecord(value: object): boolean {\n return Object.keys(value).length === 0;\n}\n","/**\n * Adapter 抽象基类\n *\n * 约定 adapter 的内部职责分层(build / invoke / parse / emit):\n * 1. buildRequest — 将 NormalizedRequest 转换为 provider 请求格式\n * 2. invokeProvider — 调用 provider API\n * 3. parseResponse — 解析 provider 响应为 canonical 中间态\n * 4. emitEvents — 产出 canonical 事件流\n *\n * 子类实现 buildRequest() 和 runStream(),\n * runStream 返回 AsyncIterable,事件实时发射给消费者。\n */\n\nimport type {\n NormalizedRequest,\n BackendAdapter,\n AIStreamEvent,\n AIResponse,\n AuxiliaryInfo,\n OutputItem,\n ReplayItem,\n StopReason,\n Usage,\n BillingInfo,\n ToolCallItem,\n} from \"../types/index.js\";\nimport { createEventFactory } from \"../core/event-factory.js\";\nimport { AIMappingError, AIProviderError, AIRequestError, AIStreamError } from \"../core/errors.js\";\nimport type { EventFactory } from \"../core/event-factory.js\";\nimport { extractText } from \"./mapping.js\";\nimport { AdapterAuxiliaryState } from \"./adapter-auxiliary.js\";\nimport { mergeAuxiliary } from \"../core/merge-auxiliary.js\";\n\n// ── Adapter 解析中间结果 ──────────────────────────────────────\n\nexport type ProviderResponse = unknown;\n\n/**\n * adapter 完成一轮处理后返回的最终结果。\n * 用于 buildResponse() 构建 AIResponse。\n */\nexport type StreamResult = {\n output: OutputItem[];\n replay: ReplayItem[];\n stopReason?: StopReason;\n usage?: Usage;\n billing?: BillingInfo;\n providerMetadata?: Record<string, unknown>;\n auxiliary?: Partial<AuxiliaryInfo>;\n warnings?: string[];\n metadataSources?: string[];\n rawResponseId?: string;\n};\n\n// ── 抽象基类 ──────────────────────────────────────────────────\n\nexport abstract class AdapterBase implements BackendAdapter {\n abstract readonly kind: \"chat-completions\" | \"messages\" | \"responses\" | \"ollama\" | \"mock\";\n abstract readonly isSyntheticStream: boolean;\n\n /**\n * stream 模板方法:\n * 1. 创建事件工厂,发射 response.started\n * 2. 构建 provider 请求\n * 3. 委托 runStream 发射全部流事件(含 response.completed)\n */\n async *stream(request: NormalizedRequest): AsyncIterable<AIStreamEvent> {\n // 若请求已被 abort,不发出任何事件\n request.signal?.throwIfAborted();\n\n const factory = createEventFactory({\n responseId: request.requestId,\n backend: { kind: this.kind, isSynthetic: this.isSyntheticStream },\n });\n\n yield factory.responseStarted(request.model);\n\n try {\n const providerRequest = await this.buildRequest(request);\n yield* this.runStream(providerRequest, factory, request);\n } catch (err) {\n if (err instanceof AIRequestError || err instanceof AIProviderError || err instanceof AIStreamError) {\n throw err;\n }\n\n if (err instanceof AIMappingError) {\n yield factory.responseWarning(err.message, \"MAPPING_ERROR\");\n const errorResp = this.buildResponse(request, { output: [], replay: [] }, factory);\n yield factory.responseCompleted({\n replay: errorResp.replay,\n stopReason: errorResp.stopReason,\n trace: errorResp.backend,\n usage: errorResp.usage,\n billing: errorResp.billing,\n auxiliary: errorResp.auxiliary,\n warnings: errorResp.warnings,\n });\n return;\n }\n\n throw err;\n }\n }\n\n // ── 子类必须实现 ──────────────────────────────────────────\n\n /** 将 NormalizedRequest 转换为 provider 请求格式。 */\n protected abstract buildRequest(request: NormalizedRequest): ProviderResponse | Promise<ProviderResponse>;\n\n /**\n * 执行流式请求,发射全部事件(含 response.completed)。\n * 子类负责:\n * - 调用 provider\n * - 解析每个 chunk\n * - 通过 factory 发射 item 事件\n * - 构建 StreamResult\n * - 发射 factory.responseCompleted(buildResponse(…))\n */\n protected abstract runStream(\n providerRequest: ProviderResponse,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent>;\n\n // ── 共享构造方法 ──────────────────────────────────────────\n\n /**\n * 从 StreamResult 构建完整 AIResponse。\n * 子类可在返回前自定义覆盖。\n */\n protected buildResponse(request: NormalizedRequest, result: StreamResult, _factory: EventFactory): AIResponse {\n const text = extractText(result.output);\n const warnings = mergeWarnings(result.warnings, _factory.warnings);\n const auxiliary = mergeAuxiliary(\n result.auxiliary,\n result.providerMetadata ? { providerMetadata: result.providerMetadata } : undefined,\n );\n\n return {\n id: request.requestId,\n output: result.output,\n replay: result.replay,\n text,\n toolCalls: result.output.filter((item): item is ToolCallItem => item.type === \"tool_call\"),\n stopReason: result.stopReason,\n usage: result.usage,\n billing: result.billing,\n auxiliary,\n warnings,\n backend: {\n requestId: request.requestId,\n rawResponseId: result.rawResponseId,\n adapter: this.kind,\n isSyntheticStream: this.isSyntheticStream,\n metadataSources: result.metadataSources,\n warnings,\n },\n };\n }\n\n /**\n * 统一 finalize auxiliary → response.completed。\n * adapter 在调用前组装 output / replay / stopReason 等业务字段。\n */\n protected async *emitStreamCompleted(\n factory: EventFactory,\n request: NormalizedRequest,\n auxiliary: AdapterAuxiliaryState,\n result: StreamResult,\n ): AsyncIterable<AIStreamEvent> {\n const auxiliaryResult = await auxiliary.finalize(factory);\n for (const event of auxiliaryResult.events) {\n yield event;\n }\n\n const finalResponse = this.buildResponse(\n request,\n {\n ...result,\n usage: result.usage ?? auxiliaryResult.usage,\n billing: result.billing ?? auxiliaryResult.billing,\n auxiliary: mergeAuxiliary(result.auxiliary, auxiliaryResult.auxiliary),\n warnings: mergeWarnings(result.warnings, auxiliaryResult.warnings),\n metadataSources: result.metadataSources ?? auxiliaryResult.metadataSources,\n },\n factory,\n );\n\n yield factory.responseCompleted({\n replay: finalResponse.replay,\n stopReason: finalResponse.stopReason,\n trace: finalResponse.backend,\n usage: finalResponse.usage,\n billing: finalResponse.billing,\n auxiliary: finalResponse.auxiliary,\n warnings: finalResponse.warnings,\n });\n }\n\n protected createAuxiliaryState(request: NormalizedRequest): AdapterAuxiliaryState {\n return new AdapterAuxiliaryState(request);\n }\n}\n\nfunction mergeWarnings(...groups: Array<string[] | undefined>): string[] | undefined {\n const merged: string[] = [];\n\n for (const group of groups) {\n if (!group) continue;\n for (const warning of group) {\n if (!merged.includes(warning)) {\n merged.push(warning);\n }\n }\n }\n\n return merged.length > 0 ? merged : undefined;\n}\n","/**\n * Adapter 边界安全辅助\n *\n * - opaque replay 入站 envelope(大小 / 深度)\n * - provider HTTP 错误 body 出站脱敏\n */\n\nimport { AIProviderError, AIRequestError } from \"../core/errors.js\";\n\nexport const MAX_OPAQUE_PAYLOAD_BYTES = 65536;\nexport const MAX_OPAQUE_JSON_DEPTH = 8;\nexport const PROVIDER_ERROR_MESSAGE_MAX_LEN = 500;\nexport const PROVIDER_ERROR_RAW_BODY_THRESHOLD = 200;\n\nexport type OpaqueEnvelopeResult = { ok: true } | { ok: false; reason: string };\n\n/** 测量 JSON 值嵌套深度(对象/数组);循环引用按已访问节点深度计。 */\nexport function measureJsonDepth(value: unknown, seen = new WeakSet<object>()): number {\n if (value === null || typeof value !== \"object\") {\n return 0;\n }\n\n if (seen.has(value)) {\n return 0;\n }\n seen.add(value);\n\n let maxChild = 0;\n if (Array.isArray(value)) {\n for (const item of value) {\n maxChild = Math.max(maxChild, measureJsonDepth(item, seen));\n }\n } else {\n for (const key of Object.keys(value as Record<string, unknown>)) {\n maxChild = Math.max(maxChild, measureJsonDepth((value as Record<string, unknown>)[key], seen));\n }\n }\n\n return 1 + maxChild;\n}\n\n/**\n * Opaque replay 通用 envelope:必须是 object、体积 ≤ 64KB、深度 ≤ 8。\n * 不校验 adapter 专用字段形状。\n */\nexport function validateOpaqueReplayEnvelope(payload: unknown): OpaqueEnvelopeResult {\n if (typeof payload !== \"object\" || payload === null) {\n return { ok: false, reason: \"payload must be an object\" };\n }\n\n let raw: string;\n try {\n raw = JSON.stringify(payload);\n } catch {\n return { ok: false, reason: \"payload is not JSON-serializable\" };\n }\n\n if (raw === undefined) {\n return { ok: false, reason: \"payload is not JSON-serializable\" };\n }\n\n if (raw.length > MAX_OPAQUE_PAYLOAD_BYTES) {\n return {\n ok: false,\n reason: `opaque payload exceeds max size (${raw.length} > ${MAX_OPAQUE_PAYLOAD_BYTES})`,\n };\n }\n\n const depth = measureJsonDepth(payload);\n if (depth > MAX_OPAQUE_JSON_DEPTH) {\n return {\n ok: false,\n reason: `opaque payload nesting depth (${depth}) exceeds max (${MAX_OPAQUE_JSON_DEPTH})`,\n };\n }\n\n return { ok: true };\n}\n\n/** envelope 失败时抛 AIRequestError。 */\nexport function assertOpaqueReplayEnvelope(payload: unknown): void {\n const result = validateOpaqueReplayEnvelope(payload);\n if (!result.ok) {\n throw new AIRequestError(`Invalid opaque replay payload: ${result.reason}`, \"INVALID_OPAQUE_REPLAY\");\n }\n}\n\n/**\n * 从 provider HTTP 错误 body 提取可对外暴露的短消息,避免泄漏 HTML / 内部路径等。\n */\nexport function extractProviderErrorMessage(body: string, status: number): string {\n if (!body) return `HTTP ${status}`;\n\n try {\n const parsed: unknown = JSON.parse(body);\n if (parsed && typeof parsed === \"object\") {\n const record = parsed as Record<string, unknown>;\n const errorField = record.error;\n let msg: unknown;\n if (errorField && typeof errorField === \"object\" && errorField !== null) {\n msg = (errorField as Record<string, unknown>).message;\n }\n if (typeof msg !== \"string\") {\n msg = typeof errorField === \"string\" ? errorField : record.message;\n }\n if (typeof msg === \"string\" && msg.length > 0) {\n return msg.slice(0, PROVIDER_ERROR_MESSAGE_MAX_LEN);\n }\n }\n } catch {\n // not JSON\n }\n\n const trimmed = body.trimStart();\n if (trimmed.startsWith(\"<!\") || trimmed.startsWith(\"<html\") || body.length > PROVIDER_ERROR_RAW_BODY_THRESHOLD) {\n return `HTTP ${status}. Body omitted (${body.length} bytes)`;\n }\n\n return body.slice(0, PROVIDER_ERROR_MESSAGE_MAX_LEN);\n}\n\n/** 统一构造脱敏后的 AIProviderError。 */\nexport function providerHttpError(status: number, body: string): AIProviderError {\n const safe = extractProviderErrorMessage(body, status);\n return new AIProviderError(`Provider returned ${status}: ${safe}`, \"PROVIDER_ERROR\", status, safe);\n}\n","/**\n * Provider usage → canonical Usage 映射\n *\n * best-effort 提取 reasoning / cache 等扩展字段。\n */\n\nimport type { Usage } from \"../types/index.js\";\n\nfunction num(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction record(obj: Record<string, number | undefined>): Partial<Usage> {\n const out: Partial<Usage> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n (out as Record<string, number>)[key] = value;\n }\n }\n return out;\n}\n\nfunction withDerivedTotal(usage: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n cachedInputTokens?: number;\n reasoningTokens?: number;\n cacheWriteInputTokens?: number;\n}): Partial<Usage> {\n const { inputTokens, outputTokens, totalTokens, cachedInputTokens, reasoningTokens, cacheWriteInputTokens } = usage;\n return record({\n inputTokens,\n outputTokens,\n totalTokens:\n totalTokens ?? (inputTokens !== undefined && outputTokens !== undefined ? inputTokens + outputTokens : undefined),\n cachedInputTokens,\n reasoningTokens,\n cacheWriteInputTokens,\n });\n}\n\n/** OpenAI Chat Completions `usage` */\nexport function usageFromChatCompletions(raw: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number; [key: string]: unknown };\n completion_tokens_details?: { reasoning_tokens?: number; [key: string]: unknown };\n}): Partial<Usage> {\n return withDerivedTotal({\n inputTokens: num(raw.prompt_tokens),\n outputTokens: num(raw.completion_tokens),\n totalTokens: num(raw.total_tokens),\n cachedInputTokens: num(raw.prompt_tokens_details?.cached_tokens),\n reasoningTokens: num(raw.completion_tokens_details?.reasoning_tokens),\n });\n}\n\n/** OpenAI Responses API `usage` */\nexport function usageFromOpenAIResponses(raw: {\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n input_tokens_details?: { cached_tokens?: number; [key: string]: unknown };\n output_tokens_details?: { reasoning_tokens?: number; [key: string]: unknown };\n [key: string]: unknown;\n}): Partial<Usage> {\n return withDerivedTotal({\n inputTokens: num(raw.input_tokens),\n outputTokens: num(raw.output_tokens),\n totalTokens: num(raw.total_tokens),\n cachedInputTokens: num(raw.input_tokens_details?.cached_tokens),\n reasoningTokens: num(raw.output_tokens_details?.reasoning_tokens),\n });\n}\n\n/** Anthropic Messages `usage`(message_start / message_delta) */\nexport function usageFromAnthropicMessages(raw: {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n [key: string]: unknown;\n}): Partial<Usage> {\n const uncachedInputTokens = num(raw.input_tokens);\n const outputTokens = num(raw.output_tokens);\n const cacheWriteInputTokens = num(raw.cache_creation_input_tokens);\n const cachedInputTokens = num(raw.cache_read_input_tokens);\n\n const inputParts = [uncachedInputTokens, cacheWriteInputTokens, cachedInputTokens].filter(\n (n): n is number => n !== undefined,\n );\n const inputTokens = inputParts.length > 0 ? inputParts.reduce((sum, n) => sum + n, 0) : undefined;\n\n return withDerivedTotal({\n inputTokens,\n outputTokens,\n cachedInputTokens,\n cacheWriteInputTokens,\n });\n}\n\n/** Ollama 流式 chunk */\nexport function usageFromOllama(raw: { prompt_eval_count?: number; eval_count?: number }): Partial<Usage> {\n return withDerivedTotal({\n inputTokens: num(raw.prompt_eval_count),\n outputTokens: num(raw.eval_count),\n });\n}\n","/**\n * 模拟流式 (Synthetic Streaming)\n *\n * 将一组已解析的 canonical OutputItem 包装为规范事件流。\n * 适用于非原生流式后端:adapter 拿到完整响应后,调用此函数\n * 即可产出一致的事件序列,无需自己逐事件组装。\n *\n * 约束:\n * - 每个 item 只发一块完整 delta(不模拟逐 token)\n * - 保持 item 边界\n * - 保持后端原始顺序\n * - 不发明 reasoning\n * - 不改写工具参数\n */\n\nimport { createEventFactory } from \"../core/event-factory.js\";\nimport { replayFromOutput } from \"./mapping.js\";\n\nimport type {\n OutputItem,\n ReplayItem,\n StopReason,\n Usage,\n BillingInfo,\n AIStreamEvent,\n MessageItem,\n ReasoningItem,\n ToolCallItem,\n OpaqueItem,\n} from \"../types/index.js\";\n\n// ── 输入参数 ──────────────────────────────────────────────────\n\nexport type SyntheticStreamOptions = {\n model: string;\n responseId: string;\n backend: {\n kind: \"chat-completions\" | \"messages\" | \"responses\" | \"mock\";\n /** syntheticStream 强制设为 true */\n };\n output: OutputItem[];\n replay?: ReplayItem[];\n stopReason?: StopReason;\n usage?: Usage;\n billing?: BillingInfo;\n providerMetadata?: Record<string, unknown>;\n rawResponseId?: string;\n warnings?: string[];\n};\n\n// ── Synthetic Stream ──────────────────────────────────────────\n\n/**\n * 将已解析的 output items 包装为完整规范事件流。\n *\n * 用法示例(在 adapter 的 runStream 中):\n * ```ts\n * const result = parseNonStreamingResponse(data);\n * yield* syntheticStream({\n * model: request.model,\n * responseId: request.requestId,\n * backend: { kind: \"chat-completions\" },\n * output: result.output,\n * stopReason: result.stopReason,\n * usage: result.usage,\n * });\n * ```\n */\nexport async function* syntheticStream(options: SyntheticStreamOptions): AsyncIterable<AIStreamEvent> {\n const {\n model,\n responseId,\n backend,\n output,\n replay,\n stopReason,\n usage,\n billing,\n providerMetadata,\n rawResponseId,\n warnings: extraWarnings,\n } = options;\n\n const factory = createEventFactory({\n responseId,\n backend: { kind: backend.kind, isSynthetic: true },\n });\n\n // 1. 响应开始\n yield factory.responseStarted(model);\n\n // 2. item 级事件 — 每个 item 只发一块完整 delta\n for (const item of output) {\n yield* emitItemEvents(item, factory);\n }\n\n // 3. auxiliary 事件(如有)\n if (usage || billing) {\n yield factory.responseAuxiliary({ usage, billing });\n }\n\n // 4. 构建最终 completion 并发射\n const finalReplay = replay ?? replayFromOutput(output);\n\n // 收集警告\n const allWarnings: string[] = [];\n allWarnings.push(\"Response is synthetically streamed; delta granularity may differ from native streaming\");\n if (extraWarnings) allWarnings.push(...extraWarnings);\n\n yield factory.responseCompleted({\n replay: finalReplay,\n stopReason,\n usage,\n billing,\n auxiliary: providerMetadata ? { providerMetadata } : undefined,\n opaqueOutput: output.filter((item): item is OpaqueItem => item.type === \"opaque\"),\n warnings: allWarnings.length > 0 ? allWarnings : undefined,\n trace: {\n requestId: responseId,\n rawResponseId,\n adapter: backend.kind,\n isSyntheticStream: true,\n warnings: allWarnings.length > 0 ? allWarnings : undefined,\n },\n });\n}\n\n// ── Item 事件发射 ─────────────────────────────────────────────\n\nfunction* emitItemEvents(item: OutputItem, factory: ReturnType<typeof createEventFactory>): Generator<AIStreamEvent> {\n switch (item.type) {\n case \"message\":\n yield* emitMessageEvents(item, factory);\n break;\n case \"reasoning\":\n yield* emitReasoningEvents(item, factory);\n break;\n case \"tool_call\":\n yield* emitToolCallEvents(item, factory);\n break;\n case \"opaque\":\n // Opaque items in output have no streaming events\n break;\n }\n}\n\nfunction* emitMessageEvents(\n item: MessageItem,\n factory: ReturnType<typeof createEventFactory>,\n): Generator<AIStreamEvent> {\n const id = item.id ?? `syn-msg-${crypto.randomUUID()}`;\n yield factory.messageStarted(id);\n\n for (const block of item.content) {\n yield factory.messageDelta(id, block);\n }\n\n yield factory.messageCompleted(id);\n}\n\nfunction* emitReasoningEvents(\n item: ReasoningItem,\n factory: ReturnType<typeof createEventFactory>,\n): Generator<AIStreamEvent> {\n const id = item.id ?? `syn-reason-${crypto.randomUUID()}`;\n yield factory.reasoningStarted(id, item.visibility);\n\n for (const block of item.content) {\n yield factory.reasoningDelta(id, block);\n }\n\n yield factory.reasoningCompleted(id);\n}\n\nfunction* emitToolCallEvents(\n item: ToolCallItem,\n factory: ReturnType<typeof createEventFactory>,\n): Generator<AIStreamEvent> {\n yield factory.toolCallStarted(item.id, item.name);\n\n if (item.argumentsText) {\n yield factory.toolCallDelta(item.id, { argumentsText: item.argumentsText });\n }\n\n yield factory.toolCallCompleted(item.id);\n}\n\n// ── Helper ────────────────────────────────────────────────────\n","export type StreamSplitResult = {\n items: string[];\n rest: string;\n};\n\nexport type StreamParseResult<T> = { status: \"parsed\"; value: T } | { status: \"ignored\" } | { status: \"malformed\" };\n\nexport class IncrementalStreamParser<T> {\n private buffer = \"\";\n private readonly decoder = new TextDecoder();\n\n constructor(\n private readonly split: (buffer: string, allowEOF: boolean) => StreamSplitResult,\n private readonly parse: (item: string) => StreamParseResult<T>,\n ) {}\n\n feed(value: Uint8Array): { items: T[]; malformed: number } {\n this.buffer += this.decoder.decode(value, { stream: true });\n return this.consume(false);\n }\n\n flush(): { items: T[]; malformed: number } {\n this.buffer += this.decoder.decode();\n return this.consume(true);\n }\n\n getRemaining(): string {\n return this.buffer;\n }\n\n private consume(allowEOF: boolean): { items: T[]; malformed: number } {\n const split = this.split(this.buffer, allowEOF);\n this.buffer = split.rest;\n const items: T[] = [];\n let malformed = 0;\n\n for (const rawItem of split.items) {\n const result = this.parse(rawItem);\n if (result.status === \"parsed\") items.push(result.value);\n else if (result.status === \"malformed\") malformed++;\n }\n\n return { items, malformed };\n }\n}\n\nexport function splitLines(buffer: string, allowEOF: boolean): StreamSplitResult {\n const items: string[] = [];\n let cursor = 0;\n\n while (true) {\n const lineEnd = buffer.indexOf(\"\\n\", cursor);\n if (lineEnd === -1) break;\n items.push(buffer.slice(cursor, lineEnd));\n cursor = lineEnd + 1;\n }\n\n if (allowEOF && cursor < buffer.length) {\n items.push(buffer.slice(cursor));\n cursor = buffer.length;\n }\n\n return { items, rest: buffer.slice(cursor) };\n}\n\nexport function splitSSEFrames(buffer: string, allowEOF: boolean): StreamSplitResult {\n const normalized = buffer.replaceAll(\"\\r\\n\", \"\\n\");\n const items: string[] = [];\n let cursor = 0;\n\n while (true) {\n const frameEnd = normalized.indexOf(\"\\n\\n\", cursor);\n if (frameEnd === -1) break;\n items.push(normalized.slice(cursor, frameEnd));\n cursor = frameEnd + 2;\n }\n\n if (allowEOF && cursor < normalized.length) {\n items.push(normalized.slice(cursor));\n cursor = normalized.length;\n }\n\n return { items, rest: normalized.slice(cursor) };\n}\n\n// ── 常用 parse 工厂 ───────────────────────────────────────────\n\nexport type SseJsonEvent = { type: string; data: unknown };\n\n/** 解析标准 SSE frame(event: + data:),用于 Messages / Responses。 */\nexport function parseSseJsonFrame(frame: string): StreamParseResult<SseJsonEvent> {\n let eventType = \"\";\n let dataStr = \"\";\n for (const rawLine of frame.split(\"\\n\")) {\n const line = rawLine.trim();\n if (line.startsWith(\"event: \")) eventType = line.slice(7).trim();\n else if (line.startsWith(\"data: \")) dataStr += line.slice(6);\n }\n if (!eventType) return { status: \"ignored\" };\n try {\n const data: unknown = JSON.parse(dataStr);\n return { status: \"parsed\", value: { type: eventType, data } };\n } catch {\n return { status: \"malformed\" };\n }\n}\n\nexport function createSseJsonParser<T extends SseJsonEvent = SseJsonEvent>(): IncrementalStreamParser<T> {\n return new IncrementalStreamParser(splitSSEFrames, (frame) => parseSseJsonFrame(frame) as StreamParseResult<T>);\n}\n\n/** OpenAI Chat Completions 简化 SSE:仅 `data: ...` 行,忽略 `[DONE]`。 */\nexport function parseChatCompletionsDataLine(item: string): StreamParseResult<unknown> {\n const trimmed = item.trim();\n if (!trimmed.startsWith(\"data: \")) return { status: \"ignored\" };\n const data = trimmed.slice(6).trim();\n if (data === \"[DONE]\") return { status: \"ignored\" };\n try {\n return { status: \"parsed\", value: JSON.parse(data) as unknown };\n } catch {\n return { status: \"malformed\" };\n }\n}\n\nexport function createChatCompletionsSseParser<T>(): IncrementalStreamParser<T> {\n return new IncrementalStreamParser(splitLines, (item) => parseChatCompletionsDataLine(item) as StreamParseResult<T>);\n}\n\n/** NDJSON 行解析(Ollama 等):空行忽略,JSON 失败为 malformed。 */\nexport function createNdjsonLineParser<T>(isValid: (value: unknown) => value is T): IncrementalStreamParser<T> {\n return new IncrementalStreamParser<T>(splitLines, (item: string): StreamParseResult<T> => {\n const trimmed = item.trim();\n if (!trimmed) return { status: \"ignored\" };\n try {\n const parsed: unknown = JSON.parse(trimmed);\n if (isValid(parsed)) return { status: \"parsed\", value: parsed };\n return { status: \"malformed\" };\n } catch {\n return { status: \"malformed\" };\n }\n });\n}\n","/**\n * Provider HTTP 流公共脚手架\n *\n * 收敛 adapter 间重复的:\n * - JSON POST + 错误映射\n * - ReadableStream reader 生命周期\n * - IncrementalStreamParser feed/flush + malformed warning\n * - 不完整尾帧 warning\n */\n\nimport { AIProviderError, AIStreamError } from \"../core/errors.js\";\nimport type { EventFactory } from \"../core/event-factory.js\";\nimport type { AIStreamEvent, FetchFn } from \"../types/index.js\";\nimport { emitMalformedStreamWarning } from \"./adapter-auxiliary.js\";\nimport { providerHttpError } from \"./adapter-security.js\";\nimport type { IncrementalStreamParser } from \"./incremental-stream-parser.js\";\n\nexport type OpenProviderJsonStreamOptions = {\n fetchFn: FetchFn;\n url: string;\n headers: Record<string, string>;\n body: unknown;\n signal?: AbortSignal;\n};\n\nexport type OpenedProviderStream = {\n reader: ReadableStreamDefaultReader<Uint8Array>;\n headers: Headers;\n};\n\n/** POST JSON 并返回可读 body reader + response headers;统一网络/HTTP/空 body 错误。 */\nexport async function openProviderJsonStream(options: OpenProviderJsonStreamOptions): Promise<OpenedProviderStream> {\n const { fetchFn, url, headers, body, signal } = options;\n\n let response: Response;\n try {\n response = await fetchFn(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal,\n });\n } catch (err) {\n throw new AIProviderError(err instanceof Error ? err.message : String(err), \"PROVIDER_ERROR\");\n }\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => \"\");\n throw providerHttpError(response.status, errorBody);\n }\n\n const bodyStream = response.body;\n if (!bodyStream) {\n throw new AIStreamError(\"Response body is not readable\", \"STREAM_ERROR\");\n }\n\n // Bun/DOM ReadableStreamDefaultReader 类型略有差异,按最小接口使用\n return {\n reader: bodyStream.getReader() as ReadableStreamDefaultReader<Uint8Array>,\n headers: response.headers,\n };\n}\n\nexport type ProviderStreamBatchOptions<T> = {\n reader: ReadableStreamDefaultReader<Uint8Array>;\n parser: IncrementalStreamParser<T>;\n factory: EventFactory;\n providerLabel: string;\n transportLabel: string;\n incompleteMessage: string;\n};\n\nexport type ProviderStreamBatch<T> = {\n items: T[];\n warnings: AIStreamEvent[];\n};\n\n/**\n * 读取并解析 provider 流。\n * 每个 batch 携带本轮解析出的 items 与(可选)malformed / incomplete warning。\n * 调用方应 `for await` 消费完毕;reader 在迭代结束时 cancel/release。\n */\nexport async function* iterateProviderStreamBatches<T>(\n options: ProviderStreamBatchOptions<T>,\n): AsyncGenerator<ProviderStreamBatch<T>, void, undefined> {\n const { reader, parser, factory, providerLabel, transportLabel, incompleteMessage } = options;\n let streamDone = false;\n\n try {\n while (true) {\n const readResult = await reader.read().catch((err: unknown) => {\n throw new AIStreamError(\n `Failed to read response stream: ${err instanceof Error ? err.message : String(err)}`,\n \"STREAM_ERROR\",\n );\n });\n const { done, value } = readResult;\n const { items, malformed } = done ? parser.flush() : parser.feed(value as Uint8Array);\n\n const warnings: AIStreamEvent[] = [];\n const malformedWarning = emitMalformedStreamWarning(factory, {\n count: malformed,\n providerLabel,\n transportLabel,\n });\n if (malformedWarning) warnings.push(malformedWarning);\n\n yield { items, warnings };\n\n if (done) {\n streamDone = true;\n break;\n }\n }\n } finally {\n try {\n if (!streamDone) await reader.cancel().catch(() => undefined);\n } finally {\n reader.releaseLock();\n }\n }\n\n if (parser.getRemaining().trim().length > 0) {\n yield {\n items: [],\n warnings: [factory.responseWarning(incompleteMessage, \"STREAM_ERROR\")],\n };\n }\n}\n\n/** 一次性 complete 守卫:首次成功,后续返回 false。 */\nexport function createCompletionGate(): {\n readonly completed: boolean;\n tryComplete(): boolean;\n} {\n let completed = false;\n return {\n get completed() {\n return completed;\n },\n tryComplete() {\n if (completed) return false;\n completed = true;\n return true;\n },\n };\n}\n","import { AIRequestError } from \"../core/errors.js\";\nimport { contentBlocksToText } from \"./mapping.js\";\n\nimport type { ContentBlock, InstructionBlock, ToolCallItem, ToolChoice, ToolDefinition } from \"../types/index.js\";\n\nexport class NormalizedRequestMapper {\n constructor(readonly kind: string) {}\n\n mapInstructions(instructions: string | InstructionBlock[]): string {\n return typeof instructions === \"string\"\n ? instructions\n : contentBlocksToText(this.ensureTextBlocks(instructions, \"instructions\"));\n }\n\n ensureTextBlocks(blocks: ContentBlock[], field: string): ContentBlock[] {\n return this.ensureBlocks(blocks, field, [\"text\", \"json\"], \"only text/json blocks are supported\");\n }\n\n ensureReasoningBlocks(blocks: ContentBlock[], field: string): Array<Extract<ContentBlock, { type: \"text\" }>> {\n return this.ensureBlocks(blocks, field, [\"text\"], \"reasoning only supports text blocks\") as Array<\n Extract<ContentBlock, { type: \"text\" }>\n >;\n }\n\n /** ensureTextBlocks + contentBlocksToText 的常见组合。 */\n textFromBlocks(blocks: ContentBlock[], field: string): string {\n return contentBlocksToText(this.ensureTextBlocks(blocks, field));\n }\n\n parseToolArguments(item: ToolCallItem): Record<string, unknown> {\n try {\n const parsed: unknown = JSON.parse(item.argumentsText);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // handled below\n }\n\n throw new AIRequestError(\n `${this.kind} requires tool_call argumentsText to be a valid JSON object`,\n \"TOOL_CALL_ARGUMENTS_INVALID\",\n );\n }\n\n rollbackTrailingAssistantMessages<T extends { role: string }>(messages: T[]): void {\n while (messages.length > 0 && messages[messages.length - 1]?.role === \"assistant\") {\n messages.pop();\n }\n }\n\n mapToolsIfPresent<T>(tools: ToolDefinition[] | undefined, map: (tool: ToolDefinition) => T): T[] | undefined {\n if (!tools || tools.length === 0) return undefined;\n return tools.map(map);\n }\n\n /**\n * 将 canonical toolChoice 映射为 provider 形状。\n * 返回 undefined 表示调用方无需写入 body 字段。\n */\n mapToolChoice<T>(\n toolChoice: ToolChoice | undefined,\n mappers: {\n auto: T;\n none: T;\n tool: (name: string) => T;\n },\n ): T | undefined {\n if (!toolChoice) return undefined;\n if (toolChoice === \"auto\") return mappers.auto;\n if (toolChoice === \"none\") return mappers.none;\n if (toolChoice.type === \"tool\") return mappers.tool(toolChoice.name);\n return undefined;\n }\n\n private ensureBlocks(\n blocks: ContentBlock[],\n field: string,\n supportedTypes: ReadonlyArray<ContentBlock[\"type\"]>,\n description: string,\n ): ContentBlock[] {\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i];\n if (block && !supportedTypes.includes(block.type)) {\n throw new AIRequestError(\n `${this.kind} does not support ${field}[${i}] of type \"${block.type}\"; ${description}`,\n \"UNSUPPORTED_CONTENT_BLOCK\",\n );\n }\n }\n\n return blocks;\n }\n}\n","/**\n * Responses Adapter\n *\n * 接入 OpenAI Responses API (responses 端点)。\n * 职责分层:\n * 1. buildRequest — 将 NormalizedRequest 转换为 Responses API 请求\n * 2. runStream — 调用 API、解析 SSE、发射 canonical 事件\n *\n * 支持消息流 / reasoning 流 / tool_call 流及高保真 replay。\n */\n\nimport { AdapterBase } from \"../helpers/adapter-base.js\";\nimport { AIRequestError } from \"../core/errors.js\";\nimport {\n textBlock,\n messageItem,\n reasoningItem,\n toolCallItem,\n opaqueItem,\n replayFromOutput,\n} from \"../helpers/mapping.js\";\nimport { assertOpaqueReplayEnvelope } from \"../helpers/adapter-security.js\";\nimport { usageFromOpenAIResponses } from \"../helpers/usage-mapping.js\";\nimport {\n NormalizedRequestMapper,\n createSseJsonParser,\n openProviderJsonStream,\n iterateProviderStreamBatches,\n createCompletionGate,\n} from \"../helpers/index.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, EventFactory, OutputItem, FetchFn } from \"../index.js\";\n\n// ── 类型 ──────────────────────────────────────────────────────\n\nexport type ResponsesAdapterOptions = {\n apiKey: string;\n baseUrl?: string;\n /** 可注入自定义 fetch 实现(用于测试/代理) */\n fetch?: FetchFn;\n};\n\n// ── Responses API 请求类型 ────────────────────────────────────\n\ntype ResponsesAPIRequest = {\n model: string;\n input: ResponsesInputItem[];\n instructions?: string;\n tools?: ResponsesTool[];\n tool_choice?: \"auto\" | \"none\" | { type: \"function\"; name: string };\n metadata?: Record<string, string>;\n temperature?: number;\n max_output_tokens?: number;\n stream: true;\n};\n\ntype ResponsesInputItem =\n | { type: \"message\"; role: \"user\" | \"assistant\"; content: string }\n | { type: \"message\"; role: \"assistant\"; content: ResponsesContentBlock[] }\n | { type: \"function_call\"; id: string; name: string; arguments: string; call_id?: string }\n | { type: \"function_call_output\"; call_id: string; output: string }\n | { type: \"reasoning\"; content: ResponsesContentBlock[] }\n | { type: \"item_reference\"; id: string };\n\ntype ResponsesContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"reasoning\"; text: string }\n | { type: \"refusal\"; refusal: string };\n\ntype ResponsesTool = {\n type: \"function\";\n name: string;\n description?: string;\n parameters: Record<string, unknown>;\n};\n\nconst mapper = new NormalizedRequestMapper(\"responses\");\n\n// ── SSE 事件类型 ──────────────────────────────────────────────\n\ntype ResponsesSSEEvent =\n | { type: \"response.output_item.added\"; data: { item: { id: string; type: string; [key: string]: unknown } } }\n | { type: \"response.output_item.done\"; data: { item: { id: string; type: string; [key: string]: unknown } } }\n | { type: \"response.output_text.delta\"; data: { item_id: string; delta: string } }\n | { type: \"response.output_text.done\"; data: { item_id: string; text: string } }\n | { type: \"response.reasoning.delta\"; data: { item_id: string; delta: string } }\n | { type: \"response.reasoning.done\"; data: { item_id: string; text: string } }\n | { type: \"response.reasoning_summary_part.added\"; data: { item_id: string; summary_index: number; part?: unknown } }\n | { type: \"response.reasoning_summary_part.done\"; data: { item_id: string; summary_index: number; part?: unknown } }\n | { type: \"response.reasoning_summary_text.delta\"; data: { item_id: string; delta: string; summary_index?: number } }\n | { type: \"response.reasoning_summary_text.done\"; data: { item_id: string; text: string; summary_index?: number } }\n | { type: \"response.reasoning_text.delta\"; data: { item_id: string; delta: string; content_index?: number } }\n | { type: \"response.reasoning_text.done\"; data: { item_id: string; text: string; content_index?: number } }\n | { type: \"response.function_call_arguments.delta\"; data: { item_id: string; delta: string } }\n | { type: \"response.function_call_arguments.done\"; data: { item_id: string; arguments: string } }\n | { type: \"response.completed\"; data: { response: ResponsesAPIResponse } }\n | { type: \"response.failed\"; data: { response: ResponsesAPIResponse } }\n | { type: \"response.incomplete\"; data: { response: ResponsesAPIResponse } }\n | { type: \"error\"; data: { message: string; code?: string } }\n | { type: string; data: Record<string, unknown> };\n\n/** 已处理或可安全忽略的 Responses SSE 类型(未知类型会 warning 一次)。 */\nconst KNOWN_RESPONSES_SSE_TYPES = new Set([\n \"response.output_item.added\",\n \"response.output_item.done\",\n \"response.output_text.delta\",\n \"response.output_text.done\",\n // legacy aliases retained for fixtures / older gateways\n \"response.reasoning.delta\",\n \"response.reasoning.done\",\n // current OpenAI reasoning summary + full reasoning text events\n \"response.reasoning_summary_part.added\",\n \"response.reasoning_summary_part.done\",\n \"response.reasoning_summary_text.delta\",\n \"response.reasoning_summary_text.done\",\n \"response.reasoning_text.delta\",\n \"response.reasoning_text.done\",\n \"response.function_call_arguments.delta\",\n \"response.function_call_arguments.done\",\n \"response.content_part.added\",\n \"response.content_part.done\",\n \"response.refusal.delta\",\n \"response.refusal.done\",\n \"response.in_progress\",\n \"response.created\",\n \"response.queued\",\n \"response.completed\",\n \"response.failed\",\n \"response.incomplete\",\n \"error\",\n]);\n\ntype ReasoningVisibility = import(\"../index.js\").ReasoningItem[\"visibility\"];\n\ntype ReasoningStreamState = {\n visibility: ReasoningVisibility;\n hasDelta: boolean;\n /** Accumulated final texts from *.done events when deltas were skipped. */\n doneTexts: string[];\n completed: boolean;\n};\n\nfunction createReasoningState(visibility: ReasoningVisibility = \"summary\"): ReasoningStreamState {\n return { visibility, hasDelta: false, doneTexts: [], completed: false };\n}\n\nfunction extractReasoningFromOutputItem(item: Record<string, unknown>): {\n text: string;\n visibility: ReasoningVisibility;\n} {\n const contentTexts: string[] = [];\n if (Array.isArray(item.content)) {\n for (const part of item.content) {\n if (\n part &&\n typeof part === \"object\" &&\n (part as { type?: unknown }).type === \"reasoning_text\" &&\n typeof (part as { text?: unknown }).text === \"string\"\n ) {\n contentTexts.push((part as { text: string }).text);\n }\n }\n }\n\n const summaryTexts: string[] = [];\n if (Array.isArray(item.summary)) {\n for (const part of item.summary) {\n if (\n part &&\n typeof part === \"object\" &&\n (part as { type?: unknown }).type === \"summary_text\" &&\n typeof (part as { text?: unknown }).text === \"string\"\n ) {\n summaryTexts.push((part as { text: string }).text);\n }\n }\n }\n\n if (contentTexts.length > 0) {\n return { text: contentTexts.join(\"\\n\"), visibility: \"full\" };\n }\n if (summaryTexts.length > 0) {\n return { text: summaryTexts.join(\"\\n\"), visibility: \"summary\" };\n }\n if (typeof item.encrypted_content === \"string\" && item.encrypted_content.length > 0) {\n return { text: \"\", visibility: \"opaque\" };\n }\n return { text: \"\", visibility: \"summary\" };\n}\n\ntype ResponsesAPIResponse = {\n id: string;\n model: string;\n output: ResponsesAPIOutputItem[];\n status?: \"completed\" | \"failed\" | \"in_progress\" | \"cancelled\" | \"queued\" | \"incomplete\" | string;\n incomplete_details?: { reason?: string | null } | null;\n error?: { message?: string; code?: string } | null;\n failure?: { message?: string; code?: string } | null;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n};\n\ntype ResponsesAPIOutputItem = {\n id: string;\n type: \"message\" | \"reasoning\" | \"function_call\" | string;\n role?: string;\n content?: ResponsesContentBlock[] | Array<{ type: string; text?: string; [key: string]: unknown }>;\n summary?: Array<{ type: string; text?: string; [key: string]: unknown }>;\n encrypted_content?: string | null;\n name?: string;\n arguments?: string;\n status?: string;\n [key: string]: unknown;\n};\n\nfunction isReplayCanonicalInput(item: ResponsesInputItem): boolean {\n return (\n (item.type === \"message\" && item.role === \"assistant\") || item.type === \"reasoning\" || item.type === \"function_call\"\n );\n}\n\nfunction hasReplayCanonicalInput(input: ResponsesInputItem[]): boolean {\n return input.some(isReplayCanonicalInput);\n}\n\nfunction extractFailureMessage(response: ResponsesAPIResponse): string {\n return response.error?.message ?? response.failure?.message ?? \"unknown\";\n}\n\n// ── Content block 映射 ─────────────────────────────────────────\n\nfunction canonicalToResponsesBlock(b: import(\"../index.js\").ContentBlock): ResponsesContentBlock {\n if (b.type === \"text\") return { type: \"text\", text: b.text };\n if (b.type === \"json\") return { type: \"text\", text: JSON.stringify(b.json) };\n throw new AIRequestError(\n `responses does not support content block type \"${b.type}\" in canonical mapping`,\n \"UNSUPPORTED_CONTENT_BLOCK\",\n );\n}\n\n// ── Adapter ───────────────────────────────────────────────────\n\nexport class ResponsesAdapter extends AdapterBase {\n readonly kind = \"responses\" as const;\n readonly isSyntheticStream = false;\n\n private apiKey: string;\n private baseUrl: string;\n private fetchFn: FetchFn;\n\n constructor(options: ResponsesAdapterOptions) {\n super();\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://api.openai.com/v1\";\n this.fetchFn = options.fetch ?? globalThis.fetch;\n }\n\n // ── buildRequest ──────────────────────────────────────────\n\n protected buildRequest(request: NormalizedRequest): ResponsesAPIRequest {\n const input: ResponsesInputItem[] = [];\n\n for (const item of request.input) {\n switch (item.type) {\n case \"message\": {\n // Responses API 中只有 assistant 角色支持 content blocks\n if (item.role === \"assistant\") {\n const blocks = mapper\n .ensureTextBlocks(item.content, `assistant message (${item.role}) content`)\n .map(canonicalToResponsesBlock);\n input.push({ type: \"message\", role: item.role, content: blocks });\n } else {\n input.push({\n type: \"message\",\n role: item.role,\n content: mapper.textFromBlocks(item.content, `input message (${item.role}) content`),\n });\n }\n break;\n }\n case \"reasoning\": {\n const blocks = mapper\n .ensureReasoningBlocks(item.content, \"reasoning content\")\n .map((b): ResponsesContentBlock => ({ type: \"reasoning\", text: b.text }));\n input.push({ type: \"reasoning\", content: blocks });\n break;\n }\n case \"tool_call\": {\n input.push({\n type: \"function_call\",\n id: item.id,\n name: item.name,\n arguments: item.argumentsText,\n });\n break;\n }\n case \"tool_result\": {\n const output = mapper.textFromBlocks(item.content, `tool_result ${item.callId} content`);\n input.push({\n type: \"function_call_output\",\n call_id: item.callId,\n output,\n });\n break;\n }\n case \"opaque\": {\n // Canonical replay items take priority; item_reference is only a fallback\n // when the consumer kept only the provider continuation id.\n if (item.source !== \"responses\" || item.purpose !== \"replay\") break;\n assertOpaqueReplayEnvelope(item.payload);\n const payload = item.payload as Record<string, unknown>;\n if (\"id\" in payload) {\n if (typeof payload.id !== \"string\" || payload.id.length === 0 || payload.id.length > 256) {\n throw new AIRequestError(\n \"Invalid opaque replay payload: id must be a non-empty string (max 256)\",\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n if (!hasReplayCanonicalInput(input)) {\n input.push({ type: \"item_reference\", id: payload.id });\n }\n }\n break;\n }\n }\n }\n\n const body: ResponsesAPIRequest = {\n model: request.model,\n input,\n stream: true,\n };\n\n if (request.instructions) {\n body.instructions = mapper.mapInstructions(request.instructions);\n }\n\n body.tools = mapper.mapToolsIfPresent(\n request.tools,\n (t): ResponsesTool => ({\n type: \"function\",\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n }),\n );\n\n body.tool_choice = mapper.mapToolChoice<Exclude<ResponsesAPIRequest[\"tool_choice\"], undefined>>(\n request.toolChoice,\n {\n auto: \"auto\",\n none: \"none\",\n tool: (name) => ({ type: \"function\" as const, name }),\n },\n );\n\n if (request.temperature !== undefined) body.temperature = request.temperature;\n if (request.maxOutputTokens !== undefined) body.max_output_tokens = request.maxOutputTokens;\n if (request.metadata) body.metadata = request.metadata;\n\n return body;\n }\n\n // ── runStream ─────────────────────────────────────────────\n\n protected async *runStream(\n providerRequest: ResponsesAPIRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n const auxiliary = this.createAuxiliaryState(request);\n const gate = createCompletionGate();\n\n const { reader } = await openProviderJsonStream({\n fetchFn: this.fetchFn,\n url: `${this.baseUrl}/responses`,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: providerRequest,\n signal: request.signal,\n });\n\n const parser = createSseJsonParser<ResponsesSSEEvent>();\n const output: OutputItem[] = [];\n let completedResponse: ResponsesAPIResponse | undefined;\n let unknownEventsWarned = false;\n const messageItemsWithDelta = new Set<string>();\n const toolCallNames = new Map<string, string>();\n const reasoningStates = new Map<string, ReasoningStreamState>();\n\n const ensureReasoningState = (itemId: string, visibility: ReasoningVisibility = \"summary\"): ReasoningStreamState => {\n let state = reasoningStates.get(itemId);\n if (!state) {\n state = createReasoningState(visibility);\n reasoningStates.set(itemId, state);\n }\n return state;\n };\n\n const completeReasoning = function* (\n itemId: string,\n text: string,\n visibility: ReasoningVisibility,\n ): Generator<AIStreamEvent, void, undefined> {\n const state = ensureReasoningState(itemId, visibility);\n if (state.completed) return;\n state.completed = true;\n state.visibility = visibility;\n yield factory.reasoningCompleted(itemId);\n output.push(reasoningItem(text ? [textBlock(text)] : [], visibility, itemId));\n };\n\n for await (const batch of iterateProviderStreamBatches({\n reader,\n parser,\n factory,\n providerLabel: \"Responses\",\n transportLabel: \"SSE event(s)\",\n incompleteMessage: \"Stream ended with an incomplete Responses SSE frame\",\n })) {\n for (const warning of batch.warnings) yield warning;\n\n for (const sseEvent of batch.items) {\n if (sseEvent.type === \"error\") {\n const data = sseEvent.data as { message?: string; code?: string };\n yield factory.responseWarning(data.message ?? \"Provider error event\", data.code);\n continue;\n }\n\n if (sseEvent.type === \"response.output_item.added\") {\n const item = (sseEvent.data as { item: { id: string; type: string; [key: string]: unknown } }).item;\n switch (item.type) {\n case \"message\":\n yield factory.messageStarted(item.id);\n break;\n case \"reasoning\": {\n // OpenAI 公开流默认是 summary;full/opaque 在后续事件中再收紧。\n const visibility = extractReasoningFromOutputItem(item).visibility;\n ensureReasoningState(item.id, visibility);\n yield factory.reasoningStarted(item.id, visibility);\n break;\n }\n case \"function_call\": {\n const name = typeof item.name === \"string\" ? item.name : \"unknown\";\n toolCallNames.set(item.id, name);\n yield factory.toolCallStarted(item.id, name);\n break;\n }\n }\n continue;\n }\n\n if (sseEvent.type === \"response.output_item.done\") {\n const item = (sseEvent.data as { item: { id: string; type: string; [key: string]: unknown } }).item;\n if (item.type === \"reasoning\") {\n const extracted = extractReasoningFromOutputItem(item);\n const state = ensureReasoningState(item.id, extracted.visibility);\n const text =\n extracted.text ||\n (state.doneTexts.length > 0 ? state.doneTexts.join(\"\\n\") : \"\");\n yield* completeReasoning(item.id, text, extracted.visibility || state.visibility);\n }\n continue;\n }\n\n if (sseEvent.type === \"response.output_text.delta\") {\n const data = sseEvent.data as { item_id: string; delta: string };\n yield factory.messageDelta(data.item_id, textBlock(data.delta));\n messageItemsWithDelta.add(data.item_id);\n continue;\n }\n\n if (sseEvent.type === \"response.output_text.done\") {\n const data = sseEvent.data as { item_id: string; text: string };\n if (!messageItemsWithDelta.has(data.item_id) && data.text) {\n yield factory.messageDelta(data.item_id, textBlock(data.text));\n }\n yield factory.messageCompleted(data.item_id);\n output.push(messageItem([textBlock(data.text)], { id: data.item_id }));\n continue;\n }\n\n // Modern OpenAI reasoning summary text (publicly streamed for o-series / gpt-5)\n if (sseEvent.type === \"response.reasoning_summary_text.delta\") {\n const data = sseEvent.data as { item_id: string; delta: string };\n const state = ensureReasoningState(data.item_id, \"summary\");\n if (state.visibility === \"opaque\") state.visibility = \"summary\";\n if (data.delta) {\n state.hasDelta = true;\n yield factory.reasoningDelta(data.item_id, textBlock(data.delta));\n }\n continue;\n }\n\n if (sseEvent.type === \"response.reasoning_summary_text.done\") {\n const data = sseEvent.data as { item_id: string; text: string };\n const state = ensureReasoningState(data.item_id, \"summary\");\n if (state.visibility === \"opaque\") state.visibility = \"summary\";\n if (!state.hasDelta && data.text) {\n state.doneTexts.push(data.text);\n yield factory.reasoningDelta(data.item_id, textBlock(data.text));\n } else if (data.text) {\n state.doneTexts.push(data.text);\n }\n continue;\n }\n\n // Full reasoning text (opt-in via include); upgrade visibility to full\n if (sseEvent.type === \"response.reasoning_text.delta\") {\n const data = sseEvent.data as { item_id: string; delta: string };\n const state = ensureReasoningState(data.item_id, \"full\");\n state.visibility = \"full\";\n if (data.delta) {\n state.hasDelta = true;\n yield factory.reasoningDelta(data.item_id, textBlock(data.delta));\n }\n continue;\n }\n\n if (sseEvent.type === \"response.reasoning_text.done\") {\n const data = sseEvent.data as { item_id: string; text: string };\n const state = ensureReasoningState(data.item_id, \"full\");\n state.visibility = \"full\";\n if (!state.hasDelta && data.text) {\n state.doneTexts.push(data.text);\n yield factory.reasoningDelta(data.item_id, textBlock(data.text));\n } else if (data.text) {\n state.doneTexts.push(data.text);\n }\n continue;\n }\n\n // Structural summary part events — known & ignored (text is handled above)\n if (\n sseEvent.type === \"response.reasoning_summary_part.added\" ||\n sseEvent.type === \"response.reasoning_summary_part.done\"\n ) {\n continue;\n }\n\n // Legacy aliases kept for fixtures / older gateways\n if (sseEvent.type === \"response.reasoning.delta\") {\n const data = sseEvent.data as { item_id: string; delta: string };\n const state = ensureReasoningState(data.item_id, \"full\");\n state.visibility = \"full\";\n if (data.delta) {\n state.hasDelta = true;\n yield factory.reasoningDelta(data.item_id, textBlock(data.delta));\n }\n continue;\n }\n\n if (sseEvent.type === \"response.reasoning.done\") {\n const data = sseEvent.data as { item_id: string; text: string };\n const state = ensureReasoningState(data.item_id, \"full\");\n if (!state.hasDelta && data.text) {\n yield factory.reasoningDelta(data.item_id, textBlock(data.text));\n }\n yield* completeReasoning(data.item_id, data.text ?? state.doneTexts.join(\"\\n\"), \"full\");\n continue;\n }\n\n if (sseEvent.type === \"response.function_call_arguments.delta\") {\n const data = sseEvent.data as { item_id: string; delta: string };\n if (data.delta) yield factory.toolCallDelta(data.item_id, { argumentsText: data.delta });\n continue;\n }\n\n if (sseEvent.type === \"response.function_call_arguments.done\") {\n const data = sseEvent.data as { item_id: string; arguments: string };\n const tcItem = toolCallItem(data.item_id, toolCallNames.get(data.item_id) ?? \"unknown\", data.arguments);\n yield factory.toolCallCompleted(data.item_id);\n output.push(tcItem);\n continue;\n }\n\n if (\n sseEvent.type === \"response.completed\" ||\n sseEvent.type === \"response.failed\" ||\n sseEvent.type === \"response.incomplete\"\n ) {\n const data = sseEvent.data as { response: ResponsesAPIResponse };\n if (completedResponse) {\n yield factory.responseWarning(\"Duplicate finish signal ignored\", \"DUPLICATE_FINISH\");\n continue;\n }\n\n completedResponse = data.response;\n\n // Safety net: finalize any still-open reasoning items from the final response payload.\n if (Array.isArray(data.response.output)) {\n for (const item of data.response.output) {\n if (item?.type !== \"reasoning\" || !item.id) continue;\n const state = reasoningStates.get(item.id);\n if (state?.completed) continue;\n const extracted = extractReasoningFromOutputItem(item);\n const text =\n extracted.text ||\n (state && state.doneTexts.length > 0 ? state.doneTexts.join(\"\\n\") : \"\");\n // Only complete if we already started this item (otherwise aggregator has no active item).\n if (state || reasoningStates.has(item.id)) {\n yield* completeReasoning(item.id, text, extracted.visibility);\n }\n }\n }\n\n if (sseEvent.type === \"response.failed\") {\n yield factory.responseWarning(\n `Response failed: ${extractFailureMessage(data.response)}`,\n \"PROVIDER_FAILURE\",\n );\n }\n continue;\n }\n\n if (!KNOWN_RESPONSES_SSE_TYPES.has(sseEvent.type) && !unknownEventsWarned) {\n unknownEventsWarned = true;\n yield factory.responseWarning(\n `Responses API sent unknown event type \"${sseEvent.type}\"; this may indicate an incomplete integration`,\n \"UNKNOWN_PROVIDER_EVENT\",\n );\n }\n }\n }\n\n let rawResponseId: string | undefined;\n if (completedResponse) {\n rawResponseId = completedResponse.id;\n if (completedResponse.usage) {\n auxiliary.recordUsage(usageFromOpenAIResponses(completedResponse.usage), \"final\", completedResponse.usage);\n }\n }\n\n const replay = [...replayFromOutput(output)];\n if (completedResponse?.id) {\n replay.push(opaqueItem(\"responses\", \"replay\", { id: completedResponse.id }));\n }\n\n const stopReason = completedResponse ? this.inferStopReason(completedResponse) : undefined;\n\n if (gate.tryComplete()) {\n yield* this.emitStreamCompleted(factory, request, auxiliary, {\n output,\n replay,\n stopReason,\n rawResponseId,\n });\n }\n }\n\n // ── 辅助方法 ──────────────────────────────────────────────\n\n private inferStopReason(response: ResponsesAPIResponse): import(\"../index.js\").StopReason {\n if (response.status === \"failed\") return \"error\";\n\n if (response.status === \"incomplete\") {\n const reason = response.incomplete_details?.reason;\n if (reason === \"content_filter\") return \"content_filter\";\n if (reason === \"max_output_tokens\") return \"max_output_tokens\";\n return \"max_output_tokens\";\n }\n\n const output = response.output;\n if (!output || output.length === 0) {\n return response.status === \"completed\" ? \"end_turn\" : \"unknown\";\n }\n\n const hasFunctionCall = output.some((item) => item.type === \"function_call\");\n if (hasFunctionCall) return \"tool_call\";\n\n const lastItem = output[output.length - 1];\n if (lastItem?.status === \"failed\") return \"error\";\n if (lastItem?.status === \"incomplete\") return \"max_output_tokens\";\n\n return \"end_turn\";\n }\n}\n","/**\n * Messages Adapter\n *\n * 接入 Anthropic Messages API (messages 端点)。\n * 支持:\n * - 文本消息流 (text content block)\n * - 思维链流 (thinking content block)\n * - 工具调用流 (tool_use content block)\n * - 高保真 replay(含 opaque continuation)\n * - 能力降级 warning\n */\n\nimport { AdapterBase } from \"../helpers/adapter-base.js\";\nimport { AIRequestError } from \"../core/errors.js\";\nimport {\n textBlock,\n messageItem,\n reasoningItem,\n toolCallItem,\n opaqueItem,\n replayFromOutput,\n mapStopReason,\n contentBlocksToText,\n} from \"../helpers/mapping.js\";\nimport { assertOpaqueReplayEnvelope } from \"../helpers/adapter-security.js\";\nimport { usageFromAnthropicMessages } from \"../helpers/usage-mapping.js\";\nimport {\n NormalizedRequestMapper,\n createSseJsonParser,\n openProviderJsonStream,\n iterateProviderStreamBatches,\n createCompletionGate,\n} from \"../helpers/index.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, EventFactory, OutputItem, FetchFn } from \"../index.js\";\n\n// ── 类型 ──────────────────────────────────────────────────────\n\nexport type MessagesAdapterOptions = {\n apiKey: string;\n apiVersion?: string;\n baseUrl?: string;\n /** 可注入自定义 fetch 实现(用于测试/代理) */\n fetch?: FetchFn;\n};\n\n// ── Messages API 请求类型 ────────────────────────────────────\n\ntype MessagesAPIRequest = {\n model: string;\n max_tokens: number;\n messages: MessagesAPIMessage[];\n system?: string;\n tools?: MessagesAPITool[];\n tool_choice?: { type: \"auto\" | \"none\" } | { type: \"tool\"; name: string };\n temperature?: number;\n thinking?: { type: \"enabled\"; budget_tokens: number };\n stream: true;\n};\n\ntype MessagesAPIMessage = {\n role: \"user\" | \"assistant\";\n content: string | MessagesAPIContentBlock[];\n};\n\ntype MessagesAPIContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"thinking\"; thinking: string; signature?: string }\n | { type: \"redacted_thinking\"; data: string }\n | { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> }\n | { type: \"tool_result\"; tool_use_id: string; content: string | MessagesAPIContentBlock[]; is_error?: boolean };\n\ntype MessagesAPITool = {\n name: string;\n description?: string;\n input_schema: Record<string, unknown>;\n};\n\nconst mapper = new NormalizedRequestMapper(\"messages\");\n\nfunction isMessagesReplayContentBlock(value: unknown): value is MessagesAPIContentBlock {\n if (!value || typeof value !== \"object\" || !(\"type\" in value)) return false;\n const block = value as Record<string, unknown>;\n switch (block.type) {\n case \"text\":\n return typeof block.text === \"string\";\n case \"thinking\":\n return (\n typeof block.thinking === \"string\" && (block.signature === undefined || typeof block.signature === \"string\")\n );\n case \"redacted_thinking\":\n return typeof block.data === \"string\";\n case \"tool_use\":\n return (\n typeof block.id === \"string\" &&\n typeof block.name === \"string\" &&\n !!block.input &&\n typeof block.input === \"object\" &&\n !Array.isArray(block.input)\n );\n case \"tool_result\": {\n if (typeof block.tool_use_id !== \"string\") return false;\n if (block.is_error !== undefined && typeof block.is_error !== \"boolean\") return false;\n if (typeof block.content === \"string\") return true;\n if (!Array.isArray(block.content)) return false;\n return block.content.every(isMessagesReplayContentBlock);\n }\n default:\n return false;\n }\n}\n\nfunction assertMessagesReplayContent(content: unknown): asserts content is MessagesAPIContentBlock[] {\n if (!Array.isArray(content)) {\n throw new AIRequestError(\"Invalid opaque replay payload: content must be an array\", \"INVALID_OPAQUE_REPLAY\");\n }\n for (let i = 0; i < content.length; i++) {\n if (!isMessagesReplayContentBlock(content[i])) {\n throw new AIRequestError(\n `Invalid opaque replay payload: content[${i}] is not a valid Messages content block`,\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n }\n}\n\n// ── SSE 事件类型 ──────────────────────────────────────────────\n\ntype MessagesSSEEvent =\n | { type: \"message_start\"; data: { message: MessagesAPIMessageResponse } }\n | { type: \"content_block_start\"; data: { index: number; content_block: { type: string; [key: string]: unknown } } }\n | { type: \"content_block_delta\"; data: { index: number; delta: { type: string; [key: string]: unknown } } }\n | { type: \"content_block_stop\"; data: { index: number } }\n | {\n type: \"message_delta\";\n data: {\n delta: { stop_reason?: string; 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 | { type: \"message_stop\"; data: Record<string, never> }\n | { type: \"ping\"; data: Record<string, never> }\n | { type: \"error\"; data: { error: { type: string; message: string } } };\n\ntype MessagesAPIMessageResponse = {\n id: string;\n type: string;\n role: \"assistant\";\n model: string;\n content: MessagesAPIContentBlock[];\n stop_reason?: \"end_turn\" | \"max_tokens\" | \"tool_use\" | string;\n stop_sequence?: string | null;\n usage: { input_tokens: number; output_tokens: number };\n};\n\n/** 用 response 级别的命名空间合成 content block 的 item ID,避免多轮工具循环 ID 碰撞 */\nfunction synthesizeItemId(kind: \"msg\" | \"reason\" | \"reason-redacted\", blockIndex: number, responseId: string): string {\n return `${kind}-${blockIndex}-${responseId}`;\n}\n\nfunction parseProviderToolUseInput(input: string): Record<string, unknown> {\n try {\n const parsed: unknown = JSON.parse(input);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed) ? (parsed as Record<string, unknown>) : {};\n } catch {\n return {};\n }\n}\n\n// ── Content block 映射 ─────────────────────────────────────────\n\nfunction canonicalToMessagesBlock(b: import(\"../index.js\").ContentBlock): MessagesAPIContentBlock {\n if (b.type === \"text\") return { type: \"text\", text: b.text };\n if (b.type === \"json\") return { type: \"text\", text: JSON.stringify(b.json) };\n throw new AIRequestError(\n `messages does not support content block type \"${b.type}\" in canonical mapping`,\n \"UNSUPPORTED_CONTENT_BLOCK\",\n );\n}\n\nfunction pickProviderHeaders(headers: Headers): Record<string, string> {\n const metadata: Record<string, string> = {};\n\n headers.forEach((value, key) => {\n const normalizedKey = key.toLowerCase();\n if (\n normalizedKey === \"request-id\" ||\n normalizedKey === \"x-request-id\" ||\n normalizedKey === \"anthropic-organization-id\" ||\n normalizedKey === \"anthropic-beta\" ||\n normalizedKey === \"retry-after\" ||\n normalizedKey.startsWith(\"anthropic-ratelimit-\")\n ) {\n metadata[normalizedKey] = value;\n }\n });\n\n return metadata;\n}\n\nfunction buildStreamMetadata(options: {\n apiVersion: string;\n message?: MessagesAPIMessageResponse;\n stopReason?: string;\n stopSequence?: string | null;\n}): Record<string, unknown> {\n const { apiVersion, message, stopReason, stopSequence } = options;\n const metadata: Record<string, unknown> = {\n apiVersion,\n };\n\n if (message) {\n metadata.message = {\n id: message.id,\n type: message.type,\n role: message.role,\n model: message.model,\n };\n }\n\n if (stopReason !== undefined || stopSequence !== undefined) {\n metadata.stop = {\n reason: stopReason,\n sequence: stopSequence,\n };\n }\n\n return metadata;\n}\n\n// ── Adapter ───────────────────────────────────────────────────\n\nexport class MessagesAdapter extends AdapterBase {\n readonly kind = \"messages\" as const;\n readonly isSyntheticStream = false;\n\n private apiKey: string;\n private apiVersion: string;\n private baseUrl: string;\n private fetchFn: FetchFn;\n\n constructor(options: MessagesAdapterOptions) {\n super();\n this.apiKey = options.apiKey;\n this.apiVersion = options.apiVersion ?? \"2023-06-01\";\n this.baseUrl = options.baseUrl ?? \"https://api.anthropic.com/v1\";\n this.fetchFn = options.fetch ?? globalThis.fetch;\n }\n\n // ── buildRequest ──────────────────────────────────────────\n\n protected buildRequest(request: NormalizedRequest): MessagesAPIRequest {\n const messages: MessagesAPIMessage[] = [];\n let systemPrompt: string | undefined;\n let pendingToolResultMessage: MessagesAPIMessage | undefined;\n\n // 处理 instructions → system prompt\n if (request.instructions) {\n systemPrompt = mapper.mapInstructions(request.instructions);\n }\n\n // 处理 input items\n for (const item of request.input) {\n if (item.type !== \"tool_result\") {\n pendingToolResultMessage = undefined;\n }\n\n switch (item.type) {\n case \"message\": {\n const role = item.role === \"user\" ? \"user\" : \"assistant\";\n const supportedContent = mapper.ensureTextBlocks(item.content, `input message (${item.role}) content`);\n if (supportedContent.length === 1 && supportedContent[0]?.type === \"text\") {\n messages.push({ role, content: supportedContent[0].text });\n } else {\n messages.push({ role, content: supportedContent.map(canonicalToMessagesBlock) });\n }\n break;\n }\n case \"tool_call\": {\n // Anthropic 使用 tool_use block 在 assistant message 中\n const lastMsg = messages[messages.length - 1];\n const toolBlock: MessagesAPIContentBlock = {\n type: \"tool_use\",\n id: item.id,\n name: item.name,\n input: mapper.parseToolArguments(item),\n };\n\n if (lastMsg && lastMsg.role === \"assistant\" && typeof lastMsg.content !== \"string\") {\n lastMsg.content.push(toolBlock);\n } else {\n messages.push({ role: \"assistant\", content: [toolBlock] });\n }\n break;\n }\n case \"tool_result\": {\n const content = mapper.textFromBlocks(item.content, `tool_result ${item.callId} content`);\n const block: MessagesAPIContentBlock = {\n type: \"tool_result\",\n tool_use_id: item.callId,\n content,\n is_error: item.outcome !== \"success\",\n };\n if (pendingToolResultMessage && typeof pendingToolResultMessage.content !== \"string\") {\n pendingToolResultMessage.content.push(block);\n } else {\n pendingToolResultMessage = { role: \"user\", content: [block] };\n messages.push(pendingToolResultMessage);\n }\n break;\n }\n case \"reasoning\": {\n // 将 reasoning item 转为 thinking block 在 assistant message 中\n const text = contentBlocksToText(mapper.ensureReasoningBlocks(item.content, \"reasoning content\"));\n const block: MessagesAPIContentBlock = { type: \"thinking\", thinking: text };\n const lastMsg = messages[messages.length - 1];\n if (lastMsg && lastMsg.role === \"assistant\" && typeof lastMsg.content !== \"string\") {\n lastMsg.content.push(block);\n } else {\n messages.push({ role: \"assistant\", content: [block] });\n }\n break;\n }\n case \"opaque\": {\n // 尝试从 opaque replay item 中提取 assistant message\n if (item.source !== \"messages\" || item.purpose !== \"replay\") break;\n assertOpaqueReplayEnvelope(item.payload);\n const payload = item.payload as Record<string, unknown>;\n if (payload.role === \"assistant\" && \"content\" in payload) {\n assertMessagesReplayContent(payload.content);\n mapper.rollbackTrailingAssistantMessages(messages);\n messages.push({\n role: \"assistant\",\n content: payload.content,\n });\n }\n break;\n }\n }\n }\n\n const body: MessagesAPIRequest = {\n model: request.model,\n max_tokens: request.maxOutputTokens ?? 4096,\n messages,\n stream: true,\n };\n\n if (systemPrompt) body.system = systemPrompt;\n\n body.tools = mapper.mapToolsIfPresent(\n request.tools,\n (t): MessagesAPITool => ({\n name: t.name,\n description: t.description,\n input_schema: t.inputSchema,\n }),\n );\n\n body.tool_choice = mapper.mapToolChoice<Exclude<MessagesAPIRequest[\"tool_choice\"], undefined>>(request.toolChoice, {\n auto: { type: \"auto\" } as const,\n none: { type: \"none\" } as const,\n tool: (name) => ({ type: \"tool\" as const, name }),\n });\n\n if (request.temperature !== undefined) body.temperature = request.temperature;\n\n return body;\n }\n\n // ── runStream ─────────────────────────────────────────────\n\n protected async *runStream(\n providerRequest: MessagesAPIRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n const auxiliary = this.createAuxiliaryState(request);\n const gate = createCompletionGate();\n\n if (request.metadata) {\n yield factory.responseWarning(\n \"Request metadata is not supported by the Messages adapter\",\n \"UNSUPPORTED_METADATA\",\n );\n }\n\n const { reader, headers } = await openProviderJsonStream({\n fetchFn: this.fetchFn,\n url: `${this.baseUrl}/messages`,\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n \"anthropic-version\": this.apiVersion,\n },\n body: providerRequest,\n signal: request.signal,\n });\n\n const parser = createSseJsonParser<MessagesSSEEvent>();\n const output: OutputItem[] = [];\n let messageResponse: MessagesAPIMessageResponse | undefined;\n let currentContentBlockIndex = -1;\n let currentItemType: \"message\" | \"reasoning\" | \"tool_call\" | null = null;\n let currentItemId = \"\";\n let currentToolName = \"\";\n let currentArgsText = \"\";\n let currentThinkingVisibility: \"full\" | \"redacted\" = \"full\";\n const rawReplayContent: MessagesAPIContentBlock[] = [];\n\n let textBuffer = \"\";\n let thinkingBuffer = \"\";\n let argsBuffer = \"\";\n\n let stopReason: string | undefined;\n let stopSequence: string | null | undefined;\n let rawResponseId = \"\";\n\n if (request.include?.providerMetadata !== \"off\") {\n const headerMetadata = pickProviderHeaders(headers);\n auxiliary.recordProviderMetadata(\n \"header\",\n Object.keys(headerMetadata).length > 0 ? { headers: headerMetadata } : undefined,\n );\n }\n\n for await (const batch of iterateProviderStreamBatches({\n reader,\n parser,\n factory,\n providerLabel: \"Messages\",\n transportLabel: \"SSE event(s)\",\n incompleteMessage: \"Stream ended with an incomplete Messages SSE frame\",\n })) {\n for (const warning of batch.warnings) yield warning;\n\n for (const sseEvent of batch.items) {\n switch (sseEvent.type) {\n case \"ping\":\n continue;\n\n case \"error\": {\n const err = sseEvent.data.error;\n yield factory.responseWarning(err.message, err.type);\n continue;\n }\n\n case \"message_start\": {\n messageResponse = sseEvent.data.message;\n rawResponseId = messageResponse.id;\n continue;\n }\n\n case \"content_block_start\": {\n const block = sseEvent.data.content_block;\n currentContentBlockIndex = sseEvent.data.index;\n\n switch (block.type) {\n case \"text\": {\n currentItemType = \"message\";\n currentItemId = synthesizeItemId(\"msg\", currentContentBlockIndex, rawResponseId);\n textBuffer = \"\";\n yield factory.messageStarted(currentItemId);\n break;\n }\n case \"thinking\": {\n currentItemType = \"reasoning\";\n currentItemId = synthesizeItemId(\"reason\", currentContentBlockIndex, rawResponseId);\n currentThinkingVisibility = \"full\";\n thinkingBuffer = \"\";\n yield factory.reasoningStarted(currentItemId, \"full\");\n break;\n }\n case \"redacted_thinking\": {\n currentItemType = \"reasoning\";\n currentItemId = synthesizeItemId(\"reason-redacted\", currentContentBlockIndex, rawResponseId);\n currentThinkingVisibility = \"redacted\";\n const data = (block as unknown as { data: string }).data;\n yield factory.reasoningStarted(currentItemId, \"redacted\");\n yield factory.reasoningDelta(currentItemId, textBlock(data));\n const redactedItem = reasoningItem([textBlock(data)], \"redacted\", currentItemId);\n yield factory.reasoningCompleted(currentItemId);\n output.push(redactedItem);\n rawReplayContent.push({ type: \"redacted_thinking\", data });\n currentItemType = null;\n break;\n }\n case \"tool_use\": {\n const tuBlock = block as unknown as { id: string; name: string };\n currentItemType = \"tool_call\";\n currentItemId = tuBlock.id;\n currentToolName = tuBlock.name;\n currentArgsText = \"\";\n argsBuffer = \"\";\n yield factory.toolCallStarted(currentItemId, currentToolName);\n break;\n }\n }\n continue;\n }\n\n case \"content_block_delta\": {\n const delta = sseEvent.data.delta;\n\n switch (delta.type) {\n case \"text_delta\": {\n if (currentItemType === \"message\" && currentItemId) {\n const txt = (delta as unknown as { text: string }).text;\n textBuffer += txt;\n yield factory.messageDelta(currentItemId, textBlock(txt));\n }\n break;\n }\n case \"thinking_delta\": {\n if (currentItemType === \"reasoning\" && currentItemId) {\n const txt = (delta as unknown as { thinking: string }).thinking;\n thinkingBuffer += txt;\n yield factory.reasoningDelta(currentItemId, textBlock(txt));\n }\n break;\n }\n case \"input_json_delta\": {\n if (currentItemType === \"tool_call\" && currentItemId) {\n const partial = (delta as unknown as { partial_json: string }).partial_json;\n argsBuffer += partial;\n yield factory.toolCallDelta(currentItemId, { argumentsText: partial });\n }\n break;\n }\n }\n continue;\n }\n\n case \"content_block_stop\": {\n if (currentItemType === \"message\" && currentItemId) {\n yield factory.messageCompleted(currentItemId);\n output.push(messageItem([textBlock(textBuffer)], { id: currentItemId }));\n rawReplayContent.push({ type: \"text\", text: textBuffer });\n } else if (currentItemType === \"reasoning\" && currentItemId && currentThinkingVisibility !== \"redacted\") {\n yield factory.reasoningCompleted(currentItemId);\n output.push(reasoningItem([textBlock(thinkingBuffer)], currentThinkingVisibility, currentItemId));\n rawReplayContent.push({ type: \"thinking\", thinking: thinkingBuffer });\n } else if (currentItemType === \"tool_call\" && currentItemId) {\n const tcItem = toolCallItem(currentItemId, currentToolName, currentArgsText || argsBuffer);\n yield factory.toolCallCompleted(currentItemId);\n output.push(tcItem);\n rawReplayContent.push({\n type: \"tool_use\",\n id: currentItemId,\n name: currentToolName,\n input: parseProviderToolUseInput(currentArgsText || argsBuffer),\n });\n }\n\n currentItemType = null;\n currentItemId = \"\";\n continue;\n }\n\n case \"message_delta\": {\n stopReason = sseEvent.data.delta.stop_reason;\n stopSequence = sseEvent.data.delta.stop_sequence;\n const u = sseEvent.data.usage;\n if (u) {\n auxiliary.recordUsage(usageFromAnthropicMessages(u), \"stream\", u);\n }\n continue;\n }\n\n case \"message_stop\": {\n break;\n }\n }\n }\n }\n\n const replay = [...replayFromOutput(output)];\n\n if (messageResponse) {\n const replayContent = rawReplayContent.length > 0 ? rawReplayContent : messageResponse.content;\n replay.push(\n opaqueItem(\"messages\", \"replay\", {\n replaceCanonical: true,\n role: messageResponse.role,\n content: replayContent,\n messageId: messageResponse.id,\n stopReason: stopReason ?? messageResponse.stop_reason,\n }),\n );\n }\n\n if (request.include?.providerMetadata !== \"off\") {\n auxiliary.recordProviderMetadata(\n \"stream\",\n buildStreamMetadata({\n apiVersion: this.apiVersion,\n message: messageResponse,\n stopReason,\n stopSequence,\n }),\n );\n }\n\n if (gate.tryComplete()) {\n yield* this.emitStreamCompleted(factory, request, auxiliary, {\n output,\n replay,\n stopReason: stopReason ? mapStopReason(stopReason) : undefined,\n rawResponseId,\n });\n }\n }\n}\n","/**\n * Chat Completions Adapter\n *\n * 接入 OpenAI Chat Completions API (chat/completions 端点)。\n * 弱能力兼容层:\n * - third-party reasoning 字段仅做 best-effort 提取\n * - 工具调用通常整块到达(非逐 token 流)\n * - replay fidelity 依赖 provider 是否暴露可回放的 assistant turn 字段\n */\n\nimport { AdapterBase } from \"../helpers/adapter-base.js\";\nimport { AIRequestError, WarningCode } from \"../core/errors.js\";\nimport {\n textBlock,\n messageItem,\n reasoningItem,\n toolCallItem,\n opaqueItem,\n replayFromOutput,\n mapStopReason,\n} from \"../helpers/mapping.js\";\nimport { assertOpaqueReplayEnvelope } from \"../helpers/adapter-security.js\";\nimport { usageFromChatCompletions } from \"../helpers/usage-mapping.js\";\nimport {\n NormalizedRequestMapper,\n createChatCompletionsSseParser,\n openProviderJsonStream,\n iterateProviderStreamBatches,\n createCompletionGate,\n} from \"../helpers/index.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, EventFactory, OutputItem, FetchFn, StopReason } from \"../index.js\";\n\n// ── 类型 ──────────────────────────────────────────────────────\n\nexport type ChatCompletionsAdapterOptions = {\n apiKey: string;\n baseUrl?: string;\n fetch?: FetchFn;\n};\n\n// ── Chat API 请求类型 ─────────────────────────────────────────\n\ntype ChatRequest = {\n model: string;\n messages: ChatMessage[];\n tools?: ChatTool[];\n tool_choice?: \"auto\" | \"none\" | { type: \"function\"; function: { name: string } };\n metadata?: Record<string, string>;\n temperature?: number;\n max_tokens?: number;\n stream: true;\n n: 1;\n};\n\ntype ChatMessage = {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | null;\n tool_calls?: ChatToolCall[];\n tool_call_id?: string;\n name?: string;\n [key: string]: unknown;\n};\n\ntype ChatToolCall = {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n};\n\ntype ChatTool = {\n type: \"function\";\n function: { name: string; description?: string; parameters: Record<string, unknown> };\n};\n\n// ── SSE chunk 类型 ────────────────────────────────────────────\n\ntype ChatChunk = {\n id: string;\n object: string;\n created: number;\n model: string;\n choices: ChatChunkChoice[];\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n prompt_tokens_details?: { cached_tokens?: number };\n completion_tokens_details?: { reasoning_tokens?: number };\n };\n};\n\ntype ChatChunkChoice = {\n index: number;\n delta: {\n role?: string;\n content?: string | null;\n reasoning?: unknown;\n reasoning_content?: unknown;\n tool_calls?: ChatChunkToolCall[];\n function_call?: { name?: string; arguments?: string };\n [key: string]: unknown;\n };\n finish_reason?: string | null;\n};\n\ntype ChatChunkToolCall = {\n index: number;\n id?: string;\n type?: string;\n function?: { name?: string; arguments?: string };\n};\n\ntype PendingToolCall = {\n id: string;\n name: string;\n args: string;\n};\n\ntype ReasoningFieldName = \"reasoning\" | \"reasoning_content\";\n\nconst REASONING_FIELDS: readonly ReasoningFieldName[] = [\"reasoning_content\", \"reasoning\"];\n\nconst mapper = new NormalizedRequestMapper(\"chat-completions\");\n\nfunction extractReasoningText(value: unknown): string {\n if (typeof value === \"string\") return value;\n\n if (Array.isArray(value)) {\n return value.map(extractReasoningText).join(\"\");\n }\n\n if (value && typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n for (const key of [\"text\", \"content\", \"reasoning\", \"reasoning_content\", \"thinking\", \"value\"]) {\n const nested = extractReasoningText(record[key]);\n if (nested) return nested;\n }\n }\n\n return \"\";\n}\n\nfunction extractReasoningDeltas(delta: ChatChunkChoice[\"delta\"]): Array<{ field: ReasoningFieldName; text: string }> {\n const deltas: Array<{ field: ReasoningFieldName; text: string }> = [];\n\n for (const field of REASONING_FIELDS) {\n const text = extractReasoningText(delta[field]);\n if (text) {\n deltas.push({ field, text });\n }\n }\n\n return deltas;\n}\n\nfunction isChatReplayToolCall(value: unknown): value is ChatToolCall {\n if (!value || typeof value !== \"object\") return false;\n const entry = value as Record<string, unknown>;\n if (typeof entry.id !== \"string\" || entry.type !== \"function\") return false;\n const fn = entry.function;\n if (!fn || typeof fn !== \"object\") return false;\n const f = fn as Record<string, unknown>;\n return typeof f.name === \"string\" && typeof f.arguments === \"string\";\n}\n\nfunction isChatReplayMessage(value: unknown): value is ChatMessage {\n if (!value || typeof value !== \"object\") return false;\n const msg = value as Record<string, unknown>;\n const role = msg.role;\n if (role !== \"system\" && role !== \"user\" && role !== \"assistant\" && role !== \"tool\") {\n return false;\n }\n if (!(msg.content === null || typeof msg.content === \"string\")) {\n return false;\n }\n if (msg.tool_calls !== undefined) {\n if (!Array.isArray(msg.tool_calls) || !msg.tool_calls.every(isChatReplayToolCall)) {\n return false;\n }\n }\n if (msg.tool_call_id !== undefined && typeof msg.tool_call_id !== \"string\") {\n return false;\n }\n if (msg.name !== undefined && typeof msg.name !== \"string\") {\n return false;\n }\n return true;\n}\n\nfunction assertChatReplayMessages(messages: unknown, field: string): asserts messages is ChatMessage[] {\n if (!Array.isArray(messages)) {\n throw new AIRequestError(`Invalid opaque replay payload: ${field} must be an array`, \"INVALID_OPAQUE_REPLAY\");\n }\n for (let i = 0; i < messages.length; i++) {\n if (!isChatReplayMessage(messages[i])) {\n throw new AIRequestError(\n `Invalid opaque replay payload: ${field}[${i}] is not a valid chat message`,\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n }\n}\n\nfunction buildAssistantReplayMessage(params: {\n content: string;\n reasoningByField: ReadonlyMap<ReasoningFieldName, string>;\n toolCalls: readonly PendingToolCall[];\n}): ChatMessage | null {\n const { content, reasoningByField, toolCalls } = params;\n if (!content && reasoningByField.size === 0 && toolCalls.length === 0) return null;\n\n const replayMessage: ChatMessage = {\n role: \"assistant\",\n content: content || null,\n };\n\n for (const [field, text] of reasoningByField) {\n replayMessage[field] = text;\n }\n\n if (toolCalls.length > 0) {\n replayMessage.tool_calls = toolCalls.map((toolCall) => ({\n id: toolCall.id,\n type: \"function\",\n function: {\n name: toolCall.name,\n arguments: toolCall.args,\n },\n }));\n }\n\n return replayMessage;\n}\n\n// ── Adapter ───────────────────────────────────────────────────\n\nexport class ChatCompletionsAdapter extends AdapterBase {\n readonly kind = \"chat-completions\" as const;\n readonly isSyntheticStream = false;\n\n private apiKey: string;\n private baseUrl: string;\n private fetchFn: FetchFn;\n\n constructor(options: ChatCompletionsAdapterOptions) {\n super();\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://api.openai.com/v1\";\n this.fetchFn = options.fetch ?? globalThis.fetch;\n }\n\n // ── buildRequest ──────────────────────────────────────────\n\n protected buildRequest(request: NormalizedRequest): ChatRequest {\n const messages: ChatMessage[] = [];\n\n // handle instructions → system message\n if (request.instructions) {\n messages.push({ role: \"system\", content: mapper.mapInstructions(request.instructions) });\n }\n\n for (const item of request.input) {\n switch (item.type) {\n case \"message\": {\n const role = item.role;\n const text = mapper.textFromBlocks(item.content, `input message (${item.role}) content`);\n messages.push({ role, content: text || null });\n break;\n }\n case \"tool_call\": {\n // 只允许附着到尾部 assistant turn,否则新建一个\n const lastAssistant =\n messages.length > 0 && messages[messages.length - 1]?.role === \"assistant\"\n ? messages[messages.length - 1]\n : null;\n const tc: ChatToolCall = {\n id: item.id,\n type: \"function\",\n function: { name: item.name, arguments: item.argumentsText },\n };\n if (lastAssistant) {\n lastAssistant.tool_calls = [...(lastAssistant.tool_calls ?? []), tc];\n } else {\n messages.push({ role: \"assistant\", content: null, tool_calls: [tc] });\n }\n break;\n }\n case \"tool_result\": {\n messages.push({\n role: \"tool\",\n tool_call_id: item.callId,\n name: item.toolName,\n content: mapper.textFromBlocks(item.content, `tool_result ${item.callId} content`),\n });\n break;\n }\n case \"reasoning\": {\n // chat.completions doesn't support reasoning items in input\n // Convert to a text message for best-effort\n messages.push({\n role: \"assistant\",\n content: mapper.textFromBlocks(item.content, \"reasoning content\"),\n });\n break;\n }\n case \"opaque\": {\n // Try to restore from opaque replay\n if (item.source !== \"chat.completions\" || item.purpose !== \"replay\") break;\n assertOpaqueReplayEnvelope(item.payload);\n const payload = item.payload as Record<string, unknown>;\n if (payload.role === \"assistant\" && typeof payload.content === \"string\") {\n messages.push({ role: \"assistant\", content: payload.content });\n } else if (payload.replaceCanonical === true && \"messages\" in payload) {\n assertChatReplayMessages(payload.messages, \"messages\");\n mapper.rollbackTrailingAssistantMessages(messages);\n for (const m of payload.messages) {\n messages.push(m);\n }\n } else if (\"messages\" in payload) {\n assertChatReplayMessages(payload.messages, \"messages\");\n for (const m of payload.messages) {\n messages.push(m);\n }\n }\n break;\n }\n }\n }\n\n const body: ChatRequest = {\n model: request.model,\n messages,\n stream: true,\n n: 1,\n };\n\n body.tools = mapper.mapToolsIfPresent(\n request.tools,\n (t): ChatTool => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema as Record<string, unknown>,\n },\n }),\n );\n\n body.tool_choice = mapper.mapToolChoice<Exclude<ChatRequest[\"tool_choice\"], undefined>>(request.toolChoice, {\n auto: \"auto\",\n none: \"none\",\n tool: (name) => ({ type: \"function\" as const, function: { name } }),\n });\n\n if (request.temperature !== undefined) body.temperature = request.temperature;\n if (request.maxOutputTokens !== undefined) body.max_tokens = request.maxOutputTokens;\n if (request.metadata) body.metadata = request.metadata;\n\n return body;\n }\n\n // ── runStream ─────────────────────────────────────────────\n\n protected async *runStream(\n providerRequest: ChatRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n const auxiliary = this.createAuxiliaryState(request);\n const gate = createCompletionGate();\n\n const { reader } = await openProviderJsonStream({\n fetchFn: this.fetchFn,\n url: `${this.baseUrl}/chat/completions`,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: providerRequest,\n signal: request.signal,\n });\n\n const parser = createChatCompletionsSseParser<ChatChunk>();\n const output: OutputItem[] = [];\n\n // 累积状态 — 支持多 choice,此处只取 index 0\n let responseId: string | undefined;\n let accumulatedContent = \"\";\n let accumulatedReasoning = \"\";\n let currentMessageId = \"\";\n let currentReasoningId = \"\";\n let hasMessageStarted = false;\n let hasReasoningStarted = false;\n let warnedNonZeroChoice = false;\n\n // tool_calls 累积: tool call index → { id, name, args }\n const pendingToolCalls = new Map<number, PendingToolCall>();\n const reasoningByField = new Map<ReasoningFieldName, string>();\n\n const finalizePendingTurn = (): { events: AIStreamEvent[]; assistantReplayMessage: ChatMessage | null } => {\n const events: AIStreamEvent[] = [];\n const finalizedToolCalls = [...pendingToolCalls.values()];\n const finalizedReasoningByField = new Map(reasoningByField);\n\n if (hasReasoningStarted && accumulatedReasoning) {\n const reasoning = reasoningItem([textBlock(accumulatedReasoning)], \"full\", currentReasoningId);\n events.push(factory.reasoningCompleted(currentReasoningId));\n output.push(reasoning);\n }\n\n if (hasMessageStarted) {\n const message = messageItem([textBlock(accumulatedContent)], { id: currentMessageId });\n events.push(factory.messageCompleted(currentMessageId));\n output.push(message);\n }\n\n for (const pending of finalizedToolCalls) {\n const toolCall = toolCallItem(pending.id, pending.name, pending.args);\n events.push(factory.toolCallCompleted(pending.id));\n output.push(toolCall);\n }\n\n const assistantReplayMessage = buildAssistantReplayMessage({\n content: accumulatedContent,\n reasoningByField: finalizedReasoningByField,\n toolCalls: finalizedToolCalls,\n });\n\n accumulatedContent = \"\";\n accumulatedReasoning = \"\";\n currentMessageId = \"\";\n currentReasoningId = \"\";\n hasMessageStarted = false;\n hasReasoningStarted = false;\n pendingToolCalls.clear();\n reasoningByField.clear();\n\n return { events, assistantReplayMessage };\n };\n\n const emitCompleted = async function* (\n this: ChatCompletionsAdapter,\n stopReason: StopReason | undefined,\n assistantReplayMessage: ChatMessage | null,\n rawResponseId: string | undefined,\n ): AsyncIterable<AIStreamEvent> {\n if (!gate.tryComplete()) {\n yield factory.responseWarning(\"Duplicate finish signal ignored\", \"DUPLICATE_FINISH\");\n return;\n }\n\n const replay = [...replayFromOutput(output)];\n if (assistantReplayMessage) {\n replay.push(\n opaqueItem(\"chat.completions\", \"replay\", {\n replaceCanonical: true,\n messages: [assistantReplayMessage],\n }),\n );\n }\n\n yield* this.emitStreamCompleted(factory, request, auxiliary, {\n output,\n replay,\n stopReason,\n rawResponseId,\n });\n }.bind(this);\n\n for await (const batch of iterateProviderStreamBatches({\n reader,\n parser,\n factory,\n providerLabel: \"Chat Completions\",\n transportLabel: \"SSE event(s)\",\n incompleteMessage: \"Stream ended with an incomplete Chat Completions SSE frame\",\n })) {\n for (const warning of batch.warnings) yield warning;\n\n for (const chunk of batch.items) {\n responseId = chunk.id;\n\n if (chunk.usage) {\n auxiliary.recordUsage(usageFromChatCompletions(chunk.usage), \"final\", chunk.usage);\n }\n\n for (const choice of chunk.choices) {\n if (choice.index !== 0) {\n if (!warnedNonZeroChoice) {\n yield factory.responseWarning(\n `Chat Completions returned choice index ${choice.index}; only the first choice (index 0) is supported. This choice is ignored.`,\n \"MULTIPLE_CHOICES_IGNORED\",\n );\n warnedNonZeroChoice = true;\n }\n continue;\n }\n\n if (gate.completed) {\n if (choice.finish_reason) {\n yield factory.responseWarning(\"Duplicate finish signal ignored\", \"DUPLICATE_FINISH\");\n }\n continue;\n }\n\n const delta = choice.delta;\n const finishReason = choice.finish_reason;\n const reasoningDeltas = extractReasoningDeltas(delta);\n\n const ensureMessageStarted = (): void => {\n if (hasMessageStarted) return;\n currentMessageId = `msg-${chunk.id}`;\n hasMessageStarted = true;\n accumulatedContent = \"\";\n };\n\n if (reasoningDeltas.length > 0) {\n if (!hasReasoningStarted) {\n currentReasoningId = `reason-${chunk.id}`;\n hasReasoningStarted = true;\n accumulatedReasoning = \"\";\n yield factory.reasoningStarted(currentReasoningId, \"full\");\n }\n\n for (const reasoningDelta of reasoningDeltas) {\n accumulatedReasoning += reasoningDelta.text;\n reasoningByField.set(\n reasoningDelta.field,\n (reasoningByField.get(reasoningDelta.field) ?? \"\") + reasoningDelta.text,\n );\n yield factory.reasoningDelta(currentReasoningId, textBlock(reasoningDelta.text));\n }\n }\n\n if (delta.content) {\n if (!hasMessageStarted) {\n ensureMessageStarted();\n yield factory.messageStarted(currentMessageId);\n }\n accumulatedContent += delta.content;\n yield factory.messageDelta(currentMessageId, textBlock(delta.content));\n }\n\n if (delta.tool_calls) {\n if (!hasMessageStarted) {\n ensureMessageStarted();\n yield factory.messageStarted(currentMessageId);\n }\n\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n\n if (tc.id) {\n pendingToolCalls.set(idx, { id: tc.id, name: tc.function?.name ?? \"\", args: \"\" });\n yield factory.toolCallStarted(tc.id, tc.function?.name ?? \"\");\n }\n\n if (tc.function?.arguments) {\n const pending = pendingToolCalls.get(idx);\n if (pending) {\n pending.args += tc.function.arguments;\n yield factory.toolCallDelta(pending.id, { argumentsText: tc.function.arguments });\n }\n }\n }\n }\n\n if (delta.function_call) {\n if (!hasMessageStarted) {\n ensureMessageStarted();\n yield factory.messageStarted(currentMessageId);\n }\n\n if (delta.function_call.name) {\n const fcId = `fc-${chunk.id}-0`;\n pendingToolCalls.set(0, { id: fcId, name: delta.function_call.name, args: \"\" });\n yield factory.toolCallStarted(fcId, delta.function_call.name);\n }\n if (delta.function_call.arguments) {\n const pending = pendingToolCalls.get(0);\n if (pending) {\n pending.args += delta.function_call.arguments;\n yield factory.toolCallDelta(pending.id, { argumentsText: delta.function_call.arguments });\n }\n }\n }\n\n if (finishReason && finishReason !== null) {\n const { events, assistantReplayMessage } = finalizePendingTurn();\n for (const event of events) yield event;\n yield* emitCompleted(mapStopReason(finishReason), assistantReplayMessage, chunk.id);\n }\n }\n }\n }\n\n if (!gate.completed && (hasMessageStarted || hasReasoningStarted || pendingToolCalls.size > 0)) {\n yield factory.responseWarning(\"Stream ended without a finish_reason\", WarningCode.STREAM_INCOMPLETE);\n const { events, assistantReplayMessage } = finalizePendingTurn();\n for (const event of events) yield event;\n yield* emitCompleted(undefined, assistantReplayMessage, responseId);\n }\n }\n}\n","/**\n * Ollama Adapter\n *\n * 接入 Ollama 原生 Chat API (/api/chat)。\n * 与 Chat Completions 兼容层不同,此处直接使用 Ollama 的 NDJSON 流格式。\n *\n * 能力:\n * - 消息流(完整 content 逐块到达)\n * - 工具调用(整块到达,非逐 token)\n * - 用量信息(仅 prompt_eval_count / eval_count)\n *\n * 限制:\n * - 不流式输出 reasoning(Ollama 原生 API 无独立思考字段)\n * - tool_call 不支持逐 token 流式\n * - replay 保真度低(无 opaque continuation 机制)\n */\n\nimport { AdapterBase } from \"../helpers/adapter-base.js\";\nimport { AIRequestError, WarningCode } from \"../core/errors.js\";\nimport {\n textBlock,\n messageItem,\n toolCallItem,\n opaqueItem,\n replayFromOutput,\n mapStopReason,\n contentBlocksToText,\n} from \"../helpers/mapping.js\";\nimport { assertOpaqueReplayEnvelope } from \"../helpers/adapter-security.js\";\nimport { usageFromOllama } from \"../helpers/usage-mapping.js\";\nimport {\n NormalizedRequestMapper,\n createNdjsonLineParser,\n openProviderJsonStream,\n iterateProviderStreamBatches,\n createCompletionGate,\n} from \"../helpers/index.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, EventFactory, OutputItem, FetchFn, StopReason } from \"../index.js\";\n\n// ── 选项类型 ──────────────────────────────────────────────────\n\nexport type OllamaAdapterOptions = {\n /** Ollama 服务地址,默认 http://localhost:11434 */\n baseUrl?: string;\n /** 可选 API key(用于需要认证的代理场景) */\n apiKey?: string;\n /** 可注入自定义 fetch 实现 */\n fetch?: FetchFn;\n};\n\n// ── Ollama Chat API 类型 ──────────────────────────────────────\n\ntype OllamaChatRequest = {\n model: string;\n messages: OllamaMessage[];\n stream: true;\n tools?: OllamaTool[];\n options?: {\n temperature?: number;\n num_predict?: number;\n [key: string]: unknown;\n };\n};\n\ntype OllamaMessage = {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n images?: string[];\n tool_calls?: OllamaToolCall[];\n};\n\ntype OllamaToolCall = {\n function: {\n name: string;\n arguments: Record<string, unknown>;\n };\n};\n\ntype OllamaTool = {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters: Record<string, unknown>;\n };\n};\n\nconst mapper = new NormalizedRequestMapper(\"ollama\");\n\n// ── Ollama 流式 chunk ─────────────────────────────────────────\n\ntype OllamaChatChunk = {\n model: string;\n created_at: string;\n message: {\n role: string;\n content: string;\n tool_calls?: OllamaToolCall[];\n };\n done: boolean;\n done_reason?: string;\n // 计时与用量(仅 final chunk 有值)\n total_duration?: number;\n load_duration?: number;\n prompt_eval_count?: number;\n prompt_eval_duration?: number;\n eval_count?: number;\n eval_duration?: number;\n};\n\n/** Opaque replay may carry optional local `id`s; wire tool_calls never include them. */\ntype OllamaReplayToolCall = OllamaToolCall & { id?: string };\n\nfunction isOllamaReplayToolCalls(value: unknown): value is OllamaReplayToolCall[] {\n return (\n Array.isArray(value) &&\n value.every((entry) => {\n if (!entry || typeof entry !== \"object\" || !(\"function\" in entry)) return false;\n const fn = (entry as { function?: unknown }).function;\n const id = (entry as { id?: unknown }).id;\n if (id !== undefined && typeof id !== \"string\") return false;\n return (\n !!fn &&\n typeof fn === \"object\" &&\n \"name\" in fn &&\n typeof (fn as { name?: unknown }).name === \"string\" &&\n \"arguments\" in fn &&\n typeof (fn as { arguments?: unknown }).arguments === \"object\" &&\n (fn as { arguments?: unknown }).arguments !== null\n );\n })\n );\n}\n\nfunction toWireOllamaToolCalls(toolCalls: OllamaReplayToolCall[]): OllamaToolCall[] {\n return toolCalls.map((tc) => ({\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n }));\n}\n\n// ── Adapter ───────────────────────────────────────────────────\n\nexport class OllamaAdapter extends AdapterBase {\n readonly kind = \"ollama\" as const;\n readonly isSyntheticStream = false;\n\n private baseUrl: string;\n private apiKey: string | undefined;\n private fetchFn: FetchFn;\n\n constructor(options: OllamaAdapterOptions = {}) {\n super();\n this.baseUrl = options.baseUrl ?? \"http://localhost:11434\";\n this.apiKey = options.apiKey;\n this.fetchFn = options.fetch ?? globalThis.fetch;\n }\n\n // ── buildRequest ──────────────────────────────────────────\n\n protected buildRequest(request: NormalizedRequest): OllamaChatRequest {\n const messages: OllamaMessage[] = [];\n /** Local-only name → call id queue for best-effort tool_result association (not sent to Ollama). */\n const callIdsByName = new Map<string, string[]>();\n\n // handle instructions → system message\n if (request.instructions) {\n messages.push({ role: \"system\", content: mapper.mapInstructions(request.instructions) });\n }\n\n for (const item of request.input) {\n switch (item.type) {\n case \"message\": {\n const role = item.role;\n messages.push({\n role,\n content: mapper.textFromBlocks(item.content, `input message (${item.role}) content`),\n });\n break;\n }\n case \"tool_call\": {\n // Ollama expects tool_calls on the last assistant message\n const lastAssistant = messages.findLast((m) => m.role === \"assistant\");\n const tc: OllamaToolCall = {\n function: {\n name: item.name,\n arguments: mapper.parseToolArguments(item),\n },\n };\n const queue = callIdsByName.get(item.name) ?? [];\n queue.push(item.id);\n callIdsByName.set(item.name, queue);\n if (lastAssistant) {\n lastAssistant.tool_calls = [...(lastAssistant.tool_calls ?? []), tc];\n } else {\n messages.push({ role: \"assistant\", content: \"\", tool_calls: [tc] });\n }\n break;\n }\n case \"tool_result\": {\n // Best-effort: consume matching id from name queue when present (no wire call_id)\n const queue = callIdsByName.get(item.toolName);\n if (queue && queue.length > 0) {\n queue.shift();\n }\n messages.push({\n role: \"tool\",\n content: mapper.textFromBlocks(item.content, `tool_result ${item.callId} content`),\n });\n break;\n }\n case \"reasoning\": {\n // Ollama doesn't support reasoning in input; convert to text message\n messages.push({\n role: \"assistant\",\n content: contentBlocksToText(mapper.ensureReasoningBlocks(item.content, \"reasoning content\")),\n });\n break;\n }\n case \"opaque\": {\n // Best-effort restore from opaque replay (local ids stripped before wire)\n if (item.source !== \"ollama\" || item.purpose !== \"replay\") break;\n assertOpaqueReplayEnvelope(item.payload);\n const payload = item.payload as Record<string, unknown>;\n if (payload.role === \"assistant\" && typeof payload.content === \"string\") {\n mapper.rollbackTrailingAssistantMessages(messages);\n let replayToolCalls: OllamaReplayToolCall[] | undefined;\n if (\"tool_calls\" in payload && payload.tool_calls !== undefined) {\n if (!isOllamaReplayToolCalls(payload.tool_calls)) {\n throw new AIRequestError(\n \"Invalid opaque replay payload: tool_calls is not a valid ollama tool_calls array\",\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n replayToolCalls = payload.tool_calls;\n }\n // Record name → id order for best-effort tool_result correlation (local only)\n if (replayToolCalls) {\n for (const tc of replayToolCalls) {\n if (tc.id) {\n const queue = callIdsByName.get(tc.function.name) ?? [];\n queue.push(tc.id);\n callIdsByName.set(tc.function.name, queue);\n }\n }\n }\n messages.push({\n role: \"assistant\",\n content: payload.content,\n tool_calls: replayToolCalls ? toWireOllamaToolCalls(replayToolCalls) : undefined,\n });\n }\n break;\n }\n }\n }\n\n const body: OllamaChatRequest = {\n model: request.model,\n messages,\n stream: true,\n };\n\n const toolChoice = request.toolChoice;\n const selectedTools =\n toolChoice === \"none\"\n ? []\n : toolChoice && typeof toolChoice === \"object\"\n ? request.tools?.filter((tool) => tool.name === toolChoice.name)\n : request.tools;\n\n if (selectedTools && selectedTools.length > 0) {\n body.tools = selectedTools.map(\n (t): OllamaTool => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema as Record<string, unknown>,\n },\n }),\n );\n }\n\n if (request.temperature !== undefined || request.maxOutputTokens !== undefined) {\n body.options = {};\n if (request.temperature !== undefined) body.options.temperature = request.temperature;\n if (request.maxOutputTokens !== undefined) body.options.num_predict = request.maxOutputTokens;\n }\n\n return body;\n }\n\n // ── runStream ─────────────────────────────────────────────\n\n protected async *runStream(\n providerRequest: OllamaChatRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n const auxiliary = this.createAuxiliaryState(request);\n const gate = createCompletionGate();\n\n if (request.toolChoice && request.toolChoice !== \"auto\") {\n yield factory.responseWarning(\n request.toolChoice === \"none\"\n ? \"Ollama toolChoice none was mapped by omitting tools\"\n : `Ollama cannot force tool choice; only tool \"${request.toolChoice.name}\" was provided as a best-effort constraint`,\n WarningCode.CAPABILITY_DOWNGRADE,\n );\n }\n if (request.metadata) {\n yield factory.responseWarning(\"Request metadata is not supported by the Ollama adapter\", \"UNSUPPORTED_METADATA\");\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n }\n\n const { reader } = await openProviderJsonStream({\n fetchFn: this.fetchFn,\n url: `${this.baseUrl}/api/chat`,\n headers,\n body: providerRequest,\n signal: request.signal,\n });\n\n const parser = createNdjsonLineParser<OllamaChatChunk>(\n (value): value is OllamaChatChunk => !!value && typeof value === \"object\" && \"message\" in value,\n );\n\n const output: OutputItem[] = [];\n let responseId: string | undefined;\n let accumulatedContent = \"\";\n let currentMessageId = \"\";\n let hasMessageStarted = false;\n let pendingToolCalls: Array<{ id: string; name: string; argumentsText: string }> = [];\n let toolCallIndex = 0;\n\n const emitCompleted = async function* (\n this: OllamaAdapter,\n stopReason: StopReason | undefined,\n rawResponseId: string | undefined,\n ): AsyncIterable<AIStreamEvent> {\n if (!gate.tryComplete()) {\n yield factory.responseWarning(\"Duplicate finish signal ignored\", \"DUPLICATE_FINISH\");\n return;\n }\n\n const replay = replayFromOutput(output);\n if (accumulatedContent || pendingToolCalls.length > 0) {\n replay.push(\n opaqueItem(\"ollama\", \"replay\", {\n role: \"assistant\",\n content: accumulatedContent,\n tool_calls: pendingToolCalls.map((tc) => ({\n id: tc.id,\n function: { name: tc.name, arguments: JSON.parse(tc.argumentsText) as Record<string, unknown> },\n })),\n }),\n );\n }\n\n yield* this.emitStreamCompleted(factory, request, auxiliary, {\n output,\n replay,\n stopReason,\n rawResponseId,\n });\n }.bind(this);\n\n for await (const batch of iterateProviderStreamBatches({\n reader,\n parser,\n factory,\n providerLabel: \"Ollama\",\n transportLabel: \"NDJSON line(s)\",\n incompleteMessage: \"Stream ended with an incomplete Ollama NDJSON line\",\n })) {\n for (const warning of batch.warnings) yield warning;\n\n for (const chunk of batch.items) {\n responseId = chunk.created_at;\n\n if (gate.completed) {\n if (chunk.done) {\n yield factory.responseWarning(\"Duplicate finish signal ignored\", \"DUPLICATE_FINISH\");\n }\n continue;\n }\n\n const msg = chunk.message;\n\n if (msg.content) {\n if (!hasMessageStarted) {\n currentMessageId = `msg-${chunk.created_at}`;\n hasMessageStarted = true;\n yield factory.messageStarted(currentMessageId);\n }\n accumulatedContent += msg.content;\n yield factory.messageDelta(currentMessageId, textBlock(msg.content));\n }\n\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n for (const tc of msg.tool_calls) {\n const tcId = `ollama-tc-${request.requestId}-${toolCallIndex++}`;\n const argsText = JSON.stringify(tc.function.arguments);\n pendingToolCalls.push({\n id: tcId,\n name: tc.function.name,\n argumentsText: argsText,\n });\n }\n }\n\n if (chunk.done) {\n if (accumulatedContent === \"\" && pendingToolCalls.length > 0 && !hasMessageStarted) {\n currentMessageId = `msg-${chunk.created_at}`;\n hasMessageStarted = true;\n yield factory.messageStarted(currentMessageId);\n }\n\n if (hasMessageStarted) {\n const message = messageItem([textBlock(accumulatedContent)], { id: currentMessageId });\n yield factory.messageCompleted(currentMessageId);\n if (accumulatedContent) {\n output.push(message);\n }\n }\n\n if (pendingToolCalls.length > 0) {\n yield factory.responseWarning(\n `Ollama delivered ${pendingToolCalls.length} tool call(s) as a batch; tool_call streaming is not supported`,\n WarningCode.TOOL_CALL_BATCHED,\n );\n }\n\n for (const pending of pendingToolCalls) {\n const toolCall = toolCallItem(pending.id, pending.name, pending.argumentsText);\n yield factory.toolCallStarted(pending.id, pending.name);\n yield factory.toolCallDelta(pending.id, { argumentsText: pending.argumentsText });\n yield factory.toolCallCompleted(pending.id);\n output.push(toolCall);\n }\n\n if (\n request.include?.usage !== \"off\" &&\n (chunk.prompt_eval_count !== undefined || chunk.eval_count !== undefined)\n ) {\n auxiliary.recordUsage(\n usageFromOllama({\n prompt_eval_count: chunk.prompt_eval_count,\n eval_count: chunk.eval_count,\n }),\n \"final\",\n {\n prompt_eval_count: chunk.prompt_eval_count,\n eval_count: chunk.eval_count,\n },\n );\n }\n\n const stopReason = chunk.done_reason ? mapStopReason(chunk.done_reason) : undefined;\n yield* emitCompleted(stopReason, chunk.created_at);\n\n accumulatedContent = \"\";\n currentMessageId = \"\";\n hasMessageStarted = false;\n pendingToolCalls = [];\n }\n }\n }\n\n if (!gate.completed && (hasMessageStarted || pendingToolCalls.length > 0)) {\n yield factory.responseWarning(\"Stream ended without a done signal\", WarningCode.STREAM_INCOMPLETE);\n\n if (hasMessageStarted) {\n const message = messageItem([textBlock(accumulatedContent)], { id: currentMessageId });\n yield factory.messageCompleted(currentMessageId);\n if (accumulatedContent) {\n output.push(message);\n }\n }\n\n if (pendingToolCalls.length > 0) {\n yield factory.responseWarning(\n `Ollama delivered ${pendingToolCalls.length} tool call(s) as a batch; tool_call streaming is not supported`,\n WarningCode.TOOL_CALL_BATCHED,\n );\n }\n\n for (const pending of pendingToolCalls) {\n const toolCall = toolCallItem(pending.id, pending.name, pending.argumentsText);\n yield factory.toolCallStarted(pending.id, pending.name);\n yield factory.toolCallDelta(pending.id, { argumentsText: pending.argumentsText });\n yield factory.toolCallCompleted(pending.id);\n output.push(toolCall);\n }\n\n yield* emitCompleted(undefined, responseId);\n }\n }\n}\n","/**\n * Mock Adapter\n *\n * 面向测试的回调驱动 adapter:\n * - 每次请求执行用户提供的 handler\n * - 验证调用方是否正确续接 replay / tool_result\n * - 发出可控的 message / reasoning / tool_call 流\n * - 注入 warning / auxiliary / content_filter / 中断 / provider error\n *\n * 这不是通用“假模型”,而是测试工具调用编排与错误路径的测试夹具。\n */\n\nimport { AIRequestError } from \"../core/errors.js\";\nimport { AdapterBase } from \"../helpers/adapter-base.js\";\nimport { messageItem, reasoningItem, replayFromOutput, textBlock } from \"../helpers/mapping.js\";\n\nimport type {\n AIStreamEvent,\n AuxiliaryInfo,\n BillingInfo,\n ContentBlock,\n EventFactory,\n InputItem,\n MessageItem,\n NormalizedRequest,\n OutputItem,\n ReplayItem,\n StopReason,\n ToolCallItem,\n ToolResultItem,\n Usage,\n} from \"../index.js\";\n\nexport type MockInputExpectation = {\n type: InputItem[\"type\"];\n id?: string;\n role?: MessageItem[\"role\"];\n name?: string;\n toolName?: string;\n callId?: string;\n outcome?: ToolResultItem[\"outcome\"];\n visibility?: Extract<InputItem, { type: \"reasoning\" }>[\"visibility\"];\n source?: Extract<InputItem, { type: \"opaque\" }>[\"source\"];\n purpose?: Extract<InputItem, { type: \"opaque\" }>[\"purpose\"];\n textIncludes?: string;\n};\n\nexport type MockRequestExpectation = {\n minItems?: number;\n maxItems?: number;\n ordered?: boolean;\n requireReplayFromPreviousTurn?: boolean;\n requireToolResultsForPendingCalls?: boolean;\n tools?: \"ignore\" | \"present\" | \"absent\";\n toolChoice?: \"ignore\" | \"present\" | \"absent\";\n items?: MockInputExpectation[];\n};\n\nexport type MockHistoryRecord = {\n turnIndex: number;\n requestId: string;\n replay: ReplayItem[];\n toolCalls: ToolCallItem[];\n};\n\nexport type MockHandlerContext = {\n turnIndex: number;\n previousReplay: ReplayItem[];\n pendingToolCalls: readonly ToolCallItem[];\n history: readonly MockHistoryRecord[];\n /** 请求的 AbortSignal,handler 可检查 signal.aborted 提前退出。 */\n signal?: AbortSignal;\n};\n\nexport type MockWarningStep = {\n type: \"warning\";\n message: string;\n code?: string;\n};\n\nexport type MockAuxiliaryStep = {\n type: \"auxiliary\";\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: Partial<AuxiliaryInfo>;\n};\n\nexport type MockTextStreamOptions = {\n /**\n * 每秒吐出的字符数。未设置时仍会按 chunk 拆分,但不会额外等待。\n */\n charsPerSecond?: number;\n /**\n * 每个 delta 最多包含多少个字符,默认 1。\n */\n chunkSize?: number;\n /**\n * 首个 delta 发出前的延迟。\n */\n initialDelayMs?: number;\n};\n\nexport type MockMessageStep = {\n type: \"message\";\n id?: string;\n content: string | ContentBlock[];\n stream?: MockTextStreamOptions | false;\n};\n\nexport type MockReasoningStep = {\n type: \"reasoning\";\n id?: string;\n visibility?: Extract<OutputItem, { type: \"reasoning\" }>[\"visibility\"];\n content: string | ContentBlock[];\n stream?: MockTextStreamOptions | false;\n};\n\nexport type MockToolCallStep = {\n type: \"tool_call\";\n id: string;\n name: string;\n argumentsText: string;\n streamArguments?: boolean;\n stream?: MockTextStreamOptions | false;\n};\n\nexport type MockOutputStep = {\n type: \"output\";\n item: Extract<OutputItem, { type: \"message\" | \"reasoning\" | \"tool_call\" }>;\n stream?: MockTextStreamOptions | false;\n};\n\nexport type MockCompleteStep = {\n type: \"complete\";\n stopReason?: StopReason;\n replay?: ReplayItem[];\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: Partial<AuxiliaryInfo>;\n providerMetadata?: Record<string, unknown>;\n rawResponseId?: string;\n warnings?: string[];\n};\n\nexport type MockErrorStep = {\n type: \"error\";\n message: string;\n code?: string;\n stopReason?: StopReason;\n providerMetadata?: Record<string, unknown>;\n};\n\nexport type MockInterruptStep = {\n type: \"interrupt\";\n};\n\nexport type MockThrowStep = {\n type: \"throw\";\n error: string | Error;\n};\n\nexport type MockStep =\n | MockWarningStep\n | MockAuxiliaryStep\n | MockMessageStep\n | MockReasoningStep\n | MockToolCallStep\n | MockOutputStep\n | MockCompleteStep\n | MockErrorStep\n | MockInterruptStep\n | MockThrowStep;\n\nexport type MockHandler = (request: NormalizedRequest, context: MockHandlerContext) => AsyncIterable<MockStep>;\n\ntype MockHandlerSource = Iterable<MockStep> | AsyncIterable<MockStep>;\n\nexport type MockStaticHandler = (\n request: NormalizedRequest,\n context: MockHandlerContext,\n) => MockHandlerSource | Promise<MockHandlerSource>;\n\nexport type MockAdapterOptions = {\n handler: MockHandler;\n providerMetadata?: Record<string, unknown>;\n};\n\ntype MockProviderRequest = {\n request: NormalizedRequest;\n handlerResult: AsyncIterable<MockStep>;\n turnIndex: number;\n remainingPendingToolCalls: ToolCallItem[];\n};\n\ntype ResolvedMockTextStreamOptions = {\n charsPerSecond?: number;\n chunkSize: number;\n initialDelayMs: number;\n};\n\nexport function assertMockRequest(\n request: NormalizedRequest,\n expectation: MockRequestExpectation,\n context: MockHandlerContext,\n): void {\n const prefix = `MockAdapter turn ${context.turnIndex + 1} expectation failed`;\n\n if (expectation.minItems !== undefined && request.input.length < expectation.minItems) {\n throw new AIRequestError(\n `${prefix}: expected at least ${expectation.minItems} input item(s)`,\n \"MOCK_EXPECTATION_FAILED\",\n );\n }\n\n if (expectation.maxItems !== undefined && request.input.length > expectation.maxItems) {\n throw new AIRequestError(\n `${prefix}: expected at most ${expectation.maxItems} input item(s)`,\n \"MOCK_EXPECTATION_FAILED\",\n );\n }\n\n if (expectation.tools === \"present\" && (!request.tools || request.tools.length === 0)) {\n throw new AIRequestError(`${prefix}: expected tools to be present`, \"MOCK_EXPECTATION_FAILED\");\n }\n\n if (expectation.tools === \"absent\" && request.tools && request.tools.length > 0) {\n throw new AIRequestError(`${prefix}: expected tools to be absent`, \"MOCK_EXPECTATION_FAILED\");\n }\n\n if (expectation.toolChoice === \"present\" && request.toolChoice === undefined) {\n throw new AIRequestError(`${prefix}: expected toolChoice to be present`, \"MOCK_EXPECTATION_FAILED\");\n }\n\n if (expectation.toolChoice === \"absent\" && request.toolChoice !== undefined) {\n throw new AIRequestError(`${prefix}: expected toolChoice to be absent`, \"MOCK_EXPECTATION_FAILED\");\n }\n\n if (expectation.requireReplayFromPreviousTurn && context.previousReplay.length > 0) {\n assertReplayIncluded(request.input, context.previousReplay, prefix);\n }\n\n if (expectation.requireToolResultsForPendingCalls && context.pendingToolCalls.length > 0) {\n const toolResultIds = new Set(\n request.input.filter((item): item is ToolResultItem => item.type === \"tool_result\").map((item) => item.callId),\n );\n\n for (const call of context.pendingToolCalls) {\n if (!toolResultIds.has(call.id)) {\n throw new AIRequestError(\n `${prefix}: expected tool_result for pending tool call \"${call.id}\"`,\n \"MOCK_EXPECTATION_FAILED\",\n );\n }\n }\n }\n\n if (expectation.items && expectation.items.length > 0) {\n if (expectation.ordered) {\n assertOrderedItems(request.input, expectation.items, prefix);\n } else {\n assertUnorderedItems(request.input, expectation.items, prefix);\n }\n }\n}\n\nexport class MockAdapter extends AdapterBase {\n readonly kind = \"mock\" as const;\n readonly isSyntheticStream = true;\n\n private readonly handler: MockHandler;\n private readonly providerMetadata?: Record<string, unknown>;\n\n private cursor = 0;\n private previousReplay: ReplayItem[] = [];\n private pendingToolCalls: ToolCallItem[] = [];\n private history: MockHistoryRecord[] = [];\n private activeStream = false;\n\n constructor(options: MockAdapterOptions) {\n super();\n this.handler = options.handler;\n this.providerMetadata = options.providerMetadata;\n }\n\n protected async buildRequest(request: NormalizedRequest): Promise<MockProviderRequest> {\n const turnIndex = this.cursor;\n const context = this.buildHandlerContext(turnIndex, request.signal);\n const remainingPendingToolCalls = consumePendingToolCalls(this.pendingToolCalls, request.input);\n const handlerResult = this.handler(request, context);\n\n this.cursor += 1;\n\n return {\n request,\n handlerResult,\n turnIndex,\n remainingPendingToolCalls,\n };\n }\n\n protected async *runStream(\n providerRequest: unknown,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n if (this.activeStream) {\n throw new AIRequestError(\"MockAdapter does not support concurrent streams\", \"MOCK_CONCURRENT_STREAM\");\n }\n\n this.activeStream = true;\n\n try {\n const mockRequest = providerRequest as MockProviderRequest;\n const output: OutputItem[] = [];\n let stepCount = 0;\n\n for await (const step of mockRequest.handlerResult) {\n // 若 signal 已 abort,停止消费 handler 并返回\n if (request.signal?.aborted) return;\n\n stepCount += 1;\n\n switch (step.type) {\n case \"warning\":\n yield factory.responseWarning(step.message, step.code);\n break;\n case \"auxiliary\":\n yield factory.responseAuxiliary({\n usage: step.usage,\n billing: step.billing,\n auxiliary: step.auxiliary,\n });\n break;\n case \"message\": {\n const item = createMessageFromStep(step, request, mockRequest.turnIndex, stepCount - 1);\n yield* emitMessage(factory, item, resolveStepStreamOptions(undefined, step.stream, \"message\"));\n output.push(item);\n break;\n }\n case \"reasoning\": {\n const item = createReasoningFromStep(step, request, mockRequest.turnIndex, stepCount - 1);\n yield* emitReasoning(factory, item, resolveStepStreamOptions(undefined, step.stream, \"reasoning\"));\n output.push(item);\n break;\n }\n case \"tool_call\": {\n const item = createToolCallFromStep(step);\n yield* emitToolCall(\n factory,\n item,\n step.streamArguments ?? true,\n resolveStepStreamOptions(undefined, step.stream, \"tool_call\"),\n );\n output.push(item);\n break;\n }\n case \"output\": {\n assertSupportedOutputItem(step.item);\n const item = attachSyntheticId(step.item, request, mockRequest.turnIndex, stepCount - 1);\n yield* emitOutputItem(factory, item, resolveStepStreamOptions(undefined, step.stream, \"output\"));\n output.push(item);\n break;\n }\n case \"complete\": {\n const finalResponse = this.finalizeTurn(request, factory, mockRequest, output, step, stepCount);\n yield factory.responseCompleted({\n replay: finalResponse.replay,\n stopReason: finalResponse.stopReason,\n trace: finalResponse.backend,\n usage: finalResponse.usage,\n billing: finalResponse.billing,\n auxiliary: finalResponse.auxiliary,\n warnings: finalResponse.warnings,\n });\n return;\n }\n case \"error\": {\n yield factory.responseWarning(step.message, step.code);\n const finalResponse = this.finalizeTurn(\n request,\n factory,\n mockRequest,\n output,\n {\n type: \"complete\",\n stopReason: step.stopReason ?? \"error\",\n providerMetadata: step.providerMetadata,\n },\n stepCount,\n );\n yield factory.responseCompleted({\n replay: finalResponse.replay,\n stopReason: finalResponse.stopReason,\n trace: finalResponse.backend,\n usage: finalResponse.usage,\n billing: finalResponse.billing,\n auxiliary: finalResponse.auxiliary,\n warnings: finalResponse.warnings,\n });\n return;\n }\n case \"interrupt\":\n this.pendingToolCalls = mockRequest.remainingPendingToolCalls;\n return;\n case \"throw\":\n throw typeof step.error === \"string\" ? new Error(step.error) : step.error;\n }\n }\n\n const finalResponse = this.finalizeTurn(\n request,\n factory,\n mockRequest,\n output,\n {\n type: \"complete\",\n },\n stepCount,\n );\n yield factory.responseCompleted({\n replay: finalResponse.replay,\n stopReason: finalResponse.stopReason,\n trace: finalResponse.backend,\n usage: finalResponse.usage,\n billing: finalResponse.billing,\n auxiliary: finalResponse.auxiliary,\n warnings: finalResponse.warnings,\n });\n } finally {\n this.activeStream = false;\n }\n }\n\n private finalizeTurn(\n request: NormalizedRequest,\n factory: EventFactory,\n mockRequest: MockProviderRequest,\n output: OutputItem[],\n completion: MockCompleteStep,\n stepCount: number,\n ) {\n const replay = completion.replay ?? replayFromOutput(output);\n const toolCalls = output.filter((item): item is ToolCallItem => item.type === \"tool_call\");\n\n this.previousReplay = replay;\n this.pendingToolCalls = [...mockRequest.remainingPendingToolCalls, ...toolCalls];\n this.history.push({\n turnIndex: mockRequest.turnIndex,\n requestId: request.requestId,\n replay,\n toolCalls,\n });\n\n return this.buildResponse(\n request,\n {\n output,\n replay,\n stopReason: completion.stopReason ?? resolveStopReason(output),\n usage: completion.usage,\n billing: completion.billing,\n auxiliary: completion.auxiliary,\n providerMetadata: {\n turnIndex: mockRequest.turnIndex,\n stepCount,\n pendingToolCallIds: this.pendingToolCalls.map((item) => item.id),\n historyLength: this.history.length,\n ...this.providerMetadata,\n ...completion.providerMetadata,\n },\n warnings: completion.warnings,\n metadataSources: [\"mock\"],\n rawResponseId: completion.rawResponseId,\n },\n factory,\n );\n }\n\n private buildHandlerContext(turnIndex: number, signal?: AbortSignal): MockHandlerContext {\n return {\n turnIndex,\n previousReplay: this.previousReplay.map(cloneItem),\n pendingToolCalls: this.pendingToolCalls.map(cloneItem),\n history: this.history.map((record) => ({\n ...record,\n replay: record.replay.map(cloneItem),\n toolCalls: record.toolCalls.map(cloneItem),\n })),\n signal,\n };\n }\n}\n\nexport function withMockStreaming(handler: MockStaticHandler, options: MockTextStreamOptions): MockHandler {\n const defaults = resolveMockTextStreamOptions(options, \"mock stream wrapper\");\n if (!defaults) {\n throw new AIRequestError(\"mock stream wrapper requires streaming options\", \"MOCK_STREAM_CONFIG_INVALID\");\n }\n\n return async function* streamWrappedHandler(\n request: NormalizedRequest,\n context: MockHandlerContext,\n ): AsyncIterable<MockStep> {\n const source = await handler(request, context);\n\n for await (const step of source) {\n yield applyDefaultStreaming(step, defaults);\n }\n };\n}\n\nfunction applyDefaultStreaming(step: MockStep, defaults: ResolvedMockTextStreamOptions): MockStep {\n switch (step.type) {\n case \"message\":\n case \"reasoning\":\n case \"tool_call\":\n case \"output\":\n if (step.stream !== undefined) {\n return step;\n }\n return {\n ...step,\n stream: {\n charsPerSecond: defaults.charsPerSecond,\n chunkSize: defaults.chunkSize,\n initialDelayMs: defaults.initialDelayMs,\n },\n };\n default:\n return step;\n }\n}\n\nfunction createMessageFromStep(\n step: MockMessageStep,\n request: NormalizedRequest,\n turnIndex: number,\n stepIndex: number,\n): MessageItem {\n return {\n ...messageItem(normalizeBlocks(step.content), {\n id: step.id ?? `mock-msg-${request.requestId}-${turnIndex}-${stepIndex}`,\n }),\n role: \"assistant\",\n };\n}\n\nfunction createReasoningFromStep(\n step: MockReasoningStep,\n request: NormalizedRequest,\n turnIndex: number,\n stepIndex: number,\n): Extract<OutputItem, { type: \"reasoning\" }> {\n return reasoningItem(\n normalizeBlocks(step.content),\n step.visibility ?? \"full\",\n step.id ?? `mock-reason-${request.requestId}-${turnIndex}-${stepIndex}`,\n );\n}\n\nfunction createToolCallFromStep(step: MockToolCallStep): ToolCallItem {\n return {\n type: \"tool_call\",\n id: step.id,\n name: step.name,\n argumentsText: step.argumentsText,\n };\n}\n\nfunction normalizeBlocks(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === \"string\" ? [textBlock(content)] : content;\n}\n\nfunction assertSupportedOutputItem(item: OutputItem): void {\n if (item.type === \"opaque\") {\n throw new AIRequestError(\n \"MockAdapter does not stream opaque output items; use complete.replay if needed\",\n \"MOCK_OPAQUE_OUTPUT\",\n );\n }\n}\n\nfunction attachSyntheticId(\n item: Extract<OutputItem, { type: \"message\" | \"reasoning\" | \"tool_call\" }>,\n request: NormalizedRequest,\n turnIndex: number,\n stepIndex: number,\n): Extract<OutputItem, { type: \"message\" | \"reasoning\" | \"tool_call\" }> {\n if (item.type === \"message\") {\n return {\n ...item,\n id: item.id ?? `mock-msg-${request.requestId}-${turnIndex}-${stepIndex}`,\n role: \"assistant\",\n };\n }\n\n if (item.type === \"reasoning\") {\n return {\n ...item,\n id: item.id ?? `mock-reason-${request.requestId}-${turnIndex}-${stepIndex}`,\n };\n }\n\n return item;\n}\n\nasync function* emitOutputItem(\n factory: EventFactory,\n item: Extract<OutputItem, { type: \"message\" | \"reasoning\" | \"tool_call\" }>,\n stream?: ResolvedMockTextStreamOptions,\n): AsyncIterable<AIStreamEvent> {\n if (item.type === \"message\") {\n yield* emitMessage(factory, item, stream);\n return;\n }\n\n if (item.type === \"reasoning\") {\n yield* emitReasoning(factory, item, stream);\n return;\n }\n\n yield* emitToolCall(factory, item, true, stream);\n}\n\nasync function* emitMessage(\n factory: EventFactory,\n item: MessageItem,\n stream?: ResolvedMockTextStreamOptions,\n): AsyncIterable<AIStreamEvent> {\n if (!item.id) {\n throw new AIRequestError(\"Mock message output requires an id after normalization\", \"MOCK_MESSAGE_ID_MISSING\");\n }\n\n yield factory.messageStarted(item.id);\n\n let chunkIndex = 0;\n for (const block of item.content) {\n if (block.type === \"text\") {\n for (const chunk of chunkText(block.text, stream)) {\n await delayForChunk(stream, chunkIndex, chunk.length);\n yield factory.messageDelta(item.id, textBlock(chunk));\n chunkIndex += 1;\n }\n } else {\n yield factory.messageDelta(item.id, block);\n }\n }\n\n yield factory.messageCompleted(item.id);\n}\n\nasync function* emitReasoning(\n factory: EventFactory,\n item: Extract<OutputItem, { type: \"reasoning\" }>,\n stream?: ResolvedMockTextStreamOptions,\n): AsyncIterable<AIStreamEvent> {\n if (!item.id) {\n throw new AIRequestError(\"Mock reasoning output requires an id after normalization\", \"MOCK_REASONING_ID_MISSING\");\n }\n\n yield factory.reasoningStarted(item.id, item.visibility);\n\n let chunkIndex = 0;\n for (const block of item.content) {\n if (block.type !== \"text\") {\n yield factory.reasoningDelta(item.id, block);\n continue;\n }\n\n for (const chunk of chunkText(block.text, stream)) {\n await delayForChunk(stream, chunkIndex, chunk.length);\n yield factory.reasoningDelta(item.id, textBlock(chunk));\n chunkIndex += 1;\n }\n }\n\n yield factory.reasoningCompleted(item.id);\n}\n\nasync function* emitToolCall(\n factory: EventFactory,\n item: ToolCallItem,\n streamArguments: boolean,\n stream?: ResolvedMockTextStreamOptions,\n): AsyncIterable<AIStreamEvent> {\n yield factory.toolCallStarted(item.id, item.name);\n\n if (streamArguments && item.argumentsText) {\n let chunkIndex = 0;\n for (const chunk of chunkText(item.argumentsText, stream)) {\n await delayForChunk(stream, chunkIndex, chunk.length);\n yield factory.toolCallDelta(item.id, { argumentsText: chunk });\n chunkIndex += 1;\n }\n }\n\n yield factory.toolCallCompleted(item.id);\n}\n\nfunction resolveStepStreamOptions(\n defaults: ResolvedMockTextStreamOptions | undefined,\n override: MockTextStreamOptions | false | undefined,\n label: string,\n): ResolvedMockTextStreamOptions | undefined {\n if (override === false) {\n return undefined;\n }\n\n return resolveMockTextStreamOptions(override, `${label} stream`, defaults);\n}\n\nfunction resolveMockTextStreamOptions(\n options: MockTextStreamOptions | undefined,\n label: string,\n defaults?: ResolvedMockTextStreamOptions,\n): ResolvedMockTextStreamOptions | undefined {\n if (options === undefined) {\n return defaults;\n }\n\n const chunkSize = options.chunkSize ?? defaults?.chunkSize ?? 1;\n const initialDelayMs = options.initialDelayMs ?? defaults?.initialDelayMs ?? 0;\n const charsPerSecond = options.charsPerSecond ?? defaults?.charsPerSecond;\n\n if (!Number.isInteger(chunkSize) || chunkSize < 1) {\n throw new AIRequestError(`${label}: chunkSize must be a positive integer`, \"MOCK_STREAM_CONFIG_INVALID\");\n }\n\n if (!Number.isFinite(initialDelayMs) || initialDelayMs < 0) {\n throw new AIRequestError(`${label}: initialDelayMs must be a non-negative number`, \"MOCK_STREAM_CONFIG_INVALID\");\n }\n\n if (charsPerSecond !== undefined && (!Number.isFinite(charsPerSecond) || charsPerSecond <= 0)) {\n throw new AIRequestError(`${label}: charsPerSecond must be a positive number`, \"MOCK_STREAM_CONFIG_INVALID\");\n }\n\n return {\n chunkSize,\n initialDelayMs,\n charsPerSecond,\n };\n}\n\nfunction chunkText(text: string, stream?: ResolvedMockTextStreamOptions): string[] {\n if (!text) {\n return [];\n }\n\n if (!stream) {\n return [text];\n }\n\n const chars = Array.from(text);\n const chunks: string[] = [];\n\n for (let index = 0; index < chars.length; index += stream.chunkSize) {\n chunks.push(chars.slice(index, index + stream.chunkSize).join(\"\"));\n }\n\n return chunks;\n}\n\nasync function delayForChunk(\n stream: ResolvedMockTextStreamOptions | undefined,\n chunkIndex: number,\n chunkLength: number,\n): Promise<void> {\n if (!stream) {\n return;\n }\n\n if (chunkIndex === 0 && stream.initialDelayMs > 0) {\n await sleep(stream.initialDelayMs);\n return;\n }\n\n if (chunkIndex > 0 && stream.charsPerSecond !== undefined) {\n await sleep((chunkLength / stream.charsPerSecond) * 1000);\n }\n}\n\nasync function sleep(ms: number): Promise<void> {\n if (ms <= 0) {\n return;\n }\n\n await new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction resolveStopReason(output: OutputItem[]): StopReason {\n return output.some((item) => item.type === \"tool_call\") ? \"tool_call\" : \"end_turn\";\n}\n\nfunction consumePendingToolCalls(pending: readonly ToolCallItem[], input: readonly InputItem[]): ToolCallItem[] {\n const fulfilledIds = new Set(\n input.filter((item): item is ToolResultItem => item.type === \"tool_result\").map((item) => item.callId),\n );\n\n return pending.filter((item) => !fulfilledIds.has(item.id)).map(cloneItem);\n}\n\nfunction assertReplayIncluded(input: readonly InputItem[], replay: readonly ReplayItem[], prefix: string): void {\n const fingerprints = input.map(fingerprintItem);\n let cursor = 0;\n\n for (const replayItem of replay) {\n const target = fingerprintItem(replayItem);\n const foundIndex = fingerprints.indexOf(target, cursor);\n if (foundIndex === -1) {\n throw new AIRequestError(\n `${prefix}: previous replay item was not carried into the next request`,\n \"MOCK_EXPECTATION_FAILED\",\n );\n }\n cursor = foundIndex + 1;\n }\n}\n\nfunction assertOrderedItems(\n input: readonly InputItem[],\n expectations: readonly MockInputExpectation[],\n prefix: string,\n): void {\n let cursor = 0;\n\n for (const expected of expectations) {\n let matched = false;\n while (cursor < input.length) {\n const item = input[cursor];\n if (item !== undefined && matchesItemExpectation(item, expected)) {\n matched = true;\n cursor += 1;\n break;\n }\n cursor += 1;\n }\n\n if (!matched) {\n throw new AIRequestError(\n `${prefix}: missing ordered input item ${describeExpectation(expected)}`,\n \"MOCK_EXPECTATION_FAILED\",\n );\n }\n }\n}\n\nfunction assertUnorderedItems(\n input: readonly InputItem[],\n expectations: readonly MockInputExpectation[],\n prefix: string,\n): void {\n for (const expected of expectations) {\n const matched = input.some((item) => matchesItemExpectation(item, expected));\n if (!matched) {\n throw new AIRequestError(\n `${prefix}: missing input item ${describeExpectation(expected)}`,\n \"MOCK_EXPECTATION_FAILED\",\n );\n }\n }\n}\n\nfunction matchesItemExpectation(item: InputItem, expected: MockInputExpectation): boolean {\n if (item.type !== expected.type) {\n return false;\n }\n\n if (expected.id !== undefined && \"id\" in item && item.id !== expected.id) {\n return false;\n }\n\n switch (item.type) {\n case \"message\":\n return (\n (expected.role === undefined || item.role === expected.role) && matchesText(item.content, expected.textIncludes)\n );\n case \"reasoning\":\n return (\n (expected.visibility === undefined || item.visibility === expected.visibility) &&\n matchesText(item.content, expected.textIncludes)\n );\n case \"tool_call\":\n return (\n (expected.name === undefined || item.name === expected.name) &&\n (expected.textIncludes === undefined || item.argumentsText.includes(expected.textIncludes))\n );\n case \"tool_result\":\n return (\n (expected.toolName === undefined || item.toolName === expected.toolName) &&\n (expected.callId === undefined || item.callId === expected.callId) &&\n (expected.outcome === undefined || item.outcome === expected.outcome) &&\n matchesText(item.content, expected.textIncludes)\n );\n case \"opaque\":\n return (\n (expected.source === undefined || item.source === expected.source) &&\n (expected.purpose === undefined || item.purpose === expected.purpose)\n );\n }\n}\n\nfunction matchesText(blocks: readonly ContentBlock[], textIncludes: string | undefined): boolean {\n if (textIncludes === undefined) {\n return true;\n }\n\n return blocks.some((block) => {\n if (block.type === \"text\") return block.text.includes(textIncludes);\n if (block.type === \"json\") return JSON.stringify(block.json).includes(textIncludes);\n return false;\n });\n}\n\nfunction fingerprintItem(item: InputItem): string {\n return JSON.stringify(item);\n}\n\nfunction describeExpectation(expectation: MockInputExpectation): string {\n const parts = [`type=${expectation.type}`];\n if (expectation.role) parts.push(`role=${expectation.role}`);\n if (expectation.name) parts.push(`name=${expectation.name}`);\n if (expectation.toolName) parts.push(`toolName=${expectation.toolName}`);\n if (expectation.callId) parts.push(`callId=${expectation.callId}`);\n if (expectation.textIncludes) parts.push(`textIncludes=${JSON.stringify(expectation.textIncludes)}`);\n return `{ ${parts.join(\", \")} }`;\n}\n\nfunction cloneItem<T>(item: T): T {\n return structuredClone(item);\n}\n"],"mappings":"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"}