@codehz/ai 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +9 -1
- package/dist/index.mjs +86 -40
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["exhaustive","mapper","mapper","mapper","mapper","mapper","mapper","mapper","mapper","clonePart"],"sources":["../src/types/kind.ts","../src/types/request.ts","../src/types/warning-codes.ts","../src/types/compress.ts","../src/runtime/errors.ts","../src/runtime/validation.ts","../src/runtime/normalize.ts","../src/runtime/client.ts","../src/canonical/content.ts","../src/canonical/replay.ts","../src/stream/merge-auxiliary.ts","../src/stream/aggregator.ts","../src/stream/collect-stream.ts","../src/canonical/stop-reason.ts","../src/canonical/items.ts","../src/stream/event-factory.ts","../src/provider/auxiliary-collector.ts","../src/provider/auxiliary.ts","../src/provider/base.ts","../src/provider/request-options.ts","../src/provider/security.ts","../src/provider/transport/open-stream.ts","../src/provider/transport/run-json-stream.ts","../src/provider/http-adapter.ts","../src/provider/usage/index.ts","../src/provider/transport/parser.ts","../src/provider/finalize-stream-turn.ts","../src/provider/opaque-sources.ts","../src/provider/opaque-replay.ts","../src/provider/json-parse.ts","../src/provider/request-mapper.ts","../src/provider/reasoning.ts","../src/adapters/responses/map-server-tools.ts","../src/adapters/responses/map-request.ts","../src/adapters/responses/infer-stop-reason.ts","../src/provider/streaming-item-session.ts","../src/adapters/responses/map-items.ts","../src/adapters/responses/adapter.ts","../src/adapters/messages/map-request.ts","../src/adapters/messages/map-stream.ts","../src/adapters/messages/adapter.ts","../src/provider/openai-tools.ts","../src/adapters/chat-completions/types.ts","../src/adapters/chat-completions/map-request.ts","../src/adapters/chat-completions/map-stream.ts","../src/adapters/chat-completions/adapter.ts","../src/adapters/ollama/map-request.ts","../src/adapters/ollama/map-stream.ts","../src/adapters/ollama/adapter.ts","../src/adapters/gemini/map-request.ts","../src/adapters/gemini/map-stream.ts","../src/adapters/gemini/adapter.ts","../src/adapters/mock/streaming.ts","../src/adapters/mock/adapter.ts","../src/adapters/mock/expectations.ts"],"sourcesContent":["/**\n * Adapter kind 标识\n *\n * KnownAdapterKind 覆盖内置 adapter;\n * AdapterKind 额外接受任意 string,便于自定义 backend 扩展(无需改库联合类型)。\n */\n\nexport const KNOWN_ADAPTER_KINDS = [\"chat-completions\", \"messages\", \"responses\", \"ollama\", \"gemini\", \"mock\"] as const;\n\nexport type KnownAdapterKind = (typeof KNOWN_ADAPTER_KINDS)[number];\n\n/** 内置 kind 自动补全 + 自定义 string 扩展 */\nexport type AdapterKind = KnownAdapterKind | (string & {});\n","/**\n * AIRequest — 统一请求模型\n *\n * 所有 adapter 都接受同一形状的 canonical request。\n */\n\nimport type { InstructionBlock } from \"./content.js\";\nimport type { InputItem } from \"./items.js\";\n\n// ── 客户端工具定义 ────────────────────────────────────────────\n\nexport type ToolDefinition = {\n name: string;\n description?: string;\n inputSchema: Record<string, unknown>;\n};\n\nexport type ToolChoice = \"auto\" | \"none\" | { type: \"tool\"; name: string };\n\n// ── 服务端工具定义 ────────────────────────────────────────────\n\nexport type WebSearchUserLocation = {\n type: \"approximate\";\n country?: string;\n city?: string;\n region?: string;\n timezone?: string;\n};\n\nexport type WebSearchServerTool = {\n type: \"web_search\";\n allowedDomains?: string[];\n blockedDomains?: string[];\n userLocation?: WebSearchUserLocation;\n searchContextSize?: \"low\" | \"medium\" | \"high\";\n};\n\nexport type CodeExecutionServerTool = {\n type: \"code_execution\";\n container?: {\n type: \"auto\";\n memoryLimit?: \"1g\" | \"4g\" | \"16g\" | \"64g\";\n fileIds?: string[];\n };\n};\n\nexport type McpServerTool = {\n type: \"mcp\";\n serverLabel: string;\n serverUrl: string;\n serverDescription?: string;\n /** 每请求由调用方提供;不得写入日志或 opaque 回放。 */\n authorization?: string;\n allowedTools?: string[];\n /** 首版仅支持 never */\n requireApproval: \"never\";\n};\n\n/** Provider 托管执行的工具声明(不进客户端 tool loop) */\nexport type ServerToolDefinition = WebSearchServerTool | CodeExecutionServerTool | McpServerTool;\n\n// ── include 控制 ──────────────────────────────────────────────\n\nexport type IncludeSettings = {\n usage?: \"off\" | \"best_effort\";\n billing?: \"off\" | \"best_effort\";\n providerMetadata?: \"off\" | \"best_effort\";\n};\n\n// ── reasoning level ───────────────────────────────────────────\n\n/** Portable reasoning / thinking effort. Mapped per-adapter to provider wire fields. */\nexport type ReasoningLevel = \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\n/** 可移植 reasoning level 枚举(单源;validation / provider 共用)。 */\nexport const REASONING_LEVELS = [\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n] as const satisfies readonly ReasoningLevel[];\n\n/** 用于校验任意字符串 membership;值域与 REASONING_LEVELS 一致。 */\nexport const REASONING_LEVEL_SET: ReadonlySet<string> = new Set(REASONING_LEVELS);\n\n// ── 统一请求 ──────────────────────────────────────────────────\n\nexport type AIRequest = {\n instructions?: string | InstructionBlock[];\n input: InputItem[];\n tools?: ToolDefinition[];\n /** Provider 托管工具(web_search / code_execution / mcp 等);与 tools 可共存 */\n serverTools?: ServerToolDefinition[];\n toolChoice?: ToolChoice;\n include?: IncludeSettings;\n metadata?: Record<string, string>;\n temperature?: number;\n maxOutputTokens?: number;\n /**\n * Portable reasoning effort. Adapters map this to provider-native fields\n * (e.g. Responses `reasoning.effort`, Chat Completions `reasoning_effort`,\n * Messages `thinking`, Ollama `think`, Gemini `thinkingConfig`).\n * Unsupported levels throw.\n */\n reasoningLevel?: ReasoningLevel;\n /** AbortSignal 用于打断请求。abort 时 fetch 调用会被取消,流迭代器抛出 AbortError。 */\n signal?: AbortSignal;\n};\n","/**\n * 标准 warning 代码 — types 层单源\n *\n * runtime.errors 与 events 均从此导出,避免手工双表漂移。\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 STREAM_ERROR: \"STREAM_ERROR\",\n /** 能力降级 */\n CAPABILITY_DOWNGRADE: \"CAPABILITY_DOWNGRADE\",\n /** 模拟流式 */\n SYNTHETIC_STREAM: \"SYNTHETIC_STREAM\",\n /** 工具调用以批量方式到达(非 token 级流式) */\n TOOL_CALL_BATCHED: \"TOOL_CALL_BATCHED\",\n /** AIMappingError 降级为 warning */\n MAPPING_ERROR: \"MAPPING_ERROR\",\n /** 入站 tool_call.argumentsText 非合法 JSON object(object-wire adapter soft-complete) */\n TOOL_CALL_ARGUMENTS_INVALID: \"TOOL_CALL_ARGUMENTS_INVALID\",\n /** 请求 metadata 不被该 adapter 支持 */\n UNSUPPORTED_METADATA: \"UNSUPPORTED_METADATA\",\n /** 重复 finish / done 信号被忽略 */\n DUPLICATE_FINISH: \"DUPLICATE_FINISH\",\n /** provider 发出未知事件类型 */\n UNKNOWN_PROVIDER_EVENT: \"UNKNOWN_PROVIDER_EVENT\",\n /** 内容被安全/策略过滤 */\n CONTENT_FILTER: \"CONTENT_FILTER\",\n /** 多 choice 仅支持 index 0,其余忽略 */\n MULTIPLE_CHOICES_IGNORED: \"MULTIPLE_CHOICES_IGNORED\",\n /** MCP 审批流不被支持 */\n MCP_APPROVAL_REQUIRED: \"MCP_APPROVAL_REQUIRED\",\n /** provider 侧 response.failed 等失败 */\n PROVIDER_FAILURE: \"PROVIDER_FAILURE\",\n} as const;\n\nexport type WarningCodeName = (typeof WarningCode)[keyof typeof WarningCode];\n\n/** 与 WarningCodeName 同义;保留以兼容既有 KnownWarningCode 命名 */\nexport type KnownWarningCode = WarningCodeName;\n\n/** 已知码 + 开放字符串扩展 */\nexport type WarningCodeValue = KnownWarningCode | (string & {});\n\n/** 结构化 warning(AIResponse / response.completed / factory 共用) */\nexport type StreamWarning = {\n message: string;\n code?: WarningCodeValue;\n};\n\n/**\n * 去重键:以 message 为主(与旧 string[] 行为一致)。\n * 同一 message 若先无 code 后有 code,保留先到的那条。\n */\nexport function streamWarningKey(warning: StreamWarning): string {\n return warning.message;\n}\n","/**\n * 上下文压缩能力接口\n *\n * 仅由原生支持压缩的 adapter 实现;不扩展 BackendAdapter / AIClient。\n * 调用方通过 supportsContextCompress 做能力探测。\n */\n\nimport type { InstructionBlock } from \"./content.js\";\nimport type { InputItem, ReplayItem } from \"./items.js\";\nimport type { IncludeSettings } from \"./request.js\";\nimport type { AuxiliaryInfo, Usage } from \"./response.js\";\nimport type { BackendAdapter } from \"./adapter.js\";\n\n/** 显式上下文压缩请求(独立于 stream) */\nexport type CompressRequest = {\n model: string;\n input: InputItem[];\n instructions?: string | InstructionBlock[];\n include?: IncludeSettings;\n /** AbortSignal 用于打断压缩请求。 */\n signal?: AbortSignal;\n};\n\n/** 压缩结果:调用方用 replay 替换旧 transcript(非 append 全文) */\nexport type CompressResult = {\n replay: ReplayItem[];\n usage?: Usage;\n auxiliary?: AuxiliaryInfo;\n rawResponseId?: string;\n};\n\n/** Adapter 可选能力:原生上下文压缩 */\nexport interface ContextCompressCapable {\n compress(request: CompressRequest): Promise<CompressResult>;\n}\n\n/** 探测 adapter 是否实现 compress(不依赖 kind 硬编码)。 */\nexport function supportsContextCompress(adapter: BackendAdapter): adapter is BackendAdapter & ContextCompressCapable {\n return typeof (adapter as Partial<ContextCompressCapable>).compress === \"function\";\n}\n","/**\n * 公共错误模型\n *\n * 把失败、降级、断流三类情况明确区分:\n * - 致命错误(AIRequestError / AIProviderError / AIStreamError)→ 同步抛错或迭代器抛错\n * - AIMappingError → AdapterBase 捕获后降级为 response.warning + 空 output 的 response.completed(无 stopReason)\n * - AIRecoverableError → AdapterBase 捕获后 soft-complete:response.warning + response.completed(stopReason 默认 \"error\")\n * - 非致命差异 → warning 通道(WarningCode)\n * - 流中断 → 不伪造 response.completed\n */\n\nimport type { StopReason } from \"../types/response.js\";\n\n// ── 错误类型 ──────────────────────────────────────────────────\n\n/**\n * 已知错误码。保留补全;未知码用 `string & {}` 扩展,避免 `| string` 吞掉字面量提示。\n * ValidationIssue.code 可更细,不强制全部列入此处;以作为 AIError.code 传入的码为主。\n */\nexport type KnownErrorCode =\n | \"INPUT_EMPTY\"\n | \"TEMPERATURE_OUT_OF_RANGE\"\n | \"MAX_OUTPUT_TOKENS_INVALID\"\n | \"TOOL_CHOICE_NO_TOOLS\"\n | \"TOOL_CHOICE_UNKNOWN_TOOL\"\n | \"TOOL_CALL_ARGUMENTS_INVALID\"\n | \"PROVIDER_ERROR\"\n | \"AUTH_ERROR\"\n | \"STREAM_ERROR\"\n | \"STREAM_PROTOCOL_ERROR\"\n | \"MAPPING_ERROR\"\n | \"STREAM_INCOMPLETE\"\n | \"LOOKUP_FAILED\"\n | \"LOOKUP_TIMEOUT\"\n | \"INVALID_OPAQUE_REPLAY\"\n | \"UNSUPPORTED_CONTENT_BLOCK\"\n | \"UNSUPPORTED_SERVER_TOOL\"\n | \"UNSUPPORTED_REASONING_LEVEL\"\n | \"UNSUPPORTED_COMPRESS\"\n | \"MOCK_CONCURRENT_STREAM\"\n | \"MOCK_COMPRESS_NOT_CONFIGURED\"\n | \"MOCK_EXPECTATION_FAILED\"\n | \"MOCK_STREAM_CONFIG_INVALID\"\n | \"MOCK_OPAQUE_OUTPUT\"\n | \"MOCK_MESSAGE_ID_MISSING\"\n | \"MOCK_REASONING_ID_MISSING\";\n\nexport type ErrorCode = KnownErrorCode | (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/**\n * Provider 调用失败 — HTTP 非 2xx、网络错误。\n * AdapterBase **rethrow**(致命),不会转为 warning。\n */\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/**\n * 流协议/传输损坏 — SSE 解析失败、chunk 格式异常、body 不可读等。\n * 致命:同步或在异步迭代中抛出,不伪造 response.completed。\n */\nexport class AIStreamError extends AIError {\n constructor(message: string, code: ErrorCode) {\n super(message, code, \"AIStreamError\");\n }\n}\n\n/**\n * Canonical 映射失败 — 无法将 provider 响应映射到 canonical 类型。\n *\n * AdapterBase 捕获后降级为:\n * - `response.warning`(code = MAPPING_ERROR)\n * - 空 output 的 `response.completed`\n *\n * 生产 adapter 原则上不应抛出;此路径是协议级降级通道(测试 / 防御性边界)。\n */\nexport class AIMappingError extends AIError {\n constructor(message: string, code: ErrorCode) {\n super(message, code, \"AIMappingError\");\n }\n}\n\n/**\n * 可恢复的回合失败 — buildRequest / runStream 中可安全 soft-complete 的语义错误。\n *\n * AdapterBase 在 `response.started` 之后捕获后降级为:\n * - `response.warning`(code = 错误 code,通常对齐 WarningCode)\n * - 空 replay 的 `response.completed`(`stopReason` 默认 `\"error\"`)\n *\n * 与 AIMappingError 的区别:recoverable 携带显式 stopReason,表示调用方应清理\n * 中毒历史后重试;mapping 是协议级降级通道,通常不带 stopReason。\n */\nexport class AIRecoverableError extends AIError {\n constructor(\n message: string,\n code: ErrorCode,\n public readonly stopReason: StopReason = \"error\",\n ) {\n super(message, code, \"AIRecoverableError\");\n }\n}\n\n// ── Warning 辅助(单源在 types/warning-codes)────────────────\n\nexport { WarningCode, streamWarningKey } from \"../types/warning-codes.js\";\nexport type { WarningCodeName, KnownWarningCode, WarningCodeValue, StreamWarning } from \"../types/warning-codes.js\";\n","/**\n * 请求校验\n *\n * 在请求进入 adapter 前对参数合法性做基础检查。\n * 校验失败时抛 AIRequestError。\n */\n\nimport type { AIRequest } from \"../types/index.js\";\nimport { REASONING_LEVEL_SET } from \"../types/request.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 \"server_tool_call\":\n if (typeof item.id !== \"string\" || item.id.length === 0) {\n pushIssue(issues, `${field}.id`, \"SERVER_TOOL_CALL_INVALID\", `${field}.id must be a non-empty string`);\n }\n if (typeof item.tool !== \"string\" || item.tool.length === 0) {\n pushIssue(issues, `${field}.tool`, \"SERVER_TOOL_CALL_INVALID\", `${field}.tool must be a non-empty string`);\n }\n if (item.argumentsText !== undefined && typeof item.argumentsText !== \"string\") {\n pushIssue(\n issues,\n `${field}.argumentsText`,\n \"SERVER_TOOL_CALL_INVALID\",\n `${field}.argumentsText must be a string`,\n );\n }\n return;\n case \"server_tool_result\":\n if (typeof item.callId !== \"string\" || item.callId.length === 0) {\n pushIssue(\n issues,\n `${field}.callId`,\n \"SERVER_TOOL_RESULT_INVALID\",\n `${field}.callId must be a non-empty string`,\n );\n }\n if (typeof item.tool !== \"string\" || item.tool.length === 0) {\n pushIssue(issues, `${field}.tool`, \"SERVER_TOOL_RESULT_INVALID\", `${field}.tool must be a non-empty string`);\n }\n if (item.outcome !== \"success\" && item.outcome !== \"error\") {\n pushIssue(\n issues,\n `${field}.outcome`,\n \"SERVER_TOOL_RESULT_INVALID\",\n `${field}.outcome must be success or error`,\n );\n }\n validateContentArray(item.content, `${field}.content`, issues, \"SERVER_TOOL_RESULT_INVALID\");\n return;\n case \"server_tool_discovery\":\n if (typeof item.id !== \"string\" || item.id.length === 0) {\n pushIssue(issues, `${field}.id`, \"SERVER_TOOL_DISCOVERY_INVALID\", `${field}.id must be a non-empty string`);\n }\n if (item.tool !== \"mcp\") {\n pushIssue(issues, `${field}.tool`, \"SERVER_TOOL_DISCOVERY_INVALID\", `${field}.tool must be \"mcp\"`);\n }\n if (typeof item.serverLabel !== \"string\" || item.serverLabel.length === 0) {\n pushIssue(\n issues,\n `${field}.serverLabel`,\n \"SERVER_TOOL_DISCOVERY_INVALID\",\n `${field}.serverLabel must be a non-empty string`,\n );\n }\n if (!Array.isArray(item.tools)) {\n pushIssue(issues, `${field}.tools`, \"SERVER_TOOL_DISCOVERY_INVALID\", `${field}.tools must be an array`);\n }\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 // 仅校验 shape;JSON object 语义由 adapter 映射(parseToolArguments)负责\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 }\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\nconst SEARCH_CONTEXT_SIZES = new Set([\"low\", \"medium\", \"high\"]);\nconst CODE_MEMORY_LIMITS = new Set([\"1g\", \"4g\", \"16g\", \"64g\"]);\n\nfunction validateStringArrayField(value: unknown, field: string, code: string, issues: ValidationIssue[]): void {\n if (!Array.isArray(value)) {\n pushIssue(issues, field, code, `${field} must be a string array`);\n return;\n }\n for (let i = 0; i < value.length; i++) {\n if (typeof value[i] !== \"string\" || value[i].length === 0) {\n pushIssue(issues, `${field}[${i}]`, code, `${field}[${i}] must be a non-empty string`);\n }\n }\n}\n\nfunction validateServerTools(serverTools: unknown, issues: ValidationIssue[]): void {\n if (serverTools === undefined) return;\n if (!Array.isArray(serverTools)) {\n pushIssue(issues, \"serverTools\", \"SERVER_TOOLS_INVALID\", \"serverTools must be an array\");\n return;\n }\n\n for (let i = 0; i < serverTools.length; i++) {\n const tool = serverTools[i];\n const field = `serverTools[${i}]`;\n if (!isRecord(tool) || typeof tool.type !== \"string\") {\n pushIssue(issues, field, \"SERVER_TOOL_INVALID\", `${field} must be a valid ServerToolDefinition`);\n continue;\n }\n\n switch (tool.type) {\n case \"web_search\": {\n if (tool.allowedDomains !== undefined && tool.blockedDomains !== undefined) {\n pushIssue(\n issues,\n field,\n \"SERVER_TOOL_WEB_SEARCH_DOMAINS_CONFLICT\",\n `${field} cannot set both allowedDomains and blockedDomains`,\n );\n }\n if (tool.allowedDomains !== undefined) {\n validateStringArrayField(tool.allowedDomains, `${field}.allowedDomains`, \"SERVER_TOOL_INVALID\", issues);\n }\n if (tool.blockedDomains !== undefined) {\n validateStringArrayField(tool.blockedDomains, `${field}.blockedDomains`, \"SERVER_TOOL_INVALID\", issues);\n }\n if (tool.searchContextSize !== undefined) {\n if (typeof tool.searchContextSize !== \"string\" || !SEARCH_CONTEXT_SIZES.has(tool.searchContextSize)) {\n pushIssue(\n issues,\n `${field}.searchContextSize`,\n \"SERVER_TOOL_INVALID\",\n `${field}.searchContextSize must be low, medium, or high`,\n );\n }\n }\n if (tool.userLocation !== undefined) {\n if (!isRecord(tool.userLocation) || tool.userLocation.type !== \"approximate\") {\n pushIssue(\n issues,\n `${field}.userLocation`,\n \"SERVER_TOOL_INVALID\",\n `${field}.userLocation must be { type: \"approximate\", ... }`,\n );\n } else {\n for (const key of [\"country\", \"city\", \"region\", \"timezone\"] as const) {\n const value = tool.userLocation[key];\n if (value !== undefined && typeof value !== \"string\") {\n pushIssue(\n issues,\n `${field}.userLocation.${key}`,\n \"SERVER_TOOL_INVALID\",\n `${field}.userLocation.${key} must be a string`,\n );\n }\n }\n }\n }\n break;\n }\n case \"code_execution\": {\n if (tool.container !== undefined) {\n if (!isRecord(tool.container) || tool.container.type !== \"auto\") {\n pushIssue(\n issues,\n `${field}.container`,\n \"SERVER_TOOL_INVALID\",\n `${field}.container must be { type: \"auto\", ... }`,\n );\n } else {\n if (tool.container.memoryLimit !== undefined) {\n if (\n typeof tool.container.memoryLimit !== \"string\" ||\n !CODE_MEMORY_LIMITS.has(tool.container.memoryLimit)\n ) {\n pushIssue(\n issues,\n `${field}.container.memoryLimit`,\n \"SERVER_TOOL_INVALID\",\n `${field}.container.memoryLimit must be 1g, 4g, 16g, or 64g`,\n );\n }\n }\n if (tool.container.fileIds !== undefined) {\n validateStringArrayField(\n tool.container.fileIds,\n `${field}.container.fileIds`,\n \"SERVER_TOOL_INVALID\",\n issues,\n );\n }\n }\n }\n break;\n }\n case \"mcp\": {\n if (typeof tool.serverLabel !== \"string\" || tool.serverLabel.length === 0) {\n pushIssue(\n issues,\n `${field}.serverLabel`,\n \"SERVER_TOOL_INVALID\",\n `${field}.serverLabel must be a non-empty string`,\n );\n }\n if (typeof tool.serverUrl !== \"string\" || tool.serverUrl.length === 0) {\n pushIssue(\n issues,\n `${field}.serverUrl`,\n \"SERVER_TOOL_INVALID\",\n `${field}.serverUrl must be a non-empty string`,\n );\n }\n if (tool.serverDescription !== undefined && typeof tool.serverDescription !== \"string\") {\n pushIssue(\n issues,\n `${field}.serverDescription`,\n \"SERVER_TOOL_INVALID\",\n `${field}.serverDescription must be a string`,\n );\n }\n if (tool.authorization !== undefined && typeof tool.authorization !== \"string\") {\n pushIssue(issues, `${field}.authorization`, \"SERVER_TOOL_INVALID\", `${field}.authorization must be a string`);\n }\n if (tool.allowedTools !== undefined) {\n validateStringArrayField(tool.allowedTools, `${field}.allowedTools`, \"SERVER_TOOL_INVALID\", issues);\n }\n if (tool.requireApproval !== \"never\") {\n pushIssue(\n issues,\n `${field}.requireApproval`,\n \"SERVER_TOOL_MCP_APPROVAL_UNSUPPORTED\",\n `${field}.requireApproval must be \"never\" in this version`,\n );\n }\n break;\n }\n default:\n pushIssue(\n issues,\n `${field}.type`,\n \"SERVER_TOOL_TYPE_UNSUPPORTED\",\n `${field}.type \"${tool.type}\" is not supported`,\n );\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 // reasoningLevel 枚举\n if (request.reasoningLevel !== undefined) {\n if (typeof request.reasoningLevel !== \"string\" || !REASONING_LEVEL_SET.has(request.reasoningLevel)) {\n pushIssue(\n issues,\n \"reasoningLevel\",\n \"REASONING_LEVEL_INVALID\",\n \"reasoningLevel must be one of: none, minimal, low, medium, high, xhigh, max\",\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 validateServerTools(request.serverTools, 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 // include 已在合并前校验;assertValidRequest 仍覆盖其余字段(含合并后的 include 形状)\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 * Content block 构造与文本提取\n */\n\nimport type { ContentBlock } from \"../types/index.js\";\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/**\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/**\n * 合并相邻 text content blocks(直接拼接、不插入分隔符)。\n * 非 text block 保留边界。供 aggregator 与 StreamingItemSession 共用。\n */\nexport function 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 // text 合并路径需要可变副本\n previous.text += block.text;\n } else if (block.type === \"text\") {\n result.push({ type: \"text\", text: block.text });\n } else {\n // 非 text 按不可变约定直接引用,避免无意义 spread\n result.push(block);\n }\n }\n return result;\n}\n","/**\n * Replay 与输出文本提取\n */\n\nimport type { ContentBlock, InputItem, MessageItem, OutputItem, ReplayItem } from \"../types/index.js\";\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 case \"server_tool_call\":\n case \"server_tool_result\":\n case \"server_tool_discovery\":\n return item as InputItem;\n case \"opaque\":\n return item;\n }\n });\n}\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","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 ServerToolCallItem,\n ServerToolResultItem,\n ServerToolDiscoveryItem,\n OutputItem,\n Usage,\n BillingInfo,\n AuxiliaryInfo,\n BackendTrace,\n StopReason,\n ContentBlock,\n Citation,\n StreamWarning,\n} from \"../types/index.js\";\nimport { streamWarningKey } from \"../types/warning-codes.js\";\nimport { coalesceContentBlocks } from \"../canonical/content.js\";\nimport { extractText } from \"../canonical/replay.js\";\nimport { AIStreamError } from \"../runtime/errors.js\";\nimport { mergeAuxiliary } from \"./merge-auxiliary.js\";\n\n// coalesceContentBlocks 自 canonical;见 finalizeMessage / finalizeReasoning\n\n// ── Active item types ─────────────────────────────────────────\n\ntype ActiveMessage = {\n type: \"message\";\n id: string;\n role: \"assistant\";\n content: ContentBlock[];\n citations?: Citation[];\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 argumentChunks: string[];\n};\n\ntype ActiveServerToolCall = {\n type: \"server_tool_call\";\n id: string;\n tool: string;\n name?: string;\n argumentChunks: string[];\n serverLabel?: string;\n status?: \"in_progress\" | \"completed\" | \"failed\";\n providerPayload?: unknown;\n};\n\ntype ActiveItem = ActiveMessage | ActiveReasoning | ActiveToolCall | ActiveServerToolCall;\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: StreamWarning[];\n warningSet: Set<string>;\n /** opaqueOutput 等非 item-lifecycle 输出,追加在 ordered 之后 */\n output: OutputItem[];\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 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 finalizeMessage(active: ActiveMessage): MessageItem {\n return {\n type: \"message\",\n id: active.id,\n role: active.role,\n content: coalesceContentBlocks(active.content),\n ...(active.citations && active.citations.length > 0 ? { citations: active.citations } : {}),\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.argumentChunks.join(\"\"),\n };\n}\n\nfunction finalizeServerToolCall(active: ActiveServerToolCall): ServerToolCallItem {\n const argumentsText = active.argumentChunks.join(\"\");\n return {\n type: \"server_tool_call\",\n id: active.id,\n tool: active.tool,\n ...(active.name !== undefined ? { name: active.name } : {}),\n ...(argumentsText ? { argumentsText } : {}),\n ...(active.status ? { status: active.status } : {}),\n ...(active.serverLabel !== undefined ? { serverLabel: active.serverLabel } : {}),\n ...(active.providerPayload !== undefined ? { providerPayload: active.providerPayload } : {}),\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, [{ message: event.message, ...(event.code !== undefined ? { code: event.code } : {}) }]);\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 if (event.citations && event.citations.length > 0) {\n active.citations = event.citations;\n }\n state.activeItems.delete(event.itemId);\n const item = finalizeMessage(active);\n state.completedItems.set(event.itemId, 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 argumentChunks: [],\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.argumentChunks.push(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}\n\nfunction handleServerToolStarted(state: AggregatorState, event: AIStreamEvent & { type: \"server_tool.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: \"server_tool_call\",\n id,\n tool: event.item.tool,\n name: event.item.name,\n argumentChunks: [],\n serverLabel: event.item.serverLabel,\n status: \"in_progress\",\n });\n state.itemOrder.push(id);\n}\n\nfunction handleServerToolDelta(state: AggregatorState, event: AIStreamEvent & { type: \"server_tool.delta\" }): void {\n const active = getActiveItem(state, event.itemId, \"server_tool_call\") as ActiveServerToolCall;\n if (event.delta.argumentsText) {\n active.argumentChunks.push(event.delta.argumentsText);\n }\n}\n\nfunction handleServerToolCompleted(\n state: AggregatorState,\n event: AIStreamEvent & { type: \"server_tool.completed\" },\n): void {\n const active = getActiveItem(state, event.itemId, \"server_tool_call\") as ActiveServerToolCall;\n active.status = event.status ?? \"completed\";\n if (event.providerPayload !== undefined) {\n active.providerPayload = event.providerPayload;\n }\n state.activeItems.delete(event.itemId);\n const item = finalizeServerToolCall(active);\n state.completedItems.set(event.itemId, item);\n}\n\nfunction handleServerToolResultCompleted(\n state: AggregatorState,\n event: AIStreamEvent & { type: \"server_tool_result.completed\" },\n): void {\n const item: ServerToolResultItem = { ...event.item };\n const orderId = item.id ?? `server_tool_result:${item.callId}:${state.itemOrder.length}`;\n if (state.completedItems.has(orderId) || state.activeItems.has(orderId)) {\n throw streamProtocolError(`Item with id ${orderId} is already present`);\n }\n state.itemOrder.push(orderId);\n state.completedItems.set(orderId, item);\n}\n\nfunction handleServerToolDiscoveryCompleted(\n state: AggregatorState,\n event: AIStreamEvent & { type: \"server_tool_discovery.completed\" },\n): void {\n const item: ServerToolDiscoveryItem = { ...event.item };\n if (state.completedItems.has(item.id) || state.activeItems.has(item.id)) {\n throw streamProtocolError(`Item with id ${item.id} is already present`);\n }\n state.itemOrder.push(item.id);\n state.completedItems.set(item.id, 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 // 投影字段在 finalize 时一次派生,避免与 output 双写漂移\n const output = [...orderedOutput, ...state.output];\n const toolCalls = output.filter((item): item is ToolCallItem => item.type === \"tool_call\");\n const serverToolCalls = output.filter((item): item is ServerToolCallItem => item.type === \"server_tool_call\");\n const serverToolResults = output.filter((item): item is ServerToolResultItem => item.type === \"server_tool_result\");\n\n return {\n id: state.responseId,\n output,\n replay: state.replayFromAdapter ?? [],\n text: extractText(output),\n toolCalls,\n serverToolCalls,\n serverToolResults,\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 \"server_tool.started\":\n handleServerToolStarted(state, event);\n break;\n case \"server_tool.delta\":\n handleServerToolDelta(state, event);\n break;\n case \"server_tool.completed\":\n handleServerToolCompleted(state, event);\n break;\n case \"server_tool_result.completed\":\n handleServerToolResultCompleted(state, event);\n break;\n case \"server_tool_discovery.completed\":\n handleServerToolDiscoveryCompleted(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 StreamWarning[]): void {\n for (const warning of warnings) {\n const key = streamWarningKey(warning);\n if (!state.warningSet.has(key)) {\n state.warningSet.add(key);\n state.warnings.push(warning);\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 * Stop reason / reasoning visibility 映射\n */\n\nimport type { ReasoningItem, StopReason } from \"../types/index.js\";\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 // Gemini GenerateContent finishReason\n STOP: \"end_turn\",\n MAX_TOKENS: \"max_output_tokens\",\n SAFETY: \"content_filter\",\n RECITATION: \"content_filter\",\n BLOCKLIST: \"content_filter\",\n PROHIBITED_CONTENT: \"content_filter\",\n SPII: \"content_filter\",\n MALFORMED_FUNCTION_CALL: \"error\",\n UNEXPECTED_TOOL_CALL: \"error\",\n TOO_MANY_TOOL_CALLS: \"error\",\n MISSING_THOUGHT_SIGNATURE: \"error\",\n // Generic\n error: \"error\",\n};\n\nexport function mapStopReason(providerReason: string): StopReason {\n return STOP_REASON_MAP[providerReason] ?? \"unknown\";\n}\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 * Canonical item 构造 helper\n */\n\nimport type {\n ContentBlock,\n MessageItem,\n OpaqueItem,\n ReasoningItem,\n ServerToolCallItem,\n ServerToolDiscoveryItem,\n ServerToolResultItem,\n ToolCallItem,\n ToolResultItem,\n} from \"../types/index.js\";\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\nexport function serverToolCallItem(\n id: string,\n tool: ServerToolCallItem[\"tool\"],\n overrides?: Partial<Omit<ServerToolCallItem, \"type\" | \"id\" | \"tool\">>,\n): ServerToolCallItem {\n return {\n type: \"server_tool_call\",\n id,\n tool,\n ...overrides,\n };\n}\n\nexport function serverToolResultItem(\n callId: string,\n tool: string,\n outcome: ServerToolResultItem[\"outcome\"],\n content: ContentBlock[],\n overrides?: Partial<Omit<ServerToolResultItem, \"type\" | \"callId\" | \"tool\" | \"outcome\" | \"content\">>,\n): ServerToolResultItem {\n return {\n type: \"server_tool_result\",\n callId,\n tool,\n outcome,\n content,\n ...overrides,\n };\n}\n\nexport function serverToolDiscoveryItem(\n id: string,\n serverLabel: string,\n tools: ServerToolDiscoveryItem[\"tools\"],\n overrides?: Partial<Omit<ServerToolDiscoveryItem, \"type\" | \"id\" | \"tool\" | \"serverLabel\" | \"tools\">>,\n): ServerToolDiscoveryItem {\n return {\n type: \"server_tool_discovery\",\n id,\n tool: \"mcp\",\n serverLabel,\n tools,\n ...overrides,\n };\n}\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 ServerToolStartedEvent,\n ServerToolDeltaEvent,\n ServerToolCompletedEvent,\n ServerToolResultCompletedEvent,\n ServerToolDiscoveryCompletedEvent,\n ContentBlock,\n Citation,\n Usage,\n BillingInfo,\n AuxiliaryInfo,\n ReplayItem,\n StopReason,\n BackendTrace,\n OpaqueItem,\n ReasoningItem,\n AdapterKind,\n ServerToolResultItem,\n ServerToolDiscoveryItem,\n WarningCodeValue,\n StreamWarning,\n} from \"../types/index.js\";\n\nexport type EventFactoryBackend = {\n kind: AdapterKind;\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: StreamWarning[] = [];\n // backend 在 factory 生命周期内不变,复用只读引用\n const backend = state.backend;\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,\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?: WarningCodeValue): ResponseWarningEvent {\n warnings.push({ message, ...(code !== undefined ? { code } : {}) });\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?: StreamWarning[];\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, options?: { citations?: Citation[] }): MessageCompletedEvent {\n return {\n ...base(),\n type: \"message.completed\",\n itemId,\n ...(options?.citations ? { citations: options.citations } : {}),\n };\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 // ── 服务端工具流事件 ────────────────────────────────────\n\n serverToolStarted(\n id: string,\n tool: string,\n options?: { name?: string; serverLabel?: string },\n ): ServerToolStartedEvent {\n return {\n ...base(),\n type: \"server_tool.started\",\n item: {\n id,\n tool,\n ...(options?.name !== undefined ? { name: options.name } : {}),\n ...(options?.serverLabel !== undefined ? { serverLabel: options.serverLabel } : {}),\n },\n };\n },\n\n serverToolDelta(itemId: string, delta: { argumentsText?: string }): ServerToolDeltaEvent {\n return { ...base(), type: \"server_tool.delta\", itemId, delta };\n },\n\n serverToolCompleted(\n itemId: string,\n options?: { status?: \"completed\" | \"failed\"; providerPayload?: unknown },\n ): ServerToolCompletedEvent {\n return {\n ...base(),\n type: \"server_tool.completed\",\n itemId,\n ...(options?.status ? { status: options.status } : {}),\n ...(options?.providerPayload !== undefined ? { providerPayload: options.providerPayload } : {}),\n };\n },\n\n serverToolResultCompleted(item: ServerToolResultItem): ServerToolResultCompletedEvent {\n return { ...base(), type: \"server_tool_result.completed\", item };\n },\n\n serverToolDiscoveryCompleted(item: ServerToolDiscoveryItem): ServerToolDiscoveryCompletedEvent {\n return { ...base(), type: \"server_tool_discovery.completed\", item };\n },\n\n /** 返回当前已发出的 sequence 计数(用于断言) */\n get sequence(): number {\n return seq;\n },\n\n /** 返回当前已记录的 warning 副本。 */\n get warnings(): StreamWarning[] {\n return warnings.map((w) => ({ ...w }));\n },\n };\n}\n\nexport type EventFactory = ReturnType<typeof createEventFactory>;\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, StreamWarning } 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: StreamWarning[] = [];\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, code?: StreamWarning[\"code\"]): this {\n this.warnings.push({ message, ...(code !== undefined ? { code } : {}) });\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?: StreamWarning[] } {\n const result: {\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: AuxiliaryInfo;\n warnings?: StreamWarning[];\n } = {};\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 \"../runtime/errors.js\";\nimport type { EventFactory } from \"../stream/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\n/**\n * 实验性:由调用方接线;库内 HTTP adapter **未**默认启用。\n * 用于从 usage/auxiliary 派生 billing 的后处理钩子。\n */\nexport type BillingPostprocessHook = (context: {\n request: NormalizedRequest;\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: AuxiliaryInfo;\n}) => MaybePromise<Partial<BillingInfo> | undefined>;\n\n/**\n * finalize 选项。`lookup` / `postprocessBilling` 为 experimental unused 扩展点:\n * 生产 adapter 当前不传入;仅测试或宿主自定义 wiring 使用。\n */\nexport type AuxiliaryFinalizeOptions = {\n /** experimental:异步补查 usage/billing */\n lookup?: () => Promise<LookupResult>;\n lookupTimeoutMs?: number;\n /** experimental:在尚无 billing 时派生估算账单 */\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?: import(\"../types/index.js\").StreamWarning[];\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 * 大块 E(事件权威):\n * - 完整 AIResponse(output/text/toolCalls…)仅由 collectStream/aggregator 构建\n * - StreamResult / response.completed 只携带 replay 与完成元数据\n */\n\nimport type {\n NormalizedRequest,\n BackendAdapter,\n AIStreamEvent,\n AuxiliaryInfo,\n ReplayItem,\n StopReason,\n Usage,\n BillingInfo,\n BackendTrace,\n AdapterKind,\n StreamWarning,\n} from \"../types/index.js\";\nimport { streamWarningKey } from \"../types/warning-codes.js\";\nimport { createEventFactory } from \"../stream/event-factory.js\";\nimport {\n AIMappingError,\n AIProviderError,\n AIRecoverableError,\n AIRequestError,\n AIStreamError,\n WarningCode,\n} from \"../runtime/errors.js\";\nimport type { EventFactory } from \"../stream/event-factory.js\";\nimport { AdapterAuxiliaryState } from \"./auxiliary.js\";\nimport { mergeAuxiliary } from \"../stream/merge-auxiliary.js\";\n\n// ── Adapter 解析中间结果 ──────────────────────────────────────\n\nexport type ProviderResponse = unknown;\n\n/**\n * adapter 完成一轮流处理后交给 emitStreamCompleted 的元数据。\n * 不含 output/text/toolCalls — 那些由事件聚合得到。\n */\nexport type StreamResult = {\n replay: ReplayItem[];\n stopReason?: StopReason;\n usage?: Usage;\n billing?: BillingInfo;\n providerMetadata?: Record<string, unknown>;\n auxiliary?: Partial<AuxiliaryInfo>;\n warnings?: StreamWarning[];\n metadataSources?: string[];\n rawResponseId?: string;\n};\n\n/** response.completed 所需的完成元数据(无 output 账本) */\nexport type StreamCompletedPayload = {\n replay: ReplayItem[];\n stopReason?: StopReason;\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: AuxiliaryInfo;\n warnings?: StreamWarning[] | undefined;\n trace: Partial<BackendTrace>;\n};\n\n// ── 抽象基类 ──────────────────────────────────────────────────\n\nexport abstract class AdapterBase implements BackendAdapter {\n abstract readonly kind: AdapterKind;\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 AIRecoverableError) {\n yield factory.responseWarning(err.message, err.code);\n const payload = this.buildCompletedPayload(\n request,\n { replay: [], stopReason: err.stopReason },\n factory,\n );\n yield factory.responseCompleted(payload);\n return;\n }\n\n if (err instanceof AIMappingError) {\n yield factory.responseWarning(err.message, WarningCode.MAPPING_ERROR);\n const payload = this.buildCompletedPayload(request, { replay: [] }, factory);\n yield factory.responseCompleted(payload);\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 * - 通过 StreamingItemSession / factory 发射 item 事件\n * - 组装 StreamResult(replay + 元数据)\n * - 发射 response.completed(通常经 emitStreamCompleted)\n */\n protected abstract runStream(\n providerRequest: ProviderResponse,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent>;\n\n // ── 共享构造方法 ──────────────────────────────────────────\n\n /**\n * 从 StreamResult 构建 response.completed 载荷(无 output/text/toolCalls)。\n */\n protected buildCompletedPayload(\n request: NormalizedRequest,\n result: StreamResult,\n factory: EventFactory,\n ): StreamCompletedPayload {\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 replay: result.replay,\n stopReason: result.stopReason,\n usage: result.usage,\n billing: result.billing,\n auxiliary,\n warnings,\n trace: {\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 在调用前组装 replay / stopReason 等业务字段(不含 output 账本)。\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 payload = this.buildCompletedPayload(\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(payload);\n }\n\n protected createAuxiliaryState(request: NormalizedRequest): AdapterAuxiliaryState {\n return new AdapterAuxiliaryState(request);\n }\n}\n\nfunction mergeWarnings(...groups: Array<StreamWarning[] | undefined>): StreamWarning[] | undefined {\n const seen = new Set<string>();\n const merged: StreamWarning[] = [];\n\n for (const group of groups) {\n if (!group) continue;\n for (const warning of group) {\n const key = streamWarningKey(warning);\n if (seen.has(key)) continue;\n seen.add(key);\n merged.push(warning);\n }\n }\n\n return merged.length > 0 ? merged : undefined;\n}\n","/**\n * Provider 请求 headers / body 扩展合并\n *\n * 供真实后端 adapter 构造选项 `headers` / `extraBody` 使用:\n * - headers:内置鉴权头为基,自定义后写覆盖\n * - extraBody:已构建 body 为基,额外字段浅层 spread,同名顶层键可覆盖\n */\n\n/** 合并内置 headers 与自定义 headers;自定义后写覆盖同名键。 */\nexport function mergeProviderHeaders(\n base: Record<string, string>,\n custom?: Record<string, string>,\n): Record<string, string> {\n if (!custom) return base;\n return { ...base, ...custom };\n}\n\n/**\n * 将构造期 extraBody 浅层合并到已构建的 provider body。\n * 无 extraBody 时原样返回;有则允许覆盖同名顶层键。\n */\nexport function applyExtraBody<T extends object>(body: T, extraBody?: Record<string, unknown>): T {\n if (!extraBody) return body;\n return { ...body, ...extraBody };\n}\n","/**\n * Adapter 边界安全辅助\n *\n * - opaque replay 入站 envelope(大小 / 深度)\n * - provider HTTP 错误 body 出站脱敏\n */\n\nimport { AIProviderError, AIRequestError } from \"../runtime/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 HTTP 流公共脚手架\n *\n * 收敛 adapter 间重复的:\n * - JSON POST + 错误映射\n * - ReadableStream reader 生命周期\n * - IncrementalStreamParser feed/flush + malformed warning\n * - 不完整尾帧 warning\n */\n\nimport { AIProviderError, AIStreamError } from \"../../runtime/errors.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { AIStreamEvent, FetchFn } from \"../../types/index.js\";\nimport { emitMalformedStreamWarning } from \"../auxiliary.js\";\nimport { providerHttpError } from \"../security.js\";\nimport type { IncrementalStreamParser } from \"./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 opened = await postProviderJsonResponse(options);\n const bodyStream = opened.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: opened.headers,\n };\n}\n\nexport type PostProviderJsonOptions = {\n fetchFn: FetchFn;\n url: string;\n headers: Record<string, string>;\n body: unknown;\n signal?: AbortSignal;\n};\n\nexport type PostedProviderJsonResponse = {\n response: Response;\n headers: Headers;\n};\n\n/**\n * POST JSON 并返回已校验 2xx 的 Response(非流式调用可用 response.json())。\n * 网络错误 / HTTP 非 2xx 映射与 openProviderJsonStream 一致。\n */\nexport async function postProviderJsonResponse(options: PostProviderJsonOptions): Promise<PostedProviderJsonResponse> {\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 return { response, headers: response.headers };\n}\n\n/**\n * POST JSON 并解析 JSON body;解析失败抛 STREAM_PROTOCOL_ERROR(非流场景的协议错误)。\n */\nexport async function postProviderJson<T = unknown>(\n options: PostProviderJsonOptions,\n): Promise<{\n data: T;\n headers: Headers;\n}> {\n const { response, headers } = await postProviderJsonResponse(options);\n let data: T;\n try {\n data = (await response.json()) as T;\n } catch (err) {\n throw new AIStreamError(\n `Failed to parse provider JSON response: ${err instanceof Error ? err.message : String(err)}`,\n \"STREAM_PROTOCOL_ERROR\",\n );\n }\n return { data, headers };\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","/**\n * Provider JSON 流 session\n *\n * 收敛 HTTP adapter 的 open → iterate → complete 脚手架。\n * **不**在 batches 结束后自动 complete(chat/gemini/ollama 需中途 complete)。\n *\n * 错误路径仍只在 open-stream 映射:HTTP 非 2xx / 网络 / malformed / incomplete frame。\n */\n\nimport { AIStreamError, WarningCode } from \"../../runtime/errors.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { AIStreamEvent, FetchFn, NormalizedRequest } from \"../../types/index.js\";\nimport type { AdapterAuxiliaryState } from \"../auxiliary.js\";\nimport type { StreamResult } from \"../base.js\";\nimport {\n createCompletionGate,\n iterateProviderStreamBatches,\n openProviderJsonStream,\n type ProviderStreamBatch,\n} from \"./open-stream.js\";\nimport type { IncrementalStreamParser } from \"./parser.js\";\n\nexport type ProviderJsonStreamSessionHost = {\n fetchFn: FetchFn;\n factory: EventFactory;\n request: NormalizedRequest;\n auxiliary: AdapterAuxiliaryState;\n emitCompleted: (auxiliary: AdapterAuxiliaryState, result: StreamResult) => AsyncIterable<AIStreamEvent>;\n};\n\nexport type ProviderJsonStreamOpenOptions = {\n url: string;\n headers: Record<string, string>;\n body: unknown;\n};\n\nexport type ProviderJsonStreamBatchOptions<T> = {\n parser: IncrementalStreamParser<T>;\n providerLabel: string;\n transportLabel: string;\n incompleteMessage: string;\n};\n\nexport type ProviderJsonStreamCompleteOptions = {\n /**\n * 重复 complete 时:`warn` 发 DUPLICATE_FINISH(默认,对齐 chat/gemini/ollama);\n * `silent` 静默忽略(messages/responses 历史路径几乎不会触发)。\n */\n onDuplicate?: \"warn\" | \"silent\";\n};\n\nexport type ProviderJsonStreamSession = {\n readonly auxiliary: AdapterAuxiliaryState;\n readonly gate: {\n readonly completed: boolean;\n tryComplete(): boolean;\n };\n /** open 成功后填充的 response headers */\n readonly headers: Headers | undefined;\n open(options: ProviderJsonStreamOpenOptions): Promise<{ headers: Headers }>;\n batches<T>(options: ProviderJsonStreamBatchOptions<T>): AsyncGenerator<ProviderStreamBatch<T>, void, undefined>;\n complete(result: StreamResult, options?: ProviderJsonStreamCompleteOptions): AsyncIterable<AIStreamEvent>;\n};\n\n/**\n * 创建 JSON provider 流 session。\n * 调用方负责:鉴权 headers、parser、业务 map、何时 complete。\n */\nexport function createProviderJsonStreamSession(host: ProviderJsonStreamSessionHost): ProviderJsonStreamSession {\n const gate = createCompletionGate();\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined;\n let responseHeaders: Headers | undefined;\n let opened = false;\n\n return {\n get auxiliary() {\n return host.auxiliary;\n },\n get gate() {\n return gate;\n },\n get headers() {\n return responseHeaders;\n },\n\n async open(options) {\n if (opened) {\n throw new AIStreamError(\"Provider JSON stream already opened\", \"STREAM_ERROR\");\n }\n const openedStream = await openProviderJsonStream({\n fetchFn: host.fetchFn,\n url: options.url,\n headers: options.headers,\n body: options.body,\n signal: host.request.signal,\n });\n reader = openedStream.reader;\n responseHeaders = openedStream.headers;\n opened = true;\n return { headers: openedStream.headers };\n },\n\n batches(options) {\n if (!reader) {\n throw new AIStreamError(\"Provider JSON stream is not open\", \"STREAM_ERROR\");\n }\n return iterateProviderStreamBatches({\n reader,\n parser: options.parser,\n factory: host.factory,\n providerLabel: options.providerLabel,\n transportLabel: options.transportLabel,\n incompleteMessage: options.incompleteMessage,\n });\n },\n\n async *complete(result, options) {\n if (!gate.tryComplete()) {\n if (options?.onDuplicate !== \"silent\") {\n yield host.factory.responseWarning(\"Duplicate finish signal ignored\", WarningCode.DUPLICATE_FINISH);\n }\n return;\n }\n yield* host.emitCompleted(host.auxiliary, result);\n },\n };\n}\n","/**\n * HTTP adapter 共享基类与构造选项\n *\n * 收敛五家真实后端 adapter 的:\n * - apiKey / baseUrl / fetch / headers / extraBody 字段赋值\n * - 默认 baseUrl 解析\n * - beginJsonStream:open → batches → complete session\n *\n * 应用代码应只实现 BackendAdapter;勿依赖本内部基类。\n */\n\nimport { AdapterBase } from \"./base.js\";\nimport { applyExtraBody, mergeProviderHeaders } from \"./request-options.js\";\nimport { createProviderJsonStreamSession, type ProviderJsonStreamSession } from \"./transport/run-json-stream.js\";\nimport type { FetchFn, NormalizedRequest } from \"../types/index.js\";\nimport type { EventFactory } from \"../stream/event-factory.js\";\n\n/** 真实 HTTP adapter 的公共构造选项;apiKey 由各 adapter 收紧或保持可选。 */\nexport type HttpAdapterOptions = {\n apiKey?: string;\n baseUrl?: string;\n /** 可注入自定义 fetch 实现(测试 / 代理) */\n fetch?: FetchFn;\n /** 额外请求头;后写覆盖内置鉴权 / Content-Type 等 */\n headers?: Record<string, string>;\n /** 额外 body 顶层字段;浅层合并,同名键可覆盖 */\n extraBody?: Record<string, unknown>;\n};\n\nexport type HttpAdapterDefaults = {\n baseUrl: string;\n};\n\n/**\n * HTTP adapter 薄基类:统一字段、默认值与 JSON 流 session。\n */\nexport abstract class HttpAdapterBase extends AdapterBase {\n protected apiKey: string | undefined;\n protected baseUrl: string;\n protected fetchFn: FetchFn;\n protected headers: Record<string, string> | undefined;\n protected extraBody: Record<string, unknown> | undefined;\n\n constructor(options: HttpAdapterOptions, defaults: HttpAdapterDefaults) {\n super();\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? defaults.baseUrl;\n this.fetchFn = options.fetch ?? globalThis.fetch;\n this.headers = options.headers;\n this.extraBody = options.extraBody;\n }\n\n /** 合并内置 headers 与构造期自定义 headers。 */\n protected mergeHeaders(base: Record<string, string>): Record<string, string> {\n return mergeProviderHeaders(base, this.headers);\n }\n\n /** 将构造期 extraBody 浅层合并进已构建 body。 */\n protected withExtraBody<T extends object>(body: T): T {\n return applyExtraBody(body, this.extraBody);\n }\n\n /**\n * 开启 JSON provider 流 session(auxiliary + gate + open/batches/complete)。\n * 不自动 complete;调用方在业务 finish 点 `yield* session.complete(...)`。\n */\n protected beginJsonStream(factory: EventFactory, request: NormalizedRequest): ProviderJsonStreamSession {\n const auxiliary = this.createAuxiliaryState(request);\n return createProviderJsonStreamSession({\n fetchFn: this.fetchFn,\n factory,\n request,\n auxiliary,\n emitCompleted: (aux, result) => this.emitStreamCompleted(factory, request, aux, result),\n });\n }\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/** Gemini GenerateContent `usageMetadata` */\nexport function usageFromGemini(raw: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n cachedContentTokenCount?: number;\n thoughtsTokenCount?: number;\n [key: string]: unknown;\n}): Partial<Usage> {\n return withDerivedTotal({\n inputTokens: num(raw.promptTokenCount),\n outputTokens: num(raw.candidatesTokenCount),\n totalTokens: num(raw.totalTokenCount),\n cachedInputTokens: num(raw.cachedContentTokenCount),\n reasoningTokens: num(raw.thoughtsTokenCount),\n });\n}\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 /** Pending decoded fragments; compacted to at most one rest string after each consume. */\n private chunks: string[] = [];\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.chunks.push(this.decoder.decode(value, { stream: true }));\n return this.consume(false);\n }\n\n flush(): { items: T[]; malformed: number } {\n const tail = this.decoder.decode();\n if (tail.length > 0) this.chunks.push(tail);\n return this.consume(true);\n }\n\n getRemaining(): string {\n return this.materializeBuffer();\n }\n\n private materializeBuffer(): string {\n if (this.chunks.length === 0) return \"\";\n if (this.chunks.length === 1) return this.chunks[0] ?? \"\";\n return this.chunks.join(\"\");\n }\n\n private consume(allowEOF: boolean): { items: T[]; malformed: number } {\n const buffer = this.materializeBuffer();\n const split = this.split(buffer, allowEOF);\n this.chunks = split.rest.length > 0 ? [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\n/**\n * Split SSE frames on blank-line boundaries without rewriting the whole buffer.\n * Accepts LF, CRLF, and mixed empty-line terminators; normalizes only extracted frames.\n */\nexport function splitSSEFrames(buffer: string, allowEOF: boolean): StreamSplitResult {\n const items: string[] = [];\n let cursor = 0;\n\n while (cursor < buffer.length) {\n const boundary = findSseFrameBoundary(buffer, cursor);\n if (boundary === null) break;\n items.push(normalizeSseFrame(buffer.slice(cursor, boundary.start)));\n cursor = boundary.end;\n }\n\n if (allowEOF && cursor < buffer.length) {\n items.push(normalizeSseFrame(buffer.slice(cursor)));\n cursor = buffer.length;\n }\n\n return { items, rest: buffer.slice(cursor) };\n}\n\n/** Locate blank-line frame end: `\\n\\n`, `\\r\\n\\r\\n`, `\\r\\n\\n`, or `\\n\\r\\n`. */\nfunction findSseFrameBoundary(buffer: string, from: number): { start: number; end: number } | null {\n for (let i = from; i < buffer.length; i++) {\n const c = buffer[i];\n if (c === \"\\n\") {\n if (i + 1 < buffer.length && buffer[i + 1] === \"\\n\") {\n return { start: i, end: i + 2 };\n }\n if (i + 2 < buffer.length && buffer[i + 1] === \"\\r\" && buffer[i + 2] === \"\\n\") {\n return { start: i, end: i + 3 };\n }\n } else if (c === \"\\r\") {\n if (i + 1 < buffer.length && buffer[i + 1] === \"\\n\") {\n if (i + 2 < buffer.length && buffer[i + 2] === \"\\n\") {\n return { start: i, end: i + 3 };\n }\n if (i + 3 < buffer.length && buffer[i + 2] === \"\\r\" && buffer[i + 3] === \"\\n\") {\n return { start: i, end: i + 4 };\n }\n }\n }\n }\n return null;\n}\n\nfunction normalizeSseFrame(frame: string): string {\n return frame.includes(\"\\r\") ? frame.replaceAll(\"\\r\\n\", \"\\n\") : frame;\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/**\n * 简化 SSE:仅 `data: ...` 行,忽略 `[DONE]`。\n * 供 Chat Completions / Gemini alt=sse 等 data-line 形态共用。\n */\nexport function parseDataLineSse(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 createDataLineSseParser<T>(): IncrementalStreamParser<T> {\n return new IncrementalStreamParser(splitLines, (item) => parseDataLineSse(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 * 收敛 incomplete / finish 后的 replay + complete 路径。\n * adapter 负责构造 opaque payload;本 helper 统一拼接 replay 并 complete。\n */\n\nimport { replayFromOutput } from \"../canonical/index.js\";\nimport type { AIStreamEvent, OpaqueItem, StopReason } from \"../types/index.js\";\nimport type { StreamingItemSession } from \"./streaming-item-session.js\";\nimport type { ProviderJsonStreamCompleteOptions, ProviderJsonStreamSession } from \"./transport/run-json-stream.js\";\n\nexport type FinalizeStreamTurnOptions = {\n opaque?: OpaqueItem | null | undefined;\n stopReason?: StopReason;\n rawResponseId?: string;\n onDuplicate?: ProviderJsonStreamCompleteOptions[\"onDuplicate\"];\n};\n\n/**\n * 从 item session 生成 canonical replay,可选追加 opaque 尾项,再 yield session.complete。\n */\nexport async function* finalizeStreamTurn(\n session: Pick<ProviderJsonStreamSession, \"complete\">,\n items: StreamingItemSession,\n options: FinalizeStreamTurnOptions = {},\n): AsyncIterable<AIStreamEvent> {\n const replay = [...replayFromOutput(items.completedItems())];\n if (options.opaque) {\n replay.push(options.opaque);\n }\n\n yield* session.complete(\n {\n replay,\n stopReason: options.stopReason,\n rawResponseId: options.rawResponseId,\n },\n options.onDuplicate !== undefined ? { onDuplicate: options.onDuplicate } : undefined,\n );\n}\n","/**\n * Opaque replay source 常量,避免 adapter 内 magic string 漂移。\n * 须与 acceptOpaqueReplay / opaqueItem 入站过滤一致。\n */\n\nexport const OPAQUE_SOURCE = {\n CHAT_COMPLETIONS: \"chat.completions\",\n MESSAGES: \"messages\",\n OLLAMA: \"ollama\",\n GEMINI: \"gemini\",\n RESPONSES: \"responses\",\n} as const;\n\nexport type OpaqueSourceId = (typeof OPAQUE_SOURCE)[keyof typeof OPAQUE_SOURCE];\n","/**\n * Opaque replay 统一协议(入站薄层)\n *\n * 过滤:仅 `source === expectedSource` 且 `purpose === \"replay\"` 才处理,否则忽略。\n * envelope:object / ≤64KB / depth≤8;失败抛 AIRequestError / INVALID_OPAQUE_REPLAY。\n * 写入 wire 尾部 assistant/model turn 前:先 rollbackTrailing*,再 append(responses 续写 id 除外)。\n * 已知 shape 非法 → 抛 INVALID_OPAQUE_REPLAY;未知 shape → 静默跳过。\n */\n\nimport { assertOpaqueReplayEnvelope } from \"./security.js\";\n\nimport type { OpaqueItem } from \"../types/index.js\";\n\n/**\n * 接受本 adapter 的 opaque replay payload。\n * source/purpose 不匹配返回 null;匹配则 assert envelope 后返回 payload object。\n */\nexport function acceptOpaqueReplay(\n item: Pick<OpaqueItem, \"source\" | \"purpose\" | \"payload\">,\n expectedSource: string,\n): Record<string, unknown> | null {\n if (item.source !== expectedSource || item.purpose !== \"replay\") {\n return null;\n }\n assertOpaqueReplayEnvelope(item.payload);\n return item.payload as Record<string, unknown>;\n}\n","/**\n * Provider JSON 解析小工具\n *\n * - loose:出站 opaque / wire best-effort,失败回退 {}\n * - strict:失败抛 AIRequestError;入站 tool_call 参数经 `parseToolArguments` 再包装为 AIRecoverableError\n */\n\nimport { AIRequestError, type ErrorCode } from \"../runtime/errors.js\";\n\n/** 宽松解析 JSON object:失败或非 object 返回 {}。 */\nexport function parseJsonLooseObject(text: string): Record<string, unknown> {\n try {\n const parsed: unknown = JSON.parse(text);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // fall through\n }\n return {};\n}\n\n/** 严格解析 JSON object:失败或非 object 抛 AIRequestError。 */\nexport function parseJsonStrictObject(\n text: string,\n message: string,\n code: ErrorCode = \"TOOL_CALL_ARGUMENTS_INVALID\",\n): Record<string, unknown> {\n try {\n const parsed: unknown = JSON.parse(text);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // fall through\n }\n throw new AIRequestError(message, code);\n}\n","import { AIRecoverableError, AIRequestError } from \"../runtime/errors.js\";\nimport { contentBlocksToText } from \"../canonical/index.js\";\nimport { parseJsonStrictObject } from \"./json-parse.js\";\n\nimport type {\n ContentBlock,\n InstructionBlock,\n ServerToolDefinition,\n ToolCallItem,\n ToolChoice,\n ToolDefinition,\n} 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 /** 不支持 serverTools 的 adapter 在 buildRequest 入口调用。 */\n assertNoServerTools(serverTools: ServerToolDefinition[] | undefined): void {\n if (serverTools && serverTools.length > 0) {\n throw new AIRequestError(\n `${this.kind} does not support serverTools; use ResponsesAdapter for web_search, code_execution, and mcp`,\n \"UNSUPPORTED_SERVER_TOOL\",\n );\n }\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 const message = `${this.kind} requires tool_call argumentsText to be a valid JSON object for tool_call \"${item.id}\" (${item.name})`;\n try {\n return parseJsonStrictObject(item.argumentsText, message, \"TOOL_CALL_ARGUMENTS_INVALID\");\n } catch (err) {\n if (err instanceof AIRequestError && err.code === \"TOOL_CALL_ARGUMENTS_INVALID\") {\n throw new AIRecoverableError(err.message, err.code);\n }\n throw err;\n }\n }\n\n /**\n * 回滚 wire 尾部连续同 role 的 turn(opaque replace 语义)。\n * chat/messages/ollama 用 `\"assistant\"`;gemini 用 `\"model\"`。\n */\n rollbackTrailingAssistantMessages<T extends { role: string }>(messages: T[], role = \"assistant\"): void {\n while (messages.length > 0 && messages[messages.length - 1]?.role === role) {\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 * Portable reasoningLevel → provider wire 字段映射\n *\n * 第一版只处理 level 枚举;budget/summary 等特化字段不在此层。\n * 无法映射的 level 抛 AIRequestError(UNSUPPORTED_REASONING_LEVEL)。\n */\n\nimport { AIRequestError } from \"../runtime/errors.js\";\nimport type { ReasoningLevel } from \"../types/request.js\";\nexport { REASONING_LEVELS, REASONING_LEVEL_SET } from \"../types/request.js\";\n\nconst MESSAGES_BUDGET_RATIOS: Record<Exclude<ReasoningLevel, \"none\">, number> = {\n minimal: 0.02,\n low: 0.1,\n medium: 0.3,\n high: 0.6,\n xhigh: 0.9,\n max: 0.95,\n};\n\nconst OLLAMA_SUPPORTED = new Set<ReasoningLevel>([\"none\", \"low\", \"medium\", \"high\"]);\nconst GEMINI_SUPPORTED = new Set<ReasoningLevel>([\"none\", \"minimal\", \"low\", \"medium\", \"high\"]);\n\nexport type OpenAIReasoningEffort = ReasoningLevel;\n\nexport type MessagesThinkingConfig = { type: \"disabled\" } | { type: \"enabled\"; budget_tokens: number };\n\nexport type OllamaThinkValue = false | \"low\" | \"medium\" | \"high\";\n\nexport type GeminiThinkingLevel = \"MINIMAL\" | \"LOW\" | \"MEDIUM\" | \"HIGH\";\n\nexport type GeminiThinkingConfig =\n | { includeThoughts: false }\n | { includeThoughts: true; thinkingLevel: GeminiThinkingLevel };\n\n/** 若 level 不在 supported 集合内则抛 AIRequestError。 */\nexport function assertSupportedReasoningLevel(\n level: ReasoningLevel,\n supported: ReadonlySet<ReasoningLevel>,\n adapterKind: string,\n): void {\n if (supported.has(level)) return;\n throw new AIRequestError(\n `reasoningLevel \"${level}\" is not supported by the ${adapterKind} adapter`,\n \"UNSUPPORTED_REASONING_LEVEL\",\n );\n}\n\n/** Responses API:`reasoning: { effort }` */\nexport function mapResponsesReasoning(level: ReasoningLevel): { effort: OpenAIReasoningEffort } {\n return { effort: level };\n}\n\n/** Chat Completions:顶层 `reasoning_effort` */\nexport function mapChatCompletionsReasoningEffort(level: ReasoningLevel): OpenAIReasoningEffort {\n return level;\n}\n\n/**\n * Messages thinking budget。\n * 基于 maxTokens 按比例推导,clamp 到 [1024, max(1024, maxTokens - 1)],\n * 满足 Anthropic budget_tokens < max_tokens。\n */\nexport function mapMessagesThinkingBudget(level: Exclude<ReasoningLevel, \"none\">, maxTokens: number): number {\n const ratio = MESSAGES_BUDGET_RATIOS[level];\n const raw = Math.round(maxTokens * ratio);\n const upper = Math.max(1024, maxTokens - 1);\n return Math.min(Math.max(raw, 1024), upper);\n}\n\n/** Messages API:`thinking` 字段 */\nexport function mapMessagesThinking(level: ReasoningLevel, maxTokens: number): MessagesThinkingConfig {\n if (level === \"none\") {\n return { type: \"disabled\" };\n }\n return {\n type: \"enabled\",\n budget_tokens: mapMessagesThinkingBudget(level, maxTokens),\n };\n}\n\n/** Ollama:`think` 字段;minimal/xhigh/max 不支持 */\nexport function mapOllamaThink(level: ReasoningLevel): OllamaThinkValue {\n assertSupportedReasoningLevel(level, OLLAMA_SUPPORTED, \"ollama\");\n if (level === \"none\") return false;\n // narrow after assert: only low|medium|high remain\n return level as Exclude<OllamaThinkValue, false>;\n}\n\n/** Gemini:`generationConfig.thinkingConfig`;xhigh/max 不支持 */\nexport function mapGeminiThinking(level: ReasoningLevel): GeminiThinkingConfig {\n assertSupportedReasoningLevel(level, GEMINI_SUPPORTED, \"gemini\");\n if (level === \"none\") {\n return { includeThoughts: false };\n }\n\n const thinkingLevel = level.toUpperCase() as GeminiThinkingLevel;\n return {\n includeThoughts: true,\n thinkingLevel,\n };\n}\n","/**\n * canonical serverTools → Responses API tools 映射\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport type { ServerToolDefinition } from \"../../types/index.js\";\nimport type { ResponsesCodeInterpreterTool, ResponsesMcpTool, ResponsesTool, ResponsesWebSearchTool } from \"./types.js\";\n\n/** 将 canonical serverTools 映射为 Responses API tools 数组项。 */\nexport function mapServerTools(serverTools: ServerToolDefinition[] | undefined): ResponsesTool[] {\n if (!serverTools || serverTools.length === 0) return [];\n\n return serverTools.map((tool): ResponsesTool => {\n switch (tool.type) {\n case \"web_search\": {\n const mapped: ResponsesWebSearchTool = { type: \"web_search\" };\n if (tool.allowedDomains || tool.blockedDomains) {\n mapped.filters = {\n ...(tool.allowedDomains ? { allowed_domains: tool.allowedDomains } : {}),\n ...(tool.blockedDomains ? { blocked_domains: tool.blockedDomains } : {}),\n };\n }\n if (tool.userLocation) {\n mapped.user_location = {\n type: \"approximate\",\n ...(tool.userLocation.country !== undefined ? { country: tool.userLocation.country } : {}),\n ...(tool.userLocation.city !== undefined ? { city: tool.userLocation.city } : {}),\n ...(tool.userLocation.region !== undefined ? { region: tool.userLocation.region } : {}),\n ...(tool.userLocation.timezone !== undefined ? { timezone: tool.userLocation.timezone } : {}),\n };\n }\n if (tool.searchContextSize !== undefined) {\n mapped.search_context_size = tool.searchContextSize;\n }\n return mapped;\n }\n case \"code_execution\": {\n const container = tool.container;\n const mapped: ResponsesCodeInterpreterTool = {\n type: \"code_interpreter\",\n container: container\n ? {\n type: \"auto\",\n ...(container.memoryLimit !== undefined ? { memory_limit: container.memoryLimit } : {}),\n ...(container.fileIds !== undefined ? { file_ids: container.fileIds } : {}),\n }\n : { type: \"auto\" },\n };\n return mapped;\n }\n case \"mcp\": {\n const mapped: ResponsesMcpTool = {\n type: \"mcp\",\n server_label: tool.serverLabel,\n server_url: tool.serverUrl,\n require_approval: \"never\",\n };\n if (tool.serverDescription !== undefined) mapped.server_description = tool.serverDescription;\n if (tool.authorization !== undefined) mapped.authorization = tool.authorization;\n if (tool.allowedTools !== undefined) mapped.allowed_tools = tool.allowedTools;\n return mapped;\n }\n default: {\n const exhaustive: never = tool;\n throw new AIRequestError(\n `Unsupported server tool type: ${(exhaustive as ServerToolDefinition).type}`,\n \"UNSUPPORTED_SERVER_TOOL\",\n );\n }\n }\n });\n}\n","/**\n * NormalizedRequest → Responses API 请求体(不含 extraBody 合并)\n *\n * 同时服务 stream(/responses)与 compress(/responses/compact)。\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport { acceptOpaqueReplay } from \"../../provider/opaque-replay.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { mapResponsesReasoning } from \"../../provider/reasoning.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\nimport type {\n CompressRequest,\n ContentBlock,\n InputItem,\n InstructionBlock,\n NormalizedRequest,\n ReasoningItem,\n} from \"../../types/index.js\";\nimport { mapServerTools } from \"./map-server-tools.js\";\nimport type {\n ResponsesAPIRequest,\n ResponsesCompactAPIRequest,\n ResponsesInputItem,\n ResponsesReasoningInput,\n ResponsesTool,\n} from \"./types.js\";\n\nconst mapper = new NormalizedRequestMapper(\"responses\");\n\n/** compact replay opaque:整份 wire output window 保真回传 */\nexport const RESPONSES_COMPACTED_WINDOW_KIND = \"compacted_window\" as const;\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 readNonEmptyString(value: unknown, maxLen = 256): string | undefined {\n if (typeof value !== \"string\" || value.length === 0 || value.length > maxLen) return undefined;\n return value;\n}\n\n/** 将 canonical text/json blocks 压成 EasyInputMessage 的 string content。 */\nfunction messageContentAsString(blocks: ContentBlock[], field: string): string {\n return mapper.textFromBlocks(blocks, field);\n}\n\nfunction mapReasoningInput(item: ReasoningItem, index: number): ResponsesReasoningInput {\n const text = mapper.textFromBlocks(\n mapper.ensureReasoningBlocks(item.content, \"reasoning content\"),\n \"reasoning content\",\n );\n const id = item.id && item.id.length > 0 ? item.id : `reasoning_replay_${index}`;\n\n if (item.visibility === \"full\") {\n return {\n type: \"reasoning\",\n id,\n summary: [],\n content: text ? [{ type: \"reasoning_text\", text }] : undefined,\n };\n }\n\n // summary / redacted / opaque:公开可回传的是 summary_text\n return {\n type: \"reasoning\",\n id,\n summary: text ? [{ type: \"summary_text\", text }] : [],\n };\n}\n\nfunction extractOpaqueContinuationId(payload: Record<string, unknown>): {\n previousResponseId?: string;\n itemReferenceId?: string;\n} {\n // 优先显式 previous_response_id;历史 payload 用 id 存 response 续写句柄\n const previousResponseId =\n readNonEmptyString(payload.previous_response_id) ??\n (typeof payload.item_id === \"string\" ? undefined : readNonEmptyString(payload.id));\n\n // 仅在显式给出 item_id 时使用 item_reference(引用的是 item,不是 response)\n const itemReferenceId = readNonEmptyString(payload.item_id);\n\n return { previousResponseId, itemReferenceId };\n}\n\nfunction assertOptionalIdFields(payload: Record<string, unknown>): void {\n for (const key of [\"id\", \"previous_response_id\", \"item_id\"] as const) {\n if (\n key in payload &&\n (typeof payload[key] !== \"string\" || payload[key].length === 0 || payload[key].length > 256)\n ) {\n throw new AIRequestError(\n `Invalid opaque replay payload: ${key} must be a non-empty string (max 256)`,\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n }\n}\n\n/**\n * 将 compact 返回的 wire output 原样展开进 input。\n * 官方要求:不要裁剪 compact output;下轮 /responses 应整窗回传。\n */\nfunction appendCompactedWindow(input: ResponsesInputItem[], payload: Record<string, unknown>): void {\n if (!Array.isArray(payload.output)) {\n throw new AIRequestError(\n 'Invalid opaque replay payload: compacted_window requires \"output\" array',\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n for (let i = 0; i < payload.output.length; i++) {\n const wireItem = payload.output[i];\n if (!wireItem || typeof wireItem !== \"object\") {\n throw new AIRequestError(\n `Invalid opaque replay payload: compacted_window.output[${i}] must be an object`,\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n // 保真:compact 输出按 wire 原样进入下一轮 input(含 compaction / retained messages)\n input.push(wireItem as ResponsesInputItem);\n }\n}\n\ntype MappedResponsesCore = {\n input: ResponsesInputItem[];\n previousResponseId?: string;\n instructions?: string;\n /** 若展开过 compacted_window,则禁止叠 previous_response_id 续写 */\n usedCompactedWindow: boolean;\n};\n\n/**\n * stream / compact 共享的 input + instructions + opaque 续写映射。\n * compact 不附带 tools / stream 等生成字段。\n */\nfunction mapResponsesCore(request: {\n input: InputItem[];\n instructions?: string | InstructionBlock[];\n}): MappedResponsesCore {\n const input: ResponsesInputItem[] = [];\n let previousResponseId: string | undefined;\n let usedCompactedWindow = false;\n let reasoningIndex = 0;\n\n for (const item of request.input) {\n switch (item.type) {\n case \"message\": {\n // EasyInputMessage:string content 对 user/assistant 都合法,且最不易触发 ModelInput 反序列化失败。\n // 切勿发送 { type: \"text\" } —— 官方 content part 是 input_text / output_text。\n input.push({\n type: \"message\",\n role: item.role,\n content: messageContentAsString(item.content, `input message (${item.role}) content`),\n });\n break;\n }\n case \"reasoning\": {\n input.push(mapReasoningInput(item, reasoningIndex++));\n break;\n }\n case \"tool_call\": {\n // call_id 必填;canonical ToolCallItem.id 即 call_id(流里会优先取 call_id)\n input.push({\n type: \"function_call\",\n call_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 优先;compacted_window 原样展开;否则 previous_response_id 服务端续写。\n // 注意:response id 不能塞进 item_reference(那是 item id);不叠 wire assistant。\n const payload = acceptOpaqueReplay(item, OPAQUE_SOURCE.RESPONSES);\n if (!payload) break;\n\n // compacted_window:压缩结果整窗回传;与 previous_response_id 互斥(window 为准)\n if (payload.kind === RESPONSES_COMPACTED_WINDOW_KIND) {\n assertOptionalIdFields(payload);\n appendCompactedWindow(input, payload);\n usedCompactedWindow = true;\n // 有 window 时丢弃已收集的 previous_response_id,避免双上下文\n previousResponseId = undefined;\n break;\n }\n\n assertOptionalIdFields(payload);\n\n // 已有 compacted_window 后忽略 id 续写 opaque(window 已是完整上下文)\n if (usedCompactedWindow) break;\n\n const { previousResponseId: prevId, itemReferenceId } = extractOpaqueContinuationId(payload);\n if (!hasReplayCanonicalInput(input)) {\n if (prevId && !previousResponseId) {\n previousResponseId = prevId;\n } else if (itemReferenceId) {\n input.push({ type: \"item_reference\", id: itemReferenceId });\n }\n }\n break;\n }\n }\n }\n\n const mapped: MappedResponsesCore = {\n input,\n usedCompactedWindow,\n };\n if (previousResponseId && !usedCompactedWindow) {\n mapped.previousResponseId = previousResponseId;\n }\n if (request.instructions) {\n mapped.instructions = mapper.mapInstructions(request.instructions);\n }\n return mapped;\n}\n\n/** 构建 Responses 流式请求体;调用方再 `withExtraBody` 合并构造期扩展字段。 */\nexport function buildResponsesRequest(request: NormalizedRequest): ResponsesAPIRequest {\n const core = mapResponsesCore(request);\n\n const body: ResponsesAPIRequest = {\n model: request.model,\n input: core.input,\n stream: true,\n };\n\n if (core.previousResponseId) {\n body.previous_response_id = core.previousResponseId;\n }\n if (core.instructions) {\n body.instructions = core.instructions;\n }\n\n const functionTools =\n 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 const serverTools = mapServerTools(request.serverTools);\n const tools = [...functionTools, ...serverTools];\n if (tools.length > 0) {\n body.tools = tools;\n }\n\n body.tool_choice = mapper.mapToolChoice<Exclude<ResponsesAPIRequest[\"tool_choice\"], undefined>>(request.toolChoice, {\n auto: \"auto\",\n none: \"none\",\n tool: (name) => ({ type: \"function\" as const, name }),\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 if (request.reasoningLevel !== undefined) {\n body.reasoning = mapResponsesReasoning(request.reasoningLevel);\n }\n\n return body;\n}\n\n/**\n * 构建 Responses compact 请求体(POST /responses/compact)。\n * 仅映射 model / input / instructions / previous_response_id;无 stream / tools。\n */\nexport function buildResponsesCompactRequest(request: CompressRequest): ResponsesCompactAPIRequest {\n if (!request.model || typeof request.model !== \"string\" || request.model.length === 0) {\n throw new AIRequestError(\"compress requires a non-empty model\", \"INPUT_EMPTY\");\n }\n if (!Array.isArray(request.input) || request.input.length === 0) {\n throw new AIRequestError(\"compress requires a non-empty input\", \"INPUT_EMPTY\");\n }\n\n const core = mapResponsesCore(request);\n const body: ResponsesCompactAPIRequest = {\n model: request.model,\n input: core.input,\n };\n if (core.previousResponseId) {\n body.previous_response_id = core.previousResponseId;\n }\n if (core.instructions) {\n body.instructions = core.instructions;\n }\n return body;\n}\n","/**\n * Responses API 最终 payload → StopReason\n */\n\nimport type { StopReason } from \"../../types/index.js\";\nimport type { ResponsesAPIResponse } from \"./types.js\";\n\nexport function inferResponsesStopReason(response: ResponsesAPIResponse): 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 * StreamingItemSession — item 级 start/delta/complete 唯一状态机\n *\n * 方案 A(事件权威):\n * - 事件由本 session 通过 EventFactory 产出\n * - completedItems 与已完成事件同源,仅供 replayFromOutput\n * - 禁止 adapter 再维护并行 OutputItem[] 内容账本\n */\n\nimport {\n coalesceContentBlocks,\n messageItem,\n reasoningItem,\n toolCallItem,\n serverToolCallItem,\n} from \"../canonical/index.js\";\nimport { AIStreamError } from \"../runtime/errors.js\";\nimport type { EventFactory } from \"../stream/event-factory.js\";\nimport type {\n AIStreamEvent,\n Citation,\n ContentBlock,\n OutputItem,\n ReasoningItem,\n ServerToolDiscoveryItem,\n ServerToolResultItem,\n} from \"../types/index.js\";\n\n// ── Active state ──────────────────────────────────────────────\n\ntype ActiveMessage = {\n type: \"message\";\n id: string;\n content: ContentBlock[];\n citations?: Citation[];\n};\n\ntype ActiveReasoning = {\n type: \"reasoning\";\n id: string;\n visibility: ReasoningItem[\"visibility\"];\n content: ContentBlock[];\n};\n\ntype ActiveToolCall = {\n type: \"tool_call\";\n id: string;\n name: string;\n argumentChunks: string[];\n};\n\ntype ActiveServerToolCall = {\n type: \"server_tool_call\";\n id: string;\n tool: string;\n name?: string;\n argumentChunks: string[];\n serverLabel?: string;\n status?: \"in_progress\" | \"completed\" | \"failed\";\n providerPayload?: unknown;\n};\n\ntype ActiveItem = ActiveMessage | ActiveReasoning | ActiveToolCall | ActiveServerToolCall;\n\nfunction protocolError(message: string): AIStreamError {\n return new AIStreamError(message, \"STREAM_PROTOCOL_ERROR\");\n}\n\n// ── Session ───────────────────────────────────────────────────\n\nexport type StreamingItemSession = {\n startMessage(id: string): AIStreamEvent;\n /** 若未 start 则 start;已 start 返回 null */\n ensureMessageStarted(id: string): AIStreamEvent | null;\n deltaMessage(id: string, block: ContentBlock): AIStreamEvent;\n completeMessage(id: string, options?: { citations?: Citation[] }): AIStreamEvent;\n\n startReasoning(id: string, visibility: ReasoningItem[\"visibility\"]): AIStreamEvent;\n ensureReasoningStarted(id: string, visibility: ReasoningItem[\"visibility\"]): AIStreamEvent | null;\n deltaReasoning(id: string, block: ContentBlock): AIStreamEvent;\n completeReasoning(id: string): AIStreamEvent;\n\n startToolCall(id: string, name: string): AIStreamEvent;\n deltaToolCall(id: string, delta: { argumentsText?: string }): AIStreamEvent;\n completeToolCall(id: string): AIStreamEvent;\n\n startServerTool(id: string, tool: string, options?: { name?: string; serverLabel?: string }): AIStreamEvent;\n deltaServerTool(id: string, delta: { argumentsText?: string }): AIStreamEvent;\n completeServerTool(\n id: string,\n options?: { status?: \"completed\" | \"failed\"; providerPayload?: unknown },\n ): AIStreamEvent;\n\n /** 原子完成项(无 started 生命周期) */\n completeServerToolResult(item: ServerToolResultItem): AIStreamEvent;\n completeServerToolDiscovery(item: ServerToolDiscoveryItem): AIStreamEvent;\n\n /** 与已完成事件同源的有序 OutputItem[],供 replayFromOutput */\n completedItems(): readonly OutputItem[];\n hasActive(): boolean;\n isActive(id: string): boolean;\n activeIds(): readonly string[];\n};\n\n/**\n * 创建流式 item session。\n * factory 必须与 adapter 当前 stream 共用,以保持 sequence 单调。\n */\nexport function createStreamingItemSession(factory: EventFactory): StreamingItemSession {\n const active = new Map<string, ActiveItem>();\n const completed: OutputItem[] = [];\n const completedIds = new Set<string>();\n\n function assertNotCompleted(id: string): void {\n if (completedIds.has(id)) {\n throw protocolError(`Item ${id} is already completed`);\n }\n }\n\n function assertNotActive(id: string): void {\n if (active.has(id)) {\n throw protocolError(`Item ${id} is already active`);\n }\n }\n\n function getActive<T extends ActiveItem[\"type\"]>(id: string, expected: T): Extract<ActiveItem, { type: T }> {\n const item = active.get(id);\n if (!item) {\n throw protocolError(`Received ${expected} delta/completed for unknown item: ${id}`);\n }\n if (item.type !== expected) {\n throw protocolError(`Item ${id} started as ${item.type} but received ${expected} event`);\n }\n return item as Extract<ActiveItem, { type: T }>;\n }\n\n return {\n startMessage(id) {\n assertNotCompleted(id);\n assertNotActive(id);\n active.set(id, { type: \"message\", id, content: [] });\n return factory.messageStarted(id);\n },\n\n ensureMessageStarted(id) {\n if (active.has(id) || completedIds.has(id)) return null;\n return this.startMessage(id);\n },\n\n deltaMessage(id, block) {\n const item = getActive(id, \"message\");\n item.content.push(block);\n return factory.messageDelta(id, block);\n },\n\n completeMessage(id, options) {\n const item = getActive(id, \"message\");\n if (options?.citations && options.citations.length > 0) {\n item.citations = options.citations;\n }\n active.delete(id);\n const outputItem = messageItem(coalesceContentBlocks(item.content), {\n id: item.id,\n ...(item.citations && item.citations.length > 0 ? { citations: item.citations } : {}),\n });\n completed.push(outputItem);\n completedIds.add(id);\n return factory.messageCompleted(id, options?.citations ? { citations: options.citations } : undefined);\n },\n\n startReasoning(id, visibility) {\n assertNotCompleted(id);\n assertNotActive(id);\n active.set(id, { type: \"reasoning\", id, visibility, content: [] });\n return factory.reasoningStarted(id, visibility);\n },\n\n ensureReasoningStarted(id, visibility) {\n if (active.has(id) || completedIds.has(id)) return null;\n return this.startReasoning(id, visibility);\n },\n\n deltaReasoning(id, block) {\n const item = getActive(id, \"reasoning\");\n item.content.push(block);\n return factory.reasoningDelta(id, block);\n },\n\n completeReasoning(id) {\n const item = getActive(id, \"reasoning\");\n active.delete(id);\n completed.push(reasoningItem(coalesceContentBlocks(item.content), item.visibility, item.id));\n completedIds.add(id);\n return factory.reasoningCompleted(id);\n },\n\n startToolCall(id, name) {\n assertNotCompleted(id);\n assertNotActive(id);\n active.set(id, { type: \"tool_call\", id, name, argumentChunks: [] });\n return factory.toolCallStarted(id, name);\n },\n\n deltaToolCall(id, delta) {\n const item = getActive(id, \"tool_call\");\n if (delta.argumentsText) {\n item.argumentChunks.push(delta.argumentsText);\n }\n return factory.toolCallDelta(id, delta);\n },\n\n completeToolCall(id) {\n const item = getActive(id, \"tool_call\");\n active.delete(id);\n completed.push(toolCallItem(item.id, item.name, item.argumentChunks.join(\"\")));\n completedIds.add(id);\n return factory.toolCallCompleted(id);\n },\n\n startServerTool(id, tool, options) {\n assertNotCompleted(id);\n assertNotActive(id);\n active.set(id, {\n type: \"server_tool_call\",\n id,\n tool,\n name: options?.name,\n argumentChunks: [],\n serverLabel: options?.serverLabel,\n status: \"in_progress\",\n });\n return factory.serverToolStarted(id, tool, options);\n },\n\n deltaServerTool(id, delta) {\n const item = getActive(id, \"server_tool_call\");\n if (delta.argumentsText) {\n item.argumentChunks.push(delta.argumentsText);\n }\n return factory.serverToolDelta(id, delta);\n },\n\n completeServerTool(id, options) {\n const item = getActive(id, \"server_tool_call\");\n item.status = options?.status ?? \"completed\";\n if (options?.providerPayload !== undefined) {\n item.providerPayload = options.providerPayload;\n }\n active.delete(id);\n const argumentsText = item.argumentChunks.join(\"\");\n completed.push(\n serverToolCallItem(item.id, item.tool, {\n ...(item.name !== undefined ? { name: item.name } : {}),\n ...(argumentsText ? { argumentsText } : {}),\n ...(item.status ? { status: item.status } : {}),\n ...(item.serverLabel !== undefined ? { serverLabel: item.serverLabel } : {}),\n ...(item.providerPayload !== undefined ? { providerPayload: item.providerPayload } : {}),\n }),\n );\n completedIds.add(id);\n return factory.serverToolCompleted(id, options);\n },\n\n completeServerToolResult(item) {\n const orderId = item.id ?? `server_tool_result:${item.callId}:${completed.length}`;\n if (completedIds.has(orderId) || active.has(orderId)) {\n throw protocolError(`Item ${orderId} is already present`);\n }\n completed.push({ ...item } as OutputItem);\n completedIds.add(orderId);\n return factory.serverToolResultCompleted(item);\n },\n\n completeServerToolDiscovery(item) {\n if (completedIds.has(item.id) || active.has(item.id)) {\n throw protocolError(`Item ${item.id} is already present`);\n }\n completed.push({ ...item });\n completedIds.add(item.id);\n return factory.serverToolDiscoveryCompleted(item);\n },\n\n completedItems() {\n return completed;\n },\n\n hasActive() {\n return active.size > 0;\n },\n\n isActive(id) {\n return active.has(id);\n },\n\n activeIds() {\n return [...active.keys()];\n },\n };\n}\n","/**\n * Responses SSE item 映射与流事件处理器\n *\n * 纯映射可单测;createResponsesSseProcessor 持有流式会话状态。\n */\n\nimport { WarningCode } from \"../../runtime/errors.js\";\nimport {\n textBlock,\n jsonBlock,\n imageBlock,\n serverToolCallItem,\n serverToolResultItem,\n serverToolDiscoveryItem,\n} from \"../../canonical/index.js\";\nimport { createStreamingItemSession, type StreamingItemSession } from \"../../provider/streaming-item-session.js\";\nimport type {\n AIStreamEvent,\n Citation,\n ContentBlock,\n ReasoningItem,\n ServerToolCallItem,\n ServerToolDiscoveryItem,\n ServerToolResultItem,\n} from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { ResponsesAPIResponse, ResponsesSSEEvent } from \"./types.js\";\n\n// ── 已知 SSE 类型 ─────────────────────────────────────────────\n\n/** 已处理或可安全忽略的 Responses SSE 类型(未知类型会 warning 一次)。 */\nexport const 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.output_text.annotation.added\",\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 // server tools\n \"response.web_search_call.in_progress\",\n \"response.web_search_call.searching\",\n \"response.web_search_call.completed\",\n \"response.code_interpreter_call.in_progress\",\n \"response.code_interpreter_call.interpreting\",\n \"response.code_interpreter_call.completed\",\n \"response.code_interpreter_call_code.delta\",\n \"response.code_interpreter_call_code.done\",\n \"response.mcp_call.in_progress\",\n \"response.mcp_call.completed\",\n \"response.mcp_call.failed\",\n \"response.mcp_call_arguments.delta\",\n \"response.mcp_call_arguments.done\",\n \"response.mcp_list_tools.in_progress\",\n \"response.mcp_list_tools.completed\",\n \"response.mcp_list_tools.failed\",\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\n// ── 纯映射 ────────────────────────────────────────────────────\n\nexport function mapAnnotationToCitation(annotation: Record<string, unknown>): Citation | undefined {\n if (annotation.type === \"url_citation\" && typeof annotation.url === \"string\") {\n return {\n type: \"url\",\n url: annotation.url,\n ...(typeof annotation.title === \"string\" ? { title: annotation.title } : {}),\n ...(typeof annotation.start_index === \"number\" ? { startIndex: annotation.start_index } : {}),\n ...(typeof annotation.end_index === \"number\" ? { endIndex: annotation.end_index } : {}),\n };\n }\n\n if (\n annotation.type === \"container_file_citation\" &&\n typeof annotation.container_id === \"string\" &&\n typeof annotation.file_id === \"string\"\n ) {\n return {\n type: \"container_file\",\n containerId: annotation.container_id,\n fileId: annotation.file_id,\n ...(typeof annotation.filename === \"string\" ? { filename: annotation.filename } : {}),\n ...(typeof annotation.start_index === \"number\" ? { startIndex: annotation.start_index } : {}),\n ...(typeof annotation.end_index === \"number\" ? { endIndex: annotation.end_index } : {}),\n };\n }\n\n return undefined;\n}\n\nexport function extractCitationsFromMessageItem(item: Record<string, unknown>): Citation[] {\n const citations: Citation[] = [];\n if (!Array.isArray(item.content)) return citations;\n for (const part of item.content) {\n if (!part || typeof part !== \"object\") continue;\n const annotations = (part as { annotations?: unknown }).annotations;\n if (!Array.isArray(annotations)) continue;\n for (const annotation of annotations) {\n if (!annotation || typeof annotation !== \"object\") continue;\n const mapped = mapAnnotationToCitation(annotation as Record<string, unknown>);\n if (mapped) citations.push(mapped);\n }\n }\n return citations;\n}\n\nexport function webSearchArgumentsText(action: unknown): string | undefined {\n if (!action || typeof action !== \"object\") return undefined;\n const record = action as Record<string, unknown>;\n if (typeof record.query === \"string\" && record.query.length > 0) {\n return JSON.stringify({ query: record.query });\n }\n if (Array.isArray(record.queries) && record.queries.every((q) => typeof q === \"string\")) {\n return JSON.stringify({ queries: record.queries });\n }\n if (record.type === \"open_page\" && typeof record.url === \"string\") {\n return JSON.stringify({ url: record.url });\n }\n if (record.type === \"find_in_page\") {\n return JSON.stringify({\n ...(typeof record.pattern === \"string\" ? { pattern: record.pattern } : {}),\n ...(typeof record.url === \"string\" ? { url: record.url } : {}),\n });\n }\n return undefined;\n}\n\nexport function mapWebSearchCallItem(item: Record<string, unknown>): {\n call: ServerToolCallItem;\n result?: ServerToolResultItem;\n} {\n const action = item.action;\n const status = item.status === \"failed\" ? \"failed\" : item.status === \"completed\" ? \"completed\" : \"in_progress\";\n const name =\n action && typeof action === \"object\" && typeof (action as { type?: unknown }).type === \"string\"\n ? (action as { type: string }).type\n : undefined;\n const call = serverToolCallItem(item.id as string, \"web_search\", {\n name,\n argumentsText: webSearchArgumentsText(action),\n status,\n providerPayload: {\n ...(action !== undefined ? { action } : {}),\n ...(item.status !== undefined ? { status: item.status } : {}),\n },\n });\n\n const sources =\n action && typeof action === \"object\" && Array.isArray((action as { sources?: unknown }).sources)\n ? (action as { sources: unknown[] }).sources\n : undefined;\n if (!sources || sources.length === 0) {\n return { call };\n }\n\n return {\n call,\n result: serverToolResultItem(\n call.id,\n \"web_search\",\n status === \"failed\" ? \"error\" : \"success\",\n [jsonBlock({ sources })],\n { providerPayload: { sources } },\n ),\n };\n}\n\nexport function mapCodeInterpreterOutputs(outputs: unknown): ContentBlock[] {\n if (!Array.isArray(outputs)) return [];\n const blocks: ContentBlock[] = [];\n for (const output of outputs) {\n if (!output || typeof output !== \"object\") continue;\n const record = output as Record<string, unknown>;\n if (record.type === \"logs\" && typeof record.logs === \"string\") {\n blocks.push(textBlock(record.logs));\n } else if (record.type === \"image\" && typeof record.url === \"string\") {\n blocks.push(imageBlock(record.url));\n } else {\n blocks.push(jsonBlock(record));\n }\n }\n return blocks;\n}\n\nexport function mapCodeInterpreterCallItem(item: Record<string, unknown>): {\n call: ServerToolCallItem;\n result?: ServerToolResultItem;\n} {\n const status = item.status === \"failed\" ? \"failed\" : item.status === \"completed\" ? \"completed\" : \"in_progress\";\n const code = typeof item.code === \"string\" ? item.code : undefined;\n const call = serverToolCallItem(item.id as string, \"code_execution\", {\n name: \"python\",\n argumentsText: code,\n status,\n providerPayload: {\n ...(typeof item.container_id === \"string\" ? { containerId: item.container_id } : {}),\n ...(item.status !== undefined ? { status: item.status } : {}),\n },\n });\n\n const content = mapCodeInterpreterOutputs(item.outputs);\n if (content.length === 0 && status !== \"failed\") {\n return { call };\n }\n\n return {\n call,\n result: serverToolResultItem(call.id, \"code_execution\", status === \"failed\" ? \"error\" : \"success\", content, {\n providerPayload: {\n ...(typeof item.container_id === \"string\" ? { containerId: item.container_id } : {}),\n ...(item.outputs !== undefined ? { outputs: item.outputs } : {}),\n },\n }),\n };\n}\n\nexport function mapMcpCallItem(item: Record<string, unknown>): {\n call: ServerToolCallItem;\n result: ServerToolResultItem;\n} {\n const failed = item.error != null && item.error !== \"\";\n const call = serverToolCallItem(item.id as string, \"mcp\", {\n name: typeof item.name === \"string\" ? item.name : undefined,\n argumentsText: typeof item.arguments === \"string\" ? item.arguments : undefined,\n serverLabel: typeof item.server_label === \"string\" ? item.server_label : undefined,\n status: failed ? \"failed\" : \"completed\",\n providerPayload: {\n ...(item.approval_request_id !== undefined ? { approvalRequestId: item.approval_request_id } : {}),\n ...(item.error !== undefined ? { error: item.error } : {}),\n },\n });\n\n const content: ContentBlock[] = [];\n if (typeof item.output === \"string\" && item.output.length > 0) {\n content.push(textBlock(item.output));\n } else if (item.output !== undefined && item.output !== null) {\n content.push(jsonBlock(item.output));\n }\n if (failed) {\n content.push(\n textBlock(typeof item.error === \"string\" ? item.error : JSON.stringify(item.error ?? \"mcp call failed\")),\n );\n }\n\n return {\n call,\n result: serverToolResultItem(call.id, \"mcp\", failed ? \"error\" : \"success\", content, {\n providerPayload: {\n ...(typeof item.server_label === \"string\" ? { serverLabel: item.server_label } : {}),\n ...(item.error !== undefined ? { error: item.error } : {}),\n },\n }),\n };\n}\n\nexport function mapMcpListToolsItem(item: Record<string, unknown>): ServerToolDiscoveryItem {\n const tools: ServerToolDiscoveryItem[\"tools\"] = [];\n if (Array.isArray(item.tools)) {\n for (const tool of item.tools) {\n if (!tool || typeof tool !== \"object\") continue;\n const record = tool as Record<string, unknown>;\n if (typeof record.name !== \"string\") continue;\n tools.push({\n name: record.name,\n ...(typeof record.description === \"string\" ? { description: record.description } : {}),\n ...(record.input_schema !== undefined ? { inputSchema: record.input_schema } : {}),\n });\n }\n }\n\n return serverToolDiscoveryItem(\n item.id as string,\n typeof item.server_label === \"string\" ? item.server_label : \"unknown\",\n tools,\n {\n providerPayload: {\n ...(item.error !== undefined ? { error: item.error } : {}),\n ...(item.tools !== undefined ? { tools: item.tools } : {}),\n },\n },\n );\n}\n\ntype ReasoningVisibility = 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\nexport function 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\nfunction extractFailureMessage(response: ResponsesAPIResponse): string {\n return response.error?.message ?? response.failure?.message ?? \"unknown\";\n}\n\n// ── SSE 处理器 ────────────────────────────────────────────────\n\nexport type ResponsesSseProcessor = {\n items: StreamingItemSession;\n getCompletedResponse: () => ResponsesAPIResponse | undefined;\n handleEvent: (sseEvent: ResponsesSSEEvent) => Generator<AIStreamEvent, void, undefined>;\n};\n\nexport function createResponsesSseProcessor(factory: EventFactory): ResponsesSseProcessor {\n const items = createStreamingItemSession(factory);\n let completedResponse: ResponsesAPIResponse | undefined;\n let unknownEventsWarned = false;\n const messageItemsWithDelta = new Set<string>();\n /** item_id → function name */\n const toolCallNames = new Map<string, string>();\n /** item_id → call_id(canonical ToolCallItem.id / function_call_output.call_id) */\n const toolCallIds = new Map<string, string>();\n /** call_id → already streamed argument deltas */\n const toolCallArgDeltas = new Set<string>();\n const reasoningStates = new Map<string, ReasoningStreamState>();\n /** message item_id → citations accumulated from annotation events / item.done */\n const messageCitations = new Map<string, Citation[]>();\n /** already completed message ids (avoid double message.completed) */\n const completedMessageIds = new Set<string>();\n /** server tool call ids already completed */\n const completedServerToolIds = new Set<string>();\n /** server tool ids that already streamed argument deltas */\n const serverToolArgDeltas = new Set<string>();\n\n const resolveToolCallId = (itemId: string): string => toolCallIds.get(itemId) ?? itemId;\n\n const pushCitation = (itemId: string, citation: Citation): void => {\n const list = messageCitations.get(itemId) ?? [];\n list.push(citation);\n messageCitations.set(itemId, list);\n };\n\n const emitServerToolTerminal = function* (\n call: ServerToolCallItem,\n result?: ServerToolResultItem,\n ): Generator<AIStreamEvent, void, undefined> {\n if (completedServerToolIds.has(call.id)) return;\n completedServerToolIds.add(call.id);\n\n if (!items.isActive(call.id)) {\n yield items.startServerTool(call.id, call.tool, {\n ...(call.name !== undefined ? { name: call.name } : {}),\n ...(call.serverLabel !== undefined ? { serverLabel: call.serverLabel } : {}),\n });\n }\n\n // 若未流式吐过 arguments,用 done 载荷补齐(避免与 delta 重复拼接)\n if (call.argumentsText && !serverToolArgDeltas.has(call.id)) {\n yield items.deltaServerTool(call.id, { argumentsText: call.argumentsText });\n serverToolArgDeltas.add(call.id);\n }\n yield items.completeServerTool(call.id, {\n status: call.status === \"failed\" ? \"failed\" : \"completed\",\n providerPayload: call.providerPayload,\n });\n if (result) {\n yield items.completeServerToolResult(result);\n }\n };\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\n if (!items.isActive(itemId)) {\n const started = items.ensureReasoningStarted(itemId, visibility);\n if (started) yield started;\n }\n\n if (items.isActive(itemId)) {\n if (!state.hasDelta && text) {\n yield items.deltaReasoning(itemId, textBlock(text));\n state.hasDelta = true;\n }\n yield items.completeReasoning(itemId);\n }\n };\n\n function* handleEvent(sseEvent: ResponsesSSEEvent): Generator<AIStreamEvent, void, undefined> {\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 return;\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 items.startMessage(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 items.startReasoning(item.id, visibility);\n break;\n }\n case \"function_call\": {\n const name = typeof item.name === \"string\" ? item.name : \"unknown\";\n // Responses 用 call_id 关联 function_call_output;item.id 是 fc_* item id\n const callId = typeof item.call_id === \"string\" && item.call_id.length > 0 ? item.call_id : item.id;\n toolCallNames.set(item.id, name);\n toolCallIds.set(item.id, callId);\n yield items.startToolCall(callId, name);\n break;\n }\n case \"web_search_call\": {\n const action = item.action;\n const name =\n action && typeof action === \"object\" && typeof (action as { type?: unknown }).type === \"string\"\n ? (action as { type: string }).type\n : undefined;\n yield items.startServerTool(item.id, \"web_search\", { name });\n break;\n }\n case \"code_interpreter_call\": {\n yield items.startServerTool(item.id, \"code_execution\", { name: \"python\" });\n break;\n }\n case \"mcp_call\": {\n yield items.startServerTool(item.id, \"mcp\", {\n name: typeof item.name === \"string\" ? item.name : undefined,\n serverLabel: typeof item.server_label === \"string\" ? item.server_label : undefined,\n });\n break;\n }\n case \"mcp_list_tools\":\n // discovery 在 done 时原子发射\n break;\n case \"mcp_approval_request\":\n yield factory.responseWarning(\n `MCP approval requested for tool \"${typeof item.name === \"string\" ? item.name : \"unknown\"}\" on server \"${typeof item.server_label === \"string\" ? item.server_label : \"unknown\"}\"; requireApproval never expected`,\n WarningCode.MCP_APPROVAL_REQUIRED,\n );\n break;\n }\n return;\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 = extracted.text || (state.doneTexts.length > 0 ? state.doneTexts.join(\"\\n\") : \"\");\n yield* completeReasoning(item.id, text, extracted.visibility || state.visibility);\n return;\n }\n\n if (item.type === \"message\") {\n // 晚到的 citations:text.done 可能已 complete message;事件权威下不再回写账本\n for (const citation of extractCitationsFromMessageItem(item)) {\n pushCitation(item.id, citation);\n }\n return;\n }\n\n if (item.type === \"web_search_call\") {\n const mapped = mapWebSearchCallItem(item);\n yield* emitServerToolTerminal(mapped.call, mapped.result);\n return;\n }\n\n if (item.type === \"code_interpreter_call\") {\n const mapped = mapCodeInterpreterCallItem(item);\n yield* emitServerToolTerminal(mapped.call, mapped.result);\n return;\n }\n\n if (item.type === \"mcp_call\") {\n const mapped = mapMcpCallItem(item);\n yield* emitServerToolTerminal(mapped.call, mapped.result);\n return;\n }\n\n if (item.type === \"mcp_list_tools\") {\n const discovery = mapMcpListToolsItem(item);\n yield items.completeServerToolDiscovery(discovery);\n return;\n }\n\n if (item.type === \"mcp_approval_request\") {\n yield factory.responseWarning(\n `MCP approval request item \"${item.id}\" completed; approval flow is not supported in MVP`,\n WarningCode.MCP_APPROVAL_REQUIRED,\n );\n return;\n }\n\n return;\n }\n\n if (sseEvent.type === \"response.output_text.delta\") {\n const data = sseEvent.data as { item_id: string; delta: string };\n yield items.deltaMessage(data.item_id, textBlock(data.delta));\n messageItemsWithDelta.add(data.item_id);\n return;\n }\n\n if (sseEvent.type === \"response.output_text.annotation.added\") {\n const data = sseEvent.data as {\n item_id?: string;\n annotation?: Record<string, unknown>;\n };\n if (typeof data.item_id === \"string\" && data.annotation) {\n const citation = mapAnnotationToCitation(data.annotation);\n if (citation) pushCitation(data.item_id, citation);\n }\n return;\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 items.deltaMessage(data.item_id, textBlock(data.text));\n messageItemsWithDelta.add(data.item_id);\n }\n if (!completedMessageIds.has(data.item_id) && items.isActive(data.item_id)) {\n completedMessageIds.add(data.item_id);\n const citations = messageCitations.get(data.item_id);\n // 复制数组,避免后续 annotation / item.done 再 push 时污染 snapshot\n const citationsSnapshot = citations && citations.length > 0 ? [...citations] : undefined;\n yield items.completeMessage(data.item_id, citationsSnapshot ? { citations: citationsSnapshot } : undefined);\n }\n return;\n }\n\n if (\n sseEvent.type === \"response.code_interpreter_call_code.delta\" ||\n sseEvent.type === \"response.mcp_call_arguments.delta\"\n ) {\n const data = sseEvent.data as { item_id: string; delta?: string };\n if (typeof data.item_id === \"string\" && typeof data.delta === \"string\" && data.delta.length > 0) {\n serverToolArgDeltas.add(data.item_id);\n yield items.deltaServerTool(data.item_id, { argumentsText: data.delta });\n }\n return;\n }\n\n if (\n sseEvent.type === \"response.code_interpreter_call_code.done\" ||\n sseEvent.type === \"response.mcp_call_arguments.done\"\n ) {\n // 完整 code/args 会在 output_item.done 上写入 call;此处忽略避免重复 delta\n return;\n }\n\n // server tool progress events — known & ignored (terminal mapping on output_item.done)\n if (\n sseEvent.type === \"response.web_search_call.in_progress\" ||\n sseEvent.type === \"response.web_search_call.searching\" ||\n sseEvent.type === \"response.web_search_call.completed\" ||\n sseEvent.type === \"response.code_interpreter_call.in_progress\" ||\n sseEvent.type === \"response.code_interpreter_call.interpreting\" ||\n sseEvent.type === \"response.code_interpreter_call.completed\" ||\n sseEvent.type === \"response.mcp_call.in_progress\" ||\n sseEvent.type === \"response.mcp_call.completed\" ||\n sseEvent.type === \"response.mcp_call.failed\" ||\n sseEvent.type === \"response.mcp_list_tools.in_progress\" ||\n sseEvent.type === \"response.mcp_list_tools.completed\" ||\n sseEvent.type === \"response.mcp_list_tools.failed\"\n ) {\n return;\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 items.deltaReasoning(data.item_id, textBlock(data.delta));\n }\n return;\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 state.hasDelta = true;\n yield items.deltaReasoning(data.item_id, textBlock(data.text));\n } else if (data.text) {\n state.doneTexts.push(data.text);\n }\n return;\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 items.deltaReasoning(data.item_id, textBlock(data.delta));\n }\n return;\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 state.hasDelta = true;\n yield items.deltaReasoning(data.item_id, textBlock(data.text));\n } else if (data.text) {\n state.doneTexts.push(data.text);\n }\n return;\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 return;\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 items.deltaReasoning(data.item_id, textBlock(data.delta));\n }\n return;\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 state.hasDelta = true;\n yield items.deltaReasoning(data.item_id, textBlock(data.text));\n }\n yield* completeReasoning(data.item_id, data.text ?? state.doneTexts.join(\"\\n\"), \"full\");\n return;\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) {\n const callId = resolveToolCallId(data.item_id);\n toolCallArgDeltas.add(callId);\n yield items.deltaToolCall(callId, { argumentsText: data.delta });\n }\n return;\n }\n\n if (sseEvent.type === \"response.function_call_arguments.done\") {\n const data = sseEvent.data as { item_id: string; arguments: string };\n const callId = resolveToolCallId(data.item_id);\n // 若 added 事件缺失,done 时仍尽量从 completed payload 之外兜底 call_id\n if (!toolCallIds.has(data.item_id)) toolCallIds.set(data.item_id, callId);\n const name = toolCallNames.get(data.item_id) ?? \"unknown\";\n if (!items.isActive(callId)) {\n yield items.startToolCall(callId, name);\n }\n if (!toolCallArgDeltas.has(callId) && data.arguments) {\n yield items.deltaToolCall(callId, { argumentsText: data.arguments });\n toolCallArgDeltas.add(callId);\n }\n if (items.isActive(callId)) {\n yield items.completeToolCall(callId);\n }\n return;\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\", WarningCode.DUPLICATE_FINISH);\n return;\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 = extracted.text || (state && state.doneTexts.length > 0 ? state.doneTexts.join(\"\\n\") : \"\");\n // Only complete if we already tracked this item (session or reasoningStates).\n if (state || items.isActive(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 WarningCode.PROVIDER_FAILURE,\n );\n }\n return;\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 WarningCode.UNKNOWN_PROVIDER_EVENT,\n );\n }\n }\n\n return {\n items,\n getCompletedResponse: () => completedResponse,\n handleEvent,\n };\n}\n","/**\n * Responses Adapter\n *\n * 接入 OpenAI Responses API (responses 端点)。\n * 编排层:buildRequest + runStream(open → SSE 处理 → complete)。\n * 可选能力:compress → POST /responses/compact(ContextCompressCapable)。\n */\n\nimport { HttpAdapterBase } from \"../../provider/http-adapter.js\";\nimport { opaqueItem } from \"../../canonical/index.js\";\nimport { usageFromOpenAIResponses } from \"../../provider/usage/index.js\";\nimport { createSseJsonParser } from \"../../provider/transport/parser.js\";\nimport { postProviderJson } from \"../../provider/transport/open-stream.js\";\nimport { finalizeStreamTurn } from \"../../provider/finalize-stream-turn.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\nimport { AIStreamError } from \"../../runtime/errors.js\";\nimport { buildResponsesCompactRequest, buildResponsesRequest, RESPONSES_COMPACTED_WINDOW_KIND } from \"./map-request.js\";\nimport { inferResponsesStopReason } from \"./infer-stop-reason.js\";\nimport { createResponsesSseProcessor } from \"./map-items.js\";\n\nimport type {\n AIStreamEvent,\n CompressRequest,\n CompressResult,\n ContextCompressCapable,\n NormalizedRequest,\n} from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type {\n ResponsesAdapterOptions,\n ResponsesAPIRequest,\n ResponsesCompactAPIResponse,\n ResponsesSSEEvent,\n} from \"./types.js\";\n\nexport class ResponsesAdapter extends HttpAdapterBase implements ContextCompressCapable {\n readonly kind = \"responses\" as const;\n readonly isSyntheticStream = false;\n\n constructor(options: ResponsesAdapterOptions) {\n super(options, { baseUrl: \"https://api.openai.com/v1\" });\n }\n\n protected buildRequest(request: NormalizedRequest): ResponsesAPIRequest {\n return this.withExtraBody(buildResponsesRequest(request));\n }\n\n /**\n * 原生上下文压缩:POST /responses/compact。\n * 结果以单个 opaque(kind=compacted_window) 回传;调用方用 replay 替换旧 transcript。\n */\n async compress(request: CompressRequest): Promise<CompressResult> {\n request.signal?.throwIfAborted();\n\n const body = this.withExtraBody(buildResponsesCompactRequest(request));\n const { data } = await postProviderJson<ResponsesCompactAPIResponse>({\n fetchFn: this.fetchFn,\n url: `${this.baseUrl}/responses/compact`,\n headers: this.mergeHeaders({\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n }),\n body,\n signal: request.signal,\n });\n\n if (!data || typeof data !== \"object\" || !Array.isArray(data.output)) {\n throw new AIStreamError(\"Responses compact response missing output array\", \"STREAM_PROTOCOL_ERROR\");\n }\n\n const payload: Record<string, unknown> = {\n kind: RESPONSES_COMPACTED_WINDOW_KIND,\n output: data.output,\n };\n if (typeof data.id === \"string\" && data.id.length > 0 && data.id.length <= 256) {\n payload.id = data.id;\n }\n\n const result: CompressResult = {\n replay: [opaqueItem(OPAQUE_SOURCE.RESPONSES, \"replay\", payload)],\n };\n\n if (data.usage) {\n const usage = usageFromOpenAIResponses(data.usage);\n if (Object.keys(usage).length > 0) {\n result.usage = usage;\n }\n if (request.include?.usage === \"best_effort\" || request.include?.providerMetadata === \"best_effort\") {\n result.auxiliary = {\n usageSource: \"final\",\n providerUsage: data.usage,\n };\n }\n }\n\n if (typeof data.id === \"string\" && data.id.length > 0) {\n result.rawResponseId = data.id;\n }\n\n return result;\n }\n\n protected async *runStream(\n providerRequest: ResponsesAPIRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n const session = this.beginJsonStream(factory, request);\n const { auxiliary } = session;\n\n await session.open({\n url: `${this.baseUrl}/responses`,\n headers: this.mergeHeaders({\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n }),\n body: providerRequest,\n });\n\n const parser = createSseJsonParser<ResponsesSSEEvent>();\n const processor = createResponsesSseProcessor(factory);\n\n for await (const batch of session.batches({\n parser,\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 for (const sseEvent of batch.items) {\n yield* processor.handleEvent(sseEvent);\n }\n }\n\n const completedResponse = processor.getCompletedResponse();\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 stopReason = completedResponse ? inferResponsesStopReason(completedResponse) : undefined;\n\n yield* finalizeStreamTurn(session, processor.items, {\n // 同时保留 id(向后兼容)与 previous_response_id(语义明确)\n opaque: completedResponse?.id\n ? opaqueItem(OPAQUE_SOURCE.RESPONSES, \"replay\", {\n id: completedResponse.id,\n previous_response_id: completedResponse.id,\n })\n : null,\n stopReason,\n rawResponseId,\n onDuplicate: \"silent\",\n });\n }\n}\n","/**\n * MessagesAdapter — request 映射\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport { contentBlocksToText } from \"../../canonical/index.js\";\nimport { acceptOpaqueReplay } from \"../../provider/opaque-replay.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { mapMessagesThinking } from \"../../provider/reasoning.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\n\nimport type { NormalizedRequest, ContentBlock } from \"../../types/index.js\";\nimport type { MessagesAPIRequest, MessagesAPIMessage, MessagesAPIContentBlock, MessagesAPITool } from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"messages\");\n\nexport function 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\nexport function 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\nexport type 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\nexport type 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 碰撞 */\nexport function synthesizeItemId(\n kind: \"msg\" | \"reason\" | \"reason-redacted\",\n blockIndex: number,\n responseId: string,\n): string {\n return `${kind}-${blockIndex}-${responseId}`;\n}\n\n// ── Content block 映射 ─────────────────────────────────────────\n\nexport function canonicalToMessagesBlock(b: 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\nexport function 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\nexport function 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\nexport function buildMessagesRequest(request: NormalizedRequest): MessagesAPIRequest {\n mapper.assertNoServerTools(request.serverTools);\n\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 // assistant opaque 始终 replace 尾部(与 replaceCanonical 语义一致)\n const payload = acceptOpaqueReplay(item, OPAQUE_SOURCE.MESSAGES);\n if (!payload) break;\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 if (request.reasoningLevel !== undefined) {\n body.thinking = mapMessagesThinking(request.reasoningLevel, body.max_tokens);\n }\n\n return body;\n}\n","/**\n * MessagesAdapter — stream 映射\n */\n\nimport { AIRequestError, WarningCode } from \"../../runtime/errors.js\";\nimport { textBlock, opaqueItem, mapStopReason } from \"../../canonical/index.js\";\nimport { usageFromAnthropicMessages } from \"../../provider/usage/index.js\";\nimport { createSseJsonParser } from \"../../provider/transport/parser.js\";\nimport { createStreamingItemSession } from \"../../provider/streaming-item-session.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { parseJsonLooseObject } from \"../../provider/json-parse.js\";\nimport { finalizeStreamTurn } from \"../../provider/finalize-stream-turn.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, ContentBlock } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { MessagesAPIRequest, MessagesAPIContentBlock } from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"messages\");\n\nexport function 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\nexport function 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\nexport type 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\nexport type 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 碰撞 */\nexport function synthesizeItemId(\n kind: \"msg\" | \"reason\" | \"reason-redacted\",\n blockIndex: number,\n responseId: string,\n): string {\n return `${kind}-${blockIndex}-${responseId}`;\n}\n\n// ── Content block 映射 ─────────────────────────────────────────\n\nexport function canonicalToMessagesBlock(b: 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\nexport function 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\nexport function 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\nexport type MessagesAdapterStreamHost = {\n beginJsonStream: (\n factory: EventFactory,\n request: NormalizedRequest,\n ) => import(\"../../provider/transport/run-json-stream.js\").ProviderJsonStreamSession;\n baseUrl: string;\n apiKey?: string;\n mergeHeaders: (headers: Record<string, string>) => Record<string, string>;\n apiVersion: string;\n};\n\nexport async function* mapMessagesStream(\n host: MessagesAdapterStreamHost,\n providerRequest: MessagesAPIRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n): AsyncIterable<AIStreamEvent> {\n const session = host.beginJsonStream(factory, request);\n const { auxiliary } = session;\n\n if (request.metadata) {\n yield factory.responseWarning(\n \"Request metadata is not supported by the Messages adapter\",\n WarningCode.UNSUPPORTED_METADATA,\n );\n }\n\n const { headers } = await session.open({\n url: `${host.baseUrl}/messages`,\n headers: host.mergeHeaders({\n \"Content-Type\": \"application/json\",\n \"x-api-key\": host.apiKey ?? \"\",\n \"anthropic-version\": host.apiVersion,\n }),\n body: providerRequest,\n });\n\n const parser = createSseJsonParser<MessagesSSEEvent>();\n const items = createStreamingItemSession(factory);\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 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 session.batches({\n parser,\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 // provider 自定义 err.type 不进入 WarningCode;统一记 PROVIDER_FAILURE,原文保留在 message\n yield factory.responseWarning(\n err.type ? `${err.type}: ${err.message}` : err.message,\n WarningCode.PROVIDER_FAILURE,\n );\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 items.startMessage(currentItemId);\n break;\n }\n case \"thinking\": {\n currentItemType = \"reasoning\";\n currentItemId = synthesizeItemId(\"reason\", currentContentBlockIndex, rawResponseId);\n currentThinkingVisibility = \"full\";\n thinkingBuffer = \"\";\n yield items.startReasoning(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 items.startReasoning(currentItemId, \"redacted\");\n yield items.deltaReasoning(currentItemId, textBlock(data));\n yield items.completeReasoning(currentItemId);\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 argsBuffer = \"\";\n yield items.startToolCall(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 items.deltaMessage(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 items.deltaReasoning(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 items.deltaToolCall(currentItemId, { argumentsText: partial });\n }\n break;\n }\n }\n continue;\n }\n\n case \"content_block_stop\": {\n if (currentItemType === \"message\" && currentItemId) {\n yield items.completeMessage(currentItemId);\n rawReplayContent.push({ type: \"text\", text: textBuffer });\n } else if (currentItemType === \"reasoning\" && currentItemId && currentThinkingVisibility !== \"redacted\") {\n yield items.completeReasoning(currentItemId);\n rawReplayContent.push({ type: \"thinking\", thinking: thinkingBuffer });\n } else if (currentItemType === \"tool_call\" && currentItemId) {\n yield items.completeToolCall(currentItemId);\n rawReplayContent.push({\n type: \"tool_use\",\n id: currentItemId,\n name: currentToolName,\n input: parseJsonLooseObject(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 if (request.include?.providerMetadata !== \"off\") {\n auxiliary.recordProviderMetadata(\n \"stream\",\n buildStreamMetadata({\n apiVersion: host.apiVersion,\n message: messageResponse,\n stopReason,\n stopSequence,\n }),\n );\n }\n\n const opaque = messageResponse\n ? opaqueItem(OPAQUE_SOURCE.MESSAGES, \"replay\", {\n replaceCanonical: true,\n role: messageResponse.role,\n content: rawReplayContent.length > 0 ? rawReplayContent : messageResponse.content,\n messageId: messageResponse.id,\n stopReason: stopReason ?? messageResponse.stop_reason,\n })\n : null;\n\n yield* finalizeStreamTurn(session, items, {\n opaque,\n stopReason: stopReason ? mapStopReason(stopReason) : undefined,\n rawResponseId,\n onDuplicate: \"silent\",\n });\n}\n","/**\n * MessagesAdapter\n *\n * 编排层:buildRequest + runStream(委托 map-request / map-stream)。\n */\n\nimport { HttpAdapterBase } from \"../../provider/http-adapter.js\";\nimport type { NormalizedRequest, AIStreamEvent } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { MessagesAdapterOptions, MessagesAPIRequest } from \"./types.js\";\nimport { buildMessagesRequest } from \"./map-request.js\";\nimport { mapMessagesStream } from \"./map-stream.js\";\n\nexport class MessagesAdapter extends HttpAdapterBase {\n readonly kind = \"messages\" as const;\n readonly isSyntheticStream = false;\n private apiVersion: string;\n\n constructor(options: MessagesAdapterOptions) {\n super(options, { baseUrl: \"https://api.anthropic.com/v1\" });\n this.apiVersion = options.apiVersion ?? \"2023-06-01\";\n }\n\n protected buildRequest(request: NormalizedRequest): MessagesAPIRequest {\n return this.withExtraBody(buildMessagesRequest(request));\n }\n\n protected async *runStream(\n providerRequest: MessagesAPIRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n yield* mapMessagesStream(\n {\n beginJsonStream: this.beginJsonStream.bind(this),\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n mergeHeaders: this.mergeHeaders.bind(this),\n apiVersion: this.apiVersion,\n },\n providerRequest,\n factory,\n request,\n );\n }\n}\n","/**\n * OpenAI 风格 function tool 声明映射(chat.completions / ollama 等同构)。\n */\n\nimport type { ToolDefinition } from \"../types/index.js\";\n\nexport type OpenAiFunctionTool = {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters: Record<string, unknown>;\n };\n};\n\nexport function mapOpenAiFunctionTool(tool: ToolDefinition): OpenAiFunctionTool {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema as Record<string, unknown>,\n },\n };\n}\n","/**\n * ChatCompletionsAdapter wire / options 类型\n */\n\nimport type { HttpAdapterOptions } from \"../../provider/http-adapter.js\";\n\n/** apiKey 必填;默认 baseUrl https://api.openai.com/v1 */\nexport type ChatCompletionsAdapterOptions = HttpAdapterOptions & {\n apiKey: string;\n};\n\n// ── Chat API 请求类型 ─────────────────────────────────────────\n\nexport type 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 /** Portable reasoningLevel → reasoning_effort */\n reasoning_effort?: string;\n stream: true;\n n: 1;\n};\n\nexport type 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\nexport type ChatToolCall = {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n};\n\nexport type ChatTool = {\n type: \"function\";\n function: { name: string; description?: string; parameters: Record<string, unknown> };\n};\n\n// ── SSE chunk 类型 ────────────────────────────────────────────\n\nexport type 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\nexport type 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\nexport type ChatChunkToolCall = {\n index: number;\n id?: string;\n type?: string;\n function?: { name?: string; arguments?: string };\n};\n\nexport type PendingToolCall = {\n /** 真实 call id;未到 id 前用合成占位 id */\n id: string;\n name: string;\n args: string;\n /** 是否已向 StreamingItemSession 发出 startToolCall */\n started: boolean;\n /** 是否已收到 provider 的真实 id */\n hasProviderId: boolean;\n};\n\nexport type ReasoningFieldName = \"reasoning\" | \"reasoning_content\";\n\nexport const REASONING_FIELDS: readonly ReasoningFieldName[] = [\"reasoning_content\", \"reasoning\"];\n","/**\n * ChatCompletionsAdapter — request 映射\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport { acceptOpaqueReplay } from \"../../provider/opaque-replay.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { mapChatCompletionsReasoningEffort } from \"../../provider/reasoning.js\";\nimport { mapOpenAiFunctionTool } from \"../../provider/openai-tools.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\n\nimport type { NormalizedRequest } from \"../../types/index.js\";\nimport {\n REASONING_FIELDS,\n type ChatRequest,\n type ChatMessage,\n type ChatToolCall,\n type ChatChunkChoice,\n type PendingToolCall,\n type ReasoningFieldName,\n} from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"chat-completions\");\n\nexport function 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\nexport function extractReasoningDeltas(\n delta: ChatChunkChoice[\"delta\"],\n): 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\nexport function 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\nexport function 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\nexport function 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\nexport function 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\nexport function buildChatCompletionsRequest(request: NormalizedRequest): ChatRequest {\n mapper.assertNoServerTools(request.serverTools);\n\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 const payload = acceptOpaqueReplay(item, OPAQUE_SOURCE.CHAT_COMPLETIONS);\n if (!payload) break;\n // 仅接受 messages 形;单条 role/content 已 deprecate(有效 envelope 下未识别 shape 跳过)\n if (\"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 }\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(request.tools, mapOpenAiFunctionTool);\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 if (request.reasoningLevel !== undefined) {\n body.reasoning_effort = mapChatCompletionsReasoningEffort(request.reasoningLevel);\n }\n\n return body;\n}\n","/**\n * ChatCompletionsAdapter — stream 映射\n */\n\nimport { AIRequestError, WarningCode } from \"../../runtime/errors.js\";\nimport { textBlock, opaqueItem, mapStopReason } from \"../../canonical/index.js\";\nimport { createStreamingItemSession } from \"../../provider/streaming-item-session.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { usageFromChatCompletions } from \"../../provider/usage/index.js\";\nimport { createDataLineSseParser } from \"../../provider/transport/parser.js\";\nimport { finalizeStreamTurn } from \"../../provider/finalize-stream-turn.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, StopReason } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport {\n REASONING_FIELDS,\n type ChatRequest,\n type ChatMessage,\n type ChatToolCall,\n type ChatChunk,\n type ChatChunkChoice,\n type PendingToolCall,\n type ReasoningFieldName,\n} from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"chat-completions\");\n\nexport function 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\nexport function extractReasoningDeltas(\n delta: ChatChunkChoice[\"delta\"],\n): 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\nexport function 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\nexport function 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\nexport function 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\nexport function 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\nexport type ChatCompletionsAdapterStreamHost = {\n beginJsonStream: (\n factory: EventFactory,\n request: NormalizedRequest,\n ) => import(\"../../provider/transport/run-json-stream.js\").ProviderJsonStreamSession;\n baseUrl: string;\n apiKey?: string;\n mergeHeaders: (headers: Record<string, string>) => Record<string, string>;\n};\n\nexport async function* mapChatCompletionsStream(\n host: ChatCompletionsAdapterStreamHost,\n providerRequest: ChatRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n): AsyncIterable<AIStreamEvent> {\n const session = host.beginJsonStream(factory, request);\n const { auxiliary, gate } = session;\n const items = createStreamingItemSession(factory);\n\n await session.open({\n url: `${host.baseUrl}/chat/completions`,\n headers: host.mergeHeaders({\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${host.apiKey}`,\n }),\n body: providerRequest,\n });\n\n const parser = createDataLineSseParser<ChatChunk>();\n\n // wire 缓冲仅用于 opaque / finish 状态;item 内容账本由 items session 维护\n let responseId: string | undefined;\n let accumulatedContent = \"\";\n let currentMessageId = \"\";\n let currentReasoningId = \"\";\n let hasMessageStarted = false;\n let hasReasoningStarted = false;\n let warnedNonZeroChoice = false;\n\n // tool_calls 按 index 占位;function_call 使用独立槽位,避免与 index 0 互踩\n const pendingToolCalls = new Map<number, PendingToolCall>();\n let pendingFunctionCall: PendingToolCall | null = null;\n /** 互斥:同一轮只接受一种 tool 形态 */\n let toolCallMode: \"none\" | \"tool_calls\" | \"function_call\" = \"none\";\n const reasoningByField = new Map<ReasoningFieldName, string>();\n\n const allPendingToolCalls = (): PendingToolCall[] => {\n if (toolCallMode === \"function_call\" && pendingFunctionCall) {\n return [pendingFunctionCall];\n }\n return [...pendingToolCalls.values()];\n };\n\n const ensurePendingToolCallStarted = (pending: PendingToolCall, events: AIStreamEvent[]): void => {\n if (pending.started) return;\n events.push(items.startToolCall(pending.id, pending.name));\n if (pending.args) {\n events.push(items.deltaToolCall(pending.id, { argumentsText: pending.args }));\n }\n pending.started = true;\n };\n\n const finalizePendingTurn = (): { events: AIStreamEvent[]; assistantReplayMessage: ChatMessage | null } => {\n const events: AIStreamEvent[] = [];\n const finalizedToolCalls = allPendingToolCalls();\n const finalizedReasoningByField = new Map(reasoningByField);\n\n if (hasReasoningStarted && items.isActive(currentReasoningId)) {\n events.push(items.completeReasoning(currentReasoningId));\n }\n\n if (hasMessageStarted && items.isActive(currentMessageId)) {\n events.push(items.completeMessage(currentMessageId));\n }\n\n for (const pending of finalizedToolCalls) {\n ensurePendingToolCallStarted(pending, events);\n if (items.isActive(pending.id)) {\n events.push(items.completeToolCall(pending.id));\n }\n }\n\n const assistantReplayMessage = buildAssistantReplayMessage({\n content: accumulatedContent,\n reasoningByField: finalizedReasoningByField,\n toolCalls: finalizedToolCalls,\n });\n\n accumulatedContent = \"\";\n currentMessageId = \"\";\n currentReasoningId = \"\";\n hasMessageStarted = false;\n hasReasoningStarted = false;\n pendingToolCalls.clear();\n pendingFunctionCall = null;\n toolCallMode = \"none\";\n reasoningByField.clear();\n\n return { events, assistantReplayMessage };\n };\n\n const emitCompleted = async function* (\n stopReason: StopReason | undefined,\n assistantReplayMessage: ChatMessage | null,\n rawResponseId: string | undefined,\n ): AsyncIterable<AIStreamEvent> {\n yield* finalizeStreamTurn(session, items, {\n stopReason,\n rawResponseId,\n opaque: assistantReplayMessage\n ? opaqueItem(OPAQUE_SOURCE.CHAT_COMPLETIONS, \"replay\", {\n replaceCanonical: true,\n messages: [assistantReplayMessage],\n })\n : null,\n });\n };\n\n for await (const batch of session.batches({\n parser,\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 WarningCode.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\", WarningCode.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 = function* (): Generator<AIStreamEvent> {\n if (!currentMessageId) currentMessageId = `msg-${chunk.id}`;\n const started = items.ensureMessageStarted(currentMessageId);\n if (started) {\n hasMessageStarted = true;\n yield started;\n }\n };\n\n const ensureReasoningStarted = function* (): Generator<AIStreamEvent> {\n if (!currentReasoningId) currentReasoningId = `reason-${chunk.id}`;\n const started = items.ensureReasoningStarted(currentReasoningId, \"full\");\n if (started) {\n hasReasoningStarted = true;\n yield started;\n }\n };\n\n if (reasoningDeltas.length > 0) {\n yield* ensureReasoningStarted();\n\n for (const reasoningDelta of reasoningDeltas) {\n reasoningByField.set(\n reasoningDelta.field,\n (reasoningByField.get(reasoningDelta.field) ?? \"\") + reasoningDelta.text,\n );\n yield items.deltaReasoning(currentReasoningId, textBlock(reasoningDelta.text));\n }\n }\n\n if (delta.content) {\n yield* ensureMessageStarted();\n accumulatedContent += delta.content;\n yield items.deltaMessage(currentMessageId, textBlock(delta.content));\n }\n\n if (delta.tool_calls) {\n yield* ensureMessageStarted();\n\n if (toolCallMode === \"function_call\") {\n yield factory.responseWarning(\n \"Chat Completions mixed function_call and tool_calls; keeping tool_calls and discarding function_call state\",\n WarningCode.CAPABILITY_DOWNGRADE,\n );\n if (pendingFunctionCall?.started && items.isActive(pendingFunctionCall.id)) {\n // 已 start 的 legacy call 无法撤销 id;完成空壳以免协议挂起\n yield items.completeToolCall(pendingFunctionCall.id);\n }\n pendingFunctionCall = null;\n }\n toolCallMode = \"tool_calls\";\n\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n let pending = pendingToolCalls.get(idx);\n if (!pending) {\n pending = {\n id: tc.id ?? `pending-tc-${chunk.id}-${idx}`,\n name: tc.function?.name ?? \"\",\n args: \"\",\n started: false,\n hasProviderId: Boolean(tc.id),\n };\n pendingToolCalls.set(idx, pending);\n } else {\n if (tc.id && !pending.hasProviderId) {\n // start 前可替换占位 id\n if (!pending.started) {\n pending.id = tc.id;\n }\n pending.hasProviderId = true;\n }\n if (tc.function?.name) {\n pending.name = tc.function.name;\n }\n }\n\n if (tc.id && !pending.started) {\n pending.id = tc.id;\n pending.hasProviderId = true;\n pending.started = true;\n yield items.startToolCall(pending.id, pending.name);\n if (pending.args) {\n yield items.deltaToolCall(pending.id, { argumentsText: pending.args });\n }\n }\n\n if (tc.function?.arguments) {\n pending.args += tc.function.arguments;\n if (pending.started) {\n yield items.deltaToolCall(pending.id, { argumentsText: tc.function.arguments });\n }\n }\n }\n }\n\n if (delta.function_call) {\n yield* ensureMessageStarted();\n\n if (toolCallMode === \"tool_calls\") {\n yield factory.responseWarning(\n \"Chat Completions mixed tool_calls and function_call; ignoring legacy function_call for this turn\",\n WarningCode.CAPABILITY_DOWNGRADE,\n );\n } else {\n toolCallMode = \"function_call\";\n\n if (!pendingFunctionCall) {\n pendingFunctionCall = {\n id: `fc-${chunk.id}-0`,\n name: delta.function_call.name ?? \"\",\n args: \"\",\n started: false,\n hasProviderId: true,\n };\n }\n\n if (delta.function_call.name) {\n pendingFunctionCall.name = delta.function_call.name;\n }\n\n if (!pendingFunctionCall.started && pendingFunctionCall.name) {\n pendingFunctionCall.started = true;\n yield items.startToolCall(pendingFunctionCall.id, pendingFunctionCall.name);\n if (pendingFunctionCall.args) {\n yield items.deltaToolCall(pendingFunctionCall.id, {\n argumentsText: pendingFunctionCall.args,\n });\n }\n }\n\n if (delta.function_call.arguments) {\n pendingFunctionCall.args += delta.function_call.arguments;\n if (pendingFunctionCall.started) {\n yield items.deltaToolCall(pendingFunctionCall.id, {\n argumentsText: delta.function_call.arguments,\n });\n }\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 (\n !gate.completed &&\n (hasMessageStarted || hasReasoningStarted || pendingToolCalls.size > 0 || pendingFunctionCall !== null)\n ) {\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 * ChatCompletionsAdapter\n *\n * 编排层:buildRequest + runStream(委托 map-request / map-stream)。\n */\n\nimport { HttpAdapterBase } from \"../../provider/http-adapter.js\";\nimport type { NormalizedRequest, AIStreamEvent } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { ChatCompletionsAdapterOptions, ChatRequest } from \"./types.js\";\nimport { buildChatCompletionsRequest } from \"./map-request.js\";\nimport { mapChatCompletionsStream } from \"./map-stream.js\";\n\nexport class ChatCompletionsAdapter extends HttpAdapterBase {\n readonly kind = \"chat-completions\" as const;\n readonly isSyntheticStream = false;\n\n constructor(options: ChatCompletionsAdapterOptions) {\n super(options, { baseUrl: \"https://api.openai.com/v1\" });\n }\n\n protected buildRequest(request: NormalizedRequest): ChatRequest {\n return this.withExtraBody(buildChatCompletionsRequest(request));\n }\n\n protected async *runStream(\n providerRequest: ChatRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n yield* mapChatCompletionsStream(\n {\n beginJsonStream: this.beginJsonStream.bind(this),\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n mergeHeaders: this.mergeHeaders.bind(this),\n },\n providerRequest,\n factory,\n request,\n );\n }\n}\n","/**\n * OllamaAdapter — request 映射\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport { contentBlocksToText } from \"../../canonical/index.js\";\nimport { acceptOpaqueReplay } from \"../../provider/opaque-replay.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { mapOllamaThink } from \"../../provider/reasoning.js\";\nimport { mapOpenAiFunctionTool } from \"../../provider/openai-tools.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\n\nimport type { NormalizedRequest } from \"../../types/index.js\";\nimport type { OllamaChatRequest, OllamaMessage, OllamaToolCall } from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"ollama\");\n\n// ── Ollama 流式 chunk ─────────────────────────────────────────\n\nexport type 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. */\nexport type OllamaReplayToolCall = OllamaToolCall & { id?: string };\n\nexport function 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\nexport function 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\nexport function buildOllamaRequest(request: NormalizedRequest): OllamaChatRequest {\n mapper.assertNoServerTools(request.serverTools);\n\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 const payload = acceptOpaqueReplay(item, OPAQUE_SOURCE.OLLAMA);\n if (!payload) break;\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(mapOpenAiFunctionTool);\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 if (request.reasoningLevel !== undefined) {\n body.think = mapOllamaThink(request.reasoningLevel);\n }\n\n return body;\n}\n","/**\n * OllamaAdapter — stream 映射\n */\n\nimport { WarningCode } from \"../../runtime/errors.js\";\nimport { textBlock, opaqueItem, mapStopReason } from \"../../canonical/index.js\";\nimport { createStreamingItemSession } from \"../../provider/streaming-item-session.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { usageFromOllama } from \"../../provider/usage/index.js\";\nimport { createNdjsonLineParser } from \"../../provider/transport/parser.js\";\nimport { parseJsonLooseObject } from \"../../provider/json-parse.js\";\nimport { finalizeStreamTurn } from \"../../provider/finalize-stream-turn.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, StopReason } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { OllamaChatRequest, OllamaToolCall } from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"ollama\");\n\n// ── Ollama 流式 chunk ─────────────────────────────────────────\n\nexport type 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. */\nexport type OllamaReplayToolCall = OllamaToolCall & { id?: string };\n\nexport function 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\nexport function 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\nexport type OllamaAdapterStreamHost = {\n beginJsonStream: (\n factory: EventFactory,\n request: NormalizedRequest,\n ) => import(\"../../provider/transport/run-json-stream.js\").ProviderJsonStreamSession;\n baseUrl: string;\n apiKey?: string;\n mergeHeaders: (headers: Record<string, string>) => Record<string, string>;\n};\n\nexport async function* mapOllamaStream(\n host: OllamaAdapterStreamHost,\n providerRequest: OllamaChatRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n): AsyncIterable<AIStreamEvent> {\n const session = host.beginJsonStream(factory, request);\n const { auxiliary, gate } = session;\n const items = createStreamingItemSession(factory);\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(\n \"Request metadata is not supported by the Ollama adapter\",\n WarningCode.UNSUPPORTED_METADATA,\n );\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (host.apiKey) {\n headers.Authorization = `Bearer ${host.apiKey}`;\n }\n\n await session.open({\n url: `${host.baseUrl}/api/chat`,\n headers: host.mergeHeaders(headers),\n body: providerRequest,\n });\n\n const parser = createNdjsonLineParser<OllamaChatChunk>(\n (value): value is OllamaChatChunk => !!value && typeof value === \"object\" && \"message\" in value,\n );\n\n // wire 缓冲仅用于 opaque;item 内容由 items session 维护\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 ensureMessageStarted = function* (idSeed: string): Generator<AIStreamEvent> {\n if (!currentMessageId) currentMessageId = `msg-${idSeed}`;\n const started = items.ensureMessageStarted(currentMessageId);\n if (started) {\n hasMessageStarted = true;\n yield started;\n }\n };\n\n /** done / incomplete 共用:flush message + batched tool_calls */\n const flushPendingItems = function* (idSeed: string): Generator<AIStreamEvent> {\n if (accumulatedContent === \"\" && pendingToolCalls.length > 0 && !hasMessageStarted) {\n yield* ensureMessageStarted(idSeed);\n }\n\n // 已 start 的空 message 也 complete 进 session(事件权威)\n if (hasMessageStarted && items.isActive(currentMessageId)) {\n yield items.completeMessage(currentMessageId);\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 yield items.startToolCall(pending.id, pending.name);\n yield items.deltaToolCall(pending.id, { argumentsText: pending.argumentsText });\n yield items.completeToolCall(pending.id);\n }\n };\n\n const emitCompleted = async function* (\n stopReason: StopReason | undefined,\n rawResponseId: string | undefined,\n ): AsyncIterable<AIStreamEvent> {\n yield* finalizeStreamTurn(session, items, {\n stopReason,\n rawResponseId,\n opaque:\n accumulatedContent || pendingToolCalls.length > 0\n ? opaqueItem(OPAQUE_SOURCE.OLLAMA, \"replay\", {\n role: \"assistant\",\n content: accumulatedContent,\n tool_calls: pendingToolCalls.map((tc) => ({\n id: tc.id,\n function: { name: tc.name, arguments: parseJsonLooseObject(tc.argumentsText) },\n })),\n })\n : null,\n });\n };\n\n for await (const batch of session.batches({\n parser,\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\", WarningCode.DUPLICATE_FINISH);\n }\n continue;\n }\n\n const msg = chunk.message;\n\n if (msg.content) {\n yield* ensureMessageStarted(chunk.created_at);\n accumulatedContent += msg.content;\n yield items.deltaMessage(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 yield* flushPendingItems(chunk.created_at);\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 yield* flushPendingItems(responseId ?? request.requestId);\n yield* emitCompleted(undefined, responseId);\n }\n}\n","/**\n * OllamaAdapter\n *\n * 编排层:buildRequest + runStream(委托 map-request / map-stream)。\n */\n\nimport { HttpAdapterBase } from \"../../provider/http-adapter.js\";\nimport type { NormalizedRequest, AIStreamEvent } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { OllamaAdapterOptions, OllamaChatRequest } from \"./types.js\";\nimport { buildOllamaRequest } from \"./map-request.js\";\nimport { mapOllamaStream } from \"./map-stream.js\";\n\nexport class OllamaAdapter extends HttpAdapterBase {\n readonly kind = \"ollama\" as const;\n readonly isSyntheticStream = false;\n\n constructor(options: OllamaAdapterOptions = {}) {\n super(options, { baseUrl: \"http://localhost:11434\" });\n }\n\n protected buildRequest(request: NormalizedRequest): OllamaChatRequest {\n return this.withExtraBody(buildOllamaRequest(request));\n }\n\n protected async *runStream(\n providerRequest: OllamaChatRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n yield* mapOllamaStream(\n {\n beginJsonStream: this.beginJsonStream.bind(this),\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n mergeHeaders: this.mergeHeaders.bind(this),\n },\n providerRequest,\n factory,\n request,\n );\n }\n}\n","/**\n * GeminiAdapter — request 映射\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport { contentBlocksToText } from \"../../canonical/index.js\";\nimport { acceptOpaqueReplay } from \"../../provider/opaque-replay.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { mapGeminiThinking } from \"../../provider/reasoning.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\n\nimport type { NormalizedRequest, ContentBlock } from \"../../types/index.js\";\nimport type {\n GeminiPart,\n GeminiContent,\n GeminiTool,\n GeminiFunctionCallingConfig,\n GeminiGenerateContentRequest,\n} from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"gemini\");\n\nexport function normalizeModelPath(model: string): string {\n return model.startsWith(\"models/\") ? model.slice(\"models/\".length) : model;\n}\n\nexport function isGeminiPart(value: unknown): value is GeminiPart {\n return !!value && typeof value === \"object\";\n}\n\nexport function isGeminiContent(value: unknown): value is GeminiContent {\n if (!value || typeof value !== \"object\") return false;\n const content = value as Record<string, unknown>;\n if (content.role !== \"user\" && content.role !== \"model\") return false;\n if (!Array.isArray(content.parts)) return false;\n return content.parts.every(isGeminiPart);\n}\n\nexport function assertGeminiReplayContent(content: unknown, field: string): asserts content is GeminiContent {\n if (!isGeminiContent(content)) {\n throw new AIRequestError(\n `Invalid opaque replay payload: ${field} is not a valid Gemini content object`,\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n}\n\nexport function appendPart(contents: GeminiContent[], role: \"user\" | \"model\", part: GeminiPart): void {\n const last = contents[contents.length - 1];\n if (last && last.role === role) {\n last.parts.push(part);\n return;\n }\n contents.push({ role, parts: [part] });\n}\n\nexport function textPartsFromBlocks(blocks: ContentBlock[], field: string): GeminiPart[] {\n const supported = mapper.ensureTextBlocks(blocks, field);\n return supported.map((block) => {\n if (block.type === \"text\") return { text: block.text };\n if (block.type === \"json\") return { text: JSON.stringify(block.json) };\n throw new AIRequestError(\n `gemini does not support content block type \"${block.type}\" in ${field}`,\n \"UNSUPPORTED_CONTENT_BLOCK\",\n );\n });\n}\n\nexport function clonePart(part: GeminiPart): GeminiPart {\n return { ...part };\n}\n\nexport function cloneContent(content: GeminiContent): GeminiContent {\n return {\n role: content.role,\n parts: content.parts.map(clonePart),\n };\n}\n\nexport function mergeModelParts(base: GeminiPart[], incoming: GeminiPart[]): GeminiPart[] {\n const result = base.map(clonePart);\n for (const part of incoming) {\n const last = result[result.length - 1];\n const sameTextBucket =\n last &&\n typeof last.text === \"string\" &&\n typeof part.text === \"string\" &&\n !!last.thought === !!part.thought &&\n !last.functionCall &&\n !part.functionCall &&\n !last.functionResponse &&\n !part.functionResponse;\n\n if (sameTextBucket) {\n last.text = `${last.text ?? \"\"}${part.text ?? \"\"}`;\n if (part.thoughtSignature) last.thoughtSignature = part.thoughtSignature;\n continue;\n }\n\n result.push(clonePart(part));\n }\n return result;\n}\n\nexport function buildGeminiRequest(request: NormalizedRequest): GeminiGenerateContentRequest {\n mapper.assertNoServerTools(request.serverTools);\n\n const contents: GeminiContent[] = [];\n let systemInstruction: GeminiGenerateContentRequest[\"systemInstruction\"];\n\n if (request.instructions) {\n systemInstruction = {\n parts: [{ text: mapper.mapInstructions(request.instructions) }],\n };\n }\n\n for (const item of request.input) {\n switch (item.type) {\n case \"message\": {\n const role = item.role === \"assistant\" ? \"model\" : \"user\";\n for (const part of textPartsFromBlocks(item.content, `input message (${item.role}) content`)) {\n appendPart(contents, role, part);\n }\n break;\n }\n case \"tool_call\": {\n const part: GeminiPart = {\n functionCall: {\n id: item.id,\n name: item.name,\n args: mapper.parseToolArguments(item),\n },\n };\n appendPart(contents, \"model\", part);\n break;\n }\n case \"tool_result\": {\n let response: Record<string, unknown>;\n try {\n const text = mapper.textFromBlocks(item.content, `tool_result ${item.callId} content`);\n const parsed: unknown = text ? JSON.parse(text) : {};\n response =\n parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : { result: text };\n } catch {\n response = {\n result: mapper.textFromBlocks(item.content, `tool_result ${item.callId} content`),\n };\n }\n\n appendPart(contents, \"user\", {\n functionResponse: {\n id: item.callId,\n name: item.toolName,\n response,\n },\n });\n break;\n }\n case \"reasoning\": {\n const text = contentBlocksToText(mapper.ensureReasoningBlocks(item.content, \"reasoning content\"));\n appendPart(contents, \"model\", { text, thought: true });\n break;\n }\n case \"opaque\": {\n const payload = acceptOpaqueReplay(item, OPAQUE_SOURCE.GEMINI);\n if (!payload) break;\n if (payload.replaceCanonical === true && \"content\" in payload) {\n assertGeminiReplayContent(payload.content, \"content\");\n mapper.rollbackTrailingAssistantMessages(contents, \"model\");\n contents.push(cloneContent(payload.content));\n } else if (isGeminiContent(payload)) {\n mapper.rollbackTrailingAssistantMessages(contents, \"model\");\n contents.push(cloneContent(payload));\n }\n break;\n }\n }\n }\n\n const body: GeminiGenerateContentRequest = {\n contents,\n };\n\n if (systemInstruction) body.systemInstruction = systemInstruction;\n\n body.tools = mapper.mapToolsIfPresent(\n request.tools,\n (tool): GeminiTool => ({\n functionDeclarations: [\n {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n ],\n }),\n );\n\n // Gemini tools 通常合并为一个 tool 对象下的 declarations\n if (body.tools && body.tools.length > 1) {\n body.tools = [\n {\n functionDeclarations: body.tools.flatMap((tool) => tool.functionDeclarations),\n },\n ];\n }\n\n const functionCallingConfig = mapper.mapToolChoice<GeminiFunctionCallingConfig>(request.toolChoice, {\n auto: { mode: \"AUTO\" },\n none: { mode: \"NONE\" },\n tool: (name) => ({ mode: \"ANY\", allowedFunctionNames: [name] }),\n });\n if (functionCallingConfig) {\n body.toolConfig = { functionCallingConfig };\n }\n\n const generationConfig: NonNullable<GeminiGenerateContentRequest[\"generationConfig\"]> = {};\n if (request.temperature !== undefined) generationConfig.temperature = request.temperature;\n if (request.maxOutputTokens !== undefined) generationConfig.maxOutputTokens = request.maxOutputTokens;\n if (request.reasoningLevel !== undefined) {\n generationConfig.thinkingConfig = mapGeminiThinking(request.reasoningLevel);\n }\n if (Object.keys(generationConfig).length > 0) {\n body.generationConfig = generationConfig;\n }\n\n return body;\n}\n","/**\n * GeminiAdapter — stream 映射\n */\n\nimport { AIRequestError, WarningCode } from \"../../runtime/errors.js\";\nimport { textBlock, opaqueItem, mapStopReason } from \"../../canonical/index.js\";\nimport { createStreamingItemSession } from \"../../provider/streaming-item-session.js\";\nimport { usageFromGemini } from \"../../provider/usage/index.js\";\nimport { createDataLineSseParser } from \"../../provider/transport/parser.js\";\nimport { finalizeStreamTurn } from \"../../provider/finalize-stream-turn.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, StopReason, ContentBlock } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { GeminiPart, GeminiContent, GeminiGenerateContentRequest, GeminiStreamChunk } from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"gemini\");\n\nexport function normalizeModelPath(model: string): string {\n return model.startsWith(\"models/\") ? model.slice(\"models/\".length) : model;\n}\n\nexport function isGeminiPart(value: unknown): value is GeminiPart {\n return !!value && typeof value === \"object\";\n}\n\nexport function isGeminiContent(value: unknown): value is GeminiContent {\n if (!value || typeof value !== \"object\") return false;\n const content = value as Record<string, unknown>;\n if (content.role !== \"user\" && content.role !== \"model\") return false;\n if (!Array.isArray(content.parts)) return false;\n return content.parts.every(isGeminiPart);\n}\n\nexport function assertGeminiReplayContent(content: unknown, field: string): asserts content is GeminiContent {\n if (!isGeminiContent(content)) {\n throw new AIRequestError(\n `Invalid opaque replay payload: ${field} is not a valid Gemini content object`,\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n}\n\nexport function appendPart(contents: GeminiContent[], role: \"user\" | \"model\", part: GeminiPart): void {\n const last = contents[contents.length - 1];\n if (last && last.role === role) {\n last.parts.push(part);\n return;\n }\n contents.push({ role, parts: [part] });\n}\n\nexport function textPartsFromBlocks(blocks: ContentBlock[], field: string): GeminiPart[] {\n const supported = mapper.ensureTextBlocks(blocks, field);\n return supported.map((block) => {\n if (block.type === \"text\") return { text: block.text };\n if (block.type === \"json\") return { text: JSON.stringify(block.json) };\n throw new AIRequestError(\n `gemini does not support content block type \"${block.type}\" in ${field}`,\n \"UNSUPPORTED_CONTENT_BLOCK\",\n );\n });\n}\n\nexport function clonePart(part: GeminiPart): GeminiPart {\n return { ...part };\n}\n\nexport function cloneContent(content: GeminiContent): GeminiContent {\n return {\n role: content.role,\n parts: content.parts.map(clonePart),\n };\n}\n\nexport function mergeModelParts(base: GeminiPart[], incoming: GeminiPart[]): GeminiPart[] {\n const result = base.map(clonePart);\n for (const part of incoming) {\n const last = result[result.length - 1];\n const sameTextBucket =\n last &&\n typeof last.text === \"string\" &&\n typeof part.text === \"string\" &&\n !!last.thought === !!part.thought &&\n !last.functionCall &&\n !part.functionCall &&\n !last.functionResponse &&\n !part.functionResponse;\n\n if (sameTextBucket) {\n last.text = `${last.text ?? \"\"}${part.text ?? \"\"}`;\n if (part.thoughtSignature) last.thoughtSignature = part.thoughtSignature;\n continue;\n }\n\n result.push(clonePart(part));\n }\n return result;\n}\n\nexport type GeminiAdapterStreamHost = {\n beginJsonStream: (\n factory: EventFactory,\n request: NormalizedRequest,\n ) => import(\"../../provider/transport/run-json-stream.js\").ProviderJsonStreamSession;\n baseUrl: string;\n apiKey?: string;\n mergeHeaders: (headers: Record<string, string>) => Record<string, string>;\n};\n\nexport async function* mapGeminiStream(\n host: GeminiAdapterStreamHost,\n providerRequest: GeminiGenerateContentRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n): AsyncIterable<AIStreamEvent> {\n const session = host.beginJsonStream(factory, request);\n const { auxiliary, gate } = session;\n const items = createStreamingItemSession(factory);\n\n if (request.metadata) {\n yield factory.responseWarning(\n \"Request metadata is not supported by the Gemini adapter\",\n WarningCode.UNSUPPORTED_METADATA,\n );\n }\n\n const modelPath = normalizeModelPath(request.model);\n await session.open({\n url: `${host.baseUrl}/models/${modelPath}:streamGenerateContent?alt=sse`,\n headers: host.mergeHeaders({\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": host.apiKey ?? \"\",\n }),\n body: providerRequest,\n });\n\n const parser = createDataLineSseParser<GeminiStreamChunk>();\n\n let responseId: string | undefined;\n let currentMessageId = \"\";\n let currentReasoningId = \"\";\n let hasMessageStarted = false;\n let hasReasoningStarted = false;\n let pendingToolCalls: Array<{ id: string; name: string; argumentsText: string }> = [];\n let replayParts: GeminiPart[] = [];\n let toolCallIndex = 0;\n let stopReason: StopReason | undefined;\n let sawPromptBlock = false;\n\n const ensureMessageStarted = function* (): Generator<AIStreamEvent> {\n if (!currentMessageId) currentMessageId = `msg-${responseId ?? request.requestId}`;\n const started = items.ensureMessageStarted(currentMessageId);\n if (started) {\n hasMessageStarted = true;\n yield started;\n }\n };\n\n const ensureReasoningStarted = function* (): Generator<AIStreamEvent> {\n if (!currentReasoningId) currentReasoningId = `reason-${responseId ?? request.requestId}`;\n const started = items.ensureReasoningStarted(currentReasoningId, \"full\");\n if (started) {\n hasReasoningStarted = true;\n yield started;\n }\n };\n\n const finalizePendingItems = function* (): Generator<AIStreamEvent> {\n if (hasReasoningStarted && items.isActive(currentReasoningId)) {\n yield items.completeReasoning(currentReasoningId);\n }\n\n if (hasMessageStarted && items.isActive(currentMessageId)) {\n yield items.completeMessage(currentMessageId);\n }\n\n if (pendingToolCalls.length > 1) {\n yield factory.responseWarning(\n `Gemini delivered ${pendingToolCalls.length} tool call(s) in this turn; arguments arrive as whole objects`,\n WarningCode.TOOL_CALL_BATCHED,\n );\n }\n\n for (const pending of pendingToolCalls) {\n if (items.isActive(pending.id)) {\n yield items.completeToolCall(pending.id);\n }\n }\n };\n\n const emitCompleted = async function* (\n reason: StopReason | undefined,\n rawResponseId: string | undefined,\n ): AsyncIterable<AIStreamEvent> {\n // finalize 仅应在首次 complete 前执行;session.complete 内部 gate 防重\n if (gate.completed) {\n yield factory.responseWarning(\"Duplicate finish signal ignored\", WarningCode.DUPLICATE_FINISH);\n return;\n }\n\n yield* finalizePendingItems();\n\n yield* finalizeStreamTurn(session, items, {\n stopReason: reason,\n rawResponseId,\n opaque:\n replayParts.length > 0\n ? opaqueItem(OPAQUE_SOURCE.GEMINI, \"replay\", {\n replaceCanonical: true,\n content: {\n role: \"model\",\n parts: replayParts.map(clonePart),\n },\n })\n : null,\n });\n };\n\n for await (const batch of session.batches({\n parser,\n providerLabel: \"Gemini\",\n transportLabel: \"SSE event(s)\",\n incompleteMessage: \"Stream ended with an incomplete Gemini SSE frame\",\n })) {\n for (const warning of batch.warnings) yield warning;\n\n for (const chunk of batch.items) {\n if (chunk.responseId) responseId = chunk.responseId;\n\n if (chunk.usageMetadata && request.include?.usage !== \"off\") {\n auxiliary.recordUsage(usageFromGemini(chunk.usageMetadata), \"stream\", chunk.usageMetadata);\n }\n\n if (chunk.promptFeedback?.blockReason) {\n sawPromptBlock = true;\n stopReason = \"content_filter\";\n yield factory.responseWarning(\n `Gemini blocked the prompt: ${chunk.promptFeedback.blockReason}`,\n WarningCode.CONTENT_FILTER,\n );\n if (!gate.completed) {\n yield* emitCompleted(stopReason, responseId);\n }\n continue;\n }\n\n if (gate.completed) {\n if (chunk.candidates?.some((c) => c.finishReason)) {\n yield factory.responseWarning(\"Duplicate finish signal ignored\", WarningCode.DUPLICATE_FINISH);\n }\n continue;\n }\n\n const candidate = chunk.candidates?.[0];\n if (!candidate) continue;\n\n const parts = candidate.content?.parts ?? [];\n if (parts.length > 0) {\n replayParts = mergeModelParts(replayParts, parts);\n }\n\n for (const part of parts) {\n if (part.functionCall) {\n const name = part.functionCall.name;\n const id = part.functionCall.id ?? `gemini-fc-${toolCallIndex++}-${responseId ?? request.requestId}`;\n const args = part.functionCall.args ?? {};\n const argumentsText = JSON.stringify(args);\n\n // functionCall 前若有未完成 message/reasoning,先不 complete,等 finish\n pendingToolCalls.push({ id, name, argumentsText });\n yield items.startToolCall(id, name);\n yield items.deltaToolCall(id, { argumentsText });\n continue;\n }\n\n if (typeof part.text !== \"string\" || part.text.length === 0) {\n // thoughtSignature-only / 空 part:仅保留在 replay\n continue;\n }\n\n if (part.thought) {\n yield* ensureReasoningStarted();\n yield items.deltaReasoning(currentReasoningId, textBlock(part.text));\n } else {\n yield* ensureMessageStarted();\n yield items.deltaMessage(currentMessageId, textBlock(part.text));\n }\n }\n\n if (candidate.finishReason) {\n const reason = mapStopReason(candidate.finishReason);\n // 有 tool_call 时优先 tool_call 语义\n const effectiveReason =\n pendingToolCalls.length > 0 && (reason === \"end_turn\" || reason === \"unknown\") ? \"tool_call\" : reason;\n stopReason = effectiveReason;\n yield* emitCompleted(effectiveReason, responseId);\n }\n }\n }\n\n if (!gate.completed) {\n if (hasMessageStarted || hasReasoningStarted || pendingToolCalls.length > 0 || sawPromptBlock) {\n if (!sawPromptBlock) {\n yield factory.responseWarning(\"Stream ended without a finishReason\", WarningCode.STREAM_INCOMPLETE);\n }\n yield* emitCompleted(stopReason, responseId);\n } else {\n // 契约差异:Gemini 空流也 emit completed;chat/ollama 仅在有 pending item 时 incomplete complete\n yield* emitCompleted(undefined, responseId);\n }\n }\n}\n","/**\n * GeminiAdapter\n *\n * 编排层:buildRequest + runStream(委托 map-request / map-stream)。\n */\n\nimport { HttpAdapterBase } from \"../../provider/http-adapter.js\";\nimport type { NormalizedRequest, AIStreamEvent } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { GeminiAdapterOptions, GeminiGenerateContentRequest } from \"./types.js\";\nimport { buildGeminiRequest } from \"./map-request.js\";\nimport { mapGeminiStream } from \"./map-stream.js\";\n\nexport class GeminiAdapter extends HttpAdapterBase {\n readonly kind = \"gemini\" as const;\n readonly isSyntheticStream = false;\n\n constructor(options: GeminiAdapterOptions) {\n super(options, { baseUrl: \"https://generativelanguage.googleapis.com/v1beta\" });\n }\n\n protected buildRequest(request: NormalizedRequest): GeminiGenerateContentRequest {\n return this.withExtraBody(buildGeminiRequest(request));\n }\n\n protected async *runStream(\n providerRequest: GeminiGenerateContentRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n yield* mapGeminiStream(\n {\n beginJsonStream: this.beginJsonStream.bind(this),\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n mergeHeaders: this.mergeHeaders.bind(this),\n },\n providerRequest,\n factory,\n request,\n );\n }\n}\n","/**\n * Mock 流式包装与事件发射\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport { messageItem, reasoningItem, serverToolCallItem, textBlock } from \"../../canonical/index.js\";\nimport type {\n AIStreamEvent,\n ContentBlock,\n MessageItem,\n NormalizedRequest,\n OutputItem,\n ServerToolCallItem,\n ToolCallItem,\n} from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type {\n MockHandler,\n MockHandlerContext,\n MockMessageStep,\n MockReasoningStep,\n MockServerToolCallStep,\n MockStaticHandler,\n MockStep,\n MockTextStreamOptions,\n MockToolCallStep,\n ResolvedMockTextStreamOptions,\n} from \"./types.js\";\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\nexport function applyDefaultStreaming(step: MockStep, defaults: ResolvedMockTextStreamOptions): MockStep {\n switch (step.type) {\n case \"message\":\n case \"reasoning\":\n case \"tool_call\":\n case \"server_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\nexport function 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 ...(step.citations ? { citations: step.citations } : {}),\n }),\n role: \"assistant\",\n };\n}\n\nexport function 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\nexport function 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\nexport function createServerToolCallFromStep(step: MockServerToolCallStep): ServerToolCallItem {\n return serverToolCallItem(step.id, step.tool, {\n name: step.name,\n argumentsText: step.argumentsText,\n serverLabel: step.serverLabel,\n status: step.status ?? \"completed\",\n providerPayload: step.providerPayload,\n });\n}\n\nexport function normalizeBlocks(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === \"string\" ? [textBlock(content)] : content;\n}\n\nexport function 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\nexport function 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\nexport async 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\nexport async 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, item.citations ? { citations: item.citations } : undefined);\n}\n\nexport async 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\nexport async 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\nexport async function* emitServerToolCall(\n factory: EventFactory,\n item: ServerToolCallItem,\n streamArguments: boolean,\n stream?: ResolvedMockTextStreamOptions,\n): AsyncIterable<AIStreamEvent> {\n yield factory.serverToolStarted(item.id, item.tool, {\n name: item.name,\n serverLabel: item.serverLabel,\n });\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.serverToolDelta(item.id, { argumentsText: chunk });\n chunkIndex += 1;\n }\n } else if (item.argumentsText) {\n yield factory.serverToolDelta(item.id, { argumentsText: item.argumentsText });\n }\n\n yield factory.serverToolCompleted(item.id, {\n status: item.status === \"failed\" ? \"failed\" : \"completed\",\n providerPayload: item.providerPayload,\n });\n}\n\nexport function 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\nexport function 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\nexport function 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\nexport async 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\nexport async function sleep(ms: number): Promise<void> {\n if (ms <= 0) {\n return;\n }\n\n await new Promise((resolve) => setTimeout(resolve, ms));\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 \"../../runtime/errors.js\";\nimport { AdapterBase } from \"../../provider/base.js\";\nimport { replayFromOutput } from \"../../canonical/index.js\";\nimport type {\n AIStreamEvent,\n CompressRequest,\n CompressResult,\n ContextCompressCapable,\n NormalizedRequest,\n OutputItem,\n ReplayItem,\n ToolCallItem,\n ToolResultItem,\n InputItem,\n StopReason,\n} from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type {\n MockAdapterOptions,\n MockCompleteStep,\n MockCompressHandler,\n MockHandler,\n MockHandlerContext,\n MockHistoryRecord,\n MockProviderRequest,\n} from \"./types.js\";\nimport {\n attachSyntheticId,\n assertSupportedOutputItem,\n createMessageFromStep,\n createReasoningFromStep,\n createServerToolCallFromStep,\n createToolCallFromStep,\n emitMessage,\n emitOutputItem,\n emitReasoning,\n emitServerToolCall,\n emitToolCall,\n resolveStepStreamOptions,\n} from \"./streaming.js\";\n\nexport class MockAdapter extends AdapterBase implements ContextCompressCapable {\n readonly kind = \"mock\" as const;\n readonly isSyntheticStream = true;\n\n private readonly handler: MockHandler;\n private readonly providerMetadata?: Record<string, unknown>;\n private readonly compressHandler?: MockCompressHandler;\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 this.compressHandler = options.compressHandler;\n }\n\n /**\n * 可选压缩夹具:需构造时提供 compressHandler,否则抛 MOCK_COMPRESS_NOT_CONFIGURED。\n * 始终存在 compress 方法以便 supportsContextCompress(mock) === true。\n */\n async compress(request: CompressRequest): Promise<CompressResult> {\n request.signal?.throwIfAborted();\n if (!this.compressHandler) {\n throw new AIRequestError(\"MockAdapter compress handler not configured\", \"MOCK_COMPRESS_NOT_CONFIGURED\");\n }\n return this.compressHandler(request);\n }\n\n protected async buildRequest(request: NormalizedRequest): Promise<MockProviderRequest> {\n const turnIndex = this.cursor;\n const context = this.buildHandlerContext(turnIndex, request);\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 \"server_tool_call\": {\n const item = createServerToolCallFromStep(step);\n yield* emitServerToolCall(\n factory,\n item,\n step.streamArguments ?? true,\n resolveStepStreamOptions(undefined, step.stream, \"server_tool_call\"),\n );\n output.push(item);\n break;\n }\n case \"server_tool_result\": {\n yield factory.serverToolResultCompleted(step.item);\n output.push(step.item);\n break;\n }\n case \"server_tool_discovery\": {\n yield factory.serverToolDiscoveryCompleted(step.item);\n output.push(step.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 yield factory.responseCompleted(this.finalizeTurn(request, factory, mockRequest, output, step, stepCount));\n return;\n }\n case \"error\": {\n yield factory.responseWarning(step.message, step.code);\n yield factory.responseCompleted(\n 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 );\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 yield factory.responseCompleted(\n this.finalizeTurn(\n request,\n factory,\n mockRequest,\n output,\n {\n type: \"complete\",\n },\n stepCount,\n ),\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.buildCompletedPayload(\n request,\n {\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, request: NormalizedRequest): 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: request.signal,\n reasoningLevel: request.reasoningLevel,\n };\n }\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 cloneItem<T>(item: T): T {\n return structuredClone(item);\n}\n","/**\n * Mock 请求期望校验\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport type { ContentBlock, InputItem, NormalizedRequest, ReplayItem, ToolResultItem } from \"../../types/index.js\";\nimport type { MockHandlerContext, MockInputExpectation, MockRequestExpectation } from \"./types.js\";\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.serverTools === \"present\" && (!request.serverTools || request.serverTools.length === 0)) {\n throw new AIRequestError(`${prefix}: expected serverTools to be present`, \"MOCK_EXPECTATION_FAILED\");\n }\n\n if (expectation.serverTools === \"absent\" && request.serverTools && request.serverTools.length > 0) {\n throw new AIRequestError(`${prefix}: expected serverTools 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 function 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\nexport function 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\nexport function 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\nexport function 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 \"server_tool_call\":\n return (\n (expected.name === undefined || item.name === expected.name) &&\n (expected.textIncludes === undefined ||\n (item.argumentsText !== undefined && item.argumentsText.includes(expected.textIncludes)))\n );\n case \"server_tool_result\":\n return (\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 \"server_tool_discovery\":\n return expected.name === undefined || item.serverLabel === expected.name;\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\nexport function 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\nexport function fingerprintItem(item: InputItem): string {\n return JSON.stringify(item);\n}\n\nexport function 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\nexport function cloneItem<T>(item: T): T {\n return structuredClone(item);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["exhaustive","mapper","mapper","mapper","mapper","mapper","mapper","mapper","mapper","clonePart"],"sources":["../src/types/kind.ts","../src/types/request.ts","../src/types/warning-codes.ts","../src/types/compress.ts","../src/runtime/errors.ts","../src/runtime/validation.ts","../src/runtime/normalize.ts","../src/runtime/client.ts","../src/canonical/content.ts","../src/canonical/replay.ts","../src/stream/merge-auxiliary.ts","../src/stream/aggregator.ts","../src/stream/collect-stream.ts","../src/canonical/stop-reason.ts","../src/canonical/items.ts","../src/stream/event-factory.ts","../src/provider/auxiliary-collector.ts","../src/provider/auxiliary.ts","../src/provider/base.ts","../src/provider/request-options.ts","../src/provider/security.ts","../src/provider/transport/open-stream.ts","../src/provider/transport/run-json-stream.ts","../src/provider/http-adapter.ts","../src/provider/usage/index.ts","../src/provider/transport/parser.ts","../src/provider/finalize-stream-turn.ts","../src/provider/opaque-sources.ts","../src/provider/opaque-replay.ts","../src/provider/json-parse.ts","../src/provider/request-mapper.ts","../src/provider/reasoning.ts","../src/adapters/responses/map-server-tools.ts","../src/adapters/responses/map-request.ts","../src/adapters/responses/infer-stop-reason.ts","../src/provider/streaming-item-session.ts","../src/adapters/responses/map-items.ts","../src/adapters/responses/adapter.ts","../src/adapters/messages/map-request.ts","../src/adapters/messages/map-stream.ts","../src/adapters/messages/adapter.ts","../src/provider/openai-tools.ts","../src/adapters/chat-completions/types.ts","../src/adapters/chat-completions/map-request.ts","../src/adapters/chat-completions/map-stream.ts","../src/adapters/chat-completions/adapter.ts","../src/adapters/ollama/map-request.ts","../src/adapters/ollama/map-stream.ts","../src/adapters/ollama/adapter.ts","../src/adapters/gemini/map-request.ts","../src/adapters/gemini/map-stream.ts","../src/adapters/gemini/adapter.ts","../src/adapters/mock/streaming.ts","../src/adapters/mock/adapter.ts","../src/adapters/mock/expectations.ts"],"sourcesContent":["/**\n * Adapter kind 标识\n *\n * KnownAdapterKind 覆盖内置 adapter;\n * AdapterKind 额外接受任意 string,便于自定义 backend 扩展(无需改库联合类型)。\n */\n\nexport const KNOWN_ADAPTER_KINDS = [\"chat-completions\", \"messages\", \"responses\", \"ollama\", \"gemini\", \"mock\"] as const;\n\nexport type KnownAdapterKind = (typeof KNOWN_ADAPTER_KINDS)[number];\n\n/** 内置 kind 自动补全 + 自定义 string 扩展 */\nexport type AdapterKind = KnownAdapterKind | (string & {});\n","/**\n * AIRequest — 统一请求模型\n *\n * 所有 adapter 都接受同一形状的 canonical request。\n */\n\nimport type { InstructionBlock } from \"./content.js\";\nimport type { InputItem } from \"./items.js\";\n\n// ── 客户端工具定义 ────────────────────────────────────────────\n\nexport type ToolDefinition = {\n name: string;\n description?: string;\n inputSchema: Record<string, unknown>;\n};\n\nexport type ToolChoice = \"auto\" | \"none\" | { type: \"tool\"; name: string };\n\n// ── 服务端工具定义 ────────────────────────────────────────────\n\nexport type WebSearchUserLocation = {\n type: \"approximate\";\n country?: string;\n city?: string;\n region?: string;\n timezone?: string;\n};\n\nexport type WebSearchServerTool = {\n type: \"web_search\";\n allowedDomains?: string[];\n blockedDomains?: string[];\n userLocation?: WebSearchUserLocation;\n searchContextSize?: \"low\" | \"medium\" | \"high\";\n};\n\nexport type CodeExecutionServerTool = {\n type: \"code_execution\";\n container?: {\n type: \"auto\";\n memoryLimit?: \"1g\" | \"4g\" | \"16g\" | \"64g\";\n fileIds?: string[];\n };\n};\n\nexport type McpServerTool = {\n type: \"mcp\";\n serverLabel: string;\n serverUrl: string;\n serverDescription?: string;\n /** 每请求由调用方提供;不得写入日志或 opaque 回放。 */\n authorization?: string;\n allowedTools?: string[];\n /** 首版仅支持 never */\n requireApproval: \"never\";\n};\n\n/** Provider 托管执行的工具声明(不进客户端 tool loop) */\nexport type ServerToolDefinition = WebSearchServerTool | CodeExecutionServerTool | McpServerTool;\n\n// ── include 控制 ──────────────────────────────────────────────\n\nexport type IncludeSettings = {\n usage?: \"off\" | \"best_effort\";\n billing?: \"off\" | \"best_effort\";\n providerMetadata?: \"off\" | \"best_effort\";\n};\n\n// ── reasoning level ───────────────────────────────────────────\n\n/** Portable reasoning / thinking effort. Mapped per-adapter to provider wire fields. */\nexport type ReasoningLevel = \"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\n/** 可移植 reasoning level 枚举(单源;validation / provider 共用)。 */\nexport const REASONING_LEVELS = [\n \"none\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n] as const satisfies readonly ReasoningLevel[];\n\n/** 用于校验任意字符串 membership;值域与 REASONING_LEVELS 一致。 */\nexport const REASONING_LEVEL_SET: ReadonlySet<string> = new Set(REASONING_LEVELS);\n\n// ── 统一请求 ──────────────────────────────────────────────────\n\nexport type AIRequest = {\n instructions?: string | InstructionBlock[];\n input: InputItem[];\n tools?: ToolDefinition[];\n /** Provider 托管工具(web_search / code_execution / mcp 等);与 tools 可共存 */\n serverTools?: ServerToolDefinition[];\n toolChoice?: ToolChoice;\n include?: IncludeSettings;\n metadata?: Record<string, string>;\n temperature?: number;\n maxOutputTokens?: number;\n /**\n * Portable reasoning effort. Adapters map this to provider-native fields\n * (e.g. Responses `reasoning.effort`, Chat Completions `reasoning_effort`,\n * Messages `thinking`, Ollama `think`, Gemini `thinkingConfig`).\n * Unsupported levels throw.\n */\n reasoningLevel?: ReasoningLevel;\n /** AbortSignal 用于打断请求。abort 时 fetch 调用会被取消,流迭代器抛出 AbortError。 */\n signal?: AbortSignal;\n};\n","/**\n * 标准 warning 代码 — types 层单源\n *\n * runtime.errors 与 events 均从此导出,避免手工双表漂移。\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 STREAM_ERROR: \"STREAM_ERROR\",\n /** 能力降级 */\n CAPABILITY_DOWNGRADE: \"CAPABILITY_DOWNGRADE\",\n /** 模拟流式 */\n SYNTHETIC_STREAM: \"SYNTHETIC_STREAM\",\n /** 工具调用以批量方式到达(非 token 级流式) */\n TOOL_CALL_BATCHED: \"TOOL_CALL_BATCHED\",\n /** AIMappingError 降级为 warning */\n MAPPING_ERROR: \"MAPPING_ERROR\",\n /** 入站 tool_call.argumentsText 非合法 JSON object(object-wire adapter soft-complete) */\n TOOL_CALL_ARGUMENTS_INVALID: \"TOOL_CALL_ARGUMENTS_INVALID\",\n /** 请求 metadata 不被该 adapter 支持 */\n UNSUPPORTED_METADATA: \"UNSUPPORTED_METADATA\",\n /** 重复 finish / done 信号被忽略 */\n DUPLICATE_FINISH: \"DUPLICATE_FINISH\",\n /** provider 发出未知事件类型 */\n UNKNOWN_PROVIDER_EVENT: \"UNKNOWN_PROVIDER_EVENT\",\n /** 内容被安全/策略过滤 */\n CONTENT_FILTER: \"CONTENT_FILTER\",\n /** 多 choice 仅支持 index 0,其余忽略 */\n MULTIPLE_CHOICES_IGNORED: \"MULTIPLE_CHOICES_IGNORED\",\n /** MCP 审批流不被支持 */\n MCP_APPROVAL_REQUIRED: \"MCP_APPROVAL_REQUIRED\",\n /** provider 侧 response.failed 等失败 */\n PROVIDER_FAILURE: \"PROVIDER_FAILURE\",\n /** 出站 opaque 超限被省略(避免下一轮 accept 自产毒) */\n OPAQUE_REPLAY_OMITTED: \"OPAQUE_REPLAY_OMITTED\",\n} as const;\n\nexport type WarningCodeName = (typeof WarningCode)[keyof typeof WarningCode];\n\n/** 与 WarningCodeName 同义;保留以兼容既有 KnownWarningCode 命名 */\nexport type KnownWarningCode = WarningCodeName;\n\n/** 已知码 + 开放字符串扩展 */\nexport type WarningCodeValue = KnownWarningCode | (string & {});\n\n/** 结构化 warning(AIResponse / response.completed / factory 共用) */\nexport type StreamWarning = {\n message: string;\n code?: WarningCodeValue;\n};\n\n/**\n * 去重键:以 message 为主(与旧 string[] 行为一致)。\n * 同一 message 若先无 code 后有 code,保留先到的那条。\n */\nexport function streamWarningKey(warning: StreamWarning): string {\n return warning.message;\n}\n","/**\n * 上下文压缩能力接口\n *\n * 仅由原生支持压缩的 adapter 实现;不扩展 BackendAdapter / AIClient。\n * 调用方通过 supportsContextCompress 做能力探测。\n */\n\nimport type { InstructionBlock } from \"./content.js\";\nimport type { InputItem, ReplayItem } from \"./items.js\";\nimport type { IncludeSettings } from \"./request.js\";\nimport type { AuxiliaryInfo, Usage } from \"./response.js\";\nimport type { BackendAdapter } from \"./adapter.js\";\n\n/** 显式上下文压缩请求(独立于 stream) */\nexport type CompressRequest = {\n model: string;\n input: InputItem[];\n instructions?: string | InstructionBlock[];\n include?: IncludeSettings;\n /** AbortSignal 用于打断压缩请求。 */\n signal?: AbortSignal;\n};\n\n/** 压缩结果:调用方用 replay 替换旧 transcript(非 append 全文) */\nexport type CompressResult = {\n replay: ReplayItem[];\n usage?: Usage;\n auxiliary?: AuxiliaryInfo;\n rawResponseId?: string;\n};\n\n/** Adapter 可选能力:原生上下文压缩 */\nexport interface ContextCompressCapable {\n compress(request: CompressRequest): Promise<CompressResult>;\n}\n\n/** 探测 adapter 是否实现 compress(不依赖 kind 硬编码)。 */\nexport function supportsContextCompress(adapter: BackendAdapter): adapter is BackendAdapter & ContextCompressCapable {\n return typeof (adapter as Partial<ContextCompressCapable>).compress === \"function\";\n}\n","/**\n * 公共错误模型\n *\n * 把失败、降级、断流三类情况明确区分:\n * - 致命错误(AIRequestError / AIProviderError / AIStreamError)→ 同步抛错或迭代器抛错\n * - AIMappingError → AdapterBase 捕获后降级为 response.warning + 空 output 的 response.completed(无 stopReason)\n * - AIRecoverableError → AdapterBase 捕获后 soft-complete:response.warning + response.completed(stopReason 默认 \"error\")\n * - 非致命差异 → warning 通道(WarningCode)\n * - 流中断 → 不伪造 response.completed\n */\n\nimport type { StopReason } from \"../types/response.js\";\n\n// ── 错误类型 ──────────────────────────────────────────────────\n\n/**\n * 已知错误码。保留补全;未知码用 `string & {}` 扩展,避免 `| string` 吞掉字面量提示。\n * ValidationIssue.code 可更细,不强制全部列入此处;以作为 AIError.code 传入的码为主。\n */\nexport type KnownErrorCode =\n | \"INPUT_EMPTY\"\n | \"TEMPERATURE_OUT_OF_RANGE\"\n | \"MAX_OUTPUT_TOKENS_INVALID\"\n | \"TOOL_CHOICE_NO_TOOLS\"\n | \"TOOL_CHOICE_UNKNOWN_TOOL\"\n | \"TOOL_CALL_ARGUMENTS_INVALID\"\n | \"PROVIDER_ERROR\"\n | \"AUTH_ERROR\"\n | \"STREAM_ERROR\"\n | \"STREAM_PROTOCOL_ERROR\"\n | \"MAPPING_ERROR\"\n | \"STREAM_INCOMPLETE\"\n | \"LOOKUP_FAILED\"\n | \"LOOKUP_TIMEOUT\"\n | \"INVALID_OPAQUE_REPLAY\"\n | \"UNSUPPORTED_CONTENT_BLOCK\"\n | \"UNSUPPORTED_SERVER_TOOL\"\n | \"UNSUPPORTED_REASONING_LEVEL\"\n | \"UNSUPPORTED_COMPRESS\"\n | \"MOCK_CONCURRENT_STREAM\"\n | \"MOCK_COMPRESS_NOT_CONFIGURED\"\n | \"MOCK_EXPECTATION_FAILED\"\n | \"MOCK_STREAM_CONFIG_INVALID\"\n | \"MOCK_OPAQUE_OUTPUT\"\n | \"MOCK_MESSAGE_ID_MISSING\"\n | \"MOCK_REASONING_ID_MISSING\";\n\nexport type ErrorCode = KnownErrorCode | (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/**\n * Provider 调用失败 — HTTP 非 2xx、网络错误。\n * AdapterBase **rethrow**(致命),不会转为 warning。\n */\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/**\n * 流协议/传输损坏 — SSE 解析失败、chunk 格式异常、body 不可读等。\n * 致命:同步或在异步迭代中抛出,不伪造 response.completed。\n */\nexport class AIStreamError extends AIError {\n constructor(message: string, code: ErrorCode) {\n super(message, code, \"AIStreamError\");\n }\n}\n\n/**\n * Canonical 映射失败 — 无法将 provider 响应映射到 canonical 类型。\n *\n * AdapterBase 捕获后降级为:\n * - `response.warning`(code = MAPPING_ERROR)\n * - 空 output 的 `response.completed`\n *\n * 生产 adapter 原则上不应抛出;此路径是协议级降级通道(测试 / 防御性边界)。\n */\nexport class AIMappingError extends AIError {\n constructor(message: string, code: ErrorCode) {\n super(message, code, \"AIMappingError\");\n }\n}\n\n/**\n * 可恢复的回合失败 — buildRequest / runStream 中可安全 soft-complete 的语义错误。\n *\n * AdapterBase 在 `response.started` 之后捕获后降级为:\n * - `response.warning`(code = 错误 code,通常对齐 WarningCode)\n * - 空 replay 的 `response.completed`(`stopReason` 默认 `\"error\"`)\n *\n * 与 AIMappingError 的区别:recoverable 携带显式 stopReason,表示调用方应清理\n * 中毒历史后重试;mapping 是协议级降级通道,通常不带 stopReason。\n */\nexport class AIRecoverableError extends AIError {\n constructor(\n message: string,\n code: ErrorCode,\n public readonly stopReason: StopReason = \"error\",\n ) {\n super(message, code, \"AIRecoverableError\");\n }\n}\n\n// ── Warning 辅助(单源在 types/warning-codes)────────────────\n\nexport { WarningCode, streamWarningKey } from \"../types/warning-codes.js\";\nexport type { WarningCodeName, KnownWarningCode, WarningCodeValue, StreamWarning } from \"../types/warning-codes.js\";\n","/**\n * 请求校验\n *\n * 在请求进入 adapter 前对参数合法性做基础检查。\n * 校验失败时抛 AIRequestError。\n */\n\nimport type { AIRequest } from \"../types/index.js\";\nimport { REASONING_LEVEL_SET } from \"../types/request.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 \"server_tool_call\":\n if (typeof item.id !== \"string\" || item.id.length === 0) {\n pushIssue(issues, `${field}.id`, \"SERVER_TOOL_CALL_INVALID\", `${field}.id must be a non-empty string`);\n }\n if (typeof item.tool !== \"string\" || item.tool.length === 0) {\n pushIssue(issues, `${field}.tool`, \"SERVER_TOOL_CALL_INVALID\", `${field}.tool must be a non-empty string`);\n }\n if (item.argumentsText !== undefined && typeof item.argumentsText !== \"string\") {\n pushIssue(\n issues,\n `${field}.argumentsText`,\n \"SERVER_TOOL_CALL_INVALID\",\n `${field}.argumentsText must be a string`,\n );\n }\n return;\n case \"server_tool_result\":\n if (typeof item.callId !== \"string\" || item.callId.length === 0) {\n pushIssue(\n issues,\n `${field}.callId`,\n \"SERVER_TOOL_RESULT_INVALID\",\n `${field}.callId must be a non-empty string`,\n );\n }\n if (typeof item.tool !== \"string\" || item.tool.length === 0) {\n pushIssue(issues, `${field}.tool`, \"SERVER_TOOL_RESULT_INVALID\", `${field}.tool must be a non-empty string`);\n }\n if (item.outcome !== \"success\" && item.outcome !== \"error\") {\n pushIssue(\n issues,\n `${field}.outcome`,\n \"SERVER_TOOL_RESULT_INVALID\",\n `${field}.outcome must be success or error`,\n );\n }\n validateContentArray(item.content, `${field}.content`, issues, \"SERVER_TOOL_RESULT_INVALID\");\n return;\n case \"server_tool_discovery\":\n if (typeof item.id !== \"string\" || item.id.length === 0) {\n pushIssue(issues, `${field}.id`, \"SERVER_TOOL_DISCOVERY_INVALID\", `${field}.id must be a non-empty string`);\n }\n if (item.tool !== \"mcp\") {\n pushIssue(issues, `${field}.tool`, \"SERVER_TOOL_DISCOVERY_INVALID\", `${field}.tool must be \"mcp\"`);\n }\n if (typeof item.serverLabel !== \"string\" || item.serverLabel.length === 0) {\n pushIssue(\n issues,\n `${field}.serverLabel`,\n \"SERVER_TOOL_DISCOVERY_INVALID\",\n `${field}.serverLabel must be a non-empty string`,\n );\n }\n if (!Array.isArray(item.tools)) {\n pushIssue(issues, `${field}.tools`, \"SERVER_TOOL_DISCOVERY_INVALID\", `${field}.tools must be an array`);\n }\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 // 仅校验 shape;JSON object 语义由 adapter 映射(parseToolArguments)负责\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 }\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\nconst SEARCH_CONTEXT_SIZES = new Set([\"low\", \"medium\", \"high\"]);\nconst CODE_MEMORY_LIMITS = new Set([\"1g\", \"4g\", \"16g\", \"64g\"]);\n\nfunction validateStringArrayField(value: unknown, field: string, code: string, issues: ValidationIssue[]): void {\n if (!Array.isArray(value)) {\n pushIssue(issues, field, code, `${field} must be a string array`);\n return;\n }\n for (let i = 0; i < value.length; i++) {\n if (typeof value[i] !== \"string\" || value[i].length === 0) {\n pushIssue(issues, `${field}[${i}]`, code, `${field}[${i}] must be a non-empty string`);\n }\n }\n}\n\nfunction validateServerTools(serverTools: unknown, issues: ValidationIssue[]): void {\n if (serverTools === undefined) return;\n if (!Array.isArray(serverTools)) {\n pushIssue(issues, \"serverTools\", \"SERVER_TOOLS_INVALID\", \"serverTools must be an array\");\n return;\n }\n\n for (let i = 0; i < serverTools.length; i++) {\n const tool = serverTools[i];\n const field = `serverTools[${i}]`;\n if (!isRecord(tool) || typeof tool.type !== \"string\") {\n pushIssue(issues, field, \"SERVER_TOOL_INVALID\", `${field} must be a valid ServerToolDefinition`);\n continue;\n }\n\n switch (tool.type) {\n case \"web_search\": {\n if (tool.allowedDomains !== undefined && tool.blockedDomains !== undefined) {\n pushIssue(\n issues,\n field,\n \"SERVER_TOOL_WEB_SEARCH_DOMAINS_CONFLICT\",\n `${field} cannot set both allowedDomains and blockedDomains`,\n );\n }\n if (tool.allowedDomains !== undefined) {\n validateStringArrayField(tool.allowedDomains, `${field}.allowedDomains`, \"SERVER_TOOL_INVALID\", issues);\n }\n if (tool.blockedDomains !== undefined) {\n validateStringArrayField(tool.blockedDomains, `${field}.blockedDomains`, \"SERVER_TOOL_INVALID\", issues);\n }\n if (tool.searchContextSize !== undefined) {\n if (typeof tool.searchContextSize !== \"string\" || !SEARCH_CONTEXT_SIZES.has(tool.searchContextSize)) {\n pushIssue(\n issues,\n `${field}.searchContextSize`,\n \"SERVER_TOOL_INVALID\",\n `${field}.searchContextSize must be low, medium, or high`,\n );\n }\n }\n if (tool.userLocation !== undefined) {\n if (!isRecord(tool.userLocation) || tool.userLocation.type !== \"approximate\") {\n pushIssue(\n issues,\n `${field}.userLocation`,\n \"SERVER_TOOL_INVALID\",\n `${field}.userLocation must be { type: \"approximate\", ... }`,\n );\n } else {\n for (const key of [\"country\", \"city\", \"region\", \"timezone\"] as const) {\n const value = tool.userLocation[key];\n if (value !== undefined && typeof value !== \"string\") {\n pushIssue(\n issues,\n `${field}.userLocation.${key}`,\n \"SERVER_TOOL_INVALID\",\n `${field}.userLocation.${key} must be a string`,\n );\n }\n }\n }\n }\n break;\n }\n case \"code_execution\": {\n if (tool.container !== undefined) {\n if (!isRecord(tool.container) || tool.container.type !== \"auto\") {\n pushIssue(\n issues,\n `${field}.container`,\n \"SERVER_TOOL_INVALID\",\n `${field}.container must be { type: \"auto\", ... }`,\n );\n } else {\n if (tool.container.memoryLimit !== undefined) {\n if (\n typeof tool.container.memoryLimit !== \"string\" ||\n !CODE_MEMORY_LIMITS.has(tool.container.memoryLimit)\n ) {\n pushIssue(\n issues,\n `${field}.container.memoryLimit`,\n \"SERVER_TOOL_INVALID\",\n `${field}.container.memoryLimit must be 1g, 4g, 16g, or 64g`,\n );\n }\n }\n if (tool.container.fileIds !== undefined) {\n validateStringArrayField(\n tool.container.fileIds,\n `${field}.container.fileIds`,\n \"SERVER_TOOL_INVALID\",\n issues,\n );\n }\n }\n }\n break;\n }\n case \"mcp\": {\n if (typeof tool.serverLabel !== \"string\" || tool.serverLabel.length === 0) {\n pushIssue(\n issues,\n `${field}.serverLabel`,\n \"SERVER_TOOL_INVALID\",\n `${field}.serverLabel must be a non-empty string`,\n );\n }\n if (typeof tool.serverUrl !== \"string\" || tool.serverUrl.length === 0) {\n pushIssue(\n issues,\n `${field}.serverUrl`,\n \"SERVER_TOOL_INVALID\",\n `${field}.serverUrl must be a non-empty string`,\n );\n }\n if (tool.serverDescription !== undefined && typeof tool.serverDescription !== \"string\") {\n pushIssue(\n issues,\n `${field}.serverDescription`,\n \"SERVER_TOOL_INVALID\",\n `${field}.serverDescription must be a string`,\n );\n }\n if (tool.authorization !== undefined && typeof tool.authorization !== \"string\") {\n pushIssue(issues, `${field}.authorization`, \"SERVER_TOOL_INVALID\", `${field}.authorization must be a string`);\n }\n if (tool.allowedTools !== undefined) {\n validateStringArrayField(tool.allowedTools, `${field}.allowedTools`, \"SERVER_TOOL_INVALID\", issues);\n }\n if (tool.requireApproval !== \"never\") {\n pushIssue(\n issues,\n `${field}.requireApproval`,\n \"SERVER_TOOL_MCP_APPROVAL_UNSUPPORTED\",\n `${field}.requireApproval must be \"never\" in this version`,\n );\n }\n break;\n }\n default:\n pushIssue(\n issues,\n `${field}.type`,\n \"SERVER_TOOL_TYPE_UNSUPPORTED\",\n `${field}.type \"${tool.type}\" is not supported`,\n );\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 // reasoningLevel 枚举\n if (request.reasoningLevel !== undefined) {\n if (typeof request.reasoningLevel !== \"string\" || !REASONING_LEVEL_SET.has(request.reasoningLevel)) {\n pushIssue(\n issues,\n \"reasoningLevel\",\n \"REASONING_LEVEL_INVALID\",\n \"reasoningLevel must be one of: none, minimal, low, medium, high, xhigh, max\",\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 validateServerTools(request.serverTools, 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 // include 已在合并前校验;assertValidRequest 仍覆盖其余字段(含合并后的 include 形状)\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 * Content block 构造与文本提取\n */\n\nimport type { ContentBlock } from \"../types/index.js\";\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/**\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/**\n * 合并相邻 text content blocks(直接拼接、不插入分隔符)。\n * 非 text block 保留边界。供 aggregator 与 StreamingItemSession 共用。\n */\nexport function 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 // text 合并路径需要可变副本\n previous.text += block.text;\n } else if (block.type === \"text\") {\n result.push({ type: \"text\", text: block.text });\n } else {\n // 非 text 按不可变约定直接引用,避免无意义 spread\n result.push(block);\n }\n }\n return result;\n}\n","/**\n * Replay 与输出文本提取\n */\n\nimport type { ContentBlock, InputItem, MessageItem, OutputItem, ReplayItem } from \"../types/index.js\";\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 case \"server_tool_call\":\n case \"server_tool_result\":\n case \"server_tool_discovery\":\n return item as InputItem;\n case \"opaque\":\n return item;\n }\n });\n}\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","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 ServerToolCallItem,\n ServerToolResultItem,\n ServerToolDiscoveryItem,\n OutputItem,\n Usage,\n BillingInfo,\n AuxiliaryInfo,\n BackendTrace,\n StopReason,\n ContentBlock,\n Citation,\n StreamWarning,\n} from \"../types/index.js\";\nimport { streamWarningKey } from \"../types/warning-codes.js\";\nimport { coalesceContentBlocks } from \"../canonical/content.js\";\nimport { extractText } from \"../canonical/replay.js\";\nimport { AIStreamError } from \"../runtime/errors.js\";\nimport { mergeAuxiliary } from \"./merge-auxiliary.js\";\n\n// coalesceContentBlocks 自 canonical;见 finalizeMessage / finalizeReasoning\n\n// ── Active item types ─────────────────────────────────────────\n\ntype ActiveMessage = {\n type: \"message\";\n id: string;\n role: \"assistant\";\n content: ContentBlock[];\n citations?: Citation[];\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 argumentChunks: string[];\n};\n\ntype ActiveServerToolCall = {\n type: \"server_tool_call\";\n id: string;\n tool: string;\n name?: string;\n argumentChunks: string[];\n serverLabel?: string;\n status?: \"in_progress\" | \"completed\" | \"failed\";\n providerPayload?: unknown;\n};\n\ntype ActiveItem = ActiveMessage | ActiveReasoning | ActiveToolCall | ActiveServerToolCall;\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: StreamWarning[];\n warningSet: Set<string>;\n /** opaqueOutput 等非 item-lifecycle 输出,追加在 ordered 之后 */\n output: OutputItem[];\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 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 finalizeMessage(active: ActiveMessage): MessageItem {\n return {\n type: \"message\",\n id: active.id,\n role: active.role,\n content: coalesceContentBlocks(active.content),\n ...(active.citations && active.citations.length > 0 ? { citations: active.citations } : {}),\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.argumentChunks.join(\"\"),\n };\n}\n\nfunction finalizeServerToolCall(active: ActiveServerToolCall): ServerToolCallItem {\n const argumentsText = active.argumentChunks.join(\"\");\n return {\n type: \"server_tool_call\",\n id: active.id,\n tool: active.tool,\n ...(active.name !== undefined ? { name: active.name } : {}),\n ...(argumentsText ? { argumentsText } : {}),\n ...(active.status ? { status: active.status } : {}),\n ...(active.serverLabel !== undefined ? { serverLabel: active.serverLabel } : {}),\n ...(active.providerPayload !== undefined ? { providerPayload: active.providerPayload } : {}),\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, [{ message: event.message, ...(event.code !== undefined ? { code: event.code } : {}) }]);\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 if (event.citations && event.citations.length > 0) {\n active.citations = event.citations;\n }\n state.activeItems.delete(event.itemId);\n const item = finalizeMessage(active);\n state.completedItems.set(event.itemId, 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 argumentChunks: [],\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.argumentChunks.push(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}\n\nfunction handleServerToolStarted(state: AggregatorState, event: AIStreamEvent & { type: \"server_tool.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: \"server_tool_call\",\n id,\n tool: event.item.tool,\n name: event.item.name,\n argumentChunks: [],\n serverLabel: event.item.serverLabel,\n status: \"in_progress\",\n });\n state.itemOrder.push(id);\n}\n\nfunction handleServerToolDelta(state: AggregatorState, event: AIStreamEvent & { type: \"server_tool.delta\" }): void {\n const active = getActiveItem(state, event.itemId, \"server_tool_call\") as ActiveServerToolCall;\n if (event.delta.argumentsText) {\n active.argumentChunks.push(event.delta.argumentsText);\n }\n}\n\nfunction handleServerToolCompleted(\n state: AggregatorState,\n event: AIStreamEvent & { type: \"server_tool.completed\" },\n): void {\n const active = getActiveItem(state, event.itemId, \"server_tool_call\") as ActiveServerToolCall;\n active.status = event.status ?? \"completed\";\n if (event.providerPayload !== undefined) {\n active.providerPayload = event.providerPayload;\n }\n state.activeItems.delete(event.itemId);\n const item = finalizeServerToolCall(active);\n state.completedItems.set(event.itemId, item);\n}\n\nfunction handleServerToolResultCompleted(\n state: AggregatorState,\n event: AIStreamEvent & { type: \"server_tool_result.completed\" },\n): void {\n const item: ServerToolResultItem = { ...event.item };\n const orderId = item.id ?? `server_tool_result:${item.callId}:${state.itemOrder.length}`;\n if (state.completedItems.has(orderId) || state.activeItems.has(orderId)) {\n throw streamProtocolError(`Item with id ${orderId} is already present`);\n }\n state.itemOrder.push(orderId);\n state.completedItems.set(orderId, item);\n}\n\nfunction handleServerToolDiscoveryCompleted(\n state: AggregatorState,\n event: AIStreamEvent & { type: \"server_tool_discovery.completed\" },\n): void {\n const item: ServerToolDiscoveryItem = { ...event.item };\n if (state.completedItems.has(item.id) || state.activeItems.has(item.id)) {\n throw streamProtocolError(`Item with id ${item.id} is already present`);\n }\n state.itemOrder.push(item.id);\n state.completedItems.set(item.id, 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 // 投影字段在 finalize 时一次派生,避免与 output 双写漂移\n const output = [...orderedOutput, ...state.output];\n const toolCalls = output.filter((item): item is ToolCallItem => item.type === \"tool_call\");\n const serverToolCalls = output.filter((item): item is ServerToolCallItem => item.type === \"server_tool_call\");\n const serverToolResults = output.filter((item): item is ServerToolResultItem => item.type === \"server_tool_result\");\n\n return {\n id: state.responseId,\n output,\n replay: state.replayFromAdapter ?? [],\n text: extractText(output),\n toolCalls,\n serverToolCalls,\n serverToolResults,\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 \"server_tool.started\":\n handleServerToolStarted(state, event);\n break;\n case \"server_tool.delta\":\n handleServerToolDelta(state, event);\n break;\n case \"server_tool.completed\":\n handleServerToolCompleted(state, event);\n break;\n case \"server_tool_result.completed\":\n handleServerToolResultCompleted(state, event);\n break;\n case \"server_tool_discovery.completed\":\n handleServerToolDiscoveryCompleted(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 StreamWarning[]): void {\n for (const warning of warnings) {\n const key = streamWarningKey(warning);\n if (!state.warningSet.has(key)) {\n state.warningSet.add(key);\n state.warnings.push(warning);\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 * Stop reason / reasoning visibility 映射\n */\n\nimport type { ReasoningItem, StopReason } from \"../types/index.js\";\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 // Gemini GenerateContent finishReason\n STOP: \"end_turn\",\n MAX_TOKENS: \"max_output_tokens\",\n SAFETY: \"content_filter\",\n RECITATION: \"content_filter\",\n BLOCKLIST: \"content_filter\",\n PROHIBITED_CONTENT: \"content_filter\",\n SPII: \"content_filter\",\n MALFORMED_FUNCTION_CALL: \"error\",\n UNEXPECTED_TOOL_CALL: \"error\",\n TOO_MANY_TOOL_CALLS: \"error\",\n MISSING_THOUGHT_SIGNATURE: \"error\",\n // Generic\n error: \"error\",\n};\n\nexport function mapStopReason(providerReason: string): StopReason {\n return STOP_REASON_MAP[providerReason] ?? \"unknown\";\n}\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 * Canonical item 构造 helper\n */\n\nimport type {\n ContentBlock,\n MessageItem,\n OpaqueItem,\n ReasoningItem,\n ServerToolCallItem,\n ServerToolDiscoveryItem,\n ServerToolResultItem,\n ToolCallItem,\n ToolResultItem,\n} from \"../types/index.js\";\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\nexport function serverToolCallItem(\n id: string,\n tool: ServerToolCallItem[\"tool\"],\n overrides?: Partial<Omit<ServerToolCallItem, \"type\" | \"id\" | \"tool\">>,\n): ServerToolCallItem {\n return {\n type: \"server_tool_call\",\n id,\n tool,\n ...overrides,\n };\n}\n\nexport function serverToolResultItem(\n callId: string,\n tool: string,\n outcome: ServerToolResultItem[\"outcome\"],\n content: ContentBlock[],\n overrides?: Partial<Omit<ServerToolResultItem, \"type\" | \"callId\" | \"tool\" | \"outcome\" | \"content\">>,\n): ServerToolResultItem {\n return {\n type: \"server_tool_result\",\n callId,\n tool,\n outcome,\n content,\n ...overrides,\n };\n}\n\nexport function serverToolDiscoveryItem(\n id: string,\n serverLabel: string,\n tools: ServerToolDiscoveryItem[\"tools\"],\n overrides?: Partial<Omit<ServerToolDiscoveryItem, \"type\" | \"id\" | \"tool\" | \"serverLabel\" | \"tools\">>,\n): ServerToolDiscoveryItem {\n return {\n type: \"server_tool_discovery\",\n id,\n tool: \"mcp\",\n serverLabel,\n tools,\n ...overrides,\n };\n}\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 ServerToolStartedEvent,\n ServerToolDeltaEvent,\n ServerToolCompletedEvent,\n ServerToolResultCompletedEvent,\n ServerToolDiscoveryCompletedEvent,\n ContentBlock,\n Citation,\n Usage,\n BillingInfo,\n AuxiliaryInfo,\n ReplayItem,\n StopReason,\n BackendTrace,\n OpaqueItem,\n ReasoningItem,\n AdapterKind,\n ServerToolResultItem,\n ServerToolDiscoveryItem,\n WarningCodeValue,\n StreamWarning,\n} from \"../types/index.js\";\n\nexport type EventFactoryBackend = {\n kind: AdapterKind;\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: StreamWarning[] = [];\n // backend 在 factory 生命周期内不变,复用只读引用\n const backend = state.backend;\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,\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?: WarningCodeValue): ResponseWarningEvent {\n warnings.push({ message, ...(code !== undefined ? { code } : {}) });\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?: StreamWarning[];\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, options?: { citations?: Citation[] }): MessageCompletedEvent {\n return {\n ...base(),\n type: \"message.completed\",\n itemId,\n ...(options?.citations ? { citations: options.citations } : {}),\n };\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 // ── 服务端工具流事件 ────────────────────────────────────\n\n serverToolStarted(\n id: string,\n tool: string,\n options?: { name?: string; serverLabel?: string },\n ): ServerToolStartedEvent {\n return {\n ...base(),\n type: \"server_tool.started\",\n item: {\n id,\n tool,\n ...(options?.name !== undefined ? { name: options.name } : {}),\n ...(options?.serverLabel !== undefined ? { serverLabel: options.serverLabel } : {}),\n },\n };\n },\n\n serverToolDelta(itemId: string, delta: { argumentsText?: string }): ServerToolDeltaEvent {\n return { ...base(), type: \"server_tool.delta\", itemId, delta };\n },\n\n serverToolCompleted(\n itemId: string,\n options?: { status?: \"completed\" | \"failed\"; providerPayload?: unknown },\n ): ServerToolCompletedEvent {\n return {\n ...base(),\n type: \"server_tool.completed\",\n itemId,\n ...(options?.status ? { status: options.status } : {}),\n ...(options?.providerPayload !== undefined ? { providerPayload: options.providerPayload } : {}),\n };\n },\n\n serverToolResultCompleted(item: ServerToolResultItem): ServerToolResultCompletedEvent {\n return { ...base(), type: \"server_tool_result.completed\", item };\n },\n\n serverToolDiscoveryCompleted(item: ServerToolDiscoveryItem): ServerToolDiscoveryCompletedEvent {\n return { ...base(), type: \"server_tool_discovery.completed\", item };\n },\n\n /** 返回当前已发出的 sequence 计数(用于断言) */\n get sequence(): number {\n return seq;\n },\n\n /** 返回当前已记录的 warning 副本。 */\n get warnings(): StreamWarning[] {\n return warnings.map((w) => ({ ...w }));\n },\n };\n}\n\nexport type EventFactory = ReturnType<typeof createEventFactory>;\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, StreamWarning } 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: StreamWarning[] = [];\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, code?: StreamWarning[\"code\"]): this {\n this.warnings.push({ message, ...(code !== undefined ? { code } : {}) });\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?: StreamWarning[] } {\n const result: {\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: AuxiliaryInfo;\n warnings?: StreamWarning[];\n } = {};\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 \"../runtime/errors.js\";\nimport type { EventFactory } from \"../stream/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\n/**\n * 实验性:由调用方接线;库内 HTTP adapter **未**默认启用。\n * 用于从 usage/auxiliary 派生 billing 的后处理钩子。\n */\nexport type BillingPostprocessHook = (context: {\n request: NormalizedRequest;\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: AuxiliaryInfo;\n}) => MaybePromise<Partial<BillingInfo> | undefined>;\n\n/**\n * finalize 选项。`lookup` / `postprocessBilling` 为 experimental unused 扩展点:\n * 生产 adapter 当前不传入;仅测试或宿主自定义 wiring 使用。\n */\nexport type AuxiliaryFinalizeOptions = {\n /** experimental:异步补查 usage/billing */\n lookup?: () => Promise<LookupResult>;\n lookupTimeoutMs?: number;\n /** experimental:在尚无 billing 时派生估算账单 */\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?: import(\"../types/index.js\").StreamWarning[];\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 * 大块 E(事件权威):\n * - 完整 AIResponse(output/text/toolCalls…)仅由 collectStream/aggregator 构建\n * - StreamResult / response.completed 只携带 replay 与完成元数据\n */\n\nimport type {\n NormalizedRequest,\n BackendAdapter,\n AIStreamEvent,\n AuxiliaryInfo,\n ReplayItem,\n StopReason,\n Usage,\n BillingInfo,\n BackendTrace,\n AdapterKind,\n StreamWarning,\n} from \"../types/index.js\";\nimport { streamWarningKey } from \"../types/warning-codes.js\";\nimport { createEventFactory } from \"../stream/event-factory.js\";\nimport {\n AIMappingError,\n AIProviderError,\n AIRecoverableError,\n AIRequestError,\n AIStreamError,\n WarningCode,\n} from \"../runtime/errors.js\";\nimport type { EventFactory } from \"../stream/event-factory.js\";\nimport { AdapterAuxiliaryState } from \"./auxiliary.js\";\nimport { mergeAuxiliary } from \"../stream/merge-auxiliary.js\";\n\n// ── Adapter 解析中间结果 ──────────────────────────────────────\n\nexport type ProviderResponse = unknown;\n\n/**\n * adapter 完成一轮流处理后交给 emitStreamCompleted 的元数据。\n * 不含 output/text/toolCalls — 那些由事件聚合得到。\n */\nexport type StreamResult = {\n replay: ReplayItem[];\n stopReason?: StopReason;\n usage?: Usage;\n billing?: BillingInfo;\n providerMetadata?: Record<string, unknown>;\n auxiliary?: Partial<AuxiliaryInfo>;\n warnings?: StreamWarning[];\n metadataSources?: string[];\n rawResponseId?: string;\n};\n\n/** response.completed 所需的完成元数据(无 output 账本) */\nexport type StreamCompletedPayload = {\n replay: ReplayItem[];\n stopReason?: StopReason;\n usage?: Usage;\n billing?: BillingInfo;\n auxiliary?: AuxiliaryInfo;\n warnings?: StreamWarning[] | undefined;\n trace: Partial<BackendTrace>;\n};\n\n// ── 抽象基类 ──────────────────────────────────────────────────\n\nexport abstract class AdapterBase implements BackendAdapter {\n abstract readonly kind: AdapterKind;\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 AIRecoverableError) {\n yield factory.responseWarning(err.message, err.code);\n const payload = this.buildCompletedPayload(\n request,\n { replay: [], stopReason: err.stopReason },\n factory,\n );\n yield factory.responseCompleted(payload);\n return;\n }\n\n if (err instanceof AIMappingError) {\n yield factory.responseWarning(err.message, WarningCode.MAPPING_ERROR);\n const payload = this.buildCompletedPayload(request, { replay: [] }, factory);\n yield factory.responseCompleted(payload);\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 * - 通过 StreamingItemSession / factory 发射 item 事件\n * - 组装 StreamResult(replay + 元数据)\n * - 发射 response.completed(通常经 emitStreamCompleted)\n */\n protected abstract runStream(\n providerRequest: ProviderResponse,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent>;\n\n // ── 共享构造方法 ──────────────────────────────────────────\n\n /**\n * 从 StreamResult 构建 response.completed 载荷(无 output/text/toolCalls)。\n */\n protected buildCompletedPayload(\n request: NormalizedRequest,\n result: StreamResult,\n factory: EventFactory,\n ): StreamCompletedPayload {\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 replay: result.replay,\n stopReason: result.stopReason,\n usage: result.usage,\n billing: result.billing,\n auxiliary,\n warnings,\n trace: {\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 在调用前组装 replay / stopReason 等业务字段(不含 output 账本)。\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 payload = this.buildCompletedPayload(\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(payload);\n }\n\n protected createAuxiliaryState(request: NormalizedRequest): AdapterAuxiliaryState {\n return new AdapterAuxiliaryState(request);\n }\n}\n\nfunction mergeWarnings(...groups: Array<StreamWarning[] | undefined>): StreamWarning[] | undefined {\n const seen = new Set<string>();\n const merged: StreamWarning[] = [];\n\n for (const group of groups) {\n if (!group) continue;\n for (const warning of group) {\n const key = streamWarningKey(warning);\n if (seen.has(key)) continue;\n seen.add(key);\n merged.push(warning);\n }\n }\n\n return merged.length > 0 ? merged : undefined;\n}\n","/**\n * Provider 请求 headers / body 扩展合并\n *\n * 供真实后端 adapter 构造选项 `headers` / `extraBody` 使用:\n * - headers:内置鉴权头为基,自定义后写覆盖\n * - extraBody:已构建 body 为基,额外字段浅层 spread,同名顶层键可覆盖\n */\n\n/** 合并内置 headers 与自定义 headers;自定义后写覆盖同名键。 */\nexport function mergeProviderHeaders(\n base: Record<string, string>,\n custom?: Record<string, string>,\n): Record<string, string> {\n if (!custom) return base;\n return { ...base, ...custom };\n}\n\n/**\n * 将构造期 extraBody 浅层合并到已构建的 provider body。\n * 无 extraBody 时原样返回;有则允许覆盖同名顶层键。\n */\nexport function applyExtraBody<T extends object>(body: T, extraBody?: Record<string, unknown>): T {\n if (!extraBody) return body;\n return { ...body, ...extraBody };\n}\n","/**\n * Adapter 边界安全辅助\n *\n * - opaque replay envelope(大小 / 深度;emit 与 accept 共用)\n * - provider HTTP 错误 body 出站脱敏\n */\n\nimport { AIProviderError, AIRequestError } from \"../runtime/errors.js\";\n\n/** 默认单条 opaque payload 上限(JSON.stringify 的 UTF-16 码元长度)。 */\nexport const DEFAULT_MAX_OPAQUE_PAYLOAD_BYTES = 1 * 1024 * 1024;\n/** 硬顶:配置不可超过;挡住离谱 blob / DoS。 */\nexport const HARD_MAX_OPAQUE_PAYLOAD_BYTES = 8 * 1024 * 1024;\n/**\n * 默认 opaque 体积上限(与 DEFAULT_MAX_OPAQUE_PAYLOAD_BYTES 同值)。\n * 历史导出名;新代码优先用 DEFAULT_ / HARD_ 常量。\n */\nexport const MAX_OPAQUE_PAYLOAD_BYTES = DEFAULT_MAX_OPAQUE_PAYLOAD_BYTES;\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/** envelope 校验选项:体积上限经 clamp 后生效。 */\nexport type OpaqueEnvelopeOptions = {\n /** JSON.stringify 长度上限;省略则用默认 1 MiB;夹到 [1, HARD]。 */\n maxBytes?: number;\n};\n\n/**\n * 将调用方配置的 opaque 上限夹到合法区间。\n * 非有限 / <1 → 默认;> HARD → HARD。\n */\nexport function clampOpaquePayloadLimit(maxBytes?: number): number {\n if (maxBytes === undefined || !Number.isFinite(maxBytes)) {\n return DEFAULT_MAX_OPAQUE_PAYLOAD_BYTES;\n }\n const n = Math.floor(maxBytes);\n if (n < 1) {\n return DEFAULT_MAX_OPAQUE_PAYLOAD_BYTES;\n }\n return Math.min(n, HARD_MAX_OPAQUE_PAYLOAD_BYTES);\n}\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、体积 ≤ limit、深度 ≤ 8。\n * 不校验 adapter 专用字段形状。emit / accept 共用。\n */\nexport function validateOpaqueReplayEnvelope(\n payload: unknown,\n options?: OpaqueEnvelopeOptions,\n): 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 const maxBytes = clampOpaquePayloadLimit(options?.maxBytes);\n if (raw.length > maxBytes) {\n return {\n ok: false,\n reason: `opaque payload exceeds max size (${raw.length} > ${maxBytes})`,\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(入站 accept 路径)。 */\nexport function assertOpaqueReplayEnvelope(payload: unknown, options?: OpaqueEnvelopeOptions): void {\n const result = validateOpaqueReplayEnvelope(payload, options);\n if (!result.ok) {\n throw new AIRequestError(`Invalid opaque replay payload: ${result.reason}`, \"INVALID_OPAQUE_REPLAY\");\n }\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 HTTP 流公共脚手架\n *\n * 收敛 adapter 间重复的:\n * - JSON POST + 错误映射\n * - ReadableStream reader 生命周期\n * - IncrementalStreamParser feed/flush + malformed warning\n * - 不完整尾帧 warning\n */\n\nimport { AIProviderError, AIStreamError } from \"../../runtime/errors.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { AIStreamEvent, FetchFn } from \"../../types/index.js\";\nimport { emitMalformedStreamWarning } from \"../auxiliary.js\";\nimport { providerHttpError } from \"../security.js\";\nimport type { IncrementalStreamParser } from \"./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 opened = await postProviderJsonResponse(options);\n const bodyStream = opened.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: opened.headers,\n };\n}\n\nexport type PostProviderJsonOptions = {\n fetchFn: FetchFn;\n url: string;\n headers: Record<string, string>;\n body: unknown;\n signal?: AbortSignal;\n};\n\nexport type PostedProviderJsonResponse = {\n response: Response;\n headers: Headers;\n};\n\n/**\n * POST JSON 并返回已校验 2xx 的 Response(非流式调用可用 response.json())。\n * 网络错误 / HTTP 非 2xx 映射与 openProviderJsonStream 一致。\n */\nexport async function postProviderJsonResponse(options: PostProviderJsonOptions): Promise<PostedProviderJsonResponse> {\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 return { response, headers: response.headers };\n}\n\n/**\n * POST JSON 并解析 JSON body;解析失败抛 STREAM_PROTOCOL_ERROR(非流场景的协议错误)。\n */\nexport async function postProviderJson<T = unknown>(\n options: PostProviderJsonOptions,\n): Promise<{\n data: T;\n headers: Headers;\n}> {\n const { response, headers } = await postProviderJsonResponse(options);\n let data: T;\n try {\n data = (await response.json()) as T;\n } catch (err) {\n throw new AIStreamError(\n `Failed to parse provider JSON response: ${err instanceof Error ? err.message : String(err)}`,\n \"STREAM_PROTOCOL_ERROR\",\n );\n }\n return { data, headers };\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","/**\n * Provider JSON 流 session\n *\n * 收敛 HTTP adapter 的 open → iterate → complete 脚手架。\n * **不**在 batches 结束后自动 complete(chat/gemini/ollama 需中途 complete)。\n *\n * 错误路径仍只在 open-stream 映射:HTTP 非 2xx / 网络 / malformed / incomplete frame。\n */\n\nimport { AIStreamError, WarningCode } from \"../../runtime/errors.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { AIStreamEvent, FetchFn, NormalizedRequest } from \"../../types/index.js\";\nimport type { AdapterAuxiliaryState } from \"../auxiliary.js\";\nimport type { StreamResult } from \"../base.js\";\nimport {\n createCompletionGate,\n iterateProviderStreamBatches,\n openProviderJsonStream,\n type ProviderStreamBatch,\n} from \"./open-stream.js\";\nimport type { IncrementalStreamParser } from \"./parser.js\";\n\nexport type ProviderJsonStreamSessionHost = {\n fetchFn: FetchFn;\n factory: EventFactory;\n request: NormalizedRequest;\n auxiliary: AdapterAuxiliaryState;\n emitCompleted: (auxiliary: AdapterAuxiliaryState, result: StreamResult) => AsyncIterable<AIStreamEvent>;\n};\n\nexport type ProviderJsonStreamOpenOptions = {\n url: string;\n headers: Record<string, string>;\n body: unknown;\n};\n\nexport type ProviderJsonStreamBatchOptions<T> = {\n parser: IncrementalStreamParser<T>;\n providerLabel: string;\n transportLabel: string;\n incompleteMessage: string;\n};\n\nexport type ProviderJsonStreamCompleteOptions = {\n /**\n * 重复 complete 时:`warn` 发 DUPLICATE_FINISH(默认,对齐 chat/gemini/ollama);\n * `silent` 静默忽略(messages/responses 历史路径几乎不会触发)。\n */\n onDuplicate?: \"warn\" | \"silent\";\n};\n\nexport type ProviderJsonStreamSession = {\n readonly auxiliary: AdapterAuxiliaryState;\n readonly gate: {\n readonly completed: boolean;\n tryComplete(): boolean;\n };\n /** open 成功后填充的 response headers */\n readonly headers: Headers | undefined;\n open(options: ProviderJsonStreamOpenOptions): Promise<{ headers: Headers }>;\n batches<T>(options: ProviderJsonStreamBatchOptions<T>): AsyncGenerator<ProviderStreamBatch<T>, void, undefined>;\n complete(result: StreamResult, options?: ProviderJsonStreamCompleteOptions): AsyncIterable<AIStreamEvent>;\n};\n\n/**\n * 创建 JSON provider 流 session。\n * 调用方负责:鉴权 headers、parser、业务 map、何时 complete。\n */\nexport function createProviderJsonStreamSession(host: ProviderJsonStreamSessionHost): ProviderJsonStreamSession {\n const gate = createCompletionGate();\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined;\n let responseHeaders: Headers | undefined;\n let opened = false;\n\n return {\n get auxiliary() {\n return host.auxiliary;\n },\n get gate() {\n return gate;\n },\n get headers() {\n return responseHeaders;\n },\n\n async open(options) {\n if (opened) {\n throw new AIStreamError(\"Provider JSON stream already opened\", \"STREAM_ERROR\");\n }\n const openedStream = await openProviderJsonStream({\n fetchFn: host.fetchFn,\n url: options.url,\n headers: options.headers,\n body: options.body,\n signal: host.request.signal,\n });\n reader = openedStream.reader;\n responseHeaders = openedStream.headers;\n opened = true;\n return { headers: openedStream.headers };\n },\n\n batches(options) {\n if (!reader) {\n throw new AIStreamError(\"Provider JSON stream is not open\", \"STREAM_ERROR\");\n }\n return iterateProviderStreamBatches({\n reader,\n parser: options.parser,\n factory: host.factory,\n providerLabel: options.providerLabel,\n transportLabel: options.transportLabel,\n incompleteMessage: options.incompleteMessage,\n });\n },\n\n async *complete(result, options) {\n if (!gate.tryComplete()) {\n if (options?.onDuplicate !== \"silent\") {\n yield host.factory.responseWarning(\"Duplicate finish signal ignored\", WarningCode.DUPLICATE_FINISH);\n }\n return;\n }\n yield* host.emitCompleted(host.auxiliary, result);\n },\n };\n}\n","/**\n * HTTP adapter 共享基类与构造选项\n *\n * 收敛五家真实后端 adapter 的:\n * - apiKey / baseUrl / fetch / headers / extraBody 字段赋值\n * - 默认 baseUrl 解析\n * - beginJsonStream:open → batches → complete session\n *\n * 应用代码应只实现 BackendAdapter;勿依赖本内部基类。\n */\n\nimport { AdapterBase } from \"./base.js\";\nimport { applyExtraBody, mergeProviderHeaders } from \"./request-options.js\";\nimport { clampOpaquePayloadLimit } from \"./security.js\";\nimport { createProviderJsonStreamSession, type ProviderJsonStreamSession } from \"./transport/run-json-stream.js\";\nimport type { FetchFn, NormalizedRequest } from \"../types/index.js\";\nimport type { EventFactory } from \"../stream/event-factory.js\";\n\n\n/** 真实 HTTP adapter 的公共构造选项;apiKey 由各 adapter 收紧或保持可选。 */\nexport type HttpAdapterOptions = {\n apiKey?: string;\n baseUrl?: string;\n /** 可注入自定义 fetch 实现(测试 / 代理) */\n fetch?: FetchFn;\n /** 额外请求头;后写覆盖内置鉴权 / Content-Type 等 */\n headers?: Record<string, string>;\n /** 额外 body 顶层字段;浅层合并,同名键可覆盖 */\n extraBody?: Record<string, unknown>;\n /**\n * 单条 opaque replay payload 体积上限(JSON.stringify 码元长度)。\n * 默认 1 MiB;夹到 [1, 8 MiB] 硬顶。emit 与 accept 共用。\n */\n maxOpaquePayloadBytes?: number;\n};\n\n\nexport type HttpAdapterDefaults = {\n baseUrl: string;\n};\n\n/**\n * HTTP adapter 薄基类:统一字段、默认值与 JSON 流 session。\n */\nexport abstract class HttpAdapterBase extends AdapterBase {\n protected apiKey: string | undefined;\n protected baseUrl: string;\n protected fetchFn: FetchFn;\n protected headers: Record<string, string> | undefined;\n protected extraBody: Record<string, unknown> | undefined;\n /** 已 clamp 的 opaque 体积上限(emit / accept 共用)。 */\n protected maxOpaquePayloadBytes: number;\n\n constructor(options: HttpAdapterOptions, defaults: HttpAdapterDefaults) {\n super();\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? defaults.baseUrl;\n this.fetchFn = options.fetch ?? globalThis.fetch;\n this.headers = options.headers;\n this.extraBody = options.extraBody;\n this.maxOpaquePayloadBytes = clampOpaquePayloadLimit(options.maxOpaquePayloadBytes);\n }\n\n\n /** 合并内置 headers 与构造期自定义 headers。 */\n protected mergeHeaders(base: Record<string, string>): Record<string, string> {\n return mergeProviderHeaders(base, this.headers);\n }\n\n /** 将构造期 extraBody 浅层合并进已构建 body。 */\n protected withExtraBody<T extends object>(body: T): T {\n return applyExtraBody(body, this.extraBody);\n }\n\n /**\n * 开启 JSON provider 流 session(auxiliary + gate + open/batches/complete)。\n * 不自动 complete;调用方在业务 finish 点 `yield* session.complete(...)`。\n */\n protected beginJsonStream(factory: EventFactory, request: NormalizedRequest): ProviderJsonStreamSession {\n const auxiliary = this.createAuxiliaryState(request);\n return createProviderJsonStreamSession({\n fetchFn: this.fetchFn,\n factory,\n request,\n auxiliary,\n emitCompleted: (aux, result) => this.emitStreamCompleted(factory, request, aux, result),\n });\n }\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/** Gemini GenerateContent `usageMetadata` */\nexport function usageFromGemini(raw: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n cachedContentTokenCount?: number;\n thoughtsTokenCount?: number;\n [key: string]: unknown;\n}): Partial<Usage> {\n return withDerivedTotal({\n inputTokens: num(raw.promptTokenCount),\n outputTokens: num(raw.candidatesTokenCount),\n totalTokens: num(raw.totalTokenCount),\n cachedInputTokens: num(raw.cachedContentTokenCount),\n reasoningTokens: num(raw.thoughtsTokenCount),\n });\n}\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 /** Pending decoded fragments; compacted to at most one rest string after each consume. */\n private chunks: string[] = [];\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.chunks.push(this.decoder.decode(value, { stream: true }));\n return this.consume(false);\n }\n\n flush(): { items: T[]; malformed: number } {\n const tail = this.decoder.decode();\n if (tail.length > 0) this.chunks.push(tail);\n return this.consume(true);\n }\n\n getRemaining(): string {\n return this.materializeBuffer();\n }\n\n private materializeBuffer(): string {\n if (this.chunks.length === 0) return \"\";\n if (this.chunks.length === 1) return this.chunks[0] ?? \"\";\n return this.chunks.join(\"\");\n }\n\n private consume(allowEOF: boolean): { items: T[]; malformed: number } {\n const buffer = this.materializeBuffer();\n const split = this.split(buffer, allowEOF);\n this.chunks = split.rest.length > 0 ? [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\n/**\n * Split SSE frames on blank-line boundaries without rewriting the whole buffer.\n * Accepts LF, CRLF, and mixed empty-line terminators; normalizes only extracted frames.\n */\nexport function splitSSEFrames(buffer: string, allowEOF: boolean): StreamSplitResult {\n const items: string[] = [];\n let cursor = 0;\n\n while (cursor < buffer.length) {\n const boundary = findSseFrameBoundary(buffer, cursor);\n if (boundary === null) break;\n items.push(normalizeSseFrame(buffer.slice(cursor, boundary.start)));\n cursor = boundary.end;\n }\n\n if (allowEOF && cursor < buffer.length) {\n items.push(normalizeSseFrame(buffer.slice(cursor)));\n cursor = buffer.length;\n }\n\n return { items, rest: buffer.slice(cursor) };\n}\n\n/** Locate blank-line frame end: `\\n\\n`, `\\r\\n\\r\\n`, `\\r\\n\\n`, or `\\n\\r\\n`. */\nfunction findSseFrameBoundary(buffer: string, from: number): { start: number; end: number } | null {\n for (let i = from; i < buffer.length; i++) {\n const c = buffer[i];\n if (c === \"\\n\") {\n if (i + 1 < buffer.length && buffer[i + 1] === \"\\n\") {\n return { start: i, end: i + 2 };\n }\n if (i + 2 < buffer.length && buffer[i + 1] === \"\\r\" && buffer[i + 2] === \"\\n\") {\n return { start: i, end: i + 3 };\n }\n } else if (c === \"\\r\") {\n if (i + 1 < buffer.length && buffer[i + 1] === \"\\n\") {\n if (i + 2 < buffer.length && buffer[i + 2] === \"\\n\") {\n return { start: i, end: i + 3 };\n }\n if (i + 3 < buffer.length && buffer[i + 2] === \"\\r\" && buffer[i + 3] === \"\\n\") {\n return { start: i, end: i + 4 };\n }\n }\n }\n }\n return null;\n}\n\nfunction normalizeSseFrame(frame: string): string {\n return frame.includes(\"\\r\") ? frame.replaceAll(\"\\r\\n\", \"\\n\") : frame;\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/**\n * 简化 SSE:仅 `data: ...` 行,忽略 `[DONE]`。\n * 供 Chat Completions / Gemini alt=sse 等 data-line 形态共用。\n */\nexport function parseDataLineSse(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 createDataLineSseParser<T>(): IncrementalStreamParser<T> {\n return new IncrementalStreamParser(splitLines, (item) => parseDataLineSse(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 * 收敛 incomplete / finish 后的 replay + complete 路径。\n * adapter 负责构造 opaque payload;本 helper 统一校验体积、拼接 replay 并 complete。\n *\n * emit 与 accept 共用 envelope 上限:超限则省略 opaque(不截断)并打 warning,\n * 避免写出下一轮 accept 必炸的自产毒。\n */\n\nimport { replayFromOutput } from \"../canonical/index.js\";\nimport { WarningCode } from \"../types/warning-codes.js\";\nimport { validateOpaqueReplayEnvelope } from \"./security.js\";\nimport type { AIStreamEvent, OpaqueItem, StopReason } from \"../types/index.js\";\nimport type { EventFactory } from \"../stream/event-factory.js\";\nimport type { StreamingItemSession } from \"./streaming-item-session.js\";\nimport type { ProviderJsonStreamCompleteOptions, ProviderJsonStreamSession } from \"./transport/run-json-stream.js\";\n\nexport type FinalizeStreamTurnOptions = {\n opaque?: OpaqueItem | null | undefined;\n stopReason?: StopReason;\n rawResponseId?: string;\n onDuplicate?: ProviderJsonStreamCompleteOptions[\"onDuplicate\"];\n /** 出站 opaque 体积校验;与 accept 同限。省略则用默认 1 MiB。 */\n maxOpaquePayloadBytes?: number;\n /** 超限 omit 时发 warning;强烈建议传入(各 HTTP adapter 均有)。 */\n factory?: Pick<EventFactory, \"responseWarning\">;\n};\n\n/**\n * 从 item session 生成 canonical replay,可选追加 opaque 尾项,再 yield session.complete。\n * 超限 opaque 会被丢弃并 yield `OPAQUE_REPLAY_OMITTED` warning。\n */\nexport async function* finalizeStreamTurn(\n session: Pick<ProviderJsonStreamSession, \"complete\">,\n items: StreamingItemSession,\n options: FinalizeStreamTurnOptions = {},\n): AsyncIterable<AIStreamEvent> {\n const replay = [...replayFromOutput(items.completedItems())];\n let opaque = options.opaque ?? null;\n\n if (opaque) {\n const check = validateOpaqueReplayEnvelope(opaque.payload, {\n maxBytes: options.maxOpaquePayloadBytes,\n });\n if (!check.ok) {\n if (options.factory) {\n yield options.factory.responseWarning(\n `Omitted opaque replay payload: ${check.reason}`,\n WarningCode.OPAQUE_REPLAY_OMITTED,\n );\n }\n opaque = null;\n }\n }\n\n if (opaque) {\n replay.push(opaque);\n }\n\n yield* session.complete(\n {\n replay,\n stopReason: options.stopReason,\n rawResponseId: options.rawResponseId,\n },\n options.onDuplicate !== undefined ? { onDuplicate: options.onDuplicate } : undefined,\n );\n}\n","/**\n * Opaque replay source 常量,避免 adapter 内 magic string 漂移。\n * 须与 acceptOpaqueReplay / opaqueItem 入站过滤一致。\n */\n\nexport const OPAQUE_SOURCE = {\n CHAT_COMPLETIONS: \"chat.completions\",\n MESSAGES: \"messages\",\n OLLAMA: \"ollama\",\n GEMINI: \"gemini\",\n RESPONSES: \"responses\",\n} as const;\n\nexport type OpaqueSourceId = (typeof OPAQUE_SOURCE)[keyof typeof OPAQUE_SOURCE];\n","/**\n * Opaque replay 统一协议(入站薄层)\n *\n * 过滤:仅 `source === expectedSource` 且 `purpose === \"replay\"` 才处理,否则忽略。\n * envelope:object / ≤limit(默认 1MiB,硬顶 8MiB)/ depth≤8;失败抛 AIRequestError / INVALID_OPAQUE_REPLAY。\n * 写入 wire 尾部 assistant/model turn 前:先 rollbackTrailing*,再 append(responses 续写 id 除外)。\n * 已知 shape 非法 → 抛 INVALID_OPAQUE_REPLAY;未知 shape → 静默跳过。\n */\n\nimport { assertOpaqueReplayEnvelope, type OpaqueEnvelopeOptions } from \"./security.js\";\n\nimport type { OpaqueItem } from \"../types/index.js\";\n\nexport type AcceptOpaqueReplayOptions = OpaqueEnvelopeOptions;\n\n/**\n * 接受本 adapter 的 opaque replay payload。\n * source/purpose 不匹配返回 null;匹配则 assert envelope 后返回 payload object。\n */\nexport function acceptOpaqueReplay(\n item: Pick<OpaqueItem, \"source\" | \"purpose\" | \"payload\">,\n expectedSource: string,\n options?: AcceptOpaqueReplayOptions,\n): Record<string, unknown> | null {\n if (item.source !== expectedSource || item.purpose !== \"replay\") {\n return null;\n }\n assertOpaqueReplayEnvelope(item.payload, options);\n return item.payload as Record<string, unknown>;\n}\n","/**\n * Provider JSON 解析小工具\n *\n * - loose:出站 opaque / wire best-effort,失败回退 {}\n * - strict:失败抛 AIRequestError;入站 tool_call 参数经 `parseToolArguments` 再包装为 AIRecoverableError\n */\n\nimport { AIRequestError, type ErrorCode } from \"../runtime/errors.js\";\n\n/** 宽松解析 JSON object:失败或非 object 返回 {}。 */\nexport function parseJsonLooseObject(text: string): Record<string, unknown> {\n try {\n const parsed: unknown = JSON.parse(text);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // fall through\n }\n return {};\n}\n\n/** 严格解析 JSON object:失败或非 object 抛 AIRequestError。 */\nexport function parseJsonStrictObject(\n text: string,\n message: string,\n code: ErrorCode = \"TOOL_CALL_ARGUMENTS_INVALID\",\n): Record<string, unknown> {\n try {\n const parsed: unknown = JSON.parse(text);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // fall through\n }\n throw new AIRequestError(message, code);\n}\n","import { AIRecoverableError, AIRequestError } from \"../runtime/errors.js\";\nimport { contentBlocksToText } from \"../canonical/index.js\";\nimport { parseJsonStrictObject } from \"./json-parse.js\";\n\nimport type {\n ContentBlock,\n InstructionBlock,\n ServerToolDefinition,\n ToolCallItem,\n ToolChoice,\n ToolDefinition,\n} 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 /** 不支持 serverTools 的 adapter 在 buildRequest 入口调用。 */\n assertNoServerTools(serverTools: ServerToolDefinition[] | undefined): void {\n if (serverTools && serverTools.length > 0) {\n throw new AIRequestError(\n `${this.kind} does not support serverTools; use ResponsesAdapter for web_search, code_execution, and mcp`,\n \"UNSUPPORTED_SERVER_TOOL\",\n );\n }\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 const message = `${this.kind} requires tool_call argumentsText to be a valid JSON object for tool_call \"${item.id}\" (${item.name})`;\n try {\n return parseJsonStrictObject(item.argumentsText, message, \"TOOL_CALL_ARGUMENTS_INVALID\");\n } catch (err) {\n if (err instanceof AIRequestError && err.code === \"TOOL_CALL_ARGUMENTS_INVALID\") {\n throw new AIRecoverableError(err.message, err.code);\n }\n throw err;\n }\n }\n\n /**\n * 回滚 wire 尾部连续同 role 的 turn(opaque replace 语义)。\n * chat/messages/ollama 用 `\"assistant\"`;gemini 用 `\"model\"`。\n */\n rollbackTrailingAssistantMessages<T extends { role: string }>(messages: T[], role = \"assistant\"): void {\n while (messages.length > 0 && messages[messages.length - 1]?.role === role) {\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 * Portable reasoningLevel → provider wire 字段映射\n *\n * 第一版只处理 level 枚举;budget/summary 等特化字段不在此层。\n * 无法映射的 level 抛 AIRequestError(UNSUPPORTED_REASONING_LEVEL)。\n */\n\nimport { AIRequestError } from \"../runtime/errors.js\";\nimport type { ReasoningLevel } from \"../types/request.js\";\nexport { REASONING_LEVELS, REASONING_LEVEL_SET } from \"../types/request.js\";\n\nconst MESSAGES_BUDGET_RATIOS: Record<Exclude<ReasoningLevel, \"none\">, number> = {\n minimal: 0.02,\n low: 0.1,\n medium: 0.3,\n high: 0.6,\n xhigh: 0.9,\n max: 0.95,\n};\n\nconst OLLAMA_SUPPORTED = new Set<ReasoningLevel>([\"none\", \"low\", \"medium\", \"high\"]);\nconst GEMINI_SUPPORTED = new Set<ReasoningLevel>([\"none\", \"minimal\", \"low\", \"medium\", \"high\"]);\n\nexport type OpenAIReasoningEffort = ReasoningLevel;\n\nexport type MessagesThinkingConfig = { type: \"disabled\" } | { type: \"enabled\"; budget_tokens: number };\n\nexport type OllamaThinkValue = false | \"low\" | \"medium\" | \"high\";\n\nexport type GeminiThinkingLevel = \"MINIMAL\" | \"LOW\" | \"MEDIUM\" | \"HIGH\";\n\nexport type GeminiThinkingConfig =\n | { includeThoughts: false }\n | { includeThoughts: true; thinkingLevel: GeminiThinkingLevel };\n\n/** 若 level 不在 supported 集合内则抛 AIRequestError。 */\nexport function assertSupportedReasoningLevel(\n level: ReasoningLevel,\n supported: ReadonlySet<ReasoningLevel>,\n adapterKind: string,\n): void {\n if (supported.has(level)) return;\n throw new AIRequestError(\n `reasoningLevel \"${level}\" is not supported by the ${adapterKind} adapter`,\n \"UNSUPPORTED_REASONING_LEVEL\",\n );\n}\n\n/** Responses API:`reasoning: { effort }` */\nexport function mapResponsesReasoning(level: ReasoningLevel): { effort: OpenAIReasoningEffort } {\n return { effort: level };\n}\n\n/** Chat Completions:顶层 `reasoning_effort` */\nexport function mapChatCompletionsReasoningEffort(level: ReasoningLevel): OpenAIReasoningEffort {\n return level;\n}\n\n/**\n * Messages thinking budget。\n * 基于 maxTokens 按比例推导,clamp 到 [1024, max(1024, maxTokens - 1)],\n * 满足 Anthropic budget_tokens < max_tokens。\n */\nexport function mapMessagesThinkingBudget(level: Exclude<ReasoningLevel, \"none\">, maxTokens: number): number {\n const ratio = MESSAGES_BUDGET_RATIOS[level];\n const raw = Math.round(maxTokens * ratio);\n const upper = Math.max(1024, maxTokens - 1);\n return Math.min(Math.max(raw, 1024), upper);\n}\n\n/** Messages API:`thinking` 字段 */\nexport function mapMessagesThinking(level: ReasoningLevel, maxTokens: number): MessagesThinkingConfig {\n if (level === \"none\") {\n return { type: \"disabled\" };\n }\n return {\n type: \"enabled\",\n budget_tokens: mapMessagesThinkingBudget(level, maxTokens),\n };\n}\n\n/** Ollama:`think` 字段;minimal/xhigh/max 不支持 */\nexport function mapOllamaThink(level: ReasoningLevel): OllamaThinkValue {\n assertSupportedReasoningLevel(level, OLLAMA_SUPPORTED, \"ollama\");\n if (level === \"none\") return false;\n // narrow after assert: only low|medium|high remain\n return level as Exclude<OllamaThinkValue, false>;\n}\n\n/** Gemini:`generationConfig.thinkingConfig`;xhigh/max 不支持 */\nexport function mapGeminiThinking(level: ReasoningLevel): GeminiThinkingConfig {\n assertSupportedReasoningLevel(level, GEMINI_SUPPORTED, \"gemini\");\n if (level === \"none\") {\n return { includeThoughts: false };\n }\n\n const thinkingLevel = level.toUpperCase() as GeminiThinkingLevel;\n return {\n includeThoughts: true,\n thinkingLevel,\n };\n}\n","/**\n * canonical serverTools → Responses API tools 映射\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport type { ServerToolDefinition } from \"../../types/index.js\";\nimport type { ResponsesCodeInterpreterTool, ResponsesMcpTool, ResponsesTool, ResponsesWebSearchTool } from \"./types.js\";\n\n/** 将 canonical serverTools 映射为 Responses API tools 数组项。 */\nexport function mapServerTools(serverTools: ServerToolDefinition[] | undefined): ResponsesTool[] {\n if (!serverTools || serverTools.length === 0) return [];\n\n return serverTools.map((tool): ResponsesTool => {\n switch (tool.type) {\n case \"web_search\": {\n const mapped: ResponsesWebSearchTool = { type: \"web_search\" };\n if (tool.allowedDomains || tool.blockedDomains) {\n mapped.filters = {\n ...(tool.allowedDomains ? { allowed_domains: tool.allowedDomains } : {}),\n ...(tool.blockedDomains ? { blocked_domains: tool.blockedDomains } : {}),\n };\n }\n if (tool.userLocation) {\n mapped.user_location = {\n type: \"approximate\",\n ...(tool.userLocation.country !== undefined ? { country: tool.userLocation.country } : {}),\n ...(tool.userLocation.city !== undefined ? { city: tool.userLocation.city } : {}),\n ...(tool.userLocation.region !== undefined ? { region: tool.userLocation.region } : {}),\n ...(tool.userLocation.timezone !== undefined ? { timezone: tool.userLocation.timezone } : {}),\n };\n }\n if (tool.searchContextSize !== undefined) {\n mapped.search_context_size = tool.searchContextSize;\n }\n return mapped;\n }\n case \"code_execution\": {\n const container = tool.container;\n const mapped: ResponsesCodeInterpreterTool = {\n type: \"code_interpreter\",\n container: container\n ? {\n type: \"auto\",\n ...(container.memoryLimit !== undefined ? { memory_limit: container.memoryLimit } : {}),\n ...(container.fileIds !== undefined ? { file_ids: container.fileIds } : {}),\n }\n : { type: \"auto\" },\n };\n return mapped;\n }\n case \"mcp\": {\n const mapped: ResponsesMcpTool = {\n type: \"mcp\",\n server_label: tool.serverLabel,\n server_url: tool.serverUrl,\n require_approval: \"never\",\n };\n if (tool.serverDescription !== undefined) mapped.server_description = tool.serverDescription;\n if (tool.authorization !== undefined) mapped.authorization = tool.authorization;\n if (tool.allowedTools !== undefined) mapped.allowed_tools = tool.allowedTools;\n return mapped;\n }\n default: {\n const exhaustive: never = tool;\n throw new AIRequestError(\n `Unsupported server tool type: ${(exhaustive as ServerToolDefinition).type}`,\n \"UNSUPPORTED_SERVER_TOOL\",\n );\n }\n }\n });\n}\n","/**\n * NormalizedRequest → Responses API 请求体(不含 extraBody 合并)\n *\n * 同时服务 stream(/responses)与 compress(/responses/compact)。\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport { acceptOpaqueReplay } from \"../../provider/opaque-replay.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { mapResponsesReasoning } from \"../../provider/reasoning.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\nimport type {\n CompressRequest,\n ContentBlock,\n InputItem,\n InstructionBlock,\n NormalizedRequest,\n ReasoningItem,\n} from \"../../types/index.js\";\nimport { mapServerTools } from \"./map-server-tools.js\";\nimport type {\n ResponsesAPIRequest,\n ResponsesCompactAPIRequest,\n ResponsesInputItem,\n ResponsesReasoningInput,\n ResponsesTool,\n} from \"./types.js\";\n\nconst mapper = new NormalizedRequestMapper(\"responses\");\n\n/** compact replay opaque:整份 wire output window 保真回传 */\nexport const RESPONSES_COMPACTED_WINDOW_KIND = \"compacted_window\" as const;\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 readNonEmptyString(value: unknown, maxLen = 256): string | undefined {\n if (typeof value !== \"string\" || value.length === 0 || value.length > maxLen) return undefined;\n return value;\n}\n\n/** 将 canonical text/json blocks 压成 EasyInputMessage 的 string content。 */\nfunction messageContentAsString(blocks: ContentBlock[], field: string): string {\n return mapper.textFromBlocks(blocks, field);\n}\n\nfunction mapReasoningInput(item: ReasoningItem, index: number): ResponsesReasoningInput {\n const text = mapper.textFromBlocks(\n mapper.ensureReasoningBlocks(item.content, \"reasoning content\"),\n \"reasoning content\",\n );\n const id = item.id && item.id.length > 0 ? item.id : `reasoning_replay_${index}`;\n\n if (item.visibility === \"full\") {\n return {\n type: \"reasoning\",\n id,\n summary: [],\n content: text ? [{ type: \"reasoning_text\", text }] : undefined,\n };\n }\n\n // summary / redacted / opaque:公开可回传的是 summary_text\n return {\n type: \"reasoning\",\n id,\n summary: text ? [{ type: \"summary_text\", text }] : [],\n };\n}\n\nfunction extractOpaqueContinuationId(payload: Record<string, unknown>): {\n previousResponseId?: string;\n itemReferenceId?: string;\n} {\n // 优先显式 previous_response_id;历史 payload 用 id 存 response 续写句柄\n const previousResponseId =\n readNonEmptyString(payload.previous_response_id) ??\n (typeof payload.item_id === \"string\" ? undefined : readNonEmptyString(payload.id));\n\n // 仅在显式给出 item_id 时使用 item_reference(引用的是 item,不是 response)\n const itemReferenceId = readNonEmptyString(payload.item_id);\n\n return { previousResponseId, itemReferenceId };\n}\n\nfunction assertOptionalIdFields(payload: Record<string, unknown>): void {\n for (const key of [\"id\", \"previous_response_id\", \"item_id\"] as const) {\n if (\n key in payload &&\n (typeof payload[key] !== \"string\" || payload[key].length === 0 || payload[key].length > 256)\n ) {\n throw new AIRequestError(\n `Invalid opaque replay payload: ${key} must be a non-empty string (max 256)`,\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n }\n}\n\n/**\n * 将 compact 返回的 wire output 原样展开进 input。\n * 官方要求:不要裁剪 compact output;下轮 /responses 应整窗回传。\n */\nfunction appendCompactedWindow(input: ResponsesInputItem[], payload: Record<string, unknown>): void {\n if (!Array.isArray(payload.output)) {\n throw new AIRequestError(\n 'Invalid opaque replay payload: compacted_window requires \"output\" array',\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n for (let i = 0; i < payload.output.length; i++) {\n const wireItem = payload.output[i];\n if (!wireItem || typeof wireItem !== \"object\") {\n throw new AIRequestError(\n `Invalid opaque replay payload: compacted_window.output[${i}] must be an object`,\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n // 保真:compact 输出按 wire 原样进入下一轮 input(含 compaction / retained messages)\n input.push(wireItem as ResponsesInputItem);\n }\n}\n\ntype MappedResponsesCore = {\n input: ResponsesInputItem[];\n previousResponseId?: string;\n instructions?: string;\n /** 若展开过 compacted_window,则禁止叠 previous_response_id 续写 */\n usedCompactedWindow: boolean;\n};\n\n/**\n * stream / compact 共享的 input + instructions + opaque 续写映射。\n * compact 不附带 tools / stream 等生成字段。\n */\nfunction mapResponsesCore(\n request: {\n input: InputItem[];\n instructions?: string | InstructionBlock[];\n },\n options?: { maxOpaquePayloadBytes?: number },\n): MappedResponsesCore {\n const input: ResponsesInputItem[] = [];\n let previousResponseId: string | undefined;\n let usedCompactedWindow = false;\n let reasoningIndex = 0;\n\n for (const item of request.input) {\n switch (item.type) {\n case \"message\": {\n // EasyInputMessage:string content 对 user/assistant 都合法,且最不易触发 ModelInput 反序列化失败。\n // 切勿发送 { type: \"text\" } —— 官方 content part 是 input_text / output_text。\n input.push({\n type: \"message\",\n role: item.role,\n content: messageContentAsString(item.content, `input message (${item.role}) content`),\n });\n break;\n }\n case \"reasoning\": {\n input.push(mapReasoningInput(item, reasoningIndex++));\n break;\n }\n case \"tool_call\": {\n // call_id 必填;canonical ToolCallItem.id 即 call_id(流里会优先取 call_id)\n input.push({\n type: \"function_call\",\n call_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 优先;compacted_window 原样展开;否则 previous_response_id 服务端续写。\n // 注意:response id 不能塞进 item_reference(那是 item id);不叠 wire assistant。\n const payload = acceptOpaqueReplay(item, OPAQUE_SOURCE.RESPONSES, {\n maxBytes: options?.maxOpaquePayloadBytes,\n });\n if (!payload) break;\n\n // compacted_window:压缩结果整窗回传;与 previous_response_id 互斥(window 为准)\n if (payload.kind === RESPONSES_COMPACTED_WINDOW_KIND) {\n assertOptionalIdFields(payload);\n appendCompactedWindow(input, payload);\n usedCompactedWindow = true;\n // 有 window 时丢弃已收集的 previous_response_id,避免双上下文\n previousResponseId = undefined;\n break;\n }\n\n assertOptionalIdFields(payload);\n\n // 已有 compacted_window 后忽略 id 续写 opaque(window 已是完整上下文)\n if (usedCompactedWindow) break;\n\n const { previousResponseId: prevId, itemReferenceId } = extractOpaqueContinuationId(payload);\n if (!hasReplayCanonicalInput(input)) {\n if (prevId && !previousResponseId) {\n previousResponseId = prevId;\n } else if (itemReferenceId) {\n input.push({ type: \"item_reference\", id: itemReferenceId });\n }\n }\n break;\n }\n }\n }\n\n const mapped: MappedResponsesCore = {\n input,\n usedCompactedWindow,\n };\n if (previousResponseId && !usedCompactedWindow) {\n mapped.previousResponseId = previousResponseId;\n }\n if (request.instructions) {\n mapped.instructions = mapper.mapInstructions(request.instructions);\n }\n return mapped;\n}\n\n/** 构建 Responses 流式请求体;调用方再 `withExtraBody` 合并构造期扩展字段。 */\nexport function buildResponsesRequest(\n request: NormalizedRequest,\n options?: { maxOpaquePayloadBytes?: number },\n): ResponsesAPIRequest {\n const core = mapResponsesCore(request, options);\n\n const body: ResponsesAPIRequest = {\n model: request.model,\n input: core.input,\n stream: true,\n };\n\n if (core.previousResponseId) {\n body.previous_response_id = core.previousResponseId;\n }\n if (core.instructions) {\n body.instructions = core.instructions;\n }\n\n const functionTools =\n 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 const serverTools = mapServerTools(request.serverTools);\n const tools = [...functionTools, ...serverTools];\n if (tools.length > 0) {\n body.tools = tools;\n }\n\n body.tool_choice = mapper.mapToolChoice<Exclude<ResponsesAPIRequest[\"tool_choice\"], undefined>>(request.toolChoice, {\n auto: \"auto\",\n none: \"none\",\n tool: (name) => ({ type: \"function\" as const, name }),\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 if (request.reasoningLevel !== undefined) {\n body.reasoning = mapResponsesReasoning(request.reasoningLevel);\n }\n\n return body;\n}\n\n/**\n * 构建 Responses compact 请求体(POST /responses/compact)。\n * 仅映射 model / input / instructions / previous_response_id;无 stream / tools。\n */\nexport function buildResponsesCompactRequest(\n request: CompressRequest,\n options?: { maxOpaquePayloadBytes?: number },\n): ResponsesCompactAPIRequest {\n if (!request.model || typeof request.model !== \"string\" || request.model.length === 0) {\n throw new AIRequestError(\"compress requires a non-empty model\", \"INPUT_EMPTY\");\n }\n if (!Array.isArray(request.input) || request.input.length === 0) {\n throw new AIRequestError(\"compress requires a non-empty input\", \"INPUT_EMPTY\");\n }\n\n const core = mapResponsesCore(request, options);\n const body: ResponsesCompactAPIRequest = {\n model: request.model,\n input: core.input,\n };\n if (core.previousResponseId) {\n body.previous_response_id = core.previousResponseId;\n }\n if (core.instructions) {\n body.instructions = core.instructions;\n }\n return body;\n}\n","/**\n * Responses API 最终 payload → StopReason\n */\n\nimport type { StopReason } from \"../../types/index.js\";\nimport type { ResponsesAPIResponse } from \"./types.js\";\n\nexport function inferResponsesStopReason(response: ResponsesAPIResponse): 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 * StreamingItemSession — item 级 start/delta/complete 唯一状态机\n *\n * 方案 A(事件权威):\n * - 事件由本 session 通过 EventFactory 产出\n * - completedItems 与已完成事件同源,仅供 replayFromOutput\n * - 禁止 adapter 再维护并行 OutputItem[] 内容账本\n */\n\nimport {\n coalesceContentBlocks,\n messageItem,\n reasoningItem,\n toolCallItem,\n serverToolCallItem,\n} from \"../canonical/index.js\";\nimport { AIStreamError } from \"../runtime/errors.js\";\nimport type { EventFactory } from \"../stream/event-factory.js\";\nimport type {\n AIStreamEvent,\n Citation,\n ContentBlock,\n OutputItem,\n ReasoningItem,\n ServerToolDiscoveryItem,\n ServerToolResultItem,\n} from \"../types/index.js\";\n\n// ── Active state ──────────────────────────────────────────────\n\ntype ActiveMessage = {\n type: \"message\";\n id: string;\n content: ContentBlock[];\n citations?: Citation[];\n};\n\ntype ActiveReasoning = {\n type: \"reasoning\";\n id: string;\n visibility: ReasoningItem[\"visibility\"];\n content: ContentBlock[];\n};\n\ntype ActiveToolCall = {\n type: \"tool_call\";\n id: string;\n name: string;\n argumentChunks: string[];\n};\n\ntype ActiveServerToolCall = {\n type: \"server_tool_call\";\n id: string;\n tool: string;\n name?: string;\n argumentChunks: string[];\n serverLabel?: string;\n status?: \"in_progress\" | \"completed\" | \"failed\";\n providerPayload?: unknown;\n};\n\ntype ActiveItem = ActiveMessage | ActiveReasoning | ActiveToolCall | ActiveServerToolCall;\n\nfunction protocolError(message: string): AIStreamError {\n return new AIStreamError(message, \"STREAM_PROTOCOL_ERROR\");\n}\n\n// ── Session ───────────────────────────────────────────────────\n\nexport type StreamingItemSession = {\n startMessage(id: string): AIStreamEvent;\n /** 若未 start 则 start;已 start 返回 null */\n ensureMessageStarted(id: string): AIStreamEvent | null;\n deltaMessage(id: string, block: ContentBlock): AIStreamEvent;\n completeMessage(id: string, options?: { citations?: Citation[] }): AIStreamEvent;\n\n startReasoning(id: string, visibility: ReasoningItem[\"visibility\"]): AIStreamEvent;\n ensureReasoningStarted(id: string, visibility: ReasoningItem[\"visibility\"]): AIStreamEvent | null;\n deltaReasoning(id: string, block: ContentBlock): AIStreamEvent;\n completeReasoning(id: string): AIStreamEvent;\n\n startToolCall(id: string, name: string): AIStreamEvent;\n deltaToolCall(id: string, delta: { argumentsText?: string }): AIStreamEvent;\n completeToolCall(id: string): AIStreamEvent;\n\n startServerTool(id: string, tool: string, options?: { name?: string; serverLabel?: string }): AIStreamEvent;\n deltaServerTool(id: string, delta: { argumentsText?: string }): AIStreamEvent;\n completeServerTool(\n id: string,\n options?: { status?: \"completed\" | \"failed\"; providerPayload?: unknown },\n ): AIStreamEvent;\n\n /** 原子完成项(无 started 生命周期) */\n completeServerToolResult(item: ServerToolResultItem): AIStreamEvent;\n completeServerToolDiscovery(item: ServerToolDiscoveryItem): AIStreamEvent;\n\n /** 与已完成事件同源的有序 OutputItem[],供 replayFromOutput */\n completedItems(): readonly OutputItem[];\n hasActive(): boolean;\n isActive(id: string): boolean;\n activeIds(): readonly string[];\n};\n\n/**\n * 创建流式 item session。\n * factory 必须与 adapter 当前 stream 共用,以保持 sequence 单调。\n */\nexport function createStreamingItemSession(factory: EventFactory): StreamingItemSession {\n const active = new Map<string, ActiveItem>();\n const completed: OutputItem[] = [];\n const completedIds = new Set<string>();\n\n function assertNotCompleted(id: string): void {\n if (completedIds.has(id)) {\n throw protocolError(`Item ${id} is already completed`);\n }\n }\n\n function assertNotActive(id: string): void {\n if (active.has(id)) {\n throw protocolError(`Item ${id} is already active`);\n }\n }\n\n function getActive<T extends ActiveItem[\"type\"]>(id: string, expected: T): Extract<ActiveItem, { type: T }> {\n const item = active.get(id);\n if (!item) {\n throw protocolError(`Received ${expected} delta/completed for unknown item: ${id}`);\n }\n if (item.type !== expected) {\n throw protocolError(`Item ${id} started as ${item.type} but received ${expected} event`);\n }\n return item as Extract<ActiveItem, { type: T }>;\n }\n\n return {\n startMessage(id) {\n assertNotCompleted(id);\n assertNotActive(id);\n active.set(id, { type: \"message\", id, content: [] });\n return factory.messageStarted(id);\n },\n\n ensureMessageStarted(id) {\n if (active.has(id) || completedIds.has(id)) return null;\n return this.startMessage(id);\n },\n\n deltaMessage(id, block) {\n const item = getActive(id, \"message\");\n item.content.push(block);\n return factory.messageDelta(id, block);\n },\n\n completeMessage(id, options) {\n const item = getActive(id, \"message\");\n if (options?.citations && options.citations.length > 0) {\n item.citations = options.citations;\n }\n active.delete(id);\n const outputItem = messageItem(coalesceContentBlocks(item.content), {\n id: item.id,\n ...(item.citations && item.citations.length > 0 ? { citations: item.citations } : {}),\n });\n completed.push(outputItem);\n completedIds.add(id);\n return factory.messageCompleted(id, options?.citations ? { citations: options.citations } : undefined);\n },\n\n startReasoning(id, visibility) {\n assertNotCompleted(id);\n assertNotActive(id);\n active.set(id, { type: \"reasoning\", id, visibility, content: [] });\n return factory.reasoningStarted(id, visibility);\n },\n\n ensureReasoningStarted(id, visibility) {\n if (active.has(id) || completedIds.has(id)) return null;\n return this.startReasoning(id, visibility);\n },\n\n deltaReasoning(id, block) {\n const item = getActive(id, \"reasoning\");\n item.content.push(block);\n return factory.reasoningDelta(id, block);\n },\n\n completeReasoning(id) {\n const item = getActive(id, \"reasoning\");\n active.delete(id);\n completed.push(reasoningItem(coalesceContentBlocks(item.content), item.visibility, item.id));\n completedIds.add(id);\n return factory.reasoningCompleted(id);\n },\n\n startToolCall(id, name) {\n assertNotCompleted(id);\n assertNotActive(id);\n active.set(id, { type: \"tool_call\", id, name, argumentChunks: [] });\n return factory.toolCallStarted(id, name);\n },\n\n deltaToolCall(id, delta) {\n const item = getActive(id, \"tool_call\");\n if (delta.argumentsText) {\n item.argumentChunks.push(delta.argumentsText);\n }\n return factory.toolCallDelta(id, delta);\n },\n\n completeToolCall(id) {\n const item = getActive(id, \"tool_call\");\n active.delete(id);\n completed.push(toolCallItem(item.id, item.name, item.argumentChunks.join(\"\")));\n completedIds.add(id);\n return factory.toolCallCompleted(id);\n },\n\n startServerTool(id, tool, options) {\n assertNotCompleted(id);\n assertNotActive(id);\n active.set(id, {\n type: \"server_tool_call\",\n id,\n tool,\n name: options?.name,\n argumentChunks: [],\n serverLabel: options?.serverLabel,\n status: \"in_progress\",\n });\n return factory.serverToolStarted(id, tool, options);\n },\n\n deltaServerTool(id, delta) {\n const item = getActive(id, \"server_tool_call\");\n if (delta.argumentsText) {\n item.argumentChunks.push(delta.argumentsText);\n }\n return factory.serverToolDelta(id, delta);\n },\n\n completeServerTool(id, options) {\n const item = getActive(id, \"server_tool_call\");\n item.status = options?.status ?? \"completed\";\n if (options?.providerPayload !== undefined) {\n item.providerPayload = options.providerPayload;\n }\n active.delete(id);\n const argumentsText = item.argumentChunks.join(\"\");\n completed.push(\n serverToolCallItem(item.id, item.tool, {\n ...(item.name !== undefined ? { name: item.name } : {}),\n ...(argumentsText ? { argumentsText } : {}),\n ...(item.status ? { status: item.status } : {}),\n ...(item.serverLabel !== undefined ? { serverLabel: item.serverLabel } : {}),\n ...(item.providerPayload !== undefined ? { providerPayload: item.providerPayload } : {}),\n }),\n );\n completedIds.add(id);\n return factory.serverToolCompleted(id, options);\n },\n\n completeServerToolResult(item) {\n const orderId = item.id ?? `server_tool_result:${item.callId}:${completed.length}`;\n if (completedIds.has(orderId) || active.has(orderId)) {\n throw protocolError(`Item ${orderId} is already present`);\n }\n completed.push({ ...item } as OutputItem);\n completedIds.add(orderId);\n return factory.serverToolResultCompleted(item);\n },\n\n completeServerToolDiscovery(item) {\n if (completedIds.has(item.id) || active.has(item.id)) {\n throw protocolError(`Item ${item.id} is already present`);\n }\n completed.push({ ...item });\n completedIds.add(item.id);\n return factory.serverToolDiscoveryCompleted(item);\n },\n\n completedItems() {\n return completed;\n },\n\n hasActive() {\n return active.size > 0;\n },\n\n isActive(id) {\n return active.has(id);\n },\n\n activeIds() {\n return [...active.keys()];\n },\n };\n}\n","/**\n * Responses SSE item 映射与流事件处理器\n *\n * 纯映射可单测;createResponsesSseProcessor 持有流式会话状态。\n */\n\nimport { WarningCode } from \"../../runtime/errors.js\";\nimport {\n textBlock,\n jsonBlock,\n imageBlock,\n serverToolCallItem,\n serverToolResultItem,\n serverToolDiscoveryItem,\n} from \"../../canonical/index.js\";\nimport { createStreamingItemSession, type StreamingItemSession } from \"../../provider/streaming-item-session.js\";\nimport type {\n AIStreamEvent,\n Citation,\n ContentBlock,\n ReasoningItem,\n ServerToolCallItem,\n ServerToolDiscoveryItem,\n ServerToolResultItem,\n} from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { ResponsesAPIResponse, ResponsesSSEEvent } from \"./types.js\";\n\n// ── 已知 SSE 类型 ─────────────────────────────────────────────\n\n/** 已处理或可安全忽略的 Responses SSE 类型(未知类型会 warning 一次)。 */\nexport const 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.output_text.annotation.added\",\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 // server tools\n \"response.web_search_call.in_progress\",\n \"response.web_search_call.searching\",\n \"response.web_search_call.completed\",\n \"response.code_interpreter_call.in_progress\",\n \"response.code_interpreter_call.interpreting\",\n \"response.code_interpreter_call.completed\",\n \"response.code_interpreter_call_code.delta\",\n \"response.code_interpreter_call_code.done\",\n \"response.mcp_call.in_progress\",\n \"response.mcp_call.completed\",\n \"response.mcp_call.failed\",\n \"response.mcp_call_arguments.delta\",\n \"response.mcp_call_arguments.done\",\n \"response.mcp_list_tools.in_progress\",\n \"response.mcp_list_tools.completed\",\n \"response.mcp_list_tools.failed\",\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\n// ── 纯映射 ────────────────────────────────────────────────────\n\nexport function mapAnnotationToCitation(annotation: Record<string, unknown>): Citation | undefined {\n if (annotation.type === \"url_citation\" && typeof annotation.url === \"string\") {\n return {\n type: \"url\",\n url: annotation.url,\n ...(typeof annotation.title === \"string\" ? { title: annotation.title } : {}),\n ...(typeof annotation.start_index === \"number\" ? { startIndex: annotation.start_index } : {}),\n ...(typeof annotation.end_index === \"number\" ? { endIndex: annotation.end_index } : {}),\n };\n }\n\n if (\n annotation.type === \"container_file_citation\" &&\n typeof annotation.container_id === \"string\" &&\n typeof annotation.file_id === \"string\"\n ) {\n return {\n type: \"container_file\",\n containerId: annotation.container_id,\n fileId: annotation.file_id,\n ...(typeof annotation.filename === \"string\" ? { filename: annotation.filename } : {}),\n ...(typeof annotation.start_index === \"number\" ? { startIndex: annotation.start_index } : {}),\n ...(typeof annotation.end_index === \"number\" ? { endIndex: annotation.end_index } : {}),\n };\n }\n\n return undefined;\n}\n\nexport function extractCitationsFromMessageItem(item: Record<string, unknown>): Citation[] {\n const citations: Citation[] = [];\n if (!Array.isArray(item.content)) return citations;\n for (const part of item.content) {\n if (!part || typeof part !== \"object\") continue;\n const annotations = (part as { annotations?: unknown }).annotations;\n if (!Array.isArray(annotations)) continue;\n for (const annotation of annotations) {\n if (!annotation || typeof annotation !== \"object\") continue;\n const mapped = mapAnnotationToCitation(annotation as Record<string, unknown>);\n if (mapped) citations.push(mapped);\n }\n }\n return citations;\n}\n\nexport function webSearchArgumentsText(action: unknown): string | undefined {\n if (!action || typeof action !== \"object\") return undefined;\n const record = action as Record<string, unknown>;\n if (typeof record.query === \"string\" && record.query.length > 0) {\n return JSON.stringify({ query: record.query });\n }\n if (Array.isArray(record.queries) && record.queries.every((q) => typeof q === \"string\")) {\n return JSON.stringify({ queries: record.queries });\n }\n if (record.type === \"open_page\" && typeof record.url === \"string\") {\n return JSON.stringify({ url: record.url });\n }\n if (record.type === \"find_in_page\") {\n return JSON.stringify({\n ...(typeof record.pattern === \"string\" ? { pattern: record.pattern } : {}),\n ...(typeof record.url === \"string\" ? { url: record.url } : {}),\n });\n }\n return undefined;\n}\n\nexport function mapWebSearchCallItem(item: Record<string, unknown>): {\n call: ServerToolCallItem;\n result?: ServerToolResultItem;\n} {\n const action = item.action;\n const status = item.status === \"failed\" ? \"failed\" : item.status === \"completed\" ? \"completed\" : \"in_progress\";\n const name =\n action && typeof action === \"object\" && typeof (action as { type?: unknown }).type === \"string\"\n ? (action as { type: string }).type\n : undefined;\n const call = serverToolCallItem(item.id as string, \"web_search\", {\n name,\n argumentsText: webSearchArgumentsText(action),\n status,\n providerPayload: {\n ...(action !== undefined ? { action } : {}),\n ...(item.status !== undefined ? { status: item.status } : {}),\n },\n });\n\n const sources =\n action && typeof action === \"object\" && Array.isArray((action as { sources?: unknown }).sources)\n ? (action as { sources: unknown[] }).sources\n : undefined;\n if (!sources || sources.length === 0) {\n return { call };\n }\n\n return {\n call,\n result: serverToolResultItem(\n call.id,\n \"web_search\",\n status === \"failed\" ? \"error\" : \"success\",\n [jsonBlock({ sources })],\n { providerPayload: { sources } },\n ),\n };\n}\n\nexport function mapCodeInterpreterOutputs(outputs: unknown): ContentBlock[] {\n if (!Array.isArray(outputs)) return [];\n const blocks: ContentBlock[] = [];\n for (const output of outputs) {\n if (!output || typeof output !== \"object\") continue;\n const record = output as Record<string, unknown>;\n if (record.type === \"logs\" && typeof record.logs === \"string\") {\n blocks.push(textBlock(record.logs));\n } else if (record.type === \"image\" && typeof record.url === \"string\") {\n blocks.push(imageBlock(record.url));\n } else {\n blocks.push(jsonBlock(record));\n }\n }\n return blocks;\n}\n\nexport function mapCodeInterpreterCallItem(item: Record<string, unknown>): {\n call: ServerToolCallItem;\n result?: ServerToolResultItem;\n} {\n const status = item.status === \"failed\" ? \"failed\" : item.status === \"completed\" ? \"completed\" : \"in_progress\";\n const code = typeof item.code === \"string\" ? item.code : undefined;\n const call = serverToolCallItem(item.id as string, \"code_execution\", {\n name: \"python\",\n argumentsText: code,\n status,\n providerPayload: {\n ...(typeof item.container_id === \"string\" ? { containerId: item.container_id } : {}),\n ...(item.status !== undefined ? { status: item.status } : {}),\n },\n });\n\n const content = mapCodeInterpreterOutputs(item.outputs);\n if (content.length === 0 && status !== \"failed\") {\n return { call };\n }\n\n return {\n call,\n result: serverToolResultItem(call.id, \"code_execution\", status === \"failed\" ? \"error\" : \"success\", content, {\n providerPayload: {\n ...(typeof item.container_id === \"string\" ? { containerId: item.container_id } : {}),\n ...(item.outputs !== undefined ? { outputs: item.outputs } : {}),\n },\n }),\n };\n}\n\nexport function mapMcpCallItem(item: Record<string, unknown>): {\n call: ServerToolCallItem;\n result: ServerToolResultItem;\n} {\n const failed = item.error != null && item.error !== \"\";\n const call = serverToolCallItem(item.id as string, \"mcp\", {\n name: typeof item.name === \"string\" ? item.name : undefined,\n argumentsText: typeof item.arguments === \"string\" ? item.arguments : undefined,\n serverLabel: typeof item.server_label === \"string\" ? item.server_label : undefined,\n status: failed ? \"failed\" : \"completed\",\n providerPayload: {\n ...(item.approval_request_id !== undefined ? { approvalRequestId: item.approval_request_id } : {}),\n ...(item.error !== undefined ? { error: item.error } : {}),\n },\n });\n\n const content: ContentBlock[] = [];\n if (typeof item.output === \"string\" && item.output.length > 0) {\n content.push(textBlock(item.output));\n } else if (item.output !== undefined && item.output !== null) {\n content.push(jsonBlock(item.output));\n }\n if (failed) {\n content.push(\n textBlock(typeof item.error === \"string\" ? item.error : JSON.stringify(item.error ?? \"mcp call failed\")),\n );\n }\n\n return {\n call,\n result: serverToolResultItem(call.id, \"mcp\", failed ? \"error\" : \"success\", content, {\n providerPayload: {\n ...(typeof item.server_label === \"string\" ? { serverLabel: item.server_label } : {}),\n ...(item.error !== undefined ? { error: item.error } : {}),\n },\n }),\n };\n}\n\nexport function mapMcpListToolsItem(item: Record<string, unknown>): ServerToolDiscoveryItem {\n const tools: ServerToolDiscoveryItem[\"tools\"] = [];\n if (Array.isArray(item.tools)) {\n for (const tool of item.tools) {\n if (!tool || typeof tool !== \"object\") continue;\n const record = tool as Record<string, unknown>;\n if (typeof record.name !== \"string\") continue;\n tools.push({\n name: record.name,\n ...(typeof record.description === \"string\" ? { description: record.description } : {}),\n ...(record.input_schema !== undefined ? { inputSchema: record.input_schema } : {}),\n });\n }\n }\n\n return serverToolDiscoveryItem(\n item.id as string,\n typeof item.server_label === \"string\" ? item.server_label : \"unknown\",\n tools,\n {\n providerPayload: {\n ...(item.error !== undefined ? { error: item.error } : {}),\n ...(item.tools !== undefined ? { tools: item.tools } : {}),\n },\n },\n );\n}\n\ntype ReasoningVisibility = 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\nexport function 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\nfunction extractFailureMessage(response: ResponsesAPIResponse): string {\n return response.error?.message ?? response.failure?.message ?? \"unknown\";\n}\n\n// ── SSE 处理器 ────────────────────────────────────────────────\n\nexport type ResponsesSseProcessor = {\n items: StreamingItemSession;\n getCompletedResponse: () => ResponsesAPIResponse | undefined;\n handleEvent: (sseEvent: ResponsesSSEEvent) => Generator<AIStreamEvent, void, undefined>;\n};\n\nexport function createResponsesSseProcessor(factory: EventFactory): ResponsesSseProcessor {\n const items = createStreamingItemSession(factory);\n let completedResponse: ResponsesAPIResponse | undefined;\n let unknownEventsWarned = false;\n const messageItemsWithDelta = new Set<string>();\n /** item_id → function name */\n const toolCallNames = new Map<string, string>();\n /** item_id → call_id(canonical ToolCallItem.id / function_call_output.call_id) */\n const toolCallIds = new Map<string, string>();\n /** call_id → already streamed argument deltas */\n const toolCallArgDeltas = new Set<string>();\n const reasoningStates = new Map<string, ReasoningStreamState>();\n /** message item_id → citations accumulated from annotation events / item.done */\n const messageCitations = new Map<string, Citation[]>();\n /** already completed message ids (avoid double message.completed) */\n const completedMessageIds = new Set<string>();\n /** server tool call ids already completed */\n const completedServerToolIds = new Set<string>();\n /** server tool ids that already streamed argument deltas */\n const serverToolArgDeltas = new Set<string>();\n\n const resolveToolCallId = (itemId: string): string => toolCallIds.get(itemId) ?? itemId;\n\n const pushCitation = (itemId: string, citation: Citation): void => {\n const list = messageCitations.get(itemId) ?? [];\n list.push(citation);\n messageCitations.set(itemId, list);\n };\n\n const emitServerToolTerminal = function* (\n call: ServerToolCallItem,\n result?: ServerToolResultItem,\n ): Generator<AIStreamEvent, void, undefined> {\n if (completedServerToolIds.has(call.id)) return;\n completedServerToolIds.add(call.id);\n\n if (!items.isActive(call.id)) {\n yield items.startServerTool(call.id, call.tool, {\n ...(call.name !== undefined ? { name: call.name } : {}),\n ...(call.serverLabel !== undefined ? { serverLabel: call.serverLabel } : {}),\n });\n }\n\n // 若未流式吐过 arguments,用 done 载荷补齐(避免与 delta 重复拼接)\n if (call.argumentsText && !serverToolArgDeltas.has(call.id)) {\n yield items.deltaServerTool(call.id, { argumentsText: call.argumentsText });\n serverToolArgDeltas.add(call.id);\n }\n yield items.completeServerTool(call.id, {\n status: call.status === \"failed\" ? \"failed\" : \"completed\",\n providerPayload: call.providerPayload,\n });\n if (result) {\n yield items.completeServerToolResult(result);\n }\n };\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\n if (!items.isActive(itemId)) {\n const started = items.ensureReasoningStarted(itemId, visibility);\n if (started) yield started;\n }\n\n if (items.isActive(itemId)) {\n if (!state.hasDelta && text) {\n yield items.deltaReasoning(itemId, textBlock(text));\n state.hasDelta = true;\n }\n yield items.completeReasoning(itemId);\n }\n };\n\n function* handleEvent(sseEvent: ResponsesSSEEvent): Generator<AIStreamEvent, void, undefined> {\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 return;\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 items.startMessage(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 items.startReasoning(item.id, visibility);\n break;\n }\n case \"function_call\": {\n const name = typeof item.name === \"string\" ? item.name : \"unknown\";\n // Responses 用 call_id 关联 function_call_output;item.id 是 fc_* item id\n const callId = typeof item.call_id === \"string\" && item.call_id.length > 0 ? item.call_id : item.id;\n toolCallNames.set(item.id, name);\n toolCallIds.set(item.id, callId);\n yield items.startToolCall(callId, name);\n break;\n }\n case \"web_search_call\": {\n const action = item.action;\n const name =\n action && typeof action === \"object\" && typeof (action as { type?: unknown }).type === \"string\"\n ? (action as { type: string }).type\n : undefined;\n yield items.startServerTool(item.id, \"web_search\", { name });\n break;\n }\n case \"code_interpreter_call\": {\n yield items.startServerTool(item.id, \"code_execution\", { name: \"python\" });\n break;\n }\n case \"mcp_call\": {\n yield items.startServerTool(item.id, \"mcp\", {\n name: typeof item.name === \"string\" ? item.name : undefined,\n serverLabel: typeof item.server_label === \"string\" ? item.server_label : undefined,\n });\n break;\n }\n case \"mcp_list_tools\":\n // discovery 在 done 时原子发射\n break;\n case \"mcp_approval_request\":\n yield factory.responseWarning(\n `MCP approval requested for tool \"${typeof item.name === \"string\" ? item.name : \"unknown\"}\" on server \"${typeof item.server_label === \"string\" ? item.server_label : \"unknown\"}\"; requireApproval never expected`,\n WarningCode.MCP_APPROVAL_REQUIRED,\n );\n break;\n }\n return;\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 = extracted.text || (state.doneTexts.length > 0 ? state.doneTexts.join(\"\\n\") : \"\");\n yield* completeReasoning(item.id, text, extracted.visibility || state.visibility);\n return;\n }\n\n if (item.type === \"message\") {\n // 晚到的 citations:text.done 可能已 complete message;事件权威下不再回写账本\n for (const citation of extractCitationsFromMessageItem(item)) {\n pushCitation(item.id, citation);\n }\n return;\n }\n\n if (item.type === \"web_search_call\") {\n const mapped = mapWebSearchCallItem(item);\n yield* emitServerToolTerminal(mapped.call, mapped.result);\n return;\n }\n\n if (item.type === \"code_interpreter_call\") {\n const mapped = mapCodeInterpreterCallItem(item);\n yield* emitServerToolTerminal(mapped.call, mapped.result);\n return;\n }\n\n if (item.type === \"mcp_call\") {\n const mapped = mapMcpCallItem(item);\n yield* emitServerToolTerminal(mapped.call, mapped.result);\n return;\n }\n\n if (item.type === \"mcp_list_tools\") {\n const discovery = mapMcpListToolsItem(item);\n yield items.completeServerToolDiscovery(discovery);\n return;\n }\n\n if (item.type === \"mcp_approval_request\") {\n yield factory.responseWarning(\n `MCP approval request item \"${item.id}\" completed; approval flow is not supported in MVP`,\n WarningCode.MCP_APPROVAL_REQUIRED,\n );\n return;\n }\n\n return;\n }\n\n if (sseEvent.type === \"response.output_text.delta\") {\n const data = sseEvent.data as { item_id: string; delta: string };\n yield items.deltaMessage(data.item_id, textBlock(data.delta));\n messageItemsWithDelta.add(data.item_id);\n return;\n }\n\n if (sseEvent.type === \"response.output_text.annotation.added\") {\n const data = sseEvent.data as {\n item_id?: string;\n annotation?: Record<string, unknown>;\n };\n if (typeof data.item_id === \"string\" && data.annotation) {\n const citation = mapAnnotationToCitation(data.annotation);\n if (citation) pushCitation(data.item_id, citation);\n }\n return;\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 items.deltaMessage(data.item_id, textBlock(data.text));\n messageItemsWithDelta.add(data.item_id);\n }\n if (!completedMessageIds.has(data.item_id) && items.isActive(data.item_id)) {\n completedMessageIds.add(data.item_id);\n const citations = messageCitations.get(data.item_id);\n // 复制数组,避免后续 annotation / item.done 再 push 时污染 snapshot\n const citationsSnapshot = citations && citations.length > 0 ? [...citations] : undefined;\n yield items.completeMessage(data.item_id, citationsSnapshot ? { citations: citationsSnapshot } : undefined);\n }\n return;\n }\n\n if (\n sseEvent.type === \"response.code_interpreter_call_code.delta\" ||\n sseEvent.type === \"response.mcp_call_arguments.delta\"\n ) {\n const data = sseEvent.data as { item_id: string; delta?: string };\n if (typeof data.item_id === \"string\" && typeof data.delta === \"string\" && data.delta.length > 0) {\n serverToolArgDeltas.add(data.item_id);\n yield items.deltaServerTool(data.item_id, { argumentsText: data.delta });\n }\n return;\n }\n\n if (\n sseEvent.type === \"response.code_interpreter_call_code.done\" ||\n sseEvent.type === \"response.mcp_call_arguments.done\"\n ) {\n // 完整 code/args 会在 output_item.done 上写入 call;此处忽略避免重复 delta\n return;\n }\n\n // server tool progress events — known & ignored (terminal mapping on output_item.done)\n if (\n sseEvent.type === \"response.web_search_call.in_progress\" ||\n sseEvent.type === \"response.web_search_call.searching\" ||\n sseEvent.type === \"response.web_search_call.completed\" ||\n sseEvent.type === \"response.code_interpreter_call.in_progress\" ||\n sseEvent.type === \"response.code_interpreter_call.interpreting\" ||\n sseEvent.type === \"response.code_interpreter_call.completed\" ||\n sseEvent.type === \"response.mcp_call.in_progress\" ||\n sseEvent.type === \"response.mcp_call.completed\" ||\n sseEvent.type === \"response.mcp_call.failed\" ||\n sseEvent.type === \"response.mcp_list_tools.in_progress\" ||\n sseEvent.type === \"response.mcp_list_tools.completed\" ||\n sseEvent.type === \"response.mcp_list_tools.failed\"\n ) {\n return;\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 items.deltaReasoning(data.item_id, textBlock(data.delta));\n }\n return;\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 state.hasDelta = true;\n yield items.deltaReasoning(data.item_id, textBlock(data.text));\n } else if (data.text) {\n state.doneTexts.push(data.text);\n }\n return;\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 items.deltaReasoning(data.item_id, textBlock(data.delta));\n }\n return;\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 state.hasDelta = true;\n yield items.deltaReasoning(data.item_id, textBlock(data.text));\n } else if (data.text) {\n state.doneTexts.push(data.text);\n }\n return;\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 return;\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 items.deltaReasoning(data.item_id, textBlock(data.delta));\n }\n return;\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 state.hasDelta = true;\n yield items.deltaReasoning(data.item_id, textBlock(data.text));\n }\n yield* completeReasoning(data.item_id, data.text ?? state.doneTexts.join(\"\\n\"), \"full\");\n return;\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) {\n const callId = resolveToolCallId(data.item_id);\n toolCallArgDeltas.add(callId);\n yield items.deltaToolCall(callId, { argumentsText: data.delta });\n }\n return;\n }\n\n if (sseEvent.type === \"response.function_call_arguments.done\") {\n const data = sseEvent.data as { item_id: string; arguments: string };\n const callId = resolveToolCallId(data.item_id);\n // 若 added 事件缺失,done 时仍尽量从 completed payload 之外兜底 call_id\n if (!toolCallIds.has(data.item_id)) toolCallIds.set(data.item_id, callId);\n const name = toolCallNames.get(data.item_id) ?? \"unknown\";\n if (!items.isActive(callId)) {\n yield items.startToolCall(callId, name);\n }\n if (!toolCallArgDeltas.has(callId) && data.arguments) {\n yield items.deltaToolCall(callId, { argumentsText: data.arguments });\n toolCallArgDeltas.add(callId);\n }\n if (items.isActive(callId)) {\n yield items.completeToolCall(callId);\n }\n return;\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\", WarningCode.DUPLICATE_FINISH);\n return;\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 = extracted.text || (state && state.doneTexts.length > 0 ? state.doneTexts.join(\"\\n\") : \"\");\n // Only complete if we already tracked this item (session or reasoningStates).\n if (state || items.isActive(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 WarningCode.PROVIDER_FAILURE,\n );\n }\n return;\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 WarningCode.UNKNOWN_PROVIDER_EVENT,\n );\n }\n }\n\n return {\n items,\n getCompletedResponse: () => completedResponse,\n handleEvent,\n };\n}\n","/**\n * Responses Adapter\n *\n * 接入 OpenAI Responses API (responses 端点)。\n * 编排层:buildRequest + runStream(open → SSE 处理 → complete)。\n * 可选能力:compress → POST /responses/compact(ContextCompressCapable)。\n */\n\nimport { HttpAdapterBase } from \"../../provider/http-adapter.js\";\nimport { opaqueItem } from \"../../canonical/index.js\";\nimport { usageFromOpenAIResponses } from \"../../provider/usage/index.js\";\nimport { createSseJsonParser } from \"../../provider/transport/parser.js\";\nimport { postProviderJson } from \"../../provider/transport/open-stream.js\";\nimport { finalizeStreamTurn } from \"../../provider/finalize-stream-turn.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\nimport { assertOpaqueReplayEnvelope } from \"../../provider/security.js\";\nimport { AIStreamError } from \"../../runtime/errors.js\";\nimport { buildResponsesCompactRequest, buildResponsesRequest, RESPONSES_COMPACTED_WINDOW_KIND } from \"./map-request.js\";\nimport { inferResponsesStopReason } from \"./infer-stop-reason.js\";\nimport { createResponsesSseProcessor } from \"./map-items.js\";\n\nimport type {\n AIStreamEvent,\n CompressRequest,\n CompressResult,\n ContextCompressCapable,\n NormalizedRequest,\n} from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type {\n ResponsesAdapterOptions,\n ResponsesAPIRequest,\n ResponsesCompactAPIResponse,\n ResponsesSSEEvent,\n} from \"./types.js\";\n\nexport class ResponsesAdapter extends HttpAdapterBase implements ContextCompressCapable {\n readonly kind = \"responses\" as const;\n readonly isSyntheticStream = false;\n\n constructor(options: ResponsesAdapterOptions) {\n super(options, { baseUrl: \"https://api.openai.com/v1\" });\n }\n\n protected buildRequest(request: NormalizedRequest): ResponsesAPIRequest {\n return this.withExtraBody(\n buildResponsesRequest(request, { maxOpaquePayloadBytes: this.maxOpaquePayloadBytes }),\n );\n }\n\n /**\n * 原生上下文压缩:POST /responses/compact。\n * 结果以单个 opaque(kind=compacted_window) 回传;调用方用 replay 替换旧 transcript。\n */\n async compress(request: CompressRequest): Promise<CompressResult> {\n request.signal?.throwIfAborted();\n\n const body = this.withExtraBody(\n buildResponsesCompactRequest(request, { maxOpaquePayloadBytes: this.maxOpaquePayloadBytes }),\n );\n const { data } = await postProviderJson<ResponsesCompactAPIResponse>({\n fetchFn: this.fetchFn,\n url: `${this.baseUrl}/responses/compact`,\n headers: this.mergeHeaders({\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n }),\n body,\n signal: request.signal,\n });\n\n if (!data || typeof data !== \"object\" || !Array.isArray(data.output)) {\n throw new AIStreamError(\"Responses compact response missing output array\", \"STREAM_PROTOCOL_ERROR\");\n }\n\n const payload: Record<string, unknown> = {\n kind: RESPONSES_COMPACTED_WINDOW_KIND,\n output: data.output,\n };\n if (typeof data.id === \"string\" && data.id.length > 0 && data.id.length <= 256) {\n payload.id = data.id;\n }\n\n // compress 无 warning 通道:超限硬失败,避免写出不可回放的 window\n assertOpaqueReplayEnvelope(payload, { maxBytes: this.maxOpaquePayloadBytes });\n\n const result: CompressResult = {\n replay: [opaqueItem(OPAQUE_SOURCE.RESPONSES, \"replay\", payload)],\n };\n\n if (data.usage) {\n const usage = usageFromOpenAIResponses(data.usage);\n if (Object.keys(usage).length > 0) {\n result.usage = usage;\n }\n if (request.include?.usage === \"best_effort\" || request.include?.providerMetadata === \"best_effort\") {\n result.auxiliary = {\n usageSource: \"final\",\n providerUsage: data.usage,\n };\n }\n }\n\n if (typeof data.id === \"string\" && data.id.length > 0) {\n result.rawResponseId = data.id;\n }\n\n return result;\n }\n\n protected async *runStream(\n providerRequest: ResponsesAPIRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n const session = this.beginJsonStream(factory, request);\n const { auxiliary } = session;\n\n await session.open({\n url: `${this.baseUrl}/responses`,\n headers: this.mergeHeaders({\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n }),\n body: providerRequest,\n });\n\n const parser = createSseJsonParser<ResponsesSSEEvent>();\n const processor = createResponsesSseProcessor(factory);\n\n for await (const batch of session.batches({\n parser,\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 for (const sseEvent of batch.items) {\n yield* processor.handleEvent(sseEvent);\n }\n }\n\n const completedResponse = processor.getCompletedResponse();\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 stopReason = completedResponse ? inferResponsesStopReason(completedResponse) : undefined;\n yield* finalizeStreamTurn(session, processor.items, {\n // 同时保留 id(向后兼容)与 previous_response_id(语义明确)\n opaque: completedResponse?.id\n ? opaqueItem(OPAQUE_SOURCE.RESPONSES, \"replay\", {\n id: completedResponse.id,\n previous_response_id: completedResponse.id,\n })\n : null,\n stopReason,\n rawResponseId,\n factory,\n maxOpaquePayloadBytes: this.maxOpaquePayloadBytes,\n onDuplicate: \"silent\",\n });\n }\n}\n","/**\n * MessagesAdapter — request 映射\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport { contentBlocksToText } from \"../../canonical/index.js\";\nimport { acceptOpaqueReplay } from \"../../provider/opaque-replay.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { mapMessagesThinking } from \"../../provider/reasoning.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\n\nimport type { NormalizedRequest, ContentBlock } from \"../../types/index.js\";\nimport type { MessagesAPIRequest, MessagesAPIMessage, MessagesAPIContentBlock, MessagesAPITool } from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"messages\");\n\nexport function 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\nexport function 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\nexport type 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\nexport type 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 碰撞 */\nexport function synthesizeItemId(\n kind: \"msg\" | \"reason\" | \"reason-redacted\",\n blockIndex: number,\n responseId: string,\n): string {\n return `${kind}-${blockIndex}-${responseId}`;\n}\n\n// ── Content block 映射 ─────────────────────────────────────────\n\nexport function canonicalToMessagesBlock(b: 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\nexport function 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\nexport function 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\nexport function buildMessagesRequest(\n request: NormalizedRequest,\n options?: { maxOpaquePayloadBytes?: number },\n): MessagesAPIRequest {\n mapper.assertNoServerTools(request.serverTools);\n\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 // assistant opaque 始终 replace 尾部(与 replaceCanonical 语义一致)\n const payload = acceptOpaqueReplay(item, OPAQUE_SOURCE.MESSAGES, {\n maxBytes: options?.maxOpaquePayloadBytes,\n });\n if (!payload) break;\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 if (request.reasoningLevel !== undefined) {\n body.thinking = mapMessagesThinking(request.reasoningLevel, body.max_tokens);\n }\n\n return body;\n}\n","/**\n * MessagesAdapter — stream 映射\n */\n\nimport { AIRequestError, WarningCode } from \"../../runtime/errors.js\";\nimport { textBlock, opaqueItem, mapStopReason } from \"../../canonical/index.js\";\nimport { usageFromAnthropicMessages } from \"../../provider/usage/index.js\";\nimport { createSseJsonParser } from \"../../provider/transport/parser.js\";\nimport { createStreamingItemSession } from \"../../provider/streaming-item-session.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { parseJsonLooseObject } from \"../../provider/json-parse.js\";\nimport { finalizeStreamTurn } from \"../../provider/finalize-stream-turn.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, ContentBlock } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { MessagesAPIRequest, MessagesAPIContentBlock } from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"messages\");\n\nexport function 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\nexport function 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\nexport type 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\nexport type 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 碰撞 */\nexport function synthesizeItemId(\n kind: \"msg\" | \"reason\" | \"reason-redacted\",\n blockIndex: number,\n responseId: string,\n): string {\n return `${kind}-${blockIndex}-${responseId}`;\n}\n\n// ── Content block 映射 ─────────────────────────────────────────\n\nexport function canonicalToMessagesBlock(b: 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\nexport function 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\nexport function 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\nexport type MessagesAdapterStreamHost = {\n beginJsonStream: (\n factory: EventFactory,\n request: NormalizedRequest,\n ) => import(\"../../provider/transport/run-json-stream.js\").ProviderJsonStreamSession;\n baseUrl: string;\n apiKey?: string;\n mergeHeaders: (headers: Record<string, string>) => Record<string, string>;\n apiVersion: string;\n maxOpaquePayloadBytes: number;\n};\n\nexport async function* mapMessagesStream(\n host: MessagesAdapterStreamHost,\n providerRequest: MessagesAPIRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n): AsyncIterable<AIStreamEvent> {\n const session = host.beginJsonStream(factory, request);\n const { auxiliary } = session;\n\n if (request.metadata) {\n yield factory.responseWarning(\n \"Request metadata is not supported by the Messages adapter\",\n WarningCode.UNSUPPORTED_METADATA,\n );\n }\n\n const { headers } = await session.open({\n url: `${host.baseUrl}/messages`,\n headers: host.mergeHeaders({\n \"Content-Type\": \"application/json\",\n \"x-api-key\": host.apiKey ?? \"\",\n \"anthropic-version\": host.apiVersion,\n }),\n body: providerRequest,\n });\n\n const parser = createSseJsonParser<MessagesSSEEvent>();\n const items = createStreamingItemSession(factory);\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 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 session.batches({\n parser,\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 // provider 自定义 err.type 不进入 WarningCode;统一记 PROVIDER_FAILURE,原文保留在 message\n yield factory.responseWarning(\n err.type ? `${err.type}: ${err.message}` : err.message,\n WarningCode.PROVIDER_FAILURE,\n );\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 items.startMessage(currentItemId);\n break;\n }\n case \"thinking\": {\n currentItemType = \"reasoning\";\n currentItemId = synthesizeItemId(\"reason\", currentContentBlockIndex, rawResponseId);\n currentThinkingVisibility = \"full\";\n thinkingBuffer = \"\";\n yield items.startReasoning(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 items.startReasoning(currentItemId, \"redacted\");\n yield items.deltaReasoning(currentItemId, textBlock(data));\n yield items.completeReasoning(currentItemId);\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 argsBuffer = \"\";\n yield items.startToolCall(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 items.deltaMessage(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 items.deltaReasoning(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 items.deltaToolCall(currentItemId, { argumentsText: partial });\n }\n break;\n }\n }\n continue;\n }\n\n case \"content_block_stop\": {\n if (currentItemType === \"message\" && currentItemId) {\n yield items.completeMessage(currentItemId);\n rawReplayContent.push({ type: \"text\", text: textBuffer });\n } else if (currentItemType === \"reasoning\" && currentItemId && currentThinkingVisibility !== \"redacted\") {\n yield items.completeReasoning(currentItemId);\n rawReplayContent.push({ type: \"thinking\", thinking: thinkingBuffer });\n } else if (currentItemType === \"tool_call\" && currentItemId) {\n yield items.completeToolCall(currentItemId);\n rawReplayContent.push({\n type: \"tool_use\",\n id: currentItemId,\n name: currentToolName,\n input: parseJsonLooseObject(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 if (request.include?.providerMetadata !== \"off\") {\n auxiliary.recordProviderMetadata(\n \"stream\",\n buildStreamMetadata({\n apiVersion: host.apiVersion,\n message: messageResponse,\n stopReason,\n stopSequence,\n }),\n );\n }\n\n const opaque = messageResponse\n ? opaqueItem(OPAQUE_SOURCE.MESSAGES, \"replay\", {\n replaceCanonical: true,\n role: messageResponse.role,\n content: rawReplayContent.length > 0 ? rawReplayContent : messageResponse.content,\n messageId: messageResponse.id,\n stopReason: stopReason ?? messageResponse.stop_reason,\n })\n : null;\n\n yield* finalizeStreamTurn(session, items, {\n opaque,\n stopReason: stopReason ? mapStopReason(stopReason) : undefined,\n rawResponseId,\n factory,\n maxOpaquePayloadBytes: host.maxOpaquePayloadBytes,\n onDuplicate: \"silent\",\n });\n}\n","/**\n * MessagesAdapter\n *\n * 编排层:buildRequest + runStream(委托 map-request / map-stream)。\n */\n\nimport { HttpAdapterBase } from \"../../provider/http-adapter.js\";\nimport type { NormalizedRequest, AIStreamEvent } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { MessagesAdapterOptions, MessagesAPIRequest } from \"./types.js\";\nimport { buildMessagesRequest } from \"./map-request.js\";\nimport { mapMessagesStream } from \"./map-stream.js\";\n\nexport class MessagesAdapter extends HttpAdapterBase {\n readonly kind = \"messages\" as const;\n readonly isSyntheticStream = false;\n private apiVersion: string;\n\n constructor(options: MessagesAdapterOptions) {\n super(options, { baseUrl: \"https://api.anthropic.com/v1\" });\n this.apiVersion = options.apiVersion ?? \"2023-06-01\";\n }\n\n protected buildRequest(request: NormalizedRequest): MessagesAPIRequest {\n return this.withExtraBody(\n buildMessagesRequest(request, { maxOpaquePayloadBytes: this.maxOpaquePayloadBytes }),\n );\n }\n\n protected async *runStream(\n providerRequest: MessagesAPIRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n yield* mapMessagesStream(\n {\n beginJsonStream: this.beginJsonStream.bind(this),\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n mergeHeaders: this.mergeHeaders.bind(this),\n apiVersion: this.apiVersion,\n maxOpaquePayloadBytes: this.maxOpaquePayloadBytes,\n },\n providerRequest,\n factory,\n request,\n );\n }\n}\n","/**\n * OpenAI 风格 function tool 声明映射(chat.completions / ollama 等同构)。\n */\n\nimport type { ToolDefinition } from \"../types/index.js\";\n\nexport type OpenAiFunctionTool = {\n type: \"function\";\n function: {\n name: string;\n description?: string;\n parameters: Record<string, unknown>;\n };\n};\n\nexport function mapOpenAiFunctionTool(tool: ToolDefinition): OpenAiFunctionTool {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema as Record<string, unknown>,\n },\n };\n}\n","/**\n * ChatCompletionsAdapter wire / options 类型\n */\n\nimport type { HttpAdapterOptions } from \"../../provider/http-adapter.js\";\n\n/** apiKey 必填;默认 baseUrl https://api.openai.com/v1 */\nexport type ChatCompletionsAdapterOptions = HttpAdapterOptions & {\n apiKey: string;\n};\n\n// ── Chat API 请求类型 ─────────────────────────────────────────\n\nexport type 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 /** Portable reasoningLevel → reasoning_effort */\n reasoning_effort?: string;\n stream: true;\n n: 1;\n};\n\nexport type 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\nexport type ChatToolCall = {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n};\n\nexport type ChatTool = {\n type: \"function\";\n function: { name: string; description?: string; parameters: Record<string, unknown> };\n};\n\n// ── SSE chunk 类型 ────────────────────────────────────────────\n\nexport type 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\nexport type 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\nexport type ChatChunkToolCall = {\n index: number;\n id?: string;\n type?: string;\n function?: { name?: string; arguments?: string };\n};\n\nexport type PendingToolCall = {\n /** 真实 call id;未到 id 前用合成占位 id */\n id: string;\n name: string;\n args: string;\n /** 是否已向 StreamingItemSession 发出 startToolCall */\n started: boolean;\n /** 是否已收到 provider 的真实 id */\n hasProviderId: boolean;\n};\n\nexport type ReasoningFieldName = \"reasoning\" | \"reasoning_content\";\n\nexport const REASONING_FIELDS: readonly ReasoningFieldName[] = [\"reasoning_content\", \"reasoning\"];\n","/**\n * ChatCompletionsAdapter — request 映射\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport { acceptOpaqueReplay } from \"../../provider/opaque-replay.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { mapChatCompletionsReasoningEffort } from \"../../provider/reasoning.js\";\nimport { mapOpenAiFunctionTool } from \"../../provider/openai-tools.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\n\nimport type { NormalizedRequest } from \"../../types/index.js\";\nimport {\n REASONING_FIELDS,\n type ChatRequest,\n type ChatMessage,\n type ChatToolCall,\n type ChatChunkChoice,\n type PendingToolCall,\n type ReasoningFieldName,\n} from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"chat-completions\");\n\nexport function 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\nexport function extractReasoningDeltas(\n delta: ChatChunkChoice[\"delta\"],\n): 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\nexport function 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\nexport function 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\nexport function 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\nexport function 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\nexport function buildChatCompletionsRequest(\n request: NormalizedRequest,\n options?: { maxOpaquePayloadBytes?: number },\n): ChatRequest {\n mapper.assertNoServerTools(request.serverTools);\n\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 const payload = acceptOpaqueReplay(item, OPAQUE_SOURCE.CHAT_COMPLETIONS, {\n maxBytes: options?.maxOpaquePayloadBytes,\n });\n if (!payload) break;\n // 仅接受 messages 形;单条 role/content 已 deprecate(有效 envelope 下未识别 shape 跳过)\n if (\"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 }\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(request.tools, mapOpenAiFunctionTool);\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 if (request.reasoningLevel !== undefined) {\n body.reasoning_effort = mapChatCompletionsReasoningEffort(request.reasoningLevel);\n }\n\n return body;\n}\n","/**\n * ChatCompletionsAdapter — stream 映射\n */\n\nimport { AIRequestError, WarningCode } from \"../../runtime/errors.js\";\nimport { textBlock, opaqueItem, mapStopReason } from \"../../canonical/index.js\";\nimport { createStreamingItemSession } from \"../../provider/streaming-item-session.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { usageFromChatCompletions } from \"../../provider/usage/index.js\";\nimport { createDataLineSseParser } from \"../../provider/transport/parser.js\";\nimport { finalizeStreamTurn } from \"../../provider/finalize-stream-turn.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, StopReason } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport {\n REASONING_FIELDS,\n type ChatRequest,\n type ChatMessage,\n type ChatToolCall,\n type ChatChunk,\n type ChatChunkChoice,\n type PendingToolCall,\n type ReasoningFieldName,\n} from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"chat-completions\");\n\nexport function 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\nexport function extractReasoningDeltas(\n delta: ChatChunkChoice[\"delta\"],\n): 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\nexport function 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\nexport function 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\nexport function 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\nexport function 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\nexport type ChatCompletionsAdapterStreamHost = {\n beginJsonStream: (\n factory: EventFactory,\n request: NormalizedRequest,\n ) => import(\"../../provider/transport/run-json-stream.js\").ProviderJsonStreamSession;\n baseUrl: string;\n apiKey?: string;\n mergeHeaders: (headers: Record<string, string>) => Record<string, string>;\n maxOpaquePayloadBytes: number;\n};\n\nexport async function* mapChatCompletionsStream(\n host: ChatCompletionsAdapterStreamHost,\n providerRequest: ChatRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n): AsyncIterable<AIStreamEvent> {\n const session = host.beginJsonStream(factory, request);\n const { auxiliary, gate } = session;\n const items = createStreamingItemSession(factory);\n\n await session.open({\n url: `${host.baseUrl}/chat/completions`,\n headers: host.mergeHeaders({\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${host.apiKey}`,\n }),\n body: providerRequest,\n });\n\n const parser = createDataLineSseParser<ChatChunk>();\n\n // wire 缓冲仅用于 opaque / finish 状态;item 内容账本由 items session 维护\n let responseId: string | undefined;\n let accumulatedContent = \"\";\n let currentMessageId = \"\";\n let currentReasoningId = \"\";\n let hasMessageStarted = false;\n let hasReasoningStarted = false;\n let warnedNonZeroChoice = false;\n\n // tool_calls 按 index 占位;function_call 使用独立槽位,避免与 index 0 互踩\n const pendingToolCalls = new Map<number, PendingToolCall>();\n let pendingFunctionCall: PendingToolCall | null = null;\n /** 互斥:同一轮只接受一种 tool 形态 */\n let toolCallMode: \"none\" | \"tool_calls\" | \"function_call\" = \"none\";\n const reasoningByField = new Map<ReasoningFieldName, string>();\n\n const allPendingToolCalls = (): PendingToolCall[] => {\n if (toolCallMode === \"function_call\" && pendingFunctionCall) {\n return [pendingFunctionCall];\n }\n return [...pendingToolCalls.values()];\n };\n\n const ensurePendingToolCallStarted = (pending: PendingToolCall, events: AIStreamEvent[]): void => {\n if (pending.started) return;\n events.push(items.startToolCall(pending.id, pending.name));\n if (pending.args) {\n events.push(items.deltaToolCall(pending.id, { argumentsText: pending.args }));\n }\n pending.started = true;\n };\n\n const finalizePendingTurn = (): { events: AIStreamEvent[]; assistantReplayMessage: ChatMessage | null } => {\n const events: AIStreamEvent[] = [];\n const finalizedToolCalls = allPendingToolCalls();\n const finalizedReasoningByField = new Map(reasoningByField);\n\n if (hasReasoningStarted && items.isActive(currentReasoningId)) {\n events.push(items.completeReasoning(currentReasoningId));\n }\n\n if (hasMessageStarted && items.isActive(currentMessageId)) {\n events.push(items.completeMessage(currentMessageId));\n }\n\n for (const pending of finalizedToolCalls) {\n ensurePendingToolCallStarted(pending, events);\n if (items.isActive(pending.id)) {\n events.push(items.completeToolCall(pending.id));\n }\n }\n\n const assistantReplayMessage = buildAssistantReplayMessage({\n content: accumulatedContent,\n reasoningByField: finalizedReasoningByField,\n toolCalls: finalizedToolCalls,\n });\n\n accumulatedContent = \"\";\n currentMessageId = \"\";\n currentReasoningId = \"\";\n hasMessageStarted = false;\n hasReasoningStarted = false;\n pendingToolCalls.clear();\n pendingFunctionCall = null;\n toolCallMode = \"none\";\n reasoningByField.clear();\n\n return { events, assistantReplayMessage };\n };\n\n const emitCompleted = async function* (\n stopReason: StopReason | undefined,\n assistantReplayMessage: ChatMessage | null,\n rawResponseId: string | undefined,\n ): AsyncIterable<AIStreamEvent> {\n yield* finalizeStreamTurn(session, items, {\n stopReason,\n rawResponseId,\n factory,\n maxOpaquePayloadBytes: host.maxOpaquePayloadBytes,\n opaque: assistantReplayMessage\n ? opaqueItem(OPAQUE_SOURCE.CHAT_COMPLETIONS, \"replay\", {\n replaceCanonical: true,\n messages: [assistantReplayMessage],\n })\n : null,\n });\n };\n\n for await (const batch of session.batches({\n parser,\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 WarningCode.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\", WarningCode.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 = function* (): Generator<AIStreamEvent> {\n if (!currentMessageId) currentMessageId = `msg-${chunk.id}`;\n const started = items.ensureMessageStarted(currentMessageId);\n if (started) {\n hasMessageStarted = true;\n yield started;\n }\n };\n\n const ensureReasoningStarted = function* (): Generator<AIStreamEvent> {\n if (!currentReasoningId) currentReasoningId = `reason-${chunk.id}`;\n const started = items.ensureReasoningStarted(currentReasoningId, \"full\");\n if (started) {\n hasReasoningStarted = true;\n yield started;\n }\n };\n\n if (reasoningDeltas.length > 0) {\n yield* ensureReasoningStarted();\n\n for (const reasoningDelta of reasoningDeltas) {\n reasoningByField.set(\n reasoningDelta.field,\n (reasoningByField.get(reasoningDelta.field) ?? \"\") + reasoningDelta.text,\n );\n yield items.deltaReasoning(currentReasoningId, textBlock(reasoningDelta.text));\n }\n }\n\n if (delta.content) {\n yield* ensureMessageStarted();\n accumulatedContent += delta.content;\n yield items.deltaMessage(currentMessageId, textBlock(delta.content));\n }\n\n if (delta.tool_calls) {\n yield* ensureMessageStarted();\n\n if (toolCallMode === \"function_call\") {\n yield factory.responseWarning(\n \"Chat Completions mixed function_call and tool_calls; keeping tool_calls and discarding function_call state\",\n WarningCode.CAPABILITY_DOWNGRADE,\n );\n if (pendingFunctionCall?.started && items.isActive(pendingFunctionCall.id)) {\n // 已 start 的 legacy call 无法撤销 id;完成空壳以免协议挂起\n yield items.completeToolCall(pendingFunctionCall.id);\n }\n pendingFunctionCall = null;\n }\n toolCallMode = \"tool_calls\";\n\n for (const tc of delta.tool_calls) {\n const idx = tc.index;\n let pending = pendingToolCalls.get(idx);\n if (!pending) {\n pending = {\n id: tc.id ?? `pending-tc-${chunk.id}-${idx}`,\n name: tc.function?.name ?? \"\",\n args: \"\",\n started: false,\n hasProviderId: Boolean(tc.id),\n };\n pendingToolCalls.set(idx, pending);\n } else {\n if (tc.id && !pending.hasProviderId) {\n // start 前可替换占位 id\n if (!pending.started) {\n pending.id = tc.id;\n }\n pending.hasProviderId = true;\n }\n if (tc.function?.name) {\n pending.name = tc.function.name;\n }\n }\n\n if (tc.id && !pending.started) {\n pending.id = tc.id;\n pending.hasProviderId = true;\n pending.started = true;\n yield items.startToolCall(pending.id, pending.name);\n if (pending.args) {\n yield items.deltaToolCall(pending.id, { argumentsText: pending.args });\n }\n }\n\n if (tc.function?.arguments) {\n pending.args += tc.function.arguments;\n if (pending.started) {\n yield items.deltaToolCall(pending.id, { argumentsText: tc.function.arguments });\n }\n }\n }\n }\n\n if (delta.function_call) {\n yield* ensureMessageStarted();\n\n if (toolCallMode === \"tool_calls\") {\n yield factory.responseWarning(\n \"Chat Completions mixed tool_calls and function_call; ignoring legacy function_call for this turn\",\n WarningCode.CAPABILITY_DOWNGRADE,\n );\n } else {\n toolCallMode = \"function_call\";\n\n if (!pendingFunctionCall) {\n pendingFunctionCall = {\n id: `fc-${chunk.id}-0`,\n name: delta.function_call.name ?? \"\",\n args: \"\",\n started: false,\n hasProviderId: true,\n };\n }\n\n if (delta.function_call.name) {\n pendingFunctionCall.name = delta.function_call.name;\n }\n\n if (!pendingFunctionCall.started && pendingFunctionCall.name) {\n pendingFunctionCall.started = true;\n yield items.startToolCall(pendingFunctionCall.id, pendingFunctionCall.name);\n if (pendingFunctionCall.args) {\n yield items.deltaToolCall(pendingFunctionCall.id, {\n argumentsText: pendingFunctionCall.args,\n });\n }\n }\n\n if (delta.function_call.arguments) {\n pendingFunctionCall.args += delta.function_call.arguments;\n if (pendingFunctionCall.started) {\n yield items.deltaToolCall(pendingFunctionCall.id, {\n argumentsText: delta.function_call.arguments,\n });\n }\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 (\n !gate.completed &&\n (hasMessageStarted || hasReasoningStarted || pendingToolCalls.size > 0 || pendingFunctionCall !== null)\n ) {\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 * ChatCompletionsAdapter\n *\n * 编排层:buildRequest + runStream(委托 map-request / map-stream)。\n */\n\nimport { HttpAdapterBase } from \"../../provider/http-adapter.js\";\nimport type { NormalizedRequest, AIStreamEvent } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { ChatCompletionsAdapterOptions, ChatRequest } from \"./types.js\";\nimport { buildChatCompletionsRequest } from \"./map-request.js\";\nimport { mapChatCompletionsStream } from \"./map-stream.js\";\n\nexport class ChatCompletionsAdapter extends HttpAdapterBase {\n readonly kind = \"chat-completions\" as const;\n readonly isSyntheticStream = false;\n\n constructor(options: ChatCompletionsAdapterOptions) {\n super(options, { baseUrl: \"https://api.openai.com/v1\" });\n }\n\n protected buildRequest(request: NormalizedRequest): ChatRequest {\n return this.withExtraBody(\n buildChatCompletionsRequest(request, { maxOpaquePayloadBytes: this.maxOpaquePayloadBytes }),\n );\n }\n\n protected async *runStream(\n providerRequest: ChatRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n yield* mapChatCompletionsStream(\n {\n beginJsonStream: this.beginJsonStream.bind(this),\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n mergeHeaders: this.mergeHeaders.bind(this),\n maxOpaquePayloadBytes: this.maxOpaquePayloadBytes,\n },\n providerRequest,\n factory,\n request,\n );\n }\n}\n","/**\n * OllamaAdapter — request 映射\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport { contentBlocksToText } from \"../../canonical/index.js\";\nimport { acceptOpaqueReplay } from \"../../provider/opaque-replay.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { mapOllamaThink } from \"../../provider/reasoning.js\";\nimport { mapOpenAiFunctionTool } from \"../../provider/openai-tools.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\n\nimport type { NormalizedRequest } from \"../../types/index.js\";\nimport type { OllamaChatRequest, OllamaMessage, OllamaToolCall } from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"ollama\");\n\n// ── Ollama 流式 chunk ─────────────────────────────────────────\n\nexport type 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. */\nexport type OllamaReplayToolCall = OllamaToolCall & { id?: string };\n\nexport function 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\nexport function 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\nexport function buildOllamaRequest(\n request: NormalizedRequest,\n options?: { maxOpaquePayloadBytes?: number },\n): OllamaChatRequest {\n mapper.assertNoServerTools(request.serverTools);\n\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 const payload = acceptOpaqueReplay(item, OPAQUE_SOURCE.OLLAMA, {\n maxBytes: options?.maxOpaquePayloadBytes,\n });\n if (!payload) break;\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(mapOpenAiFunctionTool);\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 if (request.reasoningLevel !== undefined) {\n body.think = mapOllamaThink(request.reasoningLevel);\n }\n\n return body;\n}\n","/**\n * OllamaAdapter — stream 映射\n */\n\nimport { WarningCode } from \"../../runtime/errors.js\";\nimport { textBlock, opaqueItem, mapStopReason } from \"../../canonical/index.js\";\nimport { createStreamingItemSession } from \"../../provider/streaming-item-session.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { usageFromOllama } from \"../../provider/usage/index.js\";\nimport { createNdjsonLineParser } from \"../../provider/transport/parser.js\";\nimport { parseJsonLooseObject } from \"../../provider/json-parse.js\";\nimport { finalizeStreamTurn } from \"../../provider/finalize-stream-turn.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, StopReason } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { OllamaChatRequest, OllamaToolCall } from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"ollama\");\n\n// ── Ollama 流式 chunk ─────────────────────────────────────────\n\nexport type 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. */\nexport type OllamaReplayToolCall = OllamaToolCall & { id?: string };\n\nexport function 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\nexport function 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\nexport type OllamaAdapterStreamHost = {\n beginJsonStream: (\n factory: EventFactory,\n request: NormalizedRequest,\n ) => import(\"../../provider/transport/run-json-stream.js\").ProviderJsonStreamSession;\n baseUrl: string;\n apiKey?: string;\n mergeHeaders: (headers: Record<string, string>) => Record<string, string>;\n maxOpaquePayloadBytes: number;\n};\n\nexport async function* mapOllamaStream(\n host: OllamaAdapterStreamHost,\n providerRequest: OllamaChatRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n): AsyncIterable<AIStreamEvent> {\n const session = host.beginJsonStream(factory, request);\n const { auxiliary, gate } = session;\n const items = createStreamingItemSession(factory);\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(\n \"Request metadata is not supported by the Ollama adapter\",\n WarningCode.UNSUPPORTED_METADATA,\n );\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (host.apiKey) {\n headers.Authorization = `Bearer ${host.apiKey}`;\n }\n\n await session.open({\n url: `${host.baseUrl}/api/chat`,\n headers: host.mergeHeaders(headers),\n body: providerRequest,\n });\n\n const parser = createNdjsonLineParser<OllamaChatChunk>(\n (value): value is OllamaChatChunk => !!value && typeof value === \"object\" && \"message\" in value,\n );\n\n // wire 缓冲仅用于 opaque;item 内容由 items session 维护\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 ensureMessageStarted = function* (idSeed: string): Generator<AIStreamEvent> {\n if (!currentMessageId) currentMessageId = `msg-${idSeed}`;\n const started = items.ensureMessageStarted(currentMessageId);\n if (started) {\n hasMessageStarted = true;\n yield started;\n }\n };\n\n /** done / incomplete 共用:flush message + batched tool_calls */\n const flushPendingItems = function* (idSeed: string): Generator<AIStreamEvent> {\n if (accumulatedContent === \"\" && pendingToolCalls.length > 0 && !hasMessageStarted) {\n yield* ensureMessageStarted(idSeed);\n }\n\n // 已 start 的空 message 也 complete 进 session(事件权威)\n if (hasMessageStarted && items.isActive(currentMessageId)) {\n yield items.completeMessage(currentMessageId);\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 yield items.startToolCall(pending.id, pending.name);\n yield items.deltaToolCall(pending.id, { argumentsText: pending.argumentsText });\n yield items.completeToolCall(pending.id);\n }\n };\n\n const emitCompleted = async function* (\n stopReason: StopReason | undefined,\n rawResponseId: string | undefined,\n ): AsyncIterable<AIStreamEvent> {\n yield* finalizeStreamTurn(session, items, {\n stopReason,\n rawResponseId,\n factory,\n maxOpaquePayloadBytes: host.maxOpaquePayloadBytes,\n opaque:\n accumulatedContent || pendingToolCalls.length > 0\n ? opaqueItem(OPAQUE_SOURCE.OLLAMA, \"replay\", {\n role: \"assistant\",\n content: accumulatedContent,\n tool_calls: pendingToolCalls.map((tc) => ({\n id: tc.id,\n function: { name: tc.name, arguments: parseJsonLooseObject(tc.argumentsText) },\n })),\n })\n : null,\n });\n };\n\n for await (const batch of session.batches({\n parser,\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\", WarningCode.DUPLICATE_FINISH);\n }\n continue;\n }\n\n const msg = chunk.message;\n\n if (msg.content) {\n yield* ensureMessageStarted(chunk.created_at);\n accumulatedContent += msg.content;\n yield items.deltaMessage(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 yield* flushPendingItems(chunk.created_at);\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 yield* flushPendingItems(responseId ?? request.requestId);\n yield* emitCompleted(undefined, responseId);\n }\n}\n","/**\n * OllamaAdapter\n *\n * 编排层:buildRequest + runStream(委托 map-request / map-stream)。\n */\n\nimport { HttpAdapterBase } from \"../../provider/http-adapter.js\";\nimport type { NormalizedRequest, AIStreamEvent } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { OllamaAdapterOptions, OllamaChatRequest } from \"./types.js\";\nimport { buildOllamaRequest } from \"./map-request.js\";\nimport { mapOllamaStream } from \"./map-stream.js\";\n\nexport class OllamaAdapter extends HttpAdapterBase {\n readonly kind = \"ollama\" as const;\n readonly isSyntheticStream = false;\n\n constructor(options: OllamaAdapterOptions = {}) {\n super(options, { baseUrl: \"http://localhost:11434\" });\n }\n\n protected buildRequest(request: NormalizedRequest): OllamaChatRequest {\n return this.withExtraBody(\n buildOllamaRequest(request, { maxOpaquePayloadBytes: this.maxOpaquePayloadBytes }),\n );\n }\n\n protected async *runStream(\n providerRequest: OllamaChatRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n yield* mapOllamaStream(\n {\n beginJsonStream: this.beginJsonStream.bind(this),\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n mergeHeaders: this.mergeHeaders.bind(this),\n maxOpaquePayloadBytes: this.maxOpaquePayloadBytes,\n },\n providerRequest,\n factory,\n request,\n );\n }\n}\n","/**\n * GeminiAdapter — request 映射\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport { contentBlocksToText } from \"../../canonical/index.js\";\nimport { acceptOpaqueReplay } from \"../../provider/opaque-replay.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\nimport { mapGeminiThinking } from \"../../provider/reasoning.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\n\nimport type { NormalizedRequest, ContentBlock } from \"../../types/index.js\";\nimport type {\n GeminiPart,\n GeminiContent,\n GeminiTool,\n GeminiFunctionCallingConfig,\n GeminiGenerateContentRequest,\n} from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"gemini\");\n\nexport function normalizeModelPath(model: string): string {\n return model.startsWith(\"models/\") ? model.slice(\"models/\".length) : model;\n}\n\nexport function isGeminiPart(value: unknown): value is GeminiPart {\n return !!value && typeof value === \"object\";\n}\n\nexport function isGeminiContent(value: unknown): value is GeminiContent {\n if (!value || typeof value !== \"object\") return false;\n const content = value as Record<string, unknown>;\n if (content.role !== \"user\" && content.role !== \"model\") return false;\n if (!Array.isArray(content.parts)) return false;\n return content.parts.every(isGeminiPart);\n}\n\nexport function assertGeminiReplayContent(content: unknown, field: string): asserts content is GeminiContent {\n if (!isGeminiContent(content)) {\n throw new AIRequestError(\n `Invalid opaque replay payload: ${field} is not a valid Gemini content object`,\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n}\n\nexport function appendPart(contents: GeminiContent[], role: \"user\" | \"model\", part: GeminiPart): void {\n const last = contents[contents.length - 1];\n if (last && last.role === role) {\n last.parts.push(part);\n return;\n }\n contents.push({ role, parts: [part] });\n}\n\nexport function textPartsFromBlocks(blocks: ContentBlock[], field: string): GeminiPart[] {\n const supported = mapper.ensureTextBlocks(blocks, field);\n return supported.map((block) => {\n if (block.type === \"text\") return { text: block.text };\n if (block.type === \"json\") return { text: JSON.stringify(block.json) };\n throw new AIRequestError(\n `gemini does not support content block type \"${block.type}\" in ${field}`,\n \"UNSUPPORTED_CONTENT_BLOCK\",\n );\n });\n}\n\nexport function clonePart(part: GeminiPart): GeminiPart {\n return { ...part };\n}\n\nexport function cloneContent(content: GeminiContent): GeminiContent {\n return {\n role: content.role,\n parts: content.parts.map(clonePart),\n };\n}\n\nexport function mergeModelParts(base: GeminiPart[], incoming: GeminiPart[]): GeminiPart[] {\n const result = base.map(clonePart);\n for (const part of incoming) {\n const last = result[result.length - 1];\n const sameTextBucket =\n last &&\n typeof last.text === \"string\" &&\n typeof part.text === \"string\" &&\n !!last.thought === !!part.thought &&\n !last.functionCall &&\n !part.functionCall &&\n !last.functionResponse &&\n !part.functionResponse;\n\n if (sameTextBucket) {\n last.text = `${last.text ?? \"\"}${part.text ?? \"\"}`;\n if (part.thoughtSignature) last.thoughtSignature = part.thoughtSignature;\n continue;\n }\n\n result.push(clonePart(part));\n }\n return result;\n}\n\nexport function buildGeminiRequest(\n request: NormalizedRequest,\n options?: { maxOpaquePayloadBytes?: number },\n): GeminiGenerateContentRequest {\n mapper.assertNoServerTools(request.serverTools);\n\n const contents: GeminiContent[] = [];\n let systemInstruction: GeminiGenerateContentRequest[\"systemInstruction\"];\n\n if (request.instructions) {\n systemInstruction = {\n parts: [{ text: mapper.mapInstructions(request.instructions) }],\n };\n }\n\n for (const item of request.input) {\n switch (item.type) {\n case \"message\": {\n const role = item.role === \"assistant\" ? \"model\" : \"user\";\n for (const part of textPartsFromBlocks(item.content, `input message (${item.role}) content`)) {\n appendPart(contents, role, part);\n }\n break;\n }\n case \"tool_call\": {\n const part: GeminiPart = {\n functionCall: {\n id: item.id,\n name: item.name,\n args: mapper.parseToolArguments(item),\n },\n };\n appendPart(contents, \"model\", part);\n break;\n }\n case \"tool_result\": {\n let response: Record<string, unknown>;\n try {\n const text = mapper.textFromBlocks(item.content, `tool_result ${item.callId} content`);\n const parsed: unknown = text ? JSON.parse(text) : {};\n response =\n parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : { result: text };\n } catch {\n response = {\n result: mapper.textFromBlocks(item.content, `tool_result ${item.callId} content`),\n };\n }\n\n appendPart(contents, \"user\", {\n functionResponse: {\n id: item.callId,\n name: item.toolName,\n response,\n },\n });\n break;\n }\n case \"reasoning\": {\n const text = contentBlocksToText(mapper.ensureReasoningBlocks(item.content, \"reasoning content\"));\n appendPart(contents, \"model\", { text, thought: true });\n break;\n }\n case \"opaque\": {\n const payload = acceptOpaqueReplay(item, OPAQUE_SOURCE.GEMINI, {\n maxBytes: options?.maxOpaquePayloadBytes,\n });\n if (!payload) break;\n if (payload.replaceCanonical === true && \"content\" in payload) {\n assertGeminiReplayContent(payload.content, \"content\");\n mapper.rollbackTrailingAssistantMessages(contents, \"model\");\n contents.push(cloneContent(payload.content));\n } else if (isGeminiContent(payload)) {\n mapper.rollbackTrailingAssistantMessages(contents, \"model\");\n contents.push(cloneContent(payload));\n }\n break;\n }\n }\n }\n\n const body: GeminiGenerateContentRequest = {\n contents,\n };\n\n if (systemInstruction) body.systemInstruction = systemInstruction;\n\n body.tools = mapper.mapToolsIfPresent(\n request.tools,\n (tool): GeminiTool => ({\n functionDeclarations: [\n {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n ],\n }),\n );\n\n // Gemini tools 通常合并为一个 tool 对象下的 declarations\n if (body.tools && body.tools.length > 1) {\n body.tools = [\n {\n functionDeclarations: body.tools.flatMap((tool) => tool.functionDeclarations),\n },\n ];\n }\n\n const functionCallingConfig = mapper.mapToolChoice<GeminiFunctionCallingConfig>(request.toolChoice, {\n auto: { mode: \"AUTO\" },\n none: { mode: \"NONE\" },\n tool: (name) => ({ mode: \"ANY\", allowedFunctionNames: [name] }),\n });\n if (functionCallingConfig) {\n body.toolConfig = { functionCallingConfig };\n }\n\n const generationConfig: NonNullable<GeminiGenerateContentRequest[\"generationConfig\"]> = {};\n if (request.temperature !== undefined) generationConfig.temperature = request.temperature;\n if (request.maxOutputTokens !== undefined) generationConfig.maxOutputTokens = request.maxOutputTokens;\n if (request.reasoningLevel !== undefined) {\n generationConfig.thinkingConfig = mapGeminiThinking(request.reasoningLevel);\n }\n if (Object.keys(generationConfig).length > 0) {\n body.generationConfig = generationConfig;\n }\n\n return body;\n}\n","/**\n * GeminiAdapter — stream 映射\n */\n\nimport { AIRequestError, WarningCode } from \"../../runtime/errors.js\";\nimport { textBlock, opaqueItem, mapStopReason } from \"../../canonical/index.js\";\nimport { createStreamingItemSession } from \"../../provider/streaming-item-session.js\";\nimport { usageFromGemini } from \"../../provider/usage/index.js\";\nimport { createDataLineSseParser } from \"../../provider/transport/parser.js\";\nimport { finalizeStreamTurn } from \"../../provider/finalize-stream-turn.js\";\nimport { OPAQUE_SOURCE } from \"../../provider/opaque-sources.js\";\nimport { NormalizedRequestMapper } from \"../../provider/request-mapper.js\";\n\nimport type { NormalizedRequest, AIStreamEvent, StopReason, ContentBlock } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { GeminiPart, GeminiContent, GeminiGenerateContentRequest, GeminiStreamChunk } from \"./types.js\";\n\nexport const mapper = new NormalizedRequestMapper(\"gemini\");\n\nexport function normalizeModelPath(model: string): string {\n return model.startsWith(\"models/\") ? model.slice(\"models/\".length) : model;\n}\n\nexport function isGeminiPart(value: unknown): value is GeminiPart {\n return !!value && typeof value === \"object\";\n}\n\nexport function isGeminiContent(value: unknown): value is GeminiContent {\n if (!value || typeof value !== \"object\") return false;\n const content = value as Record<string, unknown>;\n if (content.role !== \"user\" && content.role !== \"model\") return false;\n if (!Array.isArray(content.parts)) return false;\n return content.parts.every(isGeminiPart);\n}\n\nexport function assertGeminiReplayContent(content: unknown, field: string): asserts content is GeminiContent {\n if (!isGeminiContent(content)) {\n throw new AIRequestError(\n `Invalid opaque replay payload: ${field} is not a valid Gemini content object`,\n \"INVALID_OPAQUE_REPLAY\",\n );\n }\n}\n\nexport function appendPart(contents: GeminiContent[], role: \"user\" | \"model\", part: GeminiPart): void {\n const last = contents[contents.length - 1];\n if (last && last.role === role) {\n last.parts.push(part);\n return;\n }\n contents.push({ role, parts: [part] });\n}\n\nexport function textPartsFromBlocks(blocks: ContentBlock[], field: string): GeminiPart[] {\n const supported = mapper.ensureTextBlocks(blocks, field);\n return supported.map((block) => {\n if (block.type === \"text\") return { text: block.text };\n if (block.type === \"json\") return { text: JSON.stringify(block.json) };\n throw new AIRequestError(\n `gemini does not support content block type \"${block.type}\" in ${field}`,\n \"UNSUPPORTED_CONTENT_BLOCK\",\n );\n });\n}\n\nexport function clonePart(part: GeminiPart): GeminiPart {\n return { ...part };\n}\n\nexport function cloneContent(content: GeminiContent): GeminiContent {\n return {\n role: content.role,\n parts: content.parts.map(clonePart),\n };\n}\n\nexport function mergeModelParts(base: GeminiPart[], incoming: GeminiPart[]): GeminiPart[] {\n const result = base.map(clonePart);\n for (const part of incoming) {\n const last = result[result.length - 1];\n const sameTextBucket =\n last &&\n typeof last.text === \"string\" &&\n typeof part.text === \"string\" &&\n !!last.thought === !!part.thought &&\n !last.functionCall &&\n !part.functionCall &&\n !last.functionResponse &&\n !part.functionResponse;\n\n if (sameTextBucket) {\n last.text = `${last.text ?? \"\"}${part.text ?? \"\"}`;\n if (part.thoughtSignature) last.thoughtSignature = part.thoughtSignature;\n continue;\n }\n\n result.push(clonePart(part));\n }\n return result;\n}\n\nexport type GeminiAdapterStreamHost = {\n beginJsonStream: (\n factory: EventFactory,\n request: NormalizedRequest,\n ) => import(\"../../provider/transport/run-json-stream.js\").ProviderJsonStreamSession;\n baseUrl: string;\n apiKey?: string;\n mergeHeaders: (headers: Record<string, string>) => Record<string, string>;\n maxOpaquePayloadBytes: number;\n};\n\nexport async function* mapGeminiStream(\n host: GeminiAdapterStreamHost,\n providerRequest: GeminiGenerateContentRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n): AsyncIterable<AIStreamEvent> {\n const session = host.beginJsonStream(factory, request);\n const { auxiliary, gate } = session;\n const items = createStreamingItemSession(factory);\n\n if (request.metadata) {\n yield factory.responseWarning(\n \"Request metadata is not supported by the Gemini adapter\",\n WarningCode.UNSUPPORTED_METADATA,\n );\n }\n\n const modelPath = normalizeModelPath(request.model);\n await session.open({\n url: `${host.baseUrl}/models/${modelPath}:streamGenerateContent?alt=sse`,\n headers: host.mergeHeaders({\n \"Content-Type\": \"application/json\",\n \"x-goog-api-key\": host.apiKey ?? \"\",\n }),\n body: providerRequest,\n });\n\n const parser = createDataLineSseParser<GeminiStreamChunk>();\n\n let responseId: string | undefined;\n let currentMessageId = \"\";\n let currentReasoningId = \"\";\n let hasMessageStarted = false;\n let hasReasoningStarted = false;\n let pendingToolCalls: Array<{ id: string; name: string; argumentsText: string }> = [];\n let replayParts: GeminiPart[] = [];\n let toolCallIndex = 0;\n let stopReason: StopReason | undefined;\n let sawPromptBlock = false;\n\n const ensureMessageStarted = function* (): Generator<AIStreamEvent> {\n if (!currentMessageId) currentMessageId = `msg-${responseId ?? request.requestId}`;\n const started = items.ensureMessageStarted(currentMessageId);\n if (started) {\n hasMessageStarted = true;\n yield started;\n }\n };\n\n const ensureReasoningStarted = function* (): Generator<AIStreamEvent> {\n if (!currentReasoningId) currentReasoningId = `reason-${responseId ?? request.requestId}`;\n const started = items.ensureReasoningStarted(currentReasoningId, \"full\");\n if (started) {\n hasReasoningStarted = true;\n yield started;\n }\n };\n\n const finalizePendingItems = function* (): Generator<AIStreamEvent> {\n if (hasReasoningStarted && items.isActive(currentReasoningId)) {\n yield items.completeReasoning(currentReasoningId);\n }\n\n if (hasMessageStarted && items.isActive(currentMessageId)) {\n yield items.completeMessage(currentMessageId);\n }\n\n if (pendingToolCalls.length > 1) {\n yield factory.responseWarning(\n `Gemini delivered ${pendingToolCalls.length} tool call(s) in this turn; arguments arrive as whole objects`,\n WarningCode.TOOL_CALL_BATCHED,\n );\n }\n\n for (const pending of pendingToolCalls) {\n if (items.isActive(pending.id)) {\n yield items.completeToolCall(pending.id);\n }\n }\n };\n\n const emitCompleted = async function* (\n reason: StopReason | undefined,\n rawResponseId: string | undefined,\n ): AsyncIterable<AIStreamEvent> {\n // finalize 仅应在首次 complete 前执行;session.complete 内部 gate 防重\n if (gate.completed) {\n yield factory.responseWarning(\"Duplicate finish signal ignored\", WarningCode.DUPLICATE_FINISH);\n return;\n }\n\n yield* finalizePendingItems();\n\n yield* finalizeStreamTurn(session, items, {\n stopReason: reason,\n rawResponseId,\n factory,\n maxOpaquePayloadBytes: host.maxOpaquePayloadBytes,\n opaque:\n replayParts.length > 0\n ? opaqueItem(OPAQUE_SOURCE.GEMINI, \"replay\", {\n replaceCanonical: true,\n content: {\n role: \"model\",\n parts: replayParts.map(clonePart),\n },\n })\n : null,\n });\n };\n\n for await (const batch of session.batches({\n parser,\n providerLabel: \"Gemini\",\n transportLabel: \"SSE event(s)\",\n incompleteMessage: \"Stream ended with an incomplete Gemini SSE frame\",\n })) {\n for (const warning of batch.warnings) yield warning;\n\n for (const chunk of batch.items) {\n if (chunk.responseId) responseId = chunk.responseId;\n\n if (chunk.usageMetadata && request.include?.usage !== \"off\") {\n auxiliary.recordUsage(usageFromGemini(chunk.usageMetadata), \"stream\", chunk.usageMetadata);\n }\n\n if (chunk.promptFeedback?.blockReason) {\n sawPromptBlock = true;\n stopReason = \"content_filter\";\n yield factory.responseWarning(\n `Gemini blocked the prompt: ${chunk.promptFeedback.blockReason}`,\n WarningCode.CONTENT_FILTER,\n );\n if (!gate.completed) {\n yield* emitCompleted(stopReason, responseId);\n }\n continue;\n }\n\n if (gate.completed) {\n if (chunk.candidates?.some((c) => c.finishReason)) {\n yield factory.responseWarning(\"Duplicate finish signal ignored\", WarningCode.DUPLICATE_FINISH);\n }\n continue;\n }\n\n const candidate = chunk.candidates?.[0];\n if (!candidate) continue;\n\n const parts = candidate.content?.parts ?? [];\n if (parts.length > 0) {\n replayParts = mergeModelParts(replayParts, parts);\n }\n\n for (const part of parts) {\n if (part.functionCall) {\n const name = part.functionCall.name;\n const id = part.functionCall.id ?? `gemini-fc-${toolCallIndex++}-${responseId ?? request.requestId}`;\n const args = part.functionCall.args ?? {};\n const argumentsText = JSON.stringify(args);\n\n // functionCall 前若有未完成 message/reasoning,先不 complete,等 finish\n pendingToolCalls.push({ id, name, argumentsText });\n yield items.startToolCall(id, name);\n yield items.deltaToolCall(id, { argumentsText });\n continue;\n }\n\n if (typeof part.text !== \"string\" || part.text.length === 0) {\n // thoughtSignature-only / 空 part:仅保留在 replay\n continue;\n }\n\n if (part.thought) {\n yield* ensureReasoningStarted();\n yield items.deltaReasoning(currentReasoningId, textBlock(part.text));\n } else {\n yield* ensureMessageStarted();\n yield items.deltaMessage(currentMessageId, textBlock(part.text));\n }\n }\n\n if (candidate.finishReason) {\n const reason = mapStopReason(candidate.finishReason);\n // 有 tool_call 时优先 tool_call 语义\n const effectiveReason =\n pendingToolCalls.length > 0 && (reason === \"end_turn\" || reason === \"unknown\") ? \"tool_call\" : reason;\n stopReason = effectiveReason;\n yield* emitCompleted(effectiveReason, responseId);\n }\n }\n }\n\n if (!gate.completed) {\n if (hasMessageStarted || hasReasoningStarted || pendingToolCalls.length > 0 || sawPromptBlock) {\n if (!sawPromptBlock) {\n yield factory.responseWarning(\"Stream ended without a finishReason\", WarningCode.STREAM_INCOMPLETE);\n }\n yield* emitCompleted(stopReason, responseId);\n } else {\n // 契约差异:Gemini 空流也 emit completed;chat/ollama 仅在有 pending item 时 incomplete complete\n yield* emitCompleted(undefined, responseId);\n }\n }\n}\n","/**\n * GeminiAdapter\n *\n * 编排层:buildRequest + runStream(委托 map-request / map-stream)。\n */\n\nimport { HttpAdapterBase } from \"../../provider/http-adapter.js\";\nimport type { NormalizedRequest, AIStreamEvent } from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type { GeminiAdapterOptions, GeminiGenerateContentRequest } from \"./types.js\";\nimport { buildGeminiRequest } from \"./map-request.js\";\nimport { mapGeminiStream } from \"./map-stream.js\";\n\nexport class GeminiAdapter extends HttpAdapterBase {\n readonly kind = \"gemini\" as const;\n readonly isSyntheticStream = false;\n\n constructor(options: GeminiAdapterOptions) {\n super(options, { baseUrl: \"https://generativelanguage.googleapis.com/v1beta\" });\n }\n\n protected buildRequest(request: NormalizedRequest): GeminiGenerateContentRequest {\n return this.withExtraBody(\n buildGeminiRequest(request, { maxOpaquePayloadBytes: this.maxOpaquePayloadBytes }),\n );\n }\n\n protected async *runStream(\n providerRequest: GeminiGenerateContentRequest,\n factory: EventFactory,\n request: NormalizedRequest,\n ): AsyncIterable<AIStreamEvent> {\n yield* mapGeminiStream(\n {\n beginJsonStream: this.beginJsonStream.bind(this),\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n mergeHeaders: this.mergeHeaders.bind(this),\n maxOpaquePayloadBytes: this.maxOpaquePayloadBytes,\n },\n providerRequest,\n factory,\n request,\n );\n }\n}\n","/**\n * Mock 流式包装与事件发射\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport { messageItem, reasoningItem, serverToolCallItem, textBlock } from \"../../canonical/index.js\";\nimport type {\n AIStreamEvent,\n ContentBlock,\n MessageItem,\n NormalizedRequest,\n OutputItem,\n ServerToolCallItem,\n ToolCallItem,\n} from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type {\n MockHandler,\n MockHandlerContext,\n MockMessageStep,\n MockReasoningStep,\n MockServerToolCallStep,\n MockStaticHandler,\n MockStep,\n MockTextStreamOptions,\n MockToolCallStep,\n ResolvedMockTextStreamOptions,\n} from \"./types.js\";\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\nexport function applyDefaultStreaming(step: MockStep, defaults: ResolvedMockTextStreamOptions): MockStep {\n switch (step.type) {\n case \"message\":\n case \"reasoning\":\n case \"tool_call\":\n case \"server_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\nexport function 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 ...(step.citations ? { citations: step.citations } : {}),\n }),\n role: \"assistant\",\n };\n}\n\nexport function 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\nexport function 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\nexport function createServerToolCallFromStep(step: MockServerToolCallStep): ServerToolCallItem {\n return serverToolCallItem(step.id, step.tool, {\n name: step.name,\n argumentsText: step.argumentsText,\n serverLabel: step.serverLabel,\n status: step.status ?? \"completed\",\n providerPayload: step.providerPayload,\n });\n}\n\nexport function normalizeBlocks(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === \"string\" ? [textBlock(content)] : content;\n}\n\nexport function 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\nexport function 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\nexport async 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\nexport async 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, item.citations ? { citations: item.citations } : undefined);\n}\n\nexport async 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\nexport async 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\nexport async function* emitServerToolCall(\n factory: EventFactory,\n item: ServerToolCallItem,\n streamArguments: boolean,\n stream?: ResolvedMockTextStreamOptions,\n): AsyncIterable<AIStreamEvent> {\n yield factory.serverToolStarted(item.id, item.tool, {\n name: item.name,\n serverLabel: item.serverLabel,\n });\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.serverToolDelta(item.id, { argumentsText: chunk });\n chunkIndex += 1;\n }\n } else if (item.argumentsText) {\n yield factory.serverToolDelta(item.id, { argumentsText: item.argumentsText });\n }\n\n yield factory.serverToolCompleted(item.id, {\n status: item.status === \"failed\" ? \"failed\" : \"completed\",\n providerPayload: item.providerPayload,\n });\n}\n\nexport function 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\nexport function 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\nexport function 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\nexport async 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\nexport async function sleep(ms: number): Promise<void> {\n if (ms <= 0) {\n return;\n }\n\n await new Promise((resolve) => setTimeout(resolve, ms));\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 \"../../runtime/errors.js\";\nimport { AdapterBase } from \"../../provider/base.js\";\nimport { replayFromOutput } from \"../../canonical/index.js\";\nimport type {\n AIStreamEvent,\n CompressRequest,\n CompressResult,\n ContextCompressCapable,\n NormalizedRequest,\n OutputItem,\n ReplayItem,\n ToolCallItem,\n ToolResultItem,\n InputItem,\n StopReason,\n} from \"../../types/index.js\";\nimport type { EventFactory } from \"../../stream/event-factory.js\";\nimport type {\n MockAdapterOptions,\n MockCompleteStep,\n MockCompressHandler,\n MockHandler,\n MockHandlerContext,\n MockHistoryRecord,\n MockProviderRequest,\n} from \"./types.js\";\nimport {\n attachSyntheticId,\n assertSupportedOutputItem,\n createMessageFromStep,\n createReasoningFromStep,\n createServerToolCallFromStep,\n createToolCallFromStep,\n emitMessage,\n emitOutputItem,\n emitReasoning,\n emitServerToolCall,\n emitToolCall,\n resolveStepStreamOptions,\n} from \"./streaming.js\";\n\nexport class MockAdapter extends AdapterBase implements ContextCompressCapable {\n readonly kind = \"mock\" as const;\n readonly isSyntheticStream = true;\n\n private readonly handler: MockHandler;\n private readonly providerMetadata?: Record<string, unknown>;\n private readonly compressHandler?: MockCompressHandler;\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 this.compressHandler = options.compressHandler;\n }\n\n /**\n * 可选压缩夹具:需构造时提供 compressHandler,否则抛 MOCK_COMPRESS_NOT_CONFIGURED。\n * 始终存在 compress 方法以便 supportsContextCompress(mock) === true。\n */\n async compress(request: CompressRequest): Promise<CompressResult> {\n request.signal?.throwIfAborted();\n if (!this.compressHandler) {\n throw new AIRequestError(\"MockAdapter compress handler not configured\", \"MOCK_COMPRESS_NOT_CONFIGURED\");\n }\n return this.compressHandler(request);\n }\n\n protected async buildRequest(request: NormalizedRequest): Promise<MockProviderRequest> {\n const turnIndex = this.cursor;\n const context = this.buildHandlerContext(turnIndex, request);\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 \"server_tool_call\": {\n const item = createServerToolCallFromStep(step);\n yield* emitServerToolCall(\n factory,\n item,\n step.streamArguments ?? true,\n resolveStepStreamOptions(undefined, step.stream, \"server_tool_call\"),\n );\n output.push(item);\n break;\n }\n case \"server_tool_result\": {\n yield factory.serverToolResultCompleted(step.item);\n output.push(step.item);\n break;\n }\n case \"server_tool_discovery\": {\n yield factory.serverToolDiscoveryCompleted(step.item);\n output.push(step.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 yield factory.responseCompleted(this.finalizeTurn(request, factory, mockRequest, output, step, stepCount));\n return;\n }\n case \"error\": {\n yield factory.responseWarning(step.message, step.code);\n yield factory.responseCompleted(\n 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 );\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 yield factory.responseCompleted(\n this.finalizeTurn(\n request,\n factory,\n mockRequest,\n output,\n {\n type: \"complete\",\n },\n stepCount,\n ),\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.buildCompletedPayload(\n request,\n {\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, request: NormalizedRequest): 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: request.signal,\n reasoningLevel: request.reasoningLevel,\n };\n }\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 cloneItem<T>(item: T): T {\n return structuredClone(item);\n}\n","/**\n * Mock 请求期望校验\n */\n\nimport { AIRequestError } from \"../../runtime/errors.js\";\nimport type { ContentBlock, InputItem, NormalizedRequest, ReplayItem, ToolResultItem } from \"../../types/index.js\";\nimport type { MockHandlerContext, MockInputExpectation, MockRequestExpectation } from \"./types.js\";\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.serverTools === \"present\" && (!request.serverTools || request.serverTools.length === 0)) {\n throw new AIRequestError(`${prefix}: expected serverTools to be present`, \"MOCK_EXPECTATION_FAILED\");\n }\n\n if (expectation.serverTools === \"absent\" && request.serverTools && request.serverTools.length > 0) {\n throw new AIRequestError(`${prefix}: expected serverTools 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 function 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\nexport function 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\nexport function 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\nexport function 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 \"server_tool_call\":\n return (\n (expected.name === undefined || item.name === expected.name) &&\n (expected.textIncludes === undefined ||\n (item.argumentsText !== undefined && item.argumentsText.includes(expected.textIncludes)))\n );\n case \"server_tool_result\":\n return (\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 \"server_tool_discovery\":\n return expected.name === undefined || item.serverLabel === expected.name;\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\nexport function 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\nexport function fingerprintItem(item: InputItem): string {\n return JSON.stringify(item);\n}\n\nexport function 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\nexport function cloneItem<T>(item: T): T {\n return structuredClone(item);\n}\n"],"mappings":"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"}
|