@reinsjs/lowering-fetch 0.4.1 → 0.5.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/CHANGELOG.md +20 -0
- package/README.md +2 -2
- package/dist/index.d.ts +3 -1
- package/dist/index.js +11 -9
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/usage.ts","../src/anthropic/from-stream.ts","../src/chat/loss-matrix.ts","../src/anthropic/loss-matrix.ts","../src/anthropic/to-request.ts","../src/ir.ts","../src/notes.ts","../src/capabilities.ts","../src/chat/from-stream.ts","../src/chat/to-request.ts","../src/lowering.ts","../src/http.ts","../src/models.ts","../src/responses/from-stream.ts","../src/responses/to-request.ts","../src/sse.ts","../src/factories.ts","../src/responses/loss-matrix.ts","../src/index.ts"],"sourcesContent":["/**\n * 用量与成本(三线共用)。`TokenUsage` 语义跟随 core:`input` 是**未命中缓存**的输入 token,缓存读 / 写另计。\n * 各协议的原生用量字段在各自 from-stream 里换算成这个形状,这里只算钱。\n */\nimport type { TokenUsage } from \"@reinsjs/core\"\n\n/** 每百万 token 的美元价。厂商有峰谷价的(DeepSeek)内置表存峰值价,算出来的是估算上限 */\nexport interface ModelCost {\n input: number\n output: number\n cacheRead: number\n cacheWrite: number\n}\n\n/** 算不出(没有价目)返回 undefined,LoweringOutcome.costUsd 相应缺省 */\nexport function costOf(usage: TokenUsage, cost: ModelCost | undefined): number | undefined {\n if (!cost) return undefined\n const perToken = (n: number | undefined, price: number) => ((n ?? 0) * price) / 1_000_000\n return (\n perToken(usage.input, cost.input) +\n perToken(usage.output, cost.output) +\n perToken(usage.cacheRead, cost.cacheRead) +\n perToken(usage.cacheWrite, cost.cacheWrite)\n )\n}\n","/**\n * Anthropic Messages 流 → 事件草稿。\n *\n * 只在流收尾时按拼好的内容块产出草稿(signature 在 content_block_stop 前才齐),增量经 onDelta 给 UI。\n * 中断或出错时把已拼出的部分内容也交出去——日志要记录\"发生过什么\",是否继续由循环决定。\n *\n * 事件形状(厂商 SSE,按 data.type 分派,不看 event: 行;F0 A7 实测):\n * message_start{ message: { id, model, usage: { input_tokens, cache_creation_input_tokens, cache_read_input_tokens } } }\n * content_block_start{ index, content_block: text | thinking | redacted_thinking | tool_use }\n * content_block_delta{ index, delta: text_delta | thinking_delta | signature_delta | input_json_delta }\n * content_block_stop{ index }\n * message_delta{ delta: { stop_reason, stop_sequence, stop_details? }, usage: { output_tokens, … } }\n * message_stop / ping / error{ error: { type, message } }\n * 未知字段一律忽略(厂商自带 \"p\" 填充;CF 网关原样透传)。\n */\nimport type { CoreEventDraft, LoweringOutcome, LoweringStreamContext, TokenUsage } from \"@reinsjs/core\"\nimport type { ModelOrigin } from \"../ir.js\"\nimport type { SseMessage } from \"../sse.js\"\nimport { costOf, type ModelCost } from \"../usage.js\"\n\ninterface AnthropicUsage {\n input_tokens?: unknown\n output_tokens?: unknown\n cache_creation_input_tokens?: unknown\n cache_read_input_tokens?: unknown\n}\n\ninterface AnthropicStreamEvent {\n type?: unknown\n message?: { id?: unknown; model?: unknown; usage?: AnthropicUsage | null }\n index?: unknown\n content_block?: {\n type?: unknown\n text?: unknown\n thinking?: unknown\n signature?: unknown\n data?: unknown\n id?: unknown\n name?: unknown\n input?: unknown\n }\n delta?: {\n type?: unknown\n text?: unknown\n thinking?: unknown\n signature?: unknown\n partial_json?: unknown\n stop_reason?: unknown\n stop_sequence?: unknown\n stop_details?: { category?: unknown; explanation?: unknown } | null\n }\n usage?: AnthropicUsage | null\n error?: { type?: unknown; message?: unknown }\n}\n\ntype Block =\n | { kind: \"text\"; text: string }\n | { kind: \"thinking\"; thinking: string; signature: string }\n | { kind: \"redacted_thinking\"; data: string }\n | { kind: \"tool_use\"; id: string; name: string; input: unknown; json: string }\n | { kind: \"other\"; type: string }\n\nexport interface AnthropicStreamInput {\n messages: AsyncIterable<SseMessage>\n origin: ModelOrigin\n cost?: ModelCost\n signal?: AbortSignal\n timedOut?: () => boolean\n timeoutMs?: number\n}\n\n/** pi-ai 对 redacted_thinking 的正文约定,两条降级路线的事件互换 */\nexport const REDACTED_THINKING_TEXT = \"[Reasoning redacted]\"\n\nfunction str(v: unknown): string | undefined {\n return typeof v === \"string\" ? v : undefined\n}\nfunction num(v: unknown): number | undefined {\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined\n}\n\n/** 入参 JSON 解析不了就原样存字符串(写侧会包成 { value }),空串按 {} */\nfunction parseInput(json: string, fallback: unknown): unknown {\n if (json.trim() === \"\") return typeof fallback === \"object\" && fallback !== null ? fallback : {}\n try {\n return JSON.parse(json) as unknown\n } catch {\n return json\n }\n}\n\nclass AnthropicAssembly {\n readonly blocks = new Map<number, Block>()\n start: AnthropicUsage | undefined\n delta: AnthropicUsage | undefined\n responseModel: string | undefined\n stopReason: string | undefined\n stopDetails: { category?: unknown; explanation?: unknown } | undefined\n error: { type: string; message: string } | undefined\n sawStop = false\n\n drafts(origin: ModelOrigin): CoreEventDraft[] {\n const out: CoreEventDraft[] = []\n for (const [, b] of [...this.blocks.entries()].sort((x, y) => x[0] - y[0])) {\n const replay: Record<string, unknown> = { ...origin }\n switch (b.kind) {\n case \"thinking\":\n // 签名在、正文为空(display omitted)也要留草稿:下一轮必须原样回放\n if (b.thinking.length === 0 && b.signature.length === 0) break\n if (b.signature.length > 0) replay.thinkingSignature = b.signature\n out.push({ type: \"core.model_thinking\", actor: \"model\", payload: { text: b.thinking }, replay })\n break\n case \"redacted_thinking\":\n replay.thinkingSignature = b.data\n replay.redacted = true\n out.push({\n type: \"core.model_thinking\",\n actor: \"model\",\n payload: { text: REDACTED_THINKING_TEXT },\n replay,\n })\n break\n case \"text\":\n if (b.text.length > 0)\n out.push({ type: \"core.model_text\", actor: \"model\", payload: { text: b.text }, replay })\n break\n case \"tool_use\":\n out.push({\n type: \"core.tool_call\",\n actor: \"model\",\n payload: { toolCallId: b.id, name: b.name, args: parseInput(b.json, b.input) },\n replay,\n })\n break\n case \"other\":\n break\n }\n }\n return out\n }\n\n hasToolUse(): boolean {\n for (const b of this.blocks.values()) if (b.kind === \"tool_use\") return true\n return false\n }\n}\n\n/**\n * Anthropic 的 input_tokens 本就不含缓存部分(与 core 语义一致);message_start 报输入侧,message_delta 报输出\n * (累计值)并可能再报一次输入侧,以后到的为准。\n */\nexport function usageOf(start: AnthropicUsage | undefined, delta: AnthropicUsage | undefined): TokenUsage {\n const pick = (k: keyof AnthropicUsage) => num(delta?.[k]) ?? num(start?.[k])\n const usage: TokenUsage = { input: pick(\"input_tokens\") ?? 0, output: pick(\"output_tokens\") ?? 0 }\n const read = pick(\"cache_read_input_tokens\")\n const write = pick(\"cache_creation_input_tokens\")\n if (read) usage.cacheRead = read\n if (write) usage.cacheWrite = write\n return usage\n}\n\nfunction apply(ev: AnthropicStreamEvent, a: AnthropicAssembly, ctx: LoweringStreamContext) {\n switch (ev.type) {\n case \"message_start\": {\n const model = str(ev.message?.model)\n if (model) a.responseModel = model\n if (ev.message?.usage) a.start = ev.message.usage\n break\n }\n case \"content_block_start\": {\n const index = num(ev.index)\n const cb = ev.content_block\n if (index === undefined || !cb) break\n const type = str(cb.type) ?? \"unknown\"\n switch (type) {\n case \"text\":\n a.blocks.set(index, { kind: \"text\", text: str(cb.text) ?? \"\" })\n break\n case \"thinking\":\n a.blocks.set(index, {\n kind: \"thinking\",\n thinking: str(cb.thinking) ?? \"\",\n signature: str(cb.signature) ?? \"\",\n })\n break\n case \"redacted_thinking\":\n a.blocks.set(index, { kind: \"redacted_thinking\", data: str(cb.data) ?? \"\" })\n break\n case \"tool_use\":\n a.blocks.set(index, {\n kind: \"tool_use\",\n id: str(cb.id) ?? \"\",\n name: str(cb.name) ?? \"\",\n input: cb.input,\n json: \"\",\n })\n break\n default:\n a.blocks.set(index, { kind: \"other\", type })\n }\n break\n }\n case \"content_block_delta\": {\n const index = num(ev.index)\n const d = ev.delta\n if (index === undefined || !d) break\n const b = a.blocks.get(index)\n if (!b) break\n switch (d.type) {\n case \"text_delta\": {\n const t = str(d.text)\n if (b.kind === \"text\" && t) {\n b.text += t\n ctx.onDelta?.({ kind: \"text\", index, delta: t })\n }\n break\n }\n case \"thinking_delta\": {\n const t = str(d.thinking)\n if (b.kind === \"thinking\" && t) {\n b.thinking += t\n ctx.onDelta?.({ kind: \"thinking\", index, delta: t })\n }\n break\n }\n case \"signature_delta\": {\n const s = str(d.signature)\n if (b.kind === \"thinking\" && s) b.signature += s\n break\n }\n case \"input_json_delta\": {\n const j = str(d.partial_json)\n if (b.kind === \"tool_use\" && j) {\n b.json += j\n ctx.onDelta?.({ kind: \"tool_args\", index, delta: j })\n }\n break\n }\n default:\n break\n }\n break\n }\n case \"message_delta\": {\n const reason = str(ev.delta?.stop_reason)\n if (reason) a.stopReason = reason\n if (ev.delta?.stop_details && typeof ev.delta.stop_details === \"object\")\n a.stopDetails = ev.delta.stop_details\n if (ev.usage) a.delta = { ...a.delta, ...ev.usage }\n break\n }\n case \"message_stop\":\n a.sawStop = true\n break\n case \"error\":\n a.error = { type: str(ev.error?.type) ?? \"error\", message: str(ev.error?.message) ?? \"\" }\n break\n default:\n // ping、content_block_stop 与未知事件:无事可做\n break\n }\n}\n\n/**\n * 停止原因:有 tool_use 块即 toolUse;end_turn / stop_sequence / pause_turn → stop;max_tokens 与\n * model_context_window_exceeded → length;refusal → error 并把 stop_details 写进 errorMessage(厂商分类器拒答,\n * 不是瞬断,core 不会重试);流里的 error 事件 → error(overloaded_error 的文案含 Overloaded,core 判可重试);\n * 没等到 message_stop 也没有 stop_reason → error \"stream ended before message_stop\"(可重试)。\n */\nfunction outcomeOf(a: AnthropicAssembly, cost: ModelCost | undefined): LoweringOutcome {\n const usage = usageOf(a.start, a.delta)\n const out: LoweringOutcome = { stopReason: \"stop\", usage }\n const c = costOf(usage, cost)\n if (c !== undefined) out.costUsd = c\n if (a.responseModel) out.responseModel = a.responseModel\n\n if (a.error) {\n out.stopReason = \"error\"\n out.errorMessage = `${a.error.type}: ${a.error.message}`\n return out\n }\n if (a.hasToolUse()) {\n out.stopReason = \"toolUse\"\n return out\n }\n switch (a.stopReason) {\n case \"end_turn\":\n case \"stop_sequence\":\n case \"pause_turn\":\n case \"tool_use\":\n break\n case \"max_tokens\":\n case \"model_context_window_exceeded\":\n out.stopReason = \"length\"\n break\n case \"refusal\": {\n out.stopReason = \"error\"\n const category = str(a.stopDetails?.category)\n const explanation = str(a.stopDetails?.explanation)\n out.errorMessage = `stop_reason=refusal${category ? ` (${category})` : \"\"}: the provider's classifier refused to answer${explanation ? `: ${explanation}` : \"\"}`\n break\n }\n case undefined:\n if (!a.sawStop) {\n out.stopReason = \"error\"\n out.errorMessage = \"stream ended before message_stop\"\n }\n break\n default:\n break\n }\n return out\n}\n\nexport async function* consumeAnthropicStream(\n input: AnthropicStreamInput,\n ctx: LoweringStreamContext = {},\n): AsyncGenerator<CoreEventDraft, LoweringOutcome> {\n const a = new AnthropicAssembly()\n try {\n for await (const msg of input.messages) {\n let ev: AnthropicStreamEvent\n try {\n ev = JSON.parse(msg.data) as AnthropicStreamEvent\n } catch {\n // 解析不了的一帧:跳过而不是整条流作废,末尾若因此缺 message_stop 会记 error\n continue\n }\n apply(ev, a, ctx)\n if (a.error) break\n }\n } catch (err) {\n yield* a.drafts(input.origin)\n const base = outcomeOf(a, input.cost)\n if (input.signal?.aborted) return { ...base, stopReason: \"aborted\", errorMessage: \"aborted by host\" }\n if (input.timedOut?.())\n return {\n ...base,\n stopReason: \"error\",\n errorMessage: `request timed out after ${input.timeoutMs ?? \"?\"}ms (stream ended before message_stop)`,\n }\n return { ...base, stopReason: \"error\", errorMessage: errorText(err) }\n }\n yield* a.drafts(input.origin)\n return outcomeOf(a, input.cost)\n}\n\nfunction errorText(err: unknown): string {\n if (err instanceof Error) {\n const cause = (err as { cause?: { code?: unknown } }).cause\n const code = typeof cause?.code === \"string\" ? ` (${cause.code})` : \"\"\n return `${err.message}${code}`\n }\n return String(err)\n}\n","/**\n * Chat Completions 的有损矩阵(P7:有损必声明)。事件 type → 可能落点;toRequest 记录的每条实际落点必须命中其中一条,\n * 矩阵里不能有从未命中的死条目(loss-matrix.test.ts)。新增事件类型或改落点不补表,测试就红。\n */\nimport type { LandingSpec } from \"@reinsjs/core\"\n\nconst exact = (landing: string, note?: string, when?: string): LandingSpec => {\n const spec: LandingSpec = { kind: \"exact\", landing }\n if (note) spec.note = note\n if (when) spec.when = when\n return spec\n}\nconst lossy = (landing: string, note: string, when?: string): LandingSpec =>\n when ? { kind: \"lossy\", landing, note, when } : { kind: \"lossy\", landing, note }\nconst dropped = (landing: string, note: string, when?: string): LandingSpec =>\n when ? { kind: \"dropped\", landing, note, when } : { kind: \"dropped\", landing, note }\n\n/** 不下发的运维事件:服务宿主与审计,信息由别的事件承载;投影默认已过滤,这里是第二道声明 */\nexport const NOT_SENT: Readonly<Record<string, readonly LandingSpec[]>> = {\n \"core.approval_request\": [\n dropped(\"none\", \"the approval outcome reaches the model through tool_result(isError)\"),\n ],\n \"core.approval_decision\": [dropped(\"none\", \"same as above\")],\n \"core.run_paused\": [dropped(\"none\", \"a run record; the perception module distills it into a system_note\")],\n \"core.run_resumed\": [dropped(\"none\", \"same as above\")],\n \"core.budget_usage\": [dropped(\"none\", \"same as above\")],\n \"core.memory_op\": [\n dropped(\n \"none\",\n \"an audit trail of memory reads and writes; the model already learned of them from the tool result\",\n ),\n ],\n \"core.handoff\": [\n dropped(\n \"none\",\n \"this session ends at the handoff; the new session's first user message carries the triggerMessage\",\n ),\n ],\n \"core.tools_bound\": [\n dropped(\n \"none\",\n \"a snapshot of the tool table; the loop announces changes to it in a separate system_note\",\n ),\n ],\n \"core.error\": [\n dropped(\n \"none\",\n \"provider errors are handled by the loop; tool errors already live in tool_result.isError\",\n ),\n ],\n \"ext.*\": [\n dropped(\n \"none\",\n \"host extension events have no general landing; translate the ones the model must see into core events in the projection layer\",\n ),\n ],\n}\n\nexport const CHAT_LOSS_MATRIX: Readonly<Record<string, readonly LandingSpec[]>> = {\n \"core.user_message\": [\n exact(\"user\"),\n lossy(\n \"user\",\n \"moved after that batch of tool results (the order changes), untrusted content escaped, or images replaced with placeholder text because the model takes none\",\n \"the user speaks up before all tool results are in / the content holds a </untrusted / it carries images the model does not take\",\n ),\n ],\n \"core.model_text\": [\n exact(\"assistant-content\"),\n lossy(\n \"merged-text\",\n \"multiple text segments of one turn are merged into a single string (assistant.content can only be a string)\",\n \"the turn holds more than one text segment\",\n ),\n ],\n \"core.model_thinking\": [\n exact(\n \"reasoning_content\",\n \"the DeepSeek dialect: the thinking text is filled back in verbatim\",\n \"the model has chat.reasoningContent on and the source is the same family\",\n ),\n dropped(\n \"none\",\n \"Chat Completions has no landing for replaying thinking (no signature, no encrypted item), or the source is another family\",\n ),\n ],\n \"core.tool_call\": [exact(\"tool_calls\", \"arguments is a JSON string\")],\n \"core.tool_result\": [\n exact(\n \"tool\",\n \"a role:tool message right after the assistant that carries the tool_calls; tool reference parts are expanded into text (Chat has no deferred-loading landing)\",\n ),\n lossy(\n \"tool\",\n \"isError is expressed with a [tool error] prefix (a tool message has no error flag), or untrusted content is escaped\",\n ),\n lossy(\n \"tool+lifted-images\",\n \"a tool message takes text only, so it keeps a pointer where each image was and the images move into a user message right after the whole batch of tool messages (the order and the role change); that message labels them as tool output, with the tool name, call id and index, and keeps the result's untrusted marking\",\n \"the result carries images and the model takes images (chat.liftToolImages is on by default)\",\n ),\n lossy(\n \"tool-text-only\",\n \"a tool message takes text only, so images are replaced with placeholder text\",\n \"the result carries images and the model takes no images, or chat.liftToolImages is false\",\n ),\n ],\n \"core.system_note\": [\n exact(\n \"system\",\n \"a mid-conversation system message\",\n \"the upstream accepts mid-conversation system (the default)\",\n ),\n lossy(\n \"system\",\n \"a mid-conversation system message, with the early close inside untrusted content escaped\",\n \"a note the host marked untrusted holds a </untrusted\",\n ),\n lossy(\n \"user-role\",\n \"wrapped in a <system_note> tag and sent with the user role\",\n \"the model declares midConversationSystem: false\",\n ),\n ],\n \"core.compaction\": [\n lossy(\n \"user-text\",\n \"the summary is rendered as user-role text, so the model cannot tell it apart from the user's own words\",\n ),\n ],\n ...NOT_SENT,\n}\n","/**\n * Anthropic Messages 的有损矩阵(P7:有损必声明)。每条实际落点必须命中其中一条,矩阵里不能有死条目(loss-matrix.test.ts)。\n * 与 lowering-pi 的 \"anthropic-messages\" 表逐格对照:能 exact 的一样(user / assistant-text / tool_use / tool_result /\n * thinking-block / system),不同处只有三格——无签名 thinking 这里 dropped 而非 pi-ai 的\"降为正文\"、redacted 单列、\n * tool_result 图片按模型能力处置。\n */\nimport type { LandingSpec } from \"@reinsjs/core\"\nimport { NOT_SENT } from \"../chat/loss-matrix.js\"\n\nconst exact = (landing: string, note?: string, when?: string): LandingSpec => {\n const spec: LandingSpec = { kind: \"exact\", landing }\n if (note) spec.note = note\n if (when) spec.when = when\n return spec\n}\nconst lossy = (landing: string, note: string, when?: string): LandingSpec =>\n when ? { kind: \"lossy\", landing, note, when } : { kind: \"lossy\", landing, note }\nconst dropped = (landing: string, note: string, when?: string): LandingSpec =>\n when ? { kind: \"dropped\", landing, note, when } : { kind: \"dropped\", landing, note }\n\nexport const ANTHROPIC_LOSS_MATRIX: Readonly<Record<string, readonly LandingSpec[]>> = {\n \"core.user_message\": [\n exact(\"user\"),\n lossy(\n \"user\",\n \"moved after that batch of tool results (the order changes), untrusted content escaped, or images replaced with placeholder text because the model takes none\",\n \"the user speaks up before all tool results are in / the content holds a </untrusted / it carries images the model does not take\",\n ),\n dropped(\n \"none\",\n \"the content is empty and Anthropic rejects empty text blocks\",\n \"the user message has no non-empty content\",\n ),\n ],\n \"core.model_text\": [\n exact(\n \"assistant-text\",\n \"a text block on the assistant; each text segment of a turn becomes its own block\",\n ),\n dropped(\n \"none\",\n \"empty text is not sent (the provider rejects empty text blocks)\",\n \"the text is an empty string\",\n ),\n ],\n \"core.model_thinking\": [\n exact(\n \"thinking-block\",\n \"replayed verbatim with its signature\",\n \"the replay has a thinkingSignature and comes from the same source (provider + api + model)\",\n ),\n exact(\n \"redacted-thinking\",\n \"redacted_thinking is replayed verbatim through its data\",\n \"replay.redacted is true\",\n ),\n dropped(\n \"none\",\n \"thinking with no signature (a broken stream), from another family, or from another model of the same family (a signature is only valid for the model that produced it) is rejected by the provider, so it is not replayed, and not downgraded to text either\",\n ),\n ],\n \"core.tool_call\": [\n exact(\"tool_use\"),\n lossy(\"wrapped-args\", \"non-object arguments are wrapped as { value }\", \"tool_call.args is not an object\"),\n ],\n \"core.tool_result\": [\n exact(\n \"tool_result\",\n \"in the user message right after the assistant that holds the tool_use; is_error is passed through; tool reference parts are expanded into text when the native capability is missing or the result is not trusted as system\",\n ),\n lossy(\n \"tool_result\",\n \"untrusted content is escaped, or images are replaced with placeholder text because the model takes none, or the referenced tool is absent from this request's tool table and its definition is expanded into text\",\n ),\n exact(\n \"tool-reference\",\n \"the result holds nothing but tool reference parts: a tool_reference block goes into the tool_result and the provider expands it in place into the full definition (the tool table stays byte-identical)\",\n \"the model supports defer_loading, the result is trusted as system, and every referenced tool is in this request's tool table\",\n ),\n lossy(\n \"tool-reference\",\n \"the reference block goes into the tool_result and the result's text segments move to a text block right after it in the same user message (a reference inside a tool_result cannot be mixed with text)\",\n \"the result holds both reference parts and text segments (explanatory text, untrusted markers)\",\n ),\n ],\n \"core.system_note\": [\n exact(\n \"system\",\n \"a mid-conversation system message carrying the text; it is placed before the next assistant message, or at the very end\",\n \"the model family supports mid-conversation system (Fable 5.x / Mythos 5.x / Opus 5 / Opus 4.8, or the host says so)\",\n ),\n lossy(\n \"system\",\n \"a mid-conversation system message, with the early close inside untrusted content escaped\",\n \"a note the host marked untrusted holds a </untrusted\",\n ),\n lossy(\n \"user-role\",\n \"wrapped in a <system_note> tag and sent with the user role\",\n \"the model family does not support mid-conversation system, or the placement rules forbid it (the previous message is an assistant, or the note would be first)\",\n ),\n ],\n \"core.compaction\": [\n lossy(\n \"user-text\",\n \"the summary is rendered as user-role text, so the model cannot tell it apart from the user's own words\",\n ),\n ],\n ...NOT_SENT,\n}\n","/**\n * IR → Anthropic Messages 请求体,并为每条事件记落点。\n *\n * 与 Chat 线相比 Anthropic 规矩最多,这里逐条落实(规则原文 F0 实测,spikes/cf-gateway-fidelity):\n * - **tool_result 紧跟**:同批 tool_result 必须在 tool_use 所在 assistant 的下一条 user 里;后移由 IR 完成,这里只把连续的\n * user 侧内容(tool_result、用户消息、摘要)并进同一条 user(F0 A5b 实测同条 user 里 tool_result 后接文本可达);\n * - **中途 system 摆放**(S1):不能是首条、必须紧跟 user(含只带 tool_result 的 user)、后接 assistant 或收尾。所以说明\n * 一律攒到\"下一条 assistant 之前\"或末尾再放出;此刻前一条不是 user(是 assistant 或什么都没有)就退成 `<system_note>`\n * 框住的 user 文本,记 lossy(user-role)。放出位置比时间线晚了一条 user 的,仍算 exact(说明只换位置,见 CLAUDE.md);\n * - **thinking 回放**:带 signature 原样回放(F0 A7b 接受、伪造签名 400);无签名(流中断)与来自别家的一律 dropped 声明——\n * 不像 pi-ai 那样降成正文,模型的私下推理不该以它\"说过的话\"出现在历史里;`redacted_thinking` 用 data 原样回放;\n * - **缓存断点**:最多 4 个。我们打三处——system 末块、tools 末项、最后一条 user 末块(厂商按前缀向前找命中,20 块回看窗口);\n * 说明殿后(末条是 system)时按 `midSystemCacheBreakpoint` 处置,缺省顶层 `cache_control`(B1 实测与不注入持平);\n * - `max_tokens` 必填:宿主 requestOptions 没给就用模型声明的 maxOutputTokens;`thinking` 不缺省设置——Opus 5 起厂商缺省\n * 就是 adaptive,是否开、开多深由宿主按模型代次决定(Fable 5.1 对 `type:\"disabled\"` 400);\n * - **延迟加载**(L1,spikes/l1-deferred-tools 实测):`ToolSpec.deferLoading` → `defer_loading: true`,工具留在 tools 块里、\n * 表整段不变;结果里的 `tool_reference` 段 → `tool_reference` 块由厂商就地展开。厂商规矩:tool_result 内引用不能与文本混放\n * (文本段改放同条 user 里紧随的 text 块,记 lossy);引用指向 tools 里没有的名字 400(整段历史都校验,所以未绑定的引用一律\n * 展开成文本);全部工具 defer_loading 400(此时不延迟);defer_loading 工具不能带 cache_control(断点打在最后一个非延迟工具上)。\n * 能力位关着(第三方上游)时 deferLoading 的工具不发、引用段展开成文本。\n */\nimport {\n type ContentPart,\n type Event,\n type LandingRecord,\n type LoweringCapabilities,\n renderToolReference,\n type ToolSpec,\n} from \"@reinsjs/core\"\nimport {\n DEFERRED_NOTE,\n ESCAPED_NOTE,\n foreignOrigin,\n type IrBlock,\n type IrItem,\n type ModelOrigin,\n orderLandings,\n} from \"../ir.js\"\nimport type { FetchModel } from \"../models.js\"\nimport { framedSummary, framedSystemNote } from \"../notes.js\"\n\nexport interface AnthropicCacheControl {\n type: \"ephemeral\"\n ttl?: \"5m\" | \"1h\"\n}\n\nexport type AnthropicUserBlock =\n | { type: \"text\"; text: string; cache_control?: AnthropicCacheControl }\n | {\n type: \"image\"\n source: { type: \"base64\"; media_type: string; data: string }\n cache_control?: AnthropicCacheControl\n }\n | {\n type: \"tool_result\"\n tool_use_id: string\n content?: AnthropicToolResultBlock[]\n is_error?: true\n cache_control?: AnthropicCacheControl\n }\n\n/** 文本与图片块:user 消息与 tool_result 内容共用的形状 */\nexport type AnthropicContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"image\"; source: { type: \"base64\"; media_type: string; data: string } }\n\nexport type AnthropicToolResultBlock =\n | AnthropicContentBlock\n /** 工具定义引用:厂商就地展开成完整定义,不能与其他块混放(L1) */\n | { type: \"tool_reference\"; tool_name: string }\n\nexport type AnthropicAssistantBlock =\n | { type: \"text\"; text: string }\n | { type: \"thinking\"; thinking: string; signature: string }\n | { type: \"redacted_thinking\"; data: string }\n | { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> }\n\nexport type AnthropicMessage =\n | { role: \"user\"; content: AnthropicUserBlock[] }\n | { role: \"assistant\"; content: AnthropicAssistantBlock[] }\n | { role: \"system\"; content: { type: \"text\"; text: string }[] }\n\nexport interface AnthropicTool {\n name: string\n description: string\n input_schema: Record<string, unknown>\n /** 声明但不载入上下文,历史里出现 tool_reference 后才可见;不能与 cache_control 同在(L1) */\n defer_loading?: true\n cache_control?: AnthropicCacheControl\n}\n\n/** 发出去的请求体本体。宿主的 requestOptions 先铺、我们的字段后盖:model / messages / system / tools / stream 不可被覆盖 */\nexport interface AnthropicRequestBody extends Record<string, unknown> {\n model: string\n max_tokens: number\n system?: { type: \"text\"; text: string; cache_control?: AnthropicCacheControl }[]\n messages: AnthropicMessage[]\n tools?: AnthropicTool[]\n stream: true\n cache_control?: AnthropicCacheControl\n}\n\nexport interface AnthropicEncodeInput {\n ir: readonly IrItem[]\n events: readonly Event[]\n model: FetchModel\n capabilities: LoweringCapabilities\n tools?: readonly ToolSpec[]\n systemPrompt?: string\n requestOptions?: Record<string, unknown>\n}\n\n/** Anthropic 每个请求最多 4 个断点(顶层自动缓存也占一个),超出即 400 */\nexport const MAX_ANTHROPIC_BREAKPOINTS = 4\n\nconst IMAGE_OMITTED = \"[image omitted: this model does not accept images]\"\nconst EMPTY_NOTE =\n \"the content is empty and Anthropic rejects empty text blocks, so the whole message is not sent\"\nconst MOVED_NOTE =\n \"moved to just after the next user message (a system message must follow a user message, and be followed by an assistant message or the end)\"\nconst REF_TEXT_ASIDE_NOTE =\n \"the result's text segments move to a text block after this batch of tool_result in the same user message (a reference inside a tool_result cannot be mixed with text, and tool_result must come first in a user message)\"\nconst REF_UNTRUSTED_NOTE =\n \"a tool reference in an untrusted result does not take the native landing (untrusted content must not light up tools for the model), so it is expanded into text\"\nconst REF_UNBOUND_NOTE =\n \"the referenced tool is absent from this request's tool table (the provider validates references across the whole history and answers 400 if one is missing), so the definition is expanded into text\"\n\nfunction land(\n out: LandingRecord[],\n e: Event,\n kind: LandingRecord[\"kind\"],\n landing: string,\n ...notes: (string | undefined)[]\n) {\n const note = notes.filter((n): n is string => Boolean(n)).join(\"; \")\n out.push(\n note\n ? { eventId: e.id, type: e.type, kind, landing, note }\n : { eventId: e.id, type: e.type, kind, landing },\n )\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v)\n}\n\n/** 内容段 → Anthropic 块;空文本段跳过(厂商不接受空文本块),图片按模型能力处置,工具引用展开成文本(原生落点在 tool_result 分支另行处理) */\nfunction blocksOf(\n parts: readonly ContentPart[],\n images: boolean,\n): { blocks: AnthropicContentBlock[]; imagesDropped: boolean } {\n let imagesDropped = false\n const blocks: AnthropicContentBlock[] = []\n for (const p of parts) {\n if (p.type === \"text\") {\n if (p.text.length > 0) blocks.push({ type: \"text\", text: p.text })\n } else if (p.type === \"tool_reference\") {\n blocks.push({ type: \"text\", text: renderToolReference(p) })\n } else if (images) {\n blocks.push({ type: \"image\", source: { type: \"base64\", media_type: p.mime, data: p.data } })\n } else {\n imagesDropped = true\n blocks.push({ type: \"text\", text: IMAGE_OMITTED })\n }\n }\n return { blocks, imagesDropped }\n}\n\ninterface PendingNote {\n item: Extract<IrItem, { kind: \"system_note\" }>\n /** 放出位置比时间线晚了至少一条 user 侧内容 */\n moved: boolean\n}\n\nexport function encodeAnthropicRequest(input: AnthropicEncodeInput): {\n body: AnthropicRequestBody\n landings: LandingRecord[]\n} {\n const { model, capabilities } = input\n const target: ModelOrigin = { provider: model.provider, api: model.api, model: model.id }\n const dialect = model.anthropic ?? {}\n /** 本次请求工具表里的名字(含 deferLoading 的):tool_reference 只能指向它们,否则厂商 400 */\n const boundNames = new Set((input.tools ?? []).map((t) => t.name))\n const messages: AnthropicMessage[] = []\n const landings: LandingRecord[] = []\n /** 正在攒的 user 消息(tool_result、用户消息、摘要并进同一条) */\n let userRun: AnthropicUserBlock[] | null = null\n /** 引用结果里的文本段:厂商要求同条 user 里 tool_result 排在最前,所以攒到这批 tool_result 之后再放(L1 spike 形态 D 实测) */\n let asides: AnthropicUserBlock[] = []\n const pendingNotes: PendingNote[] = []\n\n const openUser = (): AnthropicUserBlock[] => {\n if (!userRun) userRun = []\n // 有说明在等着放出,而这里又来了 user 侧内容:说明的位置就比时间线晚了\n for (const n of pendingNotes) n.moved = true\n return userRun\n }\n const closeUser = () => {\n if (userRun && asides.length > 0) {\n const lastResult = userRun.map((b) => b.type).lastIndexOf(\"tool_result\")\n userRun.splice(lastResult + 1, 0, ...asides)\n asides = []\n }\n if (userRun && userRun.length > 0) messages.push({ role: \"user\", content: userRun })\n userRun = null\n }\n /** 说明归位:下一条 assistant 之前或末尾。前一条是 user / system 才能放 system,否则退成 user 文本 */\n const flushNotes = () => {\n closeUser()\n if (pendingNotes.length === 0) return\n const last = messages[messages.length - 1]\n if (last && last.role !== \"assistant\") {\n for (const { item, moved } of pendingNotes) {\n messages.push({ role: \"system\", content: [{ type: \"text\", text: item.text }] })\n land(\n landings,\n item.event,\n item.escaped ? \"lossy\" : \"exact\",\n \"system\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n moved ? MOVED_NOTE : undefined,\n )\n }\n } else {\n const why = last\n ? \"the previous message is an assistant, and a system message must follow a user message\"\n : \"a system message cannot come first\"\n messages.push({\n role: \"user\",\n content: pendingNotes.map(({ item }) => ({\n type: \"text\",\n text: framedSystemNote(item.noteKind, item.text),\n })),\n })\n for (const { item } of pendingNotes) {\n land(\n landings,\n item.event,\n \"lossy\",\n \"user-role\",\n `${why}, so it is wrapped in a <system_note> tag and sent with the user role`,\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n }\n }\n pendingNotes.length = 0\n }\n\n for (const item of input.ir) {\n switch (item.kind) {\n case \"user\": {\n const c = blocksOf(item.parts, capabilities.images)\n if (c.blocks.length === 0) {\n land(landings, item.event, \"dropped\", \"none\", EMPTY_NOTE)\n break\n }\n openUser().push(...c.blocks)\n const lossy = item.deferred || item.escaped || c.imagesDropped\n land(\n landings,\n item.event,\n lossy ? \"lossy\" : \"exact\",\n \"user\",\n item.deferred\n ? `the user message sits between a tool call and its results; ${DEFERRED_NOTE}`\n : undefined,\n item.escaped ? ESCAPED_NOTE : undefined,\n c.imagesDropped\n ? \"the model takes no images, so they are replaced with placeholder text\"\n : undefined,\n )\n break\n }\n case \"tool_result\": {\n const refs = item.parts.filter(\n (p): p is Extract<ContentPart, { type: \"tool_reference\" }> => p.type === \"tool_reference\",\n )\n const block: AnthropicUserBlock = { type: \"tool_result\", tool_use_id: item.toolCallId }\n if (item.isError) block.is_error = true\n // 原生落点只给 system 信任的结果(tool_find / skill_read 这类宿主配置的内容):untrusted 工具输出不能替模型点亮工具\n const trusted = item.event.trust === \"system\"\n if (\n refs.length > 0 &&\n capabilities.deferredTools &&\n trusted &&\n refs.every((r) => boundNames.has(r.name))\n ) {\n // 原生落点:tool_result 里只放引用块,厂商就地展开;其余段(说明文字、untrusted 标记)放同条 user 里紧随其后\n block.content = refs.map((r) => ({ type: \"tool_reference\", tool_name: r.name }))\n const rest = blocksOf(\n item.parts.filter((p) => p.type !== \"tool_reference\"),\n capabilities.images,\n )\n openUser().push(block)\n asides.push(...rest.blocks)\n const aside = rest.blocks.length > 0\n land(\n landings,\n item.event,\n aside || item.escaped || rest.imagesDropped ? \"lossy\" : \"exact\",\n \"tool-reference\",\n aside ? REF_TEXT_ASIDE_NOTE : undefined,\n rest.imagesDropped\n ? \"the model takes no images, so they are replaced with placeholder text\"\n : undefined,\n item.escaped ? ESCAPED_NOTE : undefined,\n )\n break\n }\n const c = blocksOf(item.parts, capabilities.images)\n if (c.blocks.length > 0) block.content = c.blocks\n openUser().push(block)\n const unbound = refs.length > 0 && capabilities.deferredTools && trusted\n const untrustedRefs = refs.length > 0 && capabilities.deferredTools && !trusted\n const lossy = item.escaped || c.imagesDropped || unbound\n land(\n landings,\n item.event,\n lossy ? \"lossy\" : \"exact\",\n \"tool_result\",\n unbound ? REF_UNBOUND_NOTE : undefined,\n untrustedRefs ? REF_UNTRUSTED_NOTE : undefined,\n c.imagesDropped\n ? \"the model takes no images, so they are replaced with placeholder text\"\n : undefined,\n item.escaped ? ESCAPED_NOTE : undefined,\n )\n break\n }\n case \"compaction\": {\n openUser().push({ type: \"text\", text: framedSummary(item.text) })\n land(\n landings,\n item.event,\n \"lossy\",\n \"user-text\",\n \"the summary is rendered as user-role text\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n break\n }\n case \"system_note\": {\n if (capabilities.midConversationSystem) {\n pendingNotes.push({ item, moved: false })\n } else {\n openUser().push({ type: \"text\", text: framedSystemNote(item.noteKind, item.text) })\n land(\n landings,\n item.event,\n \"lossy\",\n \"user-role\",\n \"the model does not support mid-conversation system, so it is wrapped in a <system_note> tag and sent with the user role\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n }\n break\n }\n case \"assistant\": {\n const content = assistantBlocks(item.blocks, item.origin, target, landings)\n // 全部块都没法下发(如只有无签名 thinking)时整条不发(空 content 的 assistant 厂商 400),user 侧内容继续并进同一条\n if (content.length === 0) break\n flushNotes()\n messages.push({ role: \"assistant\", content })\n break\n }\n case \"dropped\":\n land(landings, item.event, \"dropped\", \"none\", item.note)\n break\n }\n }\n flushNotes()\n\n const ro = input.requestOptions ?? {}\n // 宿主选项里的 system / tools 一律不透传:这两个字段只由事件与工具表决定,没有时也不能让宿主塞一份进来\n const { system: _system, tools: _tools, ...passthrough } = ro\n const body: AnthropicRequestBody = {\n ...passthrough,\n model: model.id,\n max_tokens: typeof ro.max_tokens === \"number\" ? ro.max_tokens : model.maxOutputTokens,\n messages,\n stream: true,\n }\n if (input.systemPrompt) body.system = [{ type: \"text\", text: input.systemPrompt }]\n if (input.tools && input.tools.length > 0) {\n const tools = encodeTools(input.tools, capabilities.deferredTools)\n if (tools.length > 0) body.tools = tools\n }\n if (dialect.cacheBreakpoints !== false) placeCacheBreakpoints(body, dialect)\n return { body, landings: orderLandings(input.events, landings) }\n}\n\n/**\n * 一轮模型输出 → assistant 的内容块。\n * - 正文:Anthropic 接受多个 text 块,逐段原样(空段跳过并声明);\n * - thinking:signature 在且来源同家(provider + api)→ thinking 块;redacted → redacted_thinking(data);\n * 无签名或别家 → dropped。同家不同型号(换代、日期后缀、网关改名)照发并备注,能否读由厂商定(读不了它会丢弃、不计费);\n * - tool_call:input 必须是对象,不是对象的包成 { value }(lossy wrapped-args)。\n */\nfunction assistantBlocks(\n blocks: readonly IrBlock[],\n origin: ModelOrigin,\n target: ModelOrigin,\n landings: LandingRecord[],\n): AnthropicAssistantBlock[] {\n const out: AnthropicAssistantBlock[] = []\n const foreign = foreignOrigin(origin, target)\n for (const b of blocks) {\n switch (b.type) {\n case \"text\":\n if (b.text.length === 0) {\n land(landings, b.event, \"dropped\", \"none\", EMPTY_NOTE)\n break\n }\n out.push({ type: \"text\", text: b.text })\n land(landings, b.event, \"exact\", \"assistant-text\")\n break\n case \"thinking\": {\n const signature = typeof b.replay.thinkingSignature === \"string\" ? b.replay.thinkingSignature : \"\"\n if (foreign) {\n land(\n landings,\n b.event,\n \"dropped\",\n \"none\",\n `thinking from ${origin.provider}/${origin.api} has no signature of its own, so it is not replayed`,\n )\n break\n }\n if (signature.length === 0) {\n land(\n landings,\n b.event,\n \"dropped\",\n \"none\",\n \"thinking with no signature (a broken stream) is rejected by the provider, so it is not replayed\",\n )\n break\n }\n // 签名绑定产出它的模型:换了型号照发厂商回 400(2026-09-15 eval resume fixture 实测,Sonnet 5 收到别的模型的签名)\n if (origin.model !== target.model) {\n land(\n landings,\n b.event,\n \"dropped\",\n \"none\",\n `the signature comes from ${origin.model}, but this request targets ${target.model}; a signature is only valid for the model that produced it, so the block is not replayed`,\n )\n break\n }\n if (b.replay.redacted === true) {\n out.push({ type: \"redacted_thinking\", data: signature })\n land(\n landings,\n b.event,\n \"exact\",\n \"redacted-thinking\",\n \"redacted_thinking is replayed verbatim through its data\",\n )\n } else {\n out.push({ type: \"thinking\", thinking: b.text, signature })\n land(landings, b.event, \"exact\", \"thinking-block\")\n }\n break\n }\n case \"tool_call\": {\n const wrapped = !isPlainObject(b.args)\n out.push({\n type: \"tool_use\",\n id: b.id,\n name: b.name,\n input: wrapped ? { value: b.args } : (b.args as Record<string, unknown>),\n })\n if (wrapped)\n land(\n landings,\n b.event,\n \"lossy\",\n \"wrapped-args\",\n \"non-object arguments are wrapped as { value } (tool_use.input must be an object)\",\n )\n else land(landings, b.event, \"exact\", \"tool_use\")\n break\n }\n }\n }\n return out\n}\n\n/**\n * 工具表 → tools 块(L1)。有原生能力:deferLoading → `defer_loading: true`,但全表都延迟时厂商 400,退成都不延迟;\n * 无原生能力:deferLoading 的工具直接不发(模型看不见也调不了,与过滤同义)。\n */\nexport function encodeTools(specs: readonly ToolSpec[], deferredTools: boolean): AnthropicTool[] {\n const shown = deferredTools ? specs : specs.filter((t) => t.deferLoading !== true)\n const allDeferred = deferredTools && shown.length > 0 && shown.every((t) => t.deferLoading === true)\n return shown.map((t): AnthropicTool => {\n const tool: AnthropicTool = { name: t.name, description: t.description, input_schema: t.inputSchema }\n if (deferredTools && t.deferLoading === true && !allDeferred) tool.defer_loading = true\n return tool\n })\n}\n\n/** 数请求里块级 cache_control 的个数:system 数组、tools 数组、messages 的内容块 */\nexport function countBlockBreakpoints(body: AnthropicRequestBody): number {\n const has = (b: unknown) => typeof b === \"object\" && b !== null && \"cache_control\" in b\n let n = 0\n for (const s of body.system ?? []) if (has(s)) n++\n for (const t of body.tools ?? []) if (has(t)) n++\n for (const m of body.messages) for (const b of m.content) if (has(b)) n++\n return n\n}\n\n/**\n * 三处断点:system 末块、tools 末项、最后一条 user 末块。末条是 system(说明殿后)时按处置模式:\n * automatic → 顶层 cache_control(宿主 requestOptions 已给顶层的不覆盖);previous-user → 找最后一条 user;drop → 不打。\n * 无论哪种,块级 + 顶层总数不超过 4。\n */\nfunction placeCacheBreakpoints(body: AnthropicRequestBody, dialect: NonNullable<FetchModel[\"anthropic\"]>) {\n const cc: AnthropicCacheControl =\n dialect.cacheTtl === \"1h\" ? { type: \"ephemeral\", ttl: \"1h\" } : { type: \"ephemeral\" }\n const budget = () => MAX_ANTHROPIC_BREAKPOINTS - countBlockBreakpoints(body) - (body.cache_control ? 1 : 0)\n\n const lastSystem = body.system?.[body.system.length - 1]\n if (lastSystem && budget() > 0) lastSystem.cache_control = cc\n // defer_loading 的工具不能带 cache_control(厂商 400),断点打在最后一个非延迟工具上\n const lastTool = [...(body.tools ?? [])].reverse().find((t) => t.defer_loading !== true)\n if (lastTool && budget() > 0) lastTool.cache_control = cc\n\n const last = body.messages[body.messages.length - 1]\n if (!last) return\n const markLastUser = (m: AnthropicMessage | undefined) => {\n if (m?.role !== \"user\") return\n const block = m.content[m.content.length - 1]\n if (block && budget() > 0) block.cache_control = cc\n }\n if (last.role === \"user\") {\n markLastUser(last)\n return\n }\n if (last.role !== \"system\") return\n switch (dialect.midSystemCacheBreakpoint ?? \"automatic\") {\n case \"automatic\":\n if (body.cache_control === undefined && budget() > 0) body.cache_control = cc\n break\n case \"previous-user\":\n markLastUser([...body.messages].reverse().find((m) => m.role === \"user\"))\n break\n case \"drop\":\n break\n }\n}\n","/**\n * 事件 → 中间表示(IR):三条线协议共用的一趟遍历。\n *\n * 这一步只做与协议无关的事:\n * 1. **分组**——连续的 model 事件(thinking / text / tool_call)合成一条 assistant 轮,遇到非 model 事件或来源变了就收口;\n * 2. **后移**——\"同批 tool_result 必须紧跟 tool_use\"是厂商硬规则,而时间线里说明、摘要、用户插话都可能落在两者之间;\n * 结果没到齐时它们先攒着,到齐后按原顺序放出(`deferred: true`)。日志顺序不动(宪法二),只在翻译产物里挪位;\n * 3. **trust 标注**——untrusted 内容包 `<untrusted source=…>`(core 的同一份纯函数),转义过的记 `escaped`。\n *\n * 每种事件落到线协议的哪个位置、算 exact 还是 lossy,由各协议的 encoder 决定并记 LandingRecord;IR 只提供判定所需的事实。\n * 输出顺序就是线上顺序;`orderLandings` 把 encoder 记下的落点按输入事件顺序排回去(LoweredRequest.landings 的契约)。\n */\nimport {\n type ContentPart,\n type CoreEvent,\n type Event,\n type LandingRecord,\n markUntrusted,\n markUntrustedText,\n needsUntrustedMark,\n type SystemNotePayload,\n untrustedSourceOf,\n} from \"@reinsjs/core\"\n\n/** 模型事件 replay 里记录的来源,产出与回放两头共用(与 lowering-pi 同字段,两条路线的事件可互换) */\nexport interface ModelOrigin {\n provider: string\n api: string\n model: string\n}\n\nexport type IrBlock =\n | { type: \"thinking\"; event: Event; text: string; replay: Record<string, unknown> }\n | { type: \"text\"; event: Event; text: string; replay: Record<string, unknown> }\n | {\n type: \"tool_call\"\n event: Event\n id: string\n name: string\n args: unknown\n replay: Record<string, unknown>\n }\n\nexport type IrItem =\n | { kind: \"user\"; event: Event; parts: ContentPart[]; escaped: boolean; deferred: boolean }\n | { kind: \"assistant\"; origin: ModelOrigin; blocks: IrBlock[]; at: number }\n | {\n kind: \"tool_result\"\n event: Event\n toolCallId: string\n name: string\n parts: ContentPart[]\n isError: boolean\n escaped: boolean\n /** 内容按 untrusted 包过标记时的来源标签(`tool:<name>`);没包就没有。Chat 线上浮图片时据此给附件同样标注 */\n untrustedSource?: string\n }\n | {\n kind: \"system_note\"\n event: Event\n noteKind: SystemNotePayload[\"kind\"]\n text: string\n escaped: boolean\n deferred: boolean\n }\n | { kind: \"compaction\"; event: Event; text: string; escaped: boolean; deferred: boolean }\n /** 运维事件与 ext.*:不下发,encoder 只记落点 */\n | { kind: \"dropped\"; event: Event; note: string }\n\nexport interface IrInput {\n events: readonly Event[]\n /** 当前请求的目标模型:replay 没写来源的模型事件按它算 */\n target: ModelOrigin\n /** trust=untrusted 的内容包 <untrusted source=…>(§14)。缺省 true;关掉是宿主自担风险 */\n trustMarkers?: boolean\n}\n\nexport const DEFERRED_NOTE =\n \"moved after that batch of tool results (tool results must immediately follow their call)\"\nexport const ESCAPED_NOTE = \"an early-closing </untrusted inside untrusted content was escaped\"\nexport const NOT_SENT_NOTE = \"operational event, not sent (the default projection already filters it)\"\n\nfunction originOf(replay: Record<string, unknown> | undefined, fallback: ModelOrigin): ModelOrigin {\n const r = (replay ?? {}) as Partial<ModelOrigin>\n return {\n provider: typeof r.provider === \"string\" ? r.provider : fallback.provider,\n api: typeof r.api === \"string\" ? r.api : fallback.api,\n model: typeof r.model === \"string\" ? r.model : fallback.model,\n }\n}\n\nexport function sameOrigin(a: ModelOrigin, b: ModelOrigin): boolean {\n return a.provider === b.provider && a.api === b.api && a.model === b.model\n}\n\n/**\n * 是否来自别家:只比 provider 与 api。响应里报告的模型 id 常与请求的不同(日期后缀、别名、网关改名),\n * 同家同协议下回放数据仍可用,不算有损。\n */\nexport function foreignOrigin(a: ModelOrigin, target: ModelOrigin): boolean {\n return a.provider !== target.provider || a.api !== target.api\n}\n\nexport function eventsToIr(input: IrInput): IrItem[] {\n const { target } = input\n const trustMarkers = input.trustMarkers !== false\n const items: IrItem[] = []\n let group: { origin: ModelOrigin; blocks: IrBlock[]; at: number } | null = null\n /** 已下发 tool_call、结果还没到的调用 id;非空即\"这批结果没到齐\" */\n const awaiting = new Set<string>()\n const deferred: IrItem[] = []\n\n const content = (e: Event, parts: readonly ContentPart[]): { parts: ContentPart[]; escaped: boolean } => {\n if (!trustMarkers || !needsUntrustedMark(e)) return { parts: [...parts], escaped: false }\n return markUntrusted(parts, untrustedSourceOf(e))\n }\n const text = (e: Event, s: string): { text: string; escaped: boolean } => {\n if (!trustMarkers || !needsUntrustedMark(e)) return { text: s, escaped: false }\n return markUntrustedText(s, untrustedSourceOf(e))\n }\n const release = () => {\n for (const d of deferred) items.push(d)\n deferred.length = 0\n }\n /** 说明 / 摘要 / 用户消息:结果没到齐就先攒着,item 上标 deferred */\n const place = (item: Extract<IrItem, { deferred: boolean }>) => {\n if (awaiting.size > 0) {\n deferred.push({ ...item, deferred: true })\n return\n }\n items.push(item)\n }\n const flush = () => {\n if (!group) return\n items.push({ kind: \"assistant\", origin: group.origin, blocks: group.blocks, at: group.at })\n for (const b of group.blocks) if (b.type === \"tool_call\") awaiting.add(b.id)\n group = null\n }\n /** 新的模型输出到来:这批调用的结果不会再来了(视图被切在结果之前),后移的一切放出 */\n const settle = () => {\n awaiting.clear()\n release()\n }\n const assistant = (e: Event, origin: ModelOrigin) => {\n if (group && !sameOrigin(group.origin, origin)) flush()\n if (!group) {\n settle()\n group = { origin, blocks: [], at: e.at }\n }\n return group\n }\n\n for (const raw of input.events) {\n const e = raw as CoreEvent\n switch (e.type) {\n case \"core.user_message\": {\n flush()\n const c = content(e, e.payload.content)\n place({ kind: \"user\", event: e, parts: c.parts, escaped: c.escaped, deferred: false })\n break\n }\n case \"core.model_thinking\": {\n assistant(e, originOf(e.replay, target)).blocks.push({\n type: \"thinking\",\n event: e,\n text: e.payload.text,\n replay: e.replay ?? {},\n })\n break\n }\n case \"core.model_text\": {\n assistant(e, originOf(e.replay, target)).blocks.push({\n type: \"text\",\n event: e,\n text: e.payload.text,\n replay: e.replay ?? {},\n })\n break\n }\n case \"core.tool_call\": {\n assistant(e, originOf(e.replay, target)).blocks.push({\n type: \"tool_call\",\n event: e,\n id: e.payload.toolCallId,\n name: e.payload.name,\n args: e.payload.args,\n replay: e.replay ?? {},\n })\n break\n }\n case \"core.tool_result\": {\n flush()\n const c = content(e, e.payload.content)\n items.push({\n kind: \"tool_result\",\n event: e,\n toolCallId: e.payload.toolCallId,\n name: e.payload.name,\n parts: c.parts,\n isError: e.payload.isError,\n escaped: c.escaped,\n ...(trustMarkers && needsUntrustedMark(e) ? { untrustedSource: untrustedSourceOf(e) } : {}),\n })\n awaiting.delete(e.payload.toolCallId)\n if (awaiting.size === 0) release()\n break\n }\n case \"core.system_note\": {\n flush()\n const t = text(e, e.payload.text)\n place({\n kind: \"system_note\",\n event: e,\n noteKind: e.payload.kind,\n text: t.text,\n escaped: t.escaped,\n deferred: false,\n })\n break\n }\n case \"core.compaction\": {\n flush()\n const t = text(e, e.payload.summary)\n place({ kind: \"compaction\", event: e, text: t.text, escaped: t.escaped, deferred: false })\n break\n }\n case \"core.approval_request\":\n case \"core.approval_decision\":\n case \"core.run_paused\":\n case \"core.run_resumed\":\n case \"core.budget_usage\":\n case \"core.memory_op\":\n case \"core.handoff\":\n case \"core.tools_bound\":\n case \"core.error\":\n // 不下发的事件也不打断 assistant 分组:模型看不见它,它就不该切开模型的一轮输出\n items.push({ kind: \"dropped\", event: e, note: NOT_SENT_NOTE })\n break\n default:\n items.push({ kind: \"dropped\", event: raw, note: `no general landing for ${raw.type}` })\n }\n }\n flush()\n settle()\n return items\n}\n\n/** 把 encoder 记下的落点按输入事件顺序排回去:LoweredRequest.landings 承诺\"每条输入事件一条记录,顺序与输入一致\" */\nexport function orderLandings(events: readonly Event[], landings: readonly LandingRecord[]): LandingRecord[] {\n const index = new Map<string, number>()\n for (const [i, e] of events.entries()) index.set(e.id, i)\n return [...landings].sort((a, b) => (index.get(a.eventId) ?? 0) - (index.get(b.eventId) ?? 0))\n}\n","/**\n * 脑子说明与摘要落成文本时的包装。文案与 @reinsjs/lowering-pi 保持一致(模型在两条降级路线上看到同样的框),\n * 但两包互不依赖,这里各留一份——它们不是\"同一个值两处比对\",只是同一段提示语。\n */\nimport type { SystemNotePayload } from \"@reinsjs/core\"\n\n/** 不支持中途 system 的模型:用标签框住走 user 角色,让模型知道这不是用户说的 */\nexport function framedSystemNote(kind: SystemNotePayload[\"kind\"], text: string): string {\n return `<system_note kind=\"${kind}\">\\n${text}\\n</system_note>`\n}\n\n/** compaction 摘要以 user 文本呈现时的前缀 */\nexport function framedSummary(summary: string): string {\n return `[Summary of earlier conversation]\\n${summary}`\n}\n","/**\n * 按模型声明能力(技术方案 §11)。脑子模块只看这些布尔值,不看模型名。\n */\nimport type { LoweringCapabilities } from \"@reinsjs/core\"\nimport type { FetchModel } from \"./models.js\"\n\n/**\n * S1 / F0 核实:Anthropic 带正文的中途 system 消息支持 Fable 5.x / Mythos 5.x / Opus 5 / Opus 4.8;Sonnet 5、Haiku 4.5 及更早\n * 回厂商原文 400。按 id 前缀匹配,带日期后缀的 id 也能命中;第三方 Anthropic 协议上游(如 DeepSeek 兼容端口)由宿主声明。\n */\nconst ANTHROPIC_MID_SYSTEM = /^claude-(fable-5|mythos-5|opus-5|opus-4-8)(-|$)/\n\n/** 服务端 task budget 仅 Opus 5 与 Fable 5.1(DECISIONS 2026-09-08) */\nconst ANTHROPIC_TASK_BUDGET = /^claude-(opus-5|fable-5-1)(-|$)/\n\nexport function capabilitiesOf(model: FetchModel): LoweringCapabilities {\n const base = {\n api: model.api,\n parallelTools: true,\n images: model.images ?? false,\n contextWindow: model.contextWindow,\n maxOutputTokens: model.maxOutputTokens,\n taskBudget: false,\n // 只有 Anthropic 线有 defer_loading / tool_reference 的原生落点(L1);其余线引用段展开成文本、deferLoading 的工具不发\n deferredTools: false,\n }\n switch (model.api) {\n case \"openai-chat\":\n return {\n ...base,\n // Chat 的 system 消息可出现在任意位置(OpenAI 官方与 DeepSeek 实测到达),宿主可对特殊上游关掉\n midConversationSystem: model.midConversationSystem ?? true,\n // 官方 Chat 没有 thinking 回放位;只有 DeepSeek 方言的 reasoning_content 能把思考原样回填\n thinkingReplay: model.reasoning && model.chat?.reasoningContent === true,\n }\n case \"anthropic-messages\":\n return {\n ...base,\n midConversationSystem: model.midConversationSystem ?? ANTHROPIC_MID_SYSTEM.test(model.id),\n // 带 signature 的 thinking 块可原样回放(F0 A7b 实测接受、伪造签名 400)\n thinkingReplay: model.reasoning,\n taskBudget: ANTHROPIC_TASK_BUDGET.test(model.id),\n // 官方模型 Haiku 4.5 起都支持(L1 spike 实测 Haiku 4.5 / Opus 5);第三方兼容上游由宿主声明\n deferredTools: model.anthropic?.deferredTools ?? model.provider === \"anthropic\",\n }\n case \"openai-responses\":\n return {\n ...base,\n // input 项里 developer / system 消息可出现在任意位置(F0 R3 实测中途 developer 到达),无归位需求\n midConversationSystem: model.midConversationSystem ?? true,\n // reasoning 项以 encrypted_content 原样回放(F0 R3 接受、伪造 400);关掉 encryptedReasoning 就没有可回放的东西\n thinkingReplay: model.reasoning && model.responses?.encryptedReasoning !== false,\n }\n default:\n return { ...base, midConversationSystem: model.midConversationSystem ?? false, thinkingReplay: false }\n }\n}\n","/**\n * Chat Completions 流 → 事件草稿。\n *\n * 只在流收尾时按拼好的块产出草稿(与 lowering-pi 同策略:日志里只存完整块),增量经 onDelta 给 UI。\n * 中断或出错时把已拼出的部分内容也交出去——日志要记录\"发生过什么\",是否继续由循环决定。\n *\n * chunk 形状(OpenAI 规范 + DeepSeek 已验证的 `delta.reasoning_content`):\n * choices[0].delta.{ content, reasoning_content, tool_calls[{ index, id?, function: { name?, arguments? } }] }\n * choices[0].finish_reason 在末块;usage 在带 stream_options.include_usage 的最后一个 chunk(choices 可能为空数组)\n * `data: [DONE]` 收尾。未知字段一律忽略(CF 网关会多个 \"p\",OpenAI 常带 system_fingerprint / obfuscation)。\n */\nimport type { CoreEventDraft, LoweringOutcome, LoweringStreamContext, TokenUsage } from \"@reinsjs/core\"\nimport type { ModelOrigin } from \"../ir.js\"\nimport type { SseMessage } from \"../sse.js\"\nimport { costOf, type ModelCost } from \"../usage.js\"\n\ninterface ChatChunk {\n model?: unknown\n choices?: {\n delta?: {\n content?: unknown\n reasoning_content?: unknown\n tool_calls?: { index?: unknown; id?: unknown; function?: { name?: unknown; arguments?: unknown } }[]\n }\n finish_reason?: unknown\n }[]\n usage?: ChatUsage | null\n}\n\ninterface ChatUsage {\n prompt_tokens?: unknown\n completion_tokens?: unknown\n prompt_tokens_details?: { cached_tokens?: unknown } | null\n /** DeepSeek 原生字段,与 prompt_tokens_details.cached_tokens 同值 */\n prompt_cache_hit_tokens?: unknown\n}\n\nexport interface ChatStreamInput {\n messages: AsyncIterable<SseMessage>\n origin: ModelOrigin\n cost?: ModelCost\n /** 宿主中止信号:读流被中止时据此判\"aborted\"还是本地超时 */\n signal?: AbortSignal\n timedOut?: () => boolean\n timeoutMs?: number\n}\n\n/** 拼装中的一轮输出 */\nclass ChatAssembly {\n reasoning = \"\"\n text = \"\"\n readonly calls = new Map<number, { id: string; name: string; args: string }>()\n finish: string | undefined\n usage: ChatUsage | undefined\n responseModel: string | undefined\n /** onDelta 用的块序号:按首次出现顺序分配 */\n private readonly blockIndex = new Map<string, number>()\n\n indexOf(key: string): number {\n let i = this.blockIndex.get(key)\n if (i === undefined) {\n i = this.blockIndex.size\n this.blockIndex.set(key, i)\n }\n return i\n }\n\n drafts(origin: ModelOrigin): CoreEventDraft[] {\n const out: CoreEventDraft[] = []\n const replay: Record<string, unknown> = { ...origin }\n if (this.reasoning.length > 0)\n out.push({ type: \"core.model_thinking\", actor: \"model\", payload: { text: this.reasoning }, replay })\n if (this.text.length > 0)\n out.push({ type: \"core.model_text\", actor: \"model\", payload: { text: this.text }, replay })\n for (const [, c] of [...this.calls.entries()].sort((a, b) => a[0] - b[0])) {\n out.push({\n type: \"core.tool_call\",\n actor: \"model\",\n payload: { toolCallId: c.id, name: c.name, args: parseArguments(c.args) },\n replay,\n })\n }\n return out\n }\n}\n\n/** 入参 JSON 解析不了就原样存字符串:工具校验会把错误告诉模型,写侧再原样送回(to-request.ts argumentsOf) */\nfunction parseArguments(raw: string): unknown {\n if (raw.trim() === \"\") return {}\n try {\n return JSON.parse(raw) as unknown\n } catch {\n return raw\n }\n}\n\nfunction num(v: unknown): number | undefined {\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined\n}\n\n/** OpenAI 的 prompt_tokens 含缓存命中部分;core 的 input 是未命中数,所以要减掉 */\nexport function usageOf(u: ChatUsage | undefined): TokenUsage {\n const prompt = num(u?.prompt_tokens) ?? 0\n const cached = num(u?.prompt_tokens_details?.cached_tokens) ?? num(u?.prompt_cache_hit_tokens) ?? 0\n const usage: TokenUsage = { input: Math.max(0, prompt - cached), output: num(u?.completion_tokens) ?? 0 }\n if (cached > 0) usage.cacheRead = cached\n return usage\n}\n\nfunction apply(chunk: ChatChunk, a: ChatAssembly, ctx: LoweringStreamContext) {\n if (typeof chunk.model === \"string\" && chunk.model !== \"\") a.responseModel = chunk.model\n if (chunk.usage && typeof chunk.usage === \"object\") a.usage = chunk.usage\n const choice = chunk.choices?.[0]\n if (!choice) return\n const d = choice.delta\n if (d) {\n if (typeof d.reasoning_content === \"string\" && d.reasoning_content !== \"\") {\n a.reasoning += d.reasoning_content\n ctx.onDelta?.({ kind: \"thinking\", index: a.indexOf(\"thinking\"), delta: d.reasoning_content })\n }\n if (typeof d.content === \"string\" && d.content !== \"\") {\n a.text += d.content\n ctx.onDelta?.({ kind: \"text\", index: a.indexOf(\"text\"), delta: d.content })\n }\n for (const tc of d.tool_calls ?? []) {\n const index = num(tc.index) ?? 0\n let call = a.calls.get(index)\n if (!call) {\n call = { id: \"\", name: \"\", args: \"\" }\n a.calls.set(index, call)\n }\n if (typeof tc.id === \"string\" && tc.id !== \"\") call.id = tc.id\n if (typeof tc.function?.name === \"string\" && tc.function.name !== \"\") call.name = tc.function.name\n if (typeof tc.function?.arguments === \"string\" && tc.function.arguments !== \"\") {\n call.args += tc.function.arguments\n ctx.onDelta?.({ kind: \"tool_args\", index: a.indexOf(`tool:${index}`), delta: tc.function.arguments })\n }\n }\n }\n if (typeof choice.finish_reason === \"string\") a.finish = choice.finish_reason\n}\n\n/**\n * 停止原因:有 tool_call 就是 toolUse(强制 tool_choice 时官方 finish_reason 是 stop,F0 实测);\n * content_filter / insufficient_system_resource(DeepSeek 服务端资源不足)/ aborted(服务端中止)都是\"没正常说完\",\n * 记 error 并把原因写进 errorMessage——core 只按文案判是否重试,资源不足那条写明 temporarily unavailable 让它值得再试。\n */\nfunction outcomeOf(a: ChatAssembly, cost: ModelCost | undefined, sawDone: boolean): LoweringOutcome {\n const usage = usageOf(a.usage)\n const out: LoweringOutcome = { stopReason: \"stop\", usage }\n const c = costOf(usage, cost)\n if (c !== undefined) out.costUsd = c\n if (a.responseModel) out.responseModel = a.responseModel\n\n if (a.calls.size > 0) out.stopReason = \"toolUse\"\n else {\n switch (a.finish) {\n case \"stop\":\n case \"tool_calls\":\n break\n case \"length\":\n out.stopReason = \"length\"\n break\n case \"content_filter\":\n out.stopReason = \"error\"\n out.errorMessage = \"finish_reason=content_filter: the provider's content filter cut this output short\"\n break\n case \"insufficient_system_resource\":\n out.stopReason = \"error\"\n out.errorMessage = \"finish_reason=insufficient_system_resource (service temporarily unavailable)\"\n break\n case \"aborted\":\n out.stopReason = \"error\"\n out.errorMessage = \"finish_reason=aborted: the server aborted this generation\"\n break\n case undefined:\n if (!sawDone || a.text.length === 0) {\n out.stopReason = \"error\"\n out.errorMessage = \"stream ended before finish_reason\"\n }\n break\n default:\n break\n }\n }\n return out\n}\n\nexport async function* consumeChatStream(\n input: ChatStreamInput,\n ctx: LoweringStreamContext = {},\n): AsyncGenerator<CoreEventDraft, LoweringOutcome> {\n const a = new ChatAssembly()\n let sawDone = false\n try {\n for await (const msg of input.messages) {\n if (msg.data === \"[DONE]\") {\n sawDone = true\n break\n }\n let chunk: ChatChunk\n try {\n chunk = JSON.parse(msg.data) as ChatChunk\n } catch {\n // 解析不了的一帧:跳过而不是整条流作废,末尾若因此缺 finish_reason 会记 error\n continue\n }\n apply(chunk, a, ctx)\n }\n } catch (err) {\n yield* a.drafts(input.origin)\n const base = outcomeOf(a, input.cost, false)\n if (input.signal?.aborted) return { ...base, stopReason: \"aborted\", errorMessage: \"aborted by host\" }\n if (input.timedOut?.())\n return {\n ...base,\n stopReason: \"error\",\n errorMessage: `request timed out after ${input.timeoutMs ?? \"?\"}ms (stream ended before finish_reason)`,\n }\n return { ...base, stopReason: \"error\", errorMessage: errorText(err) }\n }\n yield* a.drafts(input.origin)\n return outcomeOf(a, input.cost, sawDone)\n}\n\nfunction errorText(err: unknown): string {\n if (err instanceof Error) {\n const cause = (err as { cause?: { code?: unknown; message?: unknown } }).cause\n const code = typeof cause?.code === \"string\" ? ` (${cause.code})` : \"\"\n return `${err.message}${code}`\n }\n return String(err)\n}\n","/**\n * IR → OpenAI Chat Completions 请求体,并为每条事件记落点。\n *\n * 严格按 OpenAI 官方规范(Boss 定),方言只收 DeepSeek 已验证的 `reasoning_content`(见 models.ts ChatDialect)。\n * 角色只有 system / user / assistant / tool 四种,这是全包唯一出现\"角色\"的地方之一(宪法二)。\n *\n * Chat 线天然有损、矩阵里如实声明:\n * - thinking 没有回放位(无签名、无加密项)——除 DeepSeek 方言外 dropped;\n * - 没有显式缓存断点——什么都不做(厂商自动前缀缓存);\n * - assistant 的 content 是单个字符串(DeepSeek 只接受 string | null)——同一轮多段正文合并,lossy(merged-text);\n * - tool 消息没有错误位——isError 以文本前缀表达,lossy;\n * - tool 消息只收文本——模型收图时图片上浮到同批 tool 消息之后的一条 user 消息(lossy:换了位置与角色),\n * 不收图或方言关掉上浮时换成占位文本,lossy。\n */\nimport {\n type ContentPart,\n type Event,\n type LandingRecord,\n type LoweringCapabilities,\n markUntrusted,\n renderToolReference,\n type ToolSpec,\n} from \"@reinsjs/core\"\nimport {\n DEFERRED_NOTE,\n ESCAPED_NOTE,\n foreignOrigin,\n type IrBlock,\n type IrItem,\n orderLandings,\n} from \"../ir.js\"\nimport type { FetchModel } from \"../models.js\"\nimport { framedSummary, framedSystemNote } from \"../notes.js\"\n\nexport type ChatContentPart =\n | { type: \"text\"; text: string }\n | { type: \"image_url\"; image_url: { url: string } }\n\nexport interface ChatToolCall {\n id: string\n type: \"function\"\n function: { name: string; arguments: string }\n}\n\nexport type ChatMessage =\n | { role: \"system\"; content: string }\n | { role: \"user\"; content: string | ChatContentPart[] }\n | { role: \"assistant\"; content: string | null; tool_calls?: ChatToolCall[]; reasoning_content?: string }\n | { role: \"tool\"; tool_call_id: string; content: string }\n\nexport interface ChatTool {\n type: \"function\"\n function: { name: string; description: string; parameters: Record<string, unknown> }\n}\n\n/** 发出去的请求体本体。宿主的 requestOptions 先铺、我们的字段后盖:messages / tools / model / stream 不可被覆盖 */\nexport interface ChatRequestBody extends Record<string, unknown> {\n model: string\n messages: ChatMessage[]\n tools?: ChatTool[]\n stream: true\n stream_options: { include_usage: true }\n}\n\nexport interface ChatEncodeInput {\n ir: readonly IrItem[]\n events: readonly Event[]\n model: FetchModel\n capabilities: LoweringCapabilities\n tools?: readonly ToolSpec[]\n systemPrompt?: string\n requestOptions?: Record<string, unknown>\n}\n\nconst IMAGE_OMITTED = \"[image omitted: this model does not accept images]\"\nconst TOOL_IMAGE_OMITTED = \"[image omitted: tool messages carry text only]\"\nconst toolImagePointer = (n: number) => `[image ${n} attached in the next user message]`\nconst ERROR_PREFIX = \"[tool error]\\n\"\n\nfunction land(\n out: LandingRecord[],\n e: Event,\n kind: LandingRecord[\"kind\"],\n landing: string,\n ...notes: (string | undefined)[]\n) {\n const note = notes.filter((n): n is string => Boolean(n)).join(\"; \")\n out.push(\n note\n ? { eventId: e.id, type: e.type, kind, landing, note }\n : { eventId: e.id, type: e.type, kind, landing },\n )\n}\n\n/** 用户内容:只有一段文本就用字符串(最兼容),否则用 content parts;图片走 data: URL */\nfunction userContent(\n parts: readonly ContentPart[],\n images: boolean,\n): { content: string | ChatContentPart[]; imagesDropped: boolean } {\n let imagesDropped = false\n const out: ChatContentPart[] = parts.map((p) => {\n if (p.type === \"text\") return { type: \"text\", text: p.text }\n if (p.type === \"tool_reference\") return { type: \"text\", text: renderToolReference(p) }\n if (!images) {\n imagesDropped = true\n return { type: \"text\", text: IMAGE_OMITTED }\n }\n return { type: \"image_url\", image_url: { url: `data:${p.mime};base64,${p.data}` } }\n })\n if (out.length === 1 && out[0]?.type === \"text\") return { content: out[0].text, imagesDropped }\n return { content: out, imagesDropped }\n}\n\n/**\n * tool 消息只收文本:文本段以换行拼接。图片两种处置——`lift` 时原位留指路文字、图片本体收进 `images` 交给上浮,\n * 否则换占位。\n */\nfunction toolContent(\n parts: readonly ContentPart[],\n lift: boolean,\n): { text: string; imagesDropped: boolean; images: Extract<ContentPart, { type: \"image\" }>[] } {\n let imagesDropped = false\n const images: Extract<ContentPart, { type: \"image\" }>[] = []\n const text = parts\n .map((p) => {\n if (p.type === \"text\") return p.text\n if (p.type === \"tool_reference\") return renderToolReference(p)\n if (lift) {\n images.push(p)\n return toolImagePointer(images.length)\n }\n imagesDropped = true\n return TOOL_IMAGE_OMITTED\n })\n .join(\"\\n\")\n return { text, imagesDropped, images }\n}\n\n/**\n * 一条工具结果上浮出去的附件:先一行我们自己的说明(来自哪次调用、几张、是工具输出不是用户发言),\n * 再逐张 `image n:` + 图片。来源结果是 untrusted 的,图片段用 core 同一份 `markUntrusted` 包起来(说明行在标记外:\n * 那是降级层的话,不是工具的话);system 信任的结果不包。纯函数:同一条结果每轮译出逐字节一致(缓存前缀稳定)。\n */\nfunction liftedAttachment(\n item: Extract<IrItem, { kind: \"tool_result\" }>,\n images: readonly Extract<ContentPart, { type: \"image\" }>[],\n): ContentPart[] {\n const header: ContentPart = {\n type: \"text\",\n text: `[Attachments from tool result ${item.name} (call ${item.toolCallId}): ${images.length} image(s). This is tool output, not a message from the user.]`,\n }\n const body: ContentPart[] = images.flatMap((img, i) => [{ type: \"text\", text: `image ${i + 1}:` }, img])\n return [header, ...(item.untrustedSource ? markUntrusted(body, item.untrustedSource).parts : body)]\n}\n\n/** tool_call 入参回到线上是 JSON 字符串;读侧解析失败时存的是原始字符串,写侧原样送回 */\nfunction argumentsOf(args: unknown): string {\n return typeof args === \"string\" ? args : JSON.stringify(args ?? {})\n}\n\nexport function encodeChatRequest(input: ChatEncodeInput): {\n body: ChatRequestBody\n landings: LandingRecord[]\n} {\n const { model, capabilities } = input\n const target = { provider: model.provider, api: model.api, model: model.id }\n const reasoningContent = model.chat?.reasoningContent === true\n const liftImages = capabilities.images && model.chat?.liftToolImages !== false\n const messages: ChatMessage[] = []\n const landings: LandingRecord[] = []\n /**\n * 本批 tool 消息上浮的图片,遇到第一个**会下发的**非 tool_result 条目(或收尾)时作为一条 user 消息放出。\n * IR 把被后移的用户消息 / 说明排在整批之后,所以附件落在\"全部 tool 消息之后、后移内容之前\";\n * 但不下发的事件(运维事件、ext.* 留痕)不经后移、原位夹在同批结果之间,它们不能触发放出——\n * 否则附件插进两条 tool 消息之间,破坏 tool_calls → tool 配对(发前审查抓到)。\n */\n let lifted: ContentPart[] = []\n const releaseLifted = () => {\n if (lifted.length === 0) return\n messages.push({ role: \"user\", content: userContent(lifted, true).content })\n lifted = []\n }\n\n if (input.systemPrompt) messages.push({ role: \"system\", content: input.systemPrompt })\n\n for (const item of input.ir) {\n if (item.kind !== \"tool_result\" && item.kind !== \"dropped\") releaseLifted()\n switch (item.kind) {\n case \"user\": {\n const c = userContent(item.parts, capabilities.images)\n messages.push({ role: \"user\", content: c.content })\n const lossy = item.deferred || item.escaped || c.imagesDropped\n land(\n landings,\n item.event,\n lossy ? \"lossy\" : \"exact\",\n \"user\",\n item.deferred\n ? `the user message sits between a tool call and its results; ${DEFERRED_NOTE}`\n : undefined,\n item.escaped ? ESCAPED_NOTE : undefined,\n c.imagesDropped\n ? \"the model takes no images, so they are replaced with placeholder text\"\n : undefined,\n )\n break\n }\n case \"assistant\": {\n messages.push(assistantMessage(item.blocks, item.origin, target, reasoningContent, landings))\n break\n }\n case \"tool_result\": {\n const c = toolContent(item.parts, liftImages)\n messages.push({\n role: \"tool\",\n tool_call_id: item.toolCallId,\n content: item.isError ? ERROR_PREFIX + c.text : c.text,\n })\n const imagesLifted = c.images.length > 0\n if (imagesLifted) lifted.push(...liftedAttachment(item, c.images))\n const lossy = item.escaped || item.isError || c.imagesDropped || imagesLifted\n land(\n landings,\n item.event,\n lossy ? \"lossy\" : \"exact\",\n c.imagesDropped ? \"tool-text-only\" : imagesLifted ? \"tool+lifted-images\" : \"tool\",\n item.isError\n ? \"a Chat tool message has no error flag, so isError is expressed with a [tool error] prefix\"\n : undefined,\n c.imagesDropped\n ? \"a tool message takes text only, so images are replaced with placeholder text\"\n : undefined,\n imagesLifted\n ? \"a tool message takes text only, so its images move into a user message after this batch of tool messages, labelled as tool output\"\n : undefined,\n item.escaped ? ESCAPED_NOTE : undefined,\n )\n break\n }\n case \"system_note\": {\n if (capabilities.midConversationSystem) {\n messages.push({ role: \"system\", content: item.text })\n land(\n landings,\n item.event,\n item.escaped ? \"lossy\" : \"exact\",\n \"system\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n } else {\n messages.push({ role: \"user\", content: framedSystemNote(item.noteKind, item.text) })\n land(\n landings,\n item.event,\n \"lossy\",\n \"user-role\",\n \"the upstream does not accept mid-conversation system, so it is wrapped in a <system_note> tag and sent with the user role\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n }\n break\n }\n case \"compaction\": {\n messages.push({ role: \"user\", content: framedSummary(item.text) })\n land(\n landings,\n item.event,\n \"lossy\",\n \"user-text\",\n \"the summary is rendered as user-role text\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n break\n }\n case \"dropped\":\n land(landings, item.event, \"dropped\", \"none\", item.note)\n break\n }\n }\n releaseLifted()\n\n // 宿主选项里的 tools 不透传:工具表只由 input.tools 决定,没有时也不能让宿主塞一份进来\n const { tools: _tools, ...passthrough } = input.requestOptions ?? {}\n // Chat 没有\"声明但不载入\"的落点:deferLoading 的工具不发(模型看不见也调不了,与过滤同义;L1)\n const shownTools = (input.tools ?? []).filter((t) => t.deferLoading !== true)\n const body: ChatRequestBody = {\n ...passthrough,\n model: model.id,\n messages,\n ...(shownTools.length > 0\n ? {\n tools: shownTools.map(\n (t): ChatTool => ({\n type: \"function\",\n function: { name: t.name, description: t.description, parameters: t.inputSchema },\n }),\n ),\n }\n : {}),\n stream: true,\n stream_options: { include_usage: true },\n }\n return { body, landings: orderLandings(input.events, landings) }\n}\n\n/**\n * 一轮模型输出 → 一条 assistant 消息。\n * - 正文:Chat 的 assistant.content 是单个字符串,多段以空行合并,每段记 lossy(merged-text);\n * - thinking:开了 reasoning_content 方言且来源同家 → 回填(多段以换行拼接),否则 dropped;\n * 方言开着时**字段必须在**(DeepSeek 带 tools 的请求缺它 400),没有可回填的就给空串;\n * - tool_call:`arguments` 是 JSON 字符串。\n */\nfunction assistantMessage(\n blocks: readonly IrBlock[],\n origin: { provider: string; api: string; model: string },\n target: { provider: string; api: string; model: string },\n reasoningContent: boolean,\n landings: LandingRecord[],\n): ChatMessage {\n const texts = blocks.filter((b): b is Extract<IrBlock, { type: \"text\" }> => b.type === \"text\")\n const thinkings = blocks.filter((b): b is Extract<IrBlock, { type: \"thinking\" }> => b.type === \"thinking\")\n const calls = blocks.filter((b): b is Extract<IrBlock, { type: \"tool_call\" }> => b.type === \"tool_call\")\n const foreign = foreignOrigin(origin, target)\n\n for (const t of texts) {\n if (texts.length > 1)\n land(\n landings,\n t.event,\n \"lossy\",\n \"merged-text\",\n \"multiple text segments of one turn are merged into a single string\",\n )\n else land(landings, t.event, \"exact\", \"assistant-content\")\n }\n const replayable = reasoningContent && !foreign\n for (const t of thinkings) {\n if (replayable) land(landings, t.event, \"exact\", \"reasoning_content\")\n else if (reasoningContent)\n land(\n landings,\n t.event,\n \"dropped\",\n \"none\",\n `thinking from ${origin.provider}/${origin.api} is not filled back in for a model of another family`,\n )\n else\n land(\n landings,\n t.event,\n \"dropped\",\n \"none\",\n \"Chat Completions has no landing for replaying thinking (no signature, no encrypted item)\",\n )\n }\n for (const c of calls) land(landings, c.event, \"exact\", \"tool_calls\")\n\n const msg: ChatMessage = {\n role: \"assistant\",\n content: texts.length > 0 ? texts.map((t) => t.text).join(\"\\n\\n\") : null,\n }\n if (calls.length > 0) {\n msg.tool_calls = calls.map((c) => ({\n id: c.id,\n type: \"function\",\n function: { name: c.name, arguments: argumentsOf(c.args) },\n }))\n }\n if (reasoningContent) msg.reasoning_content = replayable ? thinkings.map((t) => t.text).join(\"\\n\") : \"\"\n return msg\n}\n","/**\n * FetchLowering:@reinsjs/core 的 Lowering 接口只用 fetch 的实现(零依赖、零 node:*)。\n *\n * 与 lowering-pi 的分工见 DECISIONS 2026-09-14「lowering-fetch 立项」:两包并存,宿主 import 谁用谁。\n * 这里 `LoweredRequest.payload.body` 就是真正发出去的请求体——没有第二跳改写,排查 400 直接看它。\n */\nimport {\n type CoreEventDraft,\n type LoweredRequest,\n type Lowering,\n type LoweringCapabilities,\n LoweringError,\n type LoweringOutcome,\n type LoweringStreamContext,\n type ModelRef,\n type ToRequestInput,\n} from \"@reinsjs/core\"\nimport { consumeAnthropicStream } from \"./anthropic/from-stream.js\"\nimport { encodeAnthropicRequest } from \"./anthropic/to-request.js\"\nimport { capabilitiesOf } from \"./capabilities.js\"\nimport { consumeChatStream } from \"./chat/from-stream.js\"\nimport { encodeChatRequest } from \"./chat/to-request.js\"\nimport { DEFAULT_TIMEOUT_MS, postJson, requestSignals } from \"./http.js\"\nimport { eventsToIr } from \"./ir.js\"\nimport { endpointOf, type FetchApi, type FetchModel, resolveModel } from \"./models.js\"\nimport { consumeResponsesStream } from \"./responses/from-stream.js\"\nimport { encodeResponsesRequest } from \"./responses/to-request.js\"\nimport { parseSse } from \"./sse.js\"\n\n/** Anthropic Messages 的协议版本头,当前唯一稳定值 */\nexport const ANTHROPIC_VERSION = \"2023-06-01\"\n\nexport interface FetchLoweringOptions {\n /** 按 provider 取 key;返回 undefined 视为未配置。本包不读环境变量,由宿主决定来源 */\n apiKey: (provider: string) => string | undefined\n /** 自定义 fetch(测试注入、代理、Workers 绑定);缺省 globalThis.fetch */\n fetch?: typeof globalThis.fetch\n /** 附加请求头,所有请求都带;模型级 headers 优先 */\n headers?: Record<string, string>\n /** 内置表之外的模型,或覆盖表内同名模型 */\n models?: readonly FetchModel[]\n /**\n * 铺进请求体的额外字段(max_tokens、temperature、DeepSeek 的 thinking / reasoning_effort、OpenAI 的\n * parallel_tool_calls …),键名以厂商文档为准。按模型返回,便于分族配置。messages / tools / model / stream 不可覆盖。\n */\n requestOptions?: (model: ModelRef) => Record<string, unknown>\n /** 整条请求(含读完流)的时限,缺省 600 000 ms;到点判 error(可重试),宿主 signal 中止判 aborted */\n timeoutMs?: number\n /**\n * trust 标注(技术方案 §14):trust=untrusted 的事件翻译时包上 `<untrusted source=\"tool:<name>\">…</untrusted>`,\n * 事件本身不动。缺省 true;传 false 关掉是宿主自担提示注入风险\n */\n trustMarkers?: boolean\n}\n\n/** 对外暴露的请求体:就是要 POST 的 JSON,鉴权头与 URL 在 stream 时才拼(不进 payload,日志里不落凭证) */\nexport interface FetchLoweredPayload {\n api: FetchApi\n body: Record<string, unknown>\n}\n\nexport class FetchLowering implements Lowering<FetchLoweredPayload> {\n private readonly extraModels: readonly FetchModel[]\n private readonly timeoutMs: number\n\n constructor(private readonly opts: FetchLoweringOptions) {\n this.extraModels = opts.models ?? []\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS\n }\n\n capabilities(ref: ModelRef): LoweringCapabilities {\n return capabilitiesOf(resolveModel(ref, this.extraModels))\n }\n\n toRequest(input: ToRequestInput): LoweredRequest<FetchLoweredPayload> {\n const model = resolveModel(input.model, this.extraModels)\n const capabilities = capabilitiesOf(model)\n const ir = eventsToIr({\n events: input.events,\n target: { provider: model.provider, api: model.api, model: model.id },\n ...(this.opts.trustMarkers !== undefined ? { trustMarkers: this.opts.trustMarkers } : {}),\n })\n const requestOptions = this.opts.requestOptions?.(input.model)\n const encodeInput = {\n ir,\n events: input.events,\n model,\n capabilities,\n ...(input.tools ? { tools: input.tools } : {}),\n ...(input.systemPrompt !== undefined ? { systemPrompt: input.systemPrompt } : {}),\n ...(requestOptions ? { requestOptions } : {}),\n }\n switch (model.api) {\n case \"openai-chat\": {\n const { body, landings } = encodeChatRequest(encodeInput)\n return { model: input.model, capabilities, landings, payload: { api: model.api, body } }\n }\n case \"anthropic-messages\": {\n const { body, landings } = encodeAnthropicRequest(encodeInput)\n return { model: input.model, capabilities, landings, payload: { api: model.api, body } }\n }\n case \"openai-responses\": {\n const { body, landings } = encodeResponsesRequest(encodeInput)\n return { model: input.model, capabilities, landings, payload: { api: model.api, body } }\n }\n default:\n throw new LoweringError(\"unsupported_api\", `unsupported wire protocol ${model.api}`, {\n api: model.api,\n })\n }\n }\n\n async *stream(\n req: LoweredRequest<FetchLoweredPayload>,\n ctx: LoweringStreamContext = {},\n ): AsyncGenerator<CoreEventDraft, LoweringOutcome> {\n const model = resolveModel(req.model, this.extraModels)\n const headers = this.headersFor(model)\n const signals = requestSignals(ctx.signal, this.timeoutMs)\n const res = await postJson({\n url: endpointOf(model),\n headers,\n body: req.payload.body,\n signal: signals.signal,\n ...(this.opts.fetch ? { fetch: this.opts.fetch } : {}),\n })\n if (!res.body) {\n return {\n stopReason: \"error\",\n usage: { input: 0, output: 0 },\n errorMessage: \"the response has no body\",\n }\n }\n const streamInput = {\n messages: parseSse(res.body),\n origin: { provider: model.provider, api: model.api, model: model.id },\n ...(model.cost ? { cost: model.cost } : {}),\n ...(ctx.signal ? { signal: ctx.signal } : {}),\n timedOut: signals.timedOut,\n timeoutMs: this.timeoutMs,\n }\n switch (req.payload.api) {\n case \"openai-chat\":\n return yield* consumeChatStream(streamInput, ctx)\n case \"anthropic-messages\":\n return yield* consumeAnthropicStream(streamInput, ctx)\n case \"openai-responses\":\n return yield* consumeResponsesStream(streamInput, ctx)\n default:\n throw new LoweringError(\"unsupported_api\", `unsupported wire protocol ${req.payload.api}`, {\n api: req.payload.api,\n })\n }\n }\n\n /**\n * 鉴权头按协议缺省(Chat / Responses bearer、Anthropic x-api-key),模型声明 auth:\"none\" 时凭证由 headers 自带。\n * Anthropic 线固定带 `anthropic-version`,`anthropic-beta` 只在模型声明了 betas 时带(F0 结论:用到才带);模型级 headers 最后盖。\n */\n private headersFor(model: FetchModel): Record<string, string> {\n const protocol: Record<string, string> = {}\n if (model.api === \"anthropic-messages\") {\n protocol[\"anthropic-version\"] = ANTHROPIC_VERSION\n const betas = model.anthropic?.betas\n if (betas && betas.length > 0) protocol[\"anthropic-beta\"] = betas.join(\",\")\n }\n const headers: Record<string, string> = { ...this.opts.headers, ...protocol, ...model.headers }\n const auth = model.auth ?? (model.api === \"anthropic-messages\" ? \"x-api-key\" : \"bearer\")\n if (auth === \"none\") return headers\n const apiKey = this.opts.apiKey(model.provider)\n if (!apiKey) {\n throw new LoweringError(\"missing_api_key\", `no API key configured for ${model.provider}`, {\n provider: model.provider,\n })\n }\n if (auth === \"bearer\") headers.authorization = `Bearer ${apiKey}`\n else headers[\"x-api-key\"] = apiKey\n return headers\n }\n}\n","/**\n * 三线共用的 fetch 封装:超时、宿主中止、非 2xx 转成带状态码的错误。\n *\n * 错误文案刻意用 \"<status> <body>\" 格式(与两家官方 SDK 同款):core 的瞬断判据(retry.ts)先看错误对象上的\n * `status` / `headers`,再看文案开头的三位数字,所以这里抛出的错误不用任何额外约定就能被正确判成\n * \"429 / 5xx 重试、400 不重试\"。`headers` 保留原样,`x-should-retry` 由 core 自己读。\n *\n * 不读环境变量、不碰 node:*,Workers / Deno / 浏览器同一份代码。\n */\n\nexport class HttpError extends Error {\n override readonly name = \"HttpError\"\n constructor(\n readonly status: number,\n readonly headers: Headers,\n /** 响应正文原文(厂商错误体或网关信封,不假定形状) */\n readonly body: string,\n readonly url: string,\n ) {\n super(`${status} ${body}`)\n }\n}\n\n/** 一次请求的时限(整条响应,含流式读完),与两家 SDK 缺省一致 */\nexport const DEFAULT_TIMEOUT_MS = 600_000\n\nexport interface RequestSignals {\n /** 交给 fetch 与流读取的组合信号 */\n signal: AbortSignal\n /** 中止后判定是哪一方:宿主中止(ctx.signal)还是本地超时 */\n timedOut: () => boolean\n}\n\n/**\n * 把宿主的 signal 与本地超时合成一个信号。超时到点后 `timedOut()` 为真;宿主中止优先(两者都发生时算宿主中止,\n * 因为宿主中止是有意为之、不该被当成瞬断重试)。\n */\nexport function requestSignals(hostSignal: AbortSignal | undefined, timeoutMs: number): RequestSignals {\n const timeout = AbortSignal.timeout(timeoutMs)\n const signal = hostSignal ? AbortSignal.any([hostSignal, timeout]) : timeout\n return { signal, timedOut: () => timeout.aborted && !hostSignal?.aborted }\n}\n\nexport interface PostJsonInput {\n url: string\n headers: Record<string, string>\n body: unknown\n signal: AbortSignal\n fetch?: typeof globalThis.fetch\n}\n\n/**\n * POST JSON;非 2xx 读完正文抛 HttpError。网络层失败(DNS、连接被掐、超时)由 fetch 自己抛出,原样上抛——\n * 那些错误对象上的 `cause.code` / `name` 正是 core 判瞬断要看的东西,包一层反而会盖掉。\n */\nexport async function postJson(input: PostJsonInput): Promise<Response> {\n const doFetch = input.fetch ?? globalThis.fetch\n const res = await doFetch(input.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", accept: \"text/event-stream\", ...input.headers },\n body: JSON.stringify(input.body),\n signal: input.signal,\n })\n if (!res.ok) {\n const text = await res.text().catch(() => \"\")\n throw new HttpError(res.status, res.headers, text, input.url)\n }\n return res\n}\n","/**\n * 模型表与解析。只放一张**最小表**(上下文窗口、能力位、价目),`ModelRef` 找不到就抛;宿主用 `models` 选项\n * 声明表外模型或覆盖表内字段(DECISIONS 2026-09-14 立项:表过期不阻塞使用)。\n *\n * 表里的数字来自厂商公开文档(2026-09-14 查阅);价目是每百万 token 美元,DeepSeek 有峰谷价、存的是峰值价。\n */\nimport { LoweringError, type ModelRef } from \"@reinsjs/core\"\nimport type { ModelCost } from \"./usage.js\"\n\n/** 本包实现的三条线协议(F1 Chat Completions、F2 Anthropic Messages、F3 OpenAI Responses) */\nexport type FetchApi = \"openai-chat\" | \"anthropic-messages\" | \"openai-responses\"\n\n/** 当前已实现、可发请求的协议;toRequest / stream 遇到别的就抛 unsupported_api */\nexport const SUPPORTED_APIS: ReadonlySet<string> = new Set<FetchApi>([\n \"openai-chat\",\n \"anthropic-messages\",\n \"openai-responses\",\n])\n\n/** 一个模型在本降级层眼里的全部描述。字段与 LoweringCapabilities 对齐,方言开关单独成组 */\nexport interface FetchModel {\n provider: string\n id: string\n api: FetchApi\n /** 协议根地址:Chat 在其后接 /chat/completions(OpenAI 给到 …/v1,DeepSeek 给到域名即可) */\n baseUrl: string\n contextWindow: number\n maxOutputTokens: number\n /** 模型会产出 thinking / reasoning */\n reasoning: boolean\n images?: boolean\n cost?: ModelCost\n /** 额外请求头(私有网关鉴权等),与降级层级别的 headers 合并、以模型级为准 */\n headers?: Record<string, string>\n name?: string\n /**\n * 是否接受会话中途的 `role:\"system\"` 消息(system_note 的 exact 落点)。缺省按协议定:Chat 为 true\n * (OpenAI 官方经 CF 网关、DeepSeek 直连 2026-09-14 均实测到达)。\n */\n midConversationSystem?: boolean\n /**\n * 凭证怎么带。缺省按协议:Chat / Responses 用 `Authorization: Bearer`,Anthropic 用 `x-api-key`。\n * \"none\" 表示凭证在 headers 里(如 Cloudflare AI Gateway 的 cf-aig-authorization),不再向 apiKey 回调要 key。\n */\n auth?: \"bearer\" | \"x-api-key\" | \"none\"\n /** Chat Completions 方言,只收已验证的扩展(Boss 定:严格按 OpenAI 规范,方言等真有人用再加) */\n chat?: ChatDialect\n /** Anthropic Messages 线的请求整形选项(beta 头、缓存断点处置) */\n anthropic?: AnthropicDialect\n /** OpenAI Responses 线的请求整形选项(说明角色、加密推理项) */\n responses?: ResponsesDialect\n}\n\nexport interface ResponsesDialect {\n /**\n * 系统提示与 system_note 用哪个角色。缺省:推理模型 developer、其它 system(与 lowering-pi 同一选择,矩阵同格)。\n * 第三方 Responses 兼容上游不认 developer 时改 \"system\"。\n */\n systemRole?: \"developer\" | \"system\"\n /**\n * 推理模型是否带 `include: [\"reasoning.encrypted_content\"]`(缺省 true)。`store: false` 下 OpenAI 不保存推理状态,\n * 只有加密项能把上一轮推理带回下一轮(F0 R3 实测回放接受、伪造 400);不带则 reasoning 项无法回放、一律 dropped。\n * 第三方兼容上游不认 include 参数时可关。\n */\n encryptedReasoning?: boolean\n}\n\nexport interface ChatDialect {\n /**\n * DeepSeek 的 `reasoning_content`(2026-09-14 直连实测):响应里思考正文与 `content` 平级;带 `tools` 的请求里\n * **每条** assistant 消息都必须回传该字段(缺了 400,空串可过),不带 tools 时忽略。开了:读侧 → core.model_thinking,\n * 写侧把自家 thinking 回填、没有就回空串。关着(OpenAI 官方):thinking 无处可放,矩阵记 dropped。\n */\n reasoningContent?: boolean\n /**\n * 工具结果里的图片上浮(2026-10-27,OnSet 需求):`role:\"tool\"` 消息只收文本,模型声明收图(`images: true`)时,\n * 同一 assistant 轮全部 tool 消息之后补一条 `role:\"user\"` 消息放这些图片,tool 消息原位留指路文字。缺省 true;\n * 上游不接受\"tool 之后紧跟带图 user\"时关掉,退回占位文本。DeepSeek 官方 2026-10-27 实测接受(spikes/chat-tool-images)。\n */\n liftToolImages?: boolean\n}\n\n/**\n * 感知说明殿后(messages 末条是 system)时,\"最后一条 user 末块\"的断点没处打,B1 实测三种处置(spikes/b1-perception-cache):\n * - \"automatic\"(缺省):改在请求顶层放 `cache_control`(Anthropic 自动缓存:断点落在最后一个可缓存块上),命中率与不注入持平;\n * - \"previous-user\":仍打在最后一条 user 的末块上,实测低 3~6 个点(后续请求对不上前一次写入的前缀);\n * - \"drop\":不打。只在上游自己会补自动缓存(如 DeepSeek 的兼容端口)时不吃亏。\n * 把断点留在 system 消息上实测几乎零命中,不提供。\n */\nexport type MidSystemCacheBreakpoint = \"automatic\" | \"previous-user\" | \"drop\"\n\nexport interface AnthropicDialect {\n /**\n * `anthropic-beta` 头的取值,用到才带(F0 结论:中途 system 不需要 beta;某些 beta 会抬高 reasoning_extraction\n * 拒答率)。模型级 `headers[\"anthropic-beta\"]` 若也给了,以 headers 为准。\n */\n betas?: readonly string[]\n /** 是否打缓存断点(system 末块、tools 末项、最后一条 user 末块)。缺省 true;上游不认断点时可关 */\n cacheBreakpoints?: boolean\n /** 断点存活期,缺省 5 分钟(不发 ttl 字段);\"1h\" 走 `{ type: \"ephemeral\", ttl: \"1h\" }` */\n cacheTtl?: \"5m\" | \"1h\"\n /** 说明殿后时的断点处置,缺省 \"automatic\" */\n midSystemCacheBreakpoint?: MidSystemCacheBreakpoint\n /**\n * 是否走 `defer_loading` + `tool_reference` 的原生延迟加载(L1,2026-09-15 经 CF 网关实测 Haiku 4.5 / Opus 5 均支持、GA 无 beta 头)。\n * 缺省:provider 为 \"anthropic\" 时开,第三方 Anthropic 协议上游(DeepSeek 兼容端口等)关——它们对这两个字段的态度各异,\n * 宿主实测接受后再显式打开。关着时 deferLoading 的工具不发、引用段展开成文本\n */\n deferredTools?: boolean\n}\n\nconst DEEPSEEK_BASE = \"https://api.deepseek.com\"\nconst ANTHROPIC_BASE = \"https://api.anthropic.com/v1\"\n\n/** Anthropic 官方价目(美元 / 百万 token,2026-09-15 查阅);缓存写按 1.25 倍、缓存读按 0.1 倍算(Fable 5.1 读价另有公布值) */\nconst anthropicModel = (id: string, cost: ModelCost, extra: Partial<FetchModel> = {}): FetchModel => ({\n provider: \"anthropic\",\n id,\n api: \"anthropic-messages\",\n baseUrl: ANTHROPIC_BASE,\n contextWindow: 1_000_000,\n maxOutputTokens: 128_000,\n reasoning: true,\n images: true,\n cost,\n ...extra,\n})\nconst HAIKU_4_5 = anthropicModel(\n \"claude-haiku-4-5\",\n { input: 1, output: 5, cacheRead: 0.1, cacheWrite: 1.25 },\n { contextWindow: 200_000, maxOutputTokens: 64_000 },\n)\nconst OPENAI_BASE = \"https://api.openai.com/v1\"\n\n/** DeepSeek 峰值价(美元 / 百万 token);谷时减半,算出的成本是上限 */\nconst DEEPSEEK_FLASH: FetchModel = {\n provider: \"deepseek\",\n id: \"deepseek-flash\",\n api: \"openai-chat\",\n baseUrl: DEEPSEEK_BASE,\n contextWindow: 1_000_000,\n maxOutputTokens: 384_000,\n reasoning: true,\n images: true,\n cost: { input: 0.3, output: 1.2, cacheRead: 0.006, cacheWrite: 0 },\n chat: { reasoningContent: true },\n}\n\n/** OpenAI Responses 线的型号(价目 2026-09-15 查阅;gpt-5.4 / 5.5 超过 272k 输入有加价档,这里存基础价、成本是下限) */\nconst responsesModel = (\n id: string,\n cost: ModelCost,\n extra: Partial<FetchModel> & { reasoning: boolean; contextWindow: number; maxOutputTokens: number },\n): FetchModel => ({\n provider: \"openai\",\n id,\n api: \"openai-responses\",\n baseUrl: OPENAI_BASE,\n images: true,\n cost,\n ...extra,\n})\nconst GPT5 = { reasoning: true, contextWindow: 400_000, maxOutputTokens: 128_000 }\nconst GPT5_LARGE = { reasoning: true, contextWindow: 272_000, maxOutputTokens: 128_000 }\nconst O_SERIES = { reasoning: true, contextWindow: 200_000, maxOutputTokens: 100_000 }\n\n/**\n * 内置最小表。同一 provider + id 可能两条协议各一份(OpenAI 的 gpt-4o-mini 等既能走 Chat 也能走 Responses):\n * `findBuiltin` 带 api 时精确取(工厂函数总是带),不带时取先列的一份——OpenAI 官方 id 的 Responses 条目列在前,所以\n * `resolveModel({ provider: \"openai\", id })` 缺省走 OpenAI 的主协议 Responses(F3 起;F1 时只有 Chat 条目),要走 Chat 用\n * `openaiChat()` 或在 `models` 里自己声明。Anthropic 列当前一代 + 常用上一代。\n */\nexport const BUILTIN_MODELS: readonly FetchModel[] = [\n anthropicModel(\"claude-fable-5-1\", { input: 10, output: 50, cacheRead: 0.25, cacheWrite: 12.5 }),\n anthropicModel(\"claude-opus-5\", { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 }),\n anthropicModel(\"claude-opus-4-8\", { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 }),\n anthropicModel(\"claude-sonnet-5\", { input: 2, output: 10, cacheRead: 0.2, cacheWrite: 2.5 }),\n HAIKU_4_5,\n // 带日期后缀的正式 id 与短名同一份定义\n { ...HAIKU_4_5, id: \"claude-haiku-4-5-20251001\" },\n DEEPSEEK_FLASH,\n // 别名:模型列表里只有 deepseek-flash,请求带 deepseek-v4-flash 照样接受、响应报 deepseek-flash\n { ...DEEPSEEK_FLASH, id: \"deepseek-v4-flash\" },\n {\n provider: \"deepseek\",\n id: \"deepseek-v4-pro\",\n api: \"openai-chat\",\n baseUrl: DEEPSEEK_BASE,\n contextWindow: 1_000_000,\n maxOutputTokens: 384_000,\n reasoning: true,\n images: true,\n cost: { input: 1.32, output: 3.96, cacheRead: 0.044, cacheWrite: 0 },\n chat: { reasoningContent: true },\n },\n // ---- OpenAI Responses 线:OpenAI 官方的主协议,同 id 无协议解析时先取它;Chat 条目在后面\n responsesModel(\"gpt-5.5\", { input: 5, output: 30, cacheRead: 0.5, cacheWrite: 0 }, GPT5_LARGE),\n responsesModel(\"gpt-5.4\", { input: 2.5, output: 15, cacheRead: 0.25, cacheWrite: 0 }, GPT5_LARGE),\n responsesModel(\"gpt-5.4-mini\", { input: 0.75, output: 4.5, cacheRead: 0.075, cacheWrite: 0 }, GPT5),\n responsesModel(\"gpt-5.2\", { input: 1.75, output: 14, cacheRead: 0.175, cacheWrite: 0 }, GPT5),\n responsesModel(\"gpt-5.1\", { input: 1.25, output: 10, cacheRead: 0.125, cacheWrite: 0 }, GPT5),\n responsesModel(\"gpt-5\", { input: 1.25, output: 10, cacheRead: 0.125, cacheWrite: 0 }, GPT5),\n responsesModel(\"gpt-5-mini\", { input: 0.25, output: 2, cacheRead: 0.025, cacheWrite: 0 }, GPT5),\n responsesModel(\"gpt-5-nano\", { input: 0.05, output: 0.4, cacheRead: 0.005, cacheWrite: 0 }, GPT5),\n responsesModel(\"o3\", { input: 2, output: 8, cacheRead: 0.5, cacheWrite: 0 }, O_SERIES),\n responsesModel(\"o4-mini\", { input: 1.1, output: 4.4, cacheRead: 0.275, cacheWrite: 0 }, O_SERIES),\n responsesModel(\n \"gpt-4.1\",\n { input: 2, output: 8, cacheRead: 0.5, cacheWrite: 0 },\n { reasoning: false, contextWindow: 1_047_576, maxOutputTokens: 32_768 },\n ),\n responsesModel(\n \"gpt-4.1-mini\",\n { input: 0.4, output: 1.6, cacheRead: 0.1, cacheWrite: 0 },\n { reasoning: false, contextWindow: 1_047_576, maxOutputTokens: 32_768 },\n ),\n responsesModel(\n \"gpt-4o-mini\",\n { input: 0.15, output: 0.6, cacheRead: 0.075, cacheWrite: 0 },\n { reasoning: false, contextWindow: 128_000, maxOutputTokens: 16_384 },\n ),\n // ---- OpenAI Chat Completions 线的同款型号(openaiChat() 按协议精确取;无协议解析时上面的 Responses 条目优先)\n {\n provider: \"openai\",\n id: \"gpt-4o-mini\",\n api: \"openai-chat\",\n baseUrl: OPENAI_BASE,\n contextWindow: 128_000,\n maxOutputTokens: 16_384,\n reasoning: false,\n images: true,\n cost: { input: 0.15, output: 0.6, cacheRead: 0.075, cacheWrite: 0 },\n },\n {\n provider: \"openai\",\n id: \"gpt-4.1\",\n api: \"openai-chat\",\n baseUrl: OPENAI_BASE,\n contextWindow: 1_047_576,\n maxOutputTokens: 32_768,\n reasoning: false,\n images: true,\n cost: { input: 2, output: 8, cacheRead: 0.5, cacheWrite: 0 },\n },\n {\n provider: \"openai\",\n id: \"gpt-4.1-mini\",\n api: \"openai-chat\",\n baseUrl: OPENAI_BASE,\n contextWindow: 1_047_576,\n maxOutputTokens: 32_768,\n reasoning: false,\n images: true,\n cost: { input: 0.4, output: 1.6, cacheRead: 0.1, cacheWrite: 0 },\n },\n {\n provider: \"openai\",\n id: \"gpt-5-mini\",\n api: \"openai-chat\",\n baseUrl: OPENAI_BASE,\n contextWindow: 400_000,\n maxOutputTokens: 128_000,\n reasoning: true,\n images: true,\n cost: { input: 0.25, output: 2, cacheRead: 0.025, cacheWrite: 0 },\n },\n]\n\n/** 带 api 精确取该协议的条目;不带取先列的一份 */\nexport function findBuiltin(provider: string, id: string, api?: FetchApi): FetchModel | undefined {\n return BUILTIN_MODELS.find(\n (m) => m.provider === provider && m.id === id && (api === undefined || m.api === api),\n )\n}\n\n/** 宿主声明的优先于内置表 */\nexport function resolveModel(ref: ModelRef, extra: readonly FetchModel[] = []): FetchModel {\n const model =\n extra.find((m) => m.provider === ref.provider && m.id === ref.id) ?? findBuiltin(ref.provider, ref.id)\n if (!model) {\n throw new LoweringError(\n \"unsupported_model\",\n `unknown model ${ref.provider}/${ref.id}; the built-in table is a minimal set, declare the rest through the models option (or use a factory function)`,\n { provider: ref.provider, id: ref.id },\n )\n }\n if (!SUPPORTED_APIS.has(model.api)) {\n throw new LoweringError(\n \"unsupported_api\",\n `model ${ref.provider}/${ref.id} speaks ${model.api}, but this implementation currently supports only ${[...SUPPORTED_APIS].join(\" / \")}`,\n { api: model.api },\n )\n }\n return model\n}\n\n/** 协议端点:baseUrl 去掉尾部斜杠再接路径 */\nexport function endpointOf(model: FetchModel): string {\n const base = model.baseUrl.replace(/\\/+$/, \"\")\n switch (model.api) {\n case \"openai-chat\":\n return `${base}/chat/completions`\n case \"anthropic-messages\":\n return `${base}/messages`\n case \"openai-responses\":\n return `${base}/responses`\n }\n}\n","/**\n * OpenAI Responses 流 → 事件草稿。\n *\n * 只在流收尾时按拼好的输出项产出草稿(reasoning 项的 encrypted_content 在 output_item.done 才齐),增量经 onDelta 给 UI。\n * 中断或出错时把已拼出的部分内容也交出去——日志要记录\"发生过什么\",是否继续由循环决定。\n *\n * 事件形状(厂商 SSE,按 data.type 分派;F0 R2 实测事件序列完整):\n * response.created / response.in_progress { response: { id, model } }\n * response.output_item.added { output_index, item: reasoning | message | function_call | … }\n * response.reasoning_summary_part.added / response.reasoning_summary_text.delta { output_index, delta } / response.reasoning_text.delta\n * response.output_text.delta / response.refusal.delta { output_index, delta }\n * response.function_call_arguments.delta { output_index, delta } / response.function_call_arguments.done { arguments }\n * response.output_item.done { output_index, item } ← 项的最终形状(reasoning 带 encrypted_content、message 带 id)\n * response.completed / response.incomplete { response: { status, incomplete_details, usage, output } }\n * response.failed { response: { error: { code, message } } } / error { code, message }\n * 未知字段一律忽略(CF 网关会多个 \"p\")。\n */\nimport type { CoreEventDraft, LoweringOutcome, LoweringStreamContext, TokenUsage } from \"@reinsjs/core\"\nimport type { ModelOrigin } from \"../ir.js\"\nimport type { SseMessage } from \"../sse.js\"\nimport { costOf, type ModelCost } from \"../usage.js\"\n\ninterface ResponsesUsage {\n input_tokens?: unknown\n output_tokens?: unknown\n input_tokens_details?: { cached_tokens?: unknown; cache_write_tokens?: unknown } | null\n output_tokens_details?: { reasoning_tokens?: unknown } | null\n}\n\ninterface ResponsesItem {\n type?: unknown\n id?: unknown\n call_id?: unknown\n name?: unknown\n arguments?: unknown\n phase?: unknown\n encrypted_content?: unknown\n summary?: { type?: unknown; text?: unknown }[]\n content?: { type?: unknown; text?: unknown; refusal?: unknown }[]\n [k: string]: unknown\n}\n\ninterface ResponsesStreamEvent {\n type?: unknown\n output_index?: unknown\n item?: ResponsesItem\n delta?: unknown\n arguments?: unknown\n code?: unknown\n message?: unknown\n response?: {\n id?: unknown\n model?: unknown\n status?: unknown\n incomplete_details?: { reason?: unknown } | null\n usage?: ResponsesUsage | null\n output?: ResponsesItem[]\n error?: { code?: unknown; message?: unknown } | null\n }\n}\n\ntype Slot =\n | { kind: \"reasoning\"; id: string; summary: string; item: ResponsesItem | undefined }\n | { kind: \"message\"; id: string; text: string; phase: string | undefined }\n | { kind: \"function_call\"; id: string; callId: string; name: string; args: string }\n | { kind: \"other\"; type: string }\n\nexport interface ResponsesStreamInput {\n messages: AsyncIterable<SseMessage>\n origin: ModelOrigin\n cost?: ModelCost\n signal?: AbortSignal\n timedOut?: () => boolean\n timeoutMs?: number\n}\n\nfunction str(v: unknown): string | undefined {\n return typeof v === \"string\" ? v : undefined\n}\nfunction num(v: unknown): number | undefined {\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined\n}\n\n/** 入参 JSON 解析不了就原样存字符串(写侧原样送回),空串按 {} */\nfunction parseArguments(raw: string): unknown {\n if (raw.trim() === \"\") return {}\n try {\n return JSON.parse(raw) as unknown\n } catch {\n return raw\n }\n}\n\n/** reasoning 项的可见正文:summary 各段以空行拼接;没有 summary 的上游可能给 content(原文推理) */\nfunction reasoningText(item: ResponsesItem | undefined, fallback: string): string {\n if (!item) return fallback\n const summary = (item.summary ?? []).map((s) => str(s.text) ?? \"\").filter((t) => t.length > 0)\n if (summary.length > 0) return summary.join(\"\\n\\n\")\n const content = (item.content ?? []).map((c) => str(c.text) ?? \"\").filter((t) => t.length > 0)\n return content.length > 0 ? content.join(\"\\n\\n\") : fallback\n}\n\nfunction messageText(item: ResponsesItem | undefined, fallback: string): string {\n if (!item?.content) return fallback\n return item.content.map((c) => (c.type === \"refusal\" ? str(c.refusal) : str(c.text)) ?? \"\").join(\"\")\n}\n\nclass ResponsesAssembly {\n readonly slots = new Map<number, Slot>()\n responseId: string | undefined\n responseModel: string | undefined\n status: string | undefined\n incompleteReason: string | undefined\n usage: ResponsesUsage | undefined\n error: { code: string; message: string } | undefined\n sawTerminal = false\n\n slotFor(index: number, item: ResponsesItem): Slot {\n let slot = this.slots.get(index)\n if (slot) return slot\n const type = str(item.type) ?? \"unknown\"\n switch (type) {\n case \"reasoning\":\n slot = { kind: \"reasoning\", id: str(item.id) ?? \"\", summary: \"\", item: undefined }\n break\n case \"message\":\n slot = { kind: \"message\", id: str(item.id) ?? \"\", text: \"\", phase: str(item.phase) }\n break\n case \"function_call\":\n slot = {\n kind: \"function_call\",\n id: str(item.id) ?? \"\",\n callId: str(item.call_id) ?? \"\",\n name: str(item.name) ?? \"\",\n args: str(item.arguments) ?? \"\",\n }\n break\n default:\n slot = { kind: \"other\", type }\n }\n this.slots.set(index, slot)\n return slot\n }\n\n /** 项收尾:以厂商给的最终形状为准(reasoning 带 encrypted_content、message 带 id / phase、function_call 带完整 arguments) */\n finish(index: number, item: ResponsesItem) {\n const slot = this.slotFor(index, item)\n switch (slot.kind) {\n case \"reasoning\":\n slot.item = item\n slot.id = str(item.id) ?? slot.id\n slot.summary = reasoningText(item, slot.summary)\n break\n case \"message\":\n slot.id = str(item.id) ?? slot.id\n slot.phase = str(item.phase) ?? slot.phase\n slot.text = messageText(item, slot.text)\n break\n case \"function_call\":\n slot.id = str(item.id) ?? slot.id\n slot.callId = str(item.call_id) ?? slot.callId\n slot.name = str(item.name) ?? slot.name\n slot.args = str(item.arguments) ?? slot.args\n break\n case \"other\":\n break\n }\n }\n\n /**\n * Azure 等上游可能只在 response.completed 的 output 里给 encrypted_content(output_item.done 里没有),\n * 按 id 回填,让 store:false 的多轮回放不断(pi-ai 同一处置)。\n */\n backfill(output: ResponsesItem[] | undefined) {\n if (!output) return\n for (const item of output) {\n if (item.type !== \"reasoning\" || typeof item.encrypted_content !== \"string\") continue\n for (const slot of this.slots.values()) {\n if (slot.kind !== \"reasoning\" || slot.id !== item.id) continue\n if (!slot.item) slot.item = item\n else if (typeof slot.item.encrypted_content !== \"string\")\n slot.item = { ...slot.item, encrypted_content: item.encrypted_content }\n }\n }\n }\n\n hasFunctionCall(): boolean {\n for (const s of this.slots.values()) if (s.kind === \"function_call\") return true\n return false\n }\n\n drafts(origin: ModelOrigin): CoreEventDraft[] {\n const out: CoreEventDraft[] = []\n for (const [, s] of [...this.slots.entries()].sort((x, y) => x[0] - y[0])) {\n const replay: Record<string, unknown> = { ...origin }\n switch (s.kind) {\n case \"reasoning\": {\n const encrypted =\n typeof s.item?.encrypted_content === \"string\" && s.item.encrypted_content.length > 0\n // 没有加密项又没有可见摘要的 reasoning 项什么都承载不了;有加密项、摘要为空的也要留草稿(下一轮必须原样回放)\n if (!encrypted && s.summary.length === 0) break\n if (encrypted) replay.thinkingSignature = JSON.stringify(s.item)\n out.push({ type: \"core.model_thinking\", actor: \"model\", payload: { text: s.summary }, replay })\n break\n }\n case \"message\":\n if (s.text.length === 0) break\n if (s.id) replay.textSignature = s.id\n if (s.phase) replay.phase = s.phase\n out.push({ type: \"core.model_text\", actor: \"model\", payload: { text: s.text }, replay })\n break\n case \"function_call\":\n if (s.id) replay.itemId = s.id\n out.push({\n type: \"core.tool_call\",\n actor: \"model\",\n payload: { toolCallId: s.callId, name: s.name, args: parseArguments(s.args) },\n replay,\n })\n break\n case \"other\":\n break\n }\n }\n return out\n }\n}\n\n/**\n * OpenAI 的 input_tokens 含缓存命中与缓存写入部分(F0 R1 / R4 实测 `input_tokens_details.cached_tokens` / `cache_write_tokens`),\n * core 的 input 是未命中数,所以两者都要减掉。\n */\nexport function usageOf(u: ResponsesUsage | undefined): TokenUsage {\n const total = num(u?.input_tokens) ?? 0\n const cached = num(u?.input_tokens_details?.cached_tokens) ?? 0\n const written = num(u?.input_tokens_details?.cache_write_tokens) ?? 0\n const usage: TokenUsage = {\n input: Math.max(0, total - cached - written),\n output: num(u?.output_tokens) ?? 0,\n }\n if (cached > 0) usage.cacheRead = cached\n if (written > 0) usage.cacheWrite = written\n return usage\n}\n\nfunction apply(ev: ResponsesStreamEvent, a: ResponsesAssembly, ctx: LoweringStreamContext) {\n const type = str(ev.type)\n const index = num(ev.output_index)\n const slot = index === undefined ? undefined : a.slots.get(index)\n switch (type) {\n case \"response.created\":\n case \"response.in_progress\": {\n const id = str(ev.response?.id)\n const model = str(ev.response?.model)\n if (id) a.responseId = id\n if (model) a.responseModel = model\n break\n }\n case \"response.output_item.added\":\n if (index !== undefined && ev.item) a.slotFor(index, ev.item)\n break\n case \"response.reasoning_summary_part.added\":\n // 第二段起用空行隔开,与收尾时 summary 各段以 \"\\n\\n\" 拼接一致\n if (slot?.kind === \"reasoning\" && slot.summary.length > 0 && index !== undefined) {\n slot.summary += \"\\n\\n\"\n ctx.onDelta?.({ kind: \"thinking\", index, delta: \"\\n\\n\" })\n }\n break\n case \"response.reasoning_summary_text.delta\":\n case \"response.reasoning_text.delta\": {\n const d = str(ev.delta)\n if (slot?.kind === \"reasoning\" && d && index !== undefined) {\n slot.summary += d\n ctx.onDelta?.({ kind: \"thinking\", index, delta: d })\n }\n break\n }\n case \"response.output_text.delta\":\n case \"response.refusal.delta\": {\n const d = str(ev.delta)\n if (slot?.kind === \"message\" && d && index !== undefined) {\n slot.text += d\n ctx.onDelta?.({ kind: \"text\", index, delta: d })\n }\n break\n }\n case \"response.function_call_arguments.delta\": {\n const d = str(ev.delta)\n if (slot?.kind === \"function_call\" && d && index !== undefined) {\n slot.args += d\n ctx.onDelta?.({ kind: \"tool_args\", index, delta: d })\n }\n break\n }\n case \"response.function_call_arguments.done\": {\n const full = str(ev.arguments)\n if (slot?.kind === \"function_call\" && full !== undefined) slot.args = full\n break\n }\n case \"response.output_item.done\":\n if (index !== undefined && ev.item) a.finish(index, ev.item)\n break\n case \"response.completed\":\n case \"response.incomplete\": {\n a.sawTerminal = true\n const r = ev.response\n a.status = str(r?.status) ?? (type === \"response.completed\" ? \"completed\" : \"incomplete\")\n a.incompleteReason = str(r?.incomplete_details?.reason)\n if (r?.usage) a.usage = r.usage\n const model = str(r?.model)\n if (model) a.responseModel = model\n a.backfill(r?.output)\n break\n }\n case \"response.failed\": {\n a.sawTerminal = true\n a.status = \"failed\"\n const e = ev.response?.error\n a.error = {\n code: str(e?.code) ?? \"failed\",\n message: str(e?.message) ?? \"response.failed carries no error detail\",\n }\n if (ev.response?.usage) a.usage = ev.response.usage\n break\n }\n case \"error\":\n a.error = { code: str(ev.code) ?? \"error\", message: str(ev.message) ?? \"\" }\n break\n default:\n // response.output_text.done / content_part.* / reasoning_summary_part.done / 未知事件:无事可做\n break\n }\n}\n\n/**\n * 停止原因:流里的 error / response.failed → error(文案 \"<code>: <message>\",rate_limit_exceeded 之类 core 判可重试);\n * 有 function_call 项即 toolUse;completed → stop;incomplete + max_output_tokens → length、incomplete + content_filter → error\n * (厂商内容过滤,不重试);cancelled → error;没等到终态事件 → error \"stream ended before response.completed\"(可重试)。\n */\nfunction outcomeOf(a: ResponsesAssembly, cost: ModelCost | undefined): LoweringOutcome {\n const usage = usageOf(a.usage)\n const out: LoweringOutcome = { stopReason: \"stop\", usage }\n const c = costOf(usage, cost)\n if (c !== undefined) out.costUsd = c\n if (a.responseModel) out.responseModel = a.responseModel\n\n if (a.error) {\n out.stopReason = \"error\"\n out.errorMessage = `${a.error.code}: ${a.error.message}`\n return out\n }\n if (!a.sawTerminal) {\n out.stopReason = \"error\"\n out.errorMessage = \"stream ended before response.completed\"\n return out\n }\n if (a.hasFunctionCall()) {\n out.stopReason = \"toolUse\"\n return out\n }\n switch (a.status) {\n case \"completed\":\n break\n case \"incomplete\":\n if (a.incompleteReason === \"max_output_tokens\") out.stopReason = \"length\"\n else {\n out.stopReason = \"error\"\n out.errorMessage =\n a.incompleteReason === \"content_filter\"\n ? \"status=incomplete (content_filter): the provider's content filter cut this output short\"\n : `status=incomplete${a.incompleteReason ? ` (${a.incompleteReason})` : \"\"}: the provider did not finish`\n }\n break\n case \"cancelled\":\n case \"failed\":\n out.stopReason = \"error\"\n out.errorMessage = `status=${a.status}`\n break\n default:\n break\n }\n return out\n}\n\nexport async function* consumeResponsesStream(\n input: ResponsesStreamInput,\n ctx: LoweringStreamContext = {},\n): AsyncGenerator<CoreEventDraft, LoweringOutcome> {\n const a = new ResponsesAssembly()\n try {\n for await (const msg of input.messages) {\n if (msg.data === \"[DONE]\") break\n let ev: ResponsesStreamEvent\n try {\n ev = JSON.parse(msg.data) as ResponsesStreamEvent\n } catch {\n // 解析不了的一帧:跳过而不是整条流作废,末尾若因此缺终态事件会记 error\n continue\n }\n apply(ev, a, ctx)\n if (a.error) break\n }\n } catch (err) {\n yield* a.drafts(input.origin)\n const base = outcomeOf(a, input.cost)\n if (input.signal?.aborted) return { ...base, stopReason: \"aborted\", errorMessage: \"aborted by host\" }\n if (input.timedOut?.())\n return {\n ...base,\n stopReason: \"error\",\n errorMessage: `request timed out after ${input.timeoutMs ?? \"?\"}ms (stream ended before response.completed)`,\n }\n return { ...base, stopReason: \"error\", errorMessage: errorText(err) }\n }\n yield* a.drafts(input.origin)\n return outcomeOf(a, input.cost)\n}\n\nfunction errorText(err: unknown): string {\n if (err instanceof Error) {\n const cause = (err as { cause?: { code?: unknown } }).cause\n const code = typeof cause?.code === \"string\" ? ` (${cause.code})` : \"\"\n return `${err.message}${code}`\n }\n return String(err)\n}\n","/**\n * IR → OpenAI Responses 请求体,并为每条事件记落点。\n *\n * Responses 是三条线里规矩最少的一条,但有两处与\"时间线是唯一真源\"直接相关,这里逐条落实(规则原文 F0 实测,\n * spikes/cf-gateway-fidelity 的 R2 / R3 / R3b):\n * - **服务端不留状态**:`store: false` 强制、宿主传的 `previous_response_id` 剥掉。每个请求把模型该看到的历史全量放进 `input`,\n * 与别的两条线同一形状;OpenAI 侧的会话状态永远不是我们依赖的东西。\n * - **reasoning 回放判据是 encrypted_content**:推理模型缺省带 `include: [\"reasoning.encrypted_content\"]`,上一轮的 reasoning 项\n * (整项 JSON 存在事件 `replay.thinkingSignature` 里,与 lowering-pi 同字段)原样放回 `input`;没有加密项(未开 include、流中断)\n * 或来自别家的一律 dropped 声明,不降成正文。伪造的加密项厂商回原文 400,所以回放的必须是原件。\n * - **中途 system 不用归位**:`developer` / `system` 消息在 `input` 里任意位置合法(F0 R3 中途 developer 到达);推理模型用\n * developer、其它用 system(与 pi 版矩阵同格),宿主可用 `responses.systemRole` 钉死。\n * - **工具调用两个 id**:`call_id`(配对 function_call_output 用)是 core 的 toolCallId;`fc_` 项 id 存 `replay.itemId`,只在同一模型\n * 回放时带回——OpenAI 会校验 fc 项与 rs 项的配对,换了模型就不带(与 pi-ai 同一取向)。\n * - `reasoning` / `max_output_tokens` 不缺省设置:gpt-5 缺省 medium、gpt-5.1 起缺省 none,开不开由宿主按型号在 requestOptions 里定\n * (与 Anthropic 线的 thinking 同一原则)。\n */\nimport {\n type ContentPart,\n type Event,\n type LandingRecord,\n type LoweringCapabilities,\n renderToolReference,\n type ToolSpec,\n} from \"@reinsjs/core\"\nimport {\n DEFERRED_NOTE,\n ESCAPED_NOTE,\n foreignOrigin,\n type IrBlock,\n type IrItem,\n type ModelOrigin,\n orderLandings,\n} from \"../ir.js\"\nimport type { FetchModel } from \"../models.js\"\nimport { framedSummary, framedSystemNote } from \"../notes.js\"\n\nexport type ResponsesInputContent =\n | { type: \"input_text\"; text: string }\n | { type: \"input_image\"; image_url: string; detail: \"auto\" }\n\nexport type ResponsesInputItem =\n /** user / developer / system 消息 */\n | { role: \"user\" | \"developer\" | \"system\"; content: ResponsesInputContent[] }\n /** 上一轮的 assistant 正文:type:message 输出项原样放回 */\n | {\n type: \"message\"\n role: \"assistant\"\n id: string\n status: \"completed\"\n content: { type: \"output_text\"; text: string; annotations: [] }[]\n phase?: string\n }\n /** 上一轮的 reasoning 项:整项原样放回(id / summary / encrypted_content 等字段以厂商给的为准) */\n | { type: \"reasoning\"; id: string; encrypted_content: string; [k: string]: unknown }\n | { type: \"function_call\"; id?: string; call_id: string; name: string; arguments: string }\n | { type: \"function_call_output\"; call_id: string; output: string | ResponsesInputContent[] }\n\nexport interface ResponsesTool {\n type: \"function\"\n name: string\n description: string\n parameters: Record<string, unknown>\n /** 我们的 JSON Schema 不保证满足 strict 模式(additionalProperties:false、全部 required),一律不开 */\n strict: false\n}\n\n/** 发出去的请求体本体。宿主的 requestOptions 先铺、我们的字段后盖:model / input / tools / stream / store 不可被覆盖 */\nexport interface ResponsesRequestBody extends Record<string, unknown> {\n model: string\n input: ResponsesInputItem[]\n tools?: ResponsesTool[]\n stream: true\n store: false\n include?: string[]\n}\n\nexport interface ResponsesEncodeInput {\n ir: readonly IrItem[]\n events: readonly Event[]\n model: FetchModel\n capabilities: LoweringCapabilities\n tools?: readonly ToolSpec[]\n systemPrompt?: string\n requestOptions?: Record<string, unknown>\n}\n\nconst IMAGE_OMITTED = \"[image omitted: this model does not accept images]\"\nconst ERROR_PREFIX = \"[tool error]\\n\"\nconst EMPTY_NOTE = \"the content is empty, so no empty message is sent\"\nconst ENCRYPTED_INCLUDE = \"reasoning.encrypted_content\"\n\nfunction land(\n out: LandingRecord[],\n e: Event,\n kind: LandingRecord[\"kind\"],\n landing: string,\n ...notes: (string | undefined)[]\n) {\n const note = notes.filter((n): n is string => Boolean(n)).join(\"; \")\n out.push(\n note\n ? { eventId: e.id, type: e.type, kind, landing, note }\n : { eventId: e.id, type: e.type, kind, landing },\n )\n}\n\n/** 内容段 → 输入块;空文本段跳过,图片按模型能力处置 */\nfunction contentOf(\n parts: readonly ContentPart[],\n images: boolean,\n): { content: ResponsesInputContent[]; imagesDropped: boolean } {\n let imagesDropped = false\n const content: ResponsesInputContent[] = []\n for (const p of parts) {\n if (p.type === \"text\") {\n if (p.text.length > 0) content.push({ type: \"input_text\", text: p.text })\n } else if (p.type === \"tool_reference\") {\n content.push({ type: \"input_text\", text: renderToolReference(p) })\n } else if (images) {\n content.push({ type: \"input_image\", image_url: `data:${p.mime};base64,${p.data}`, detail: \"auto\" })\n } else {\n imagesDropped = true\n content.push({ type: \"input_text\", text: IMAGE_OMITTED })\n }\n }\n return { content, imagesDropped }\n}\n\n/** tool_call 入参回到线上是 JSON 字符串;读侧解析失败时存的是原始字符串,写侧原样送回 */\nfunction argumentsOf(args: unknown): string {\n return typeof args === \"string\" ? args : JSON.stringify(args ?? {})\n}\n\n/**\n * 正文项的 id:本家事件的 `replay.textSignature` 是厂商给的 msg_ id、`replay.phase` 是同一项的 phase\n * (lowering-pi 把两者存成 `{\"v\":1,\"id\":…,\"phase\":…}` JSON 签名,两种都认);\n * 没有就补一个——type:message 输入项要求带 id,pi-ai 也是这样补的(`msg_pi_<n>`),厂商接受。\n */\nfunction textItemId(replay: Record<string, unknown>): { id?: string; phase?: string } {\n const sig = replay.textSignature\n if (typeof sig !== \"string\" || sig.length === 0) return {}\n const ownPhase = typeof replay.phase === \"string\" && replay.phase.length > 0 ? { phase: replay.phase } : {}\n if (sig.startsWith(\"{\")) {\n try {\n const parsed = JSON.parse(sig) as { id?: unknown; phase?: unknown }\n if (typeof parsed.id === \"string\" && parsed.id.length > 0) {\n return typeof parsed.phase === \"string\" ? { id: parsed.id, phase: parsed.phase } : { id: parsed.id }\n }\n } catch {\n // 不是 JSON:按裸 id 处理\n }\n }\n // OpenAI 要求 id 不超过 64 字符,超长的当没有\n return sig.length > 64 ? {} : { id: sig, ...ownPhase }\n}\n\n/** replay.thinkingSignature 里存的 reasoning 项:必须是带非空 encrypted_content 的对象才可回放 */\nexport function reasoningItemOf(replay: Record<string, unknown>): Record<string, unknown> | undefined {\n const sig = replay.thinkingSignature\n if (typeof sig !== \"string\" || !sig.startsWith(\"{\")) return undefined\n try {\n const item = JSON.parse(sig) as Record<string, unknown>\n if (typeof item.encrypted_content !== \"string\" || item.encrypted_content.length === 0) return undefined\n return item\n } catch {\n return undefined\n }\n}\n\nexport function encodeResponsesRequest(input: ResponsesEncodeInput): {\n body: ResponsesRequestBody\n landings: LandingRecord[]\n} {\n const { model, capabilities } = input\n const target: ModelOrigin = { provider: model.provider, api: model.api, model: model.id }\n const dialect = model.responses ?? {}\n const systemRole = dialect.systemRole ?? (model.reasoning ? \"developer\" : \"system\")\n const items: ResponsesInputItem[] = []\n const landings: LandingRecord[] = []\n let textCounter = 0\n\n if (input.systemPrompt)\n items.push({ role: systemRole, content: [{ type: \"input_text\", text: input.systemPrompt }] })\n\n for (const item of input.ir) {\n switch (item.kind) {\n case \"user\": {\n const c = contentOf(item.parts, capabilities.images)\n if (c.content.length === 0) {\n land(landings, item.event, \"dropped\", \"none\", EMPTY_NOTE)\n break\n }\n items.push({ role: \"user\", content: c.content })\n const lossy = item.deferred || item.escaped || c.imagesDropped\n land(\n landings,\n item.event,\n lossy ? \"lossy\" : \"exact\",\n \"user\",\n item.deferred\n ? `the user message sits between a tool call and its results; ${DEFERRED_NOTE}`\n : undefined,\n item.escaped ? ESCAPED_NOTE : undefined,\n c.imagesDropped\n ? \"the model takes no images, so they are replaced with placeholder text\"\n : undefined,\n )\n break\n }\n case \"tool_result\": {\n const c = contentOf(item.parts, capabilities.images)\n const hasImage = c.content.some((b) => b.type === \"input_image\")\n const text = c.content\n .filter((b): b is Extract<ResponsesInputContent, { type: \"input_text\" }> => b.type === \"input_text\")\n .map((b) => b.text)\n .join(\"\\n\")\n const prefixed = item.isError ? ERROR_PREFIX + text : text\n // 只有文本就用字符串(最兼容);带图片时 output 为内容块数组(文本在前,前缀一并放进去)\n const output: string | ResponsesInputContent[] = hasImage\n ? [\n ...(prefixed.length > 0 ? [{ type: \"input_text\" as const, text: prefixed }] : []),\n ...c.content.filter((b) => b.type === \"input_image\"),\n ]\n : prefixed\n items.push({ type: \"function_call_output\", call_id: item.toolCallId, output })\n const lossy = item.escaped || item.isError || c.imagesDropped\n land(\n landings,\n item.event,\n lossy ? \"lossy\" : \"exact\",\n \"function_call_output\",\n item.isError\n ? \"the Responses function_call_output has no error flag, so isError is expressed with a [tool error] prefix\"\n : undefined,\n c.imagesDropped\n ? \"the model takes no images, so they are replaced with placeholder text\"\n : undefined,\n item.escaped ? ESCAPED_NOTE : undefined,\n )\n break\n }\n case \"compaction\": {\n items.push({ role: \"user\", content: [{ type: \"input_text\", text: framedSummary(item.text) }] })\n land(\n landings,\n item.event,\n \"lossy\",\n \"user-text\",\n \"the summary is rendered as user-role text\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n break\n }\n case \"system_note\": {\n if (capabilities.midConversationSystem) {\n items.push({ role: systemRole, content: [{ type: \"input_text\", text: item.text }] })\n land(\n landings,\n item.event,\n item.escaped ? \"lossy\" : \"exact\",\n systemRole,\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n } else {\n items.push({\n role: \"user\",\n content: [{ type: \"input_text\", text: framedSystemNote(item.noteKind, item.text) }],\n })\n land(\n landings,\n item.event,\n \"lossy\",\n \"user-role\",\n \"the host declared that this upstream does not support mid-conversation system, so it is wrapped in a <system_note> tag and sent with the user role\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n }\n break\n }\n case \"assistant\": {\n const out = assistantItems(\n item.blocks,\n item.origin,\n target,\n landings,\n () => `msg_reins_${++textCounter}`,\n )\n items.push(...out)\n break\n }\n case \"dropped\":\n land(landings, item.event, \"dropped\", \"none\", item.note)\n break\n }\n }\n\n const ro = input.requestOptions ?? {}\n // input / tools 只由事件与工具表决定;previous_response_id 与\"时间线是唯一真源\"冲突,一律不透传\n const { input: _input, tools: _tools, previous_response_id: _prev, ...passthrough } = ro\n const body: ResponsesRequestBody = {\n ...passthrough,\n model: model.id,\n input: items,\n stream: true,\n store: false,\n }\n // Responses 没有\"声明但不载入\"的落点:deferLoading 的工具不发(L1)\n const shownTools = (input.tools ?? []).filter((t) => t.deferLoading !== true)\n if (shownTools.length > 0) {\n body.tools = shownTools.map(\n (t): ResponsesTool => ({\n type: \"function\",\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n strict: false,\n }),\n )\n }\n if (model.reasoning && dialect.encryptedReasoning !== false) {\n const hostInclude = Array.isArray(ro.include)\n ? ro.include.filter((x): x is string => typeof x === \"string\")\n : []\n body.include = hostInclude.includes(ENCRYPTED_INCLUDE) ? hostInclude : [...hostInclude, ENCRYPTED_INCLUDE]\n }\n return { body, landings: orderLandings(input.events, landings) }\n}\n\n/**\n * 一轮模型输出 → 输出项列表(Responses 的 assistant 一轮是多个独立项,不像别家是一条消息里的多个块)。\n * - 正文:每段一个 type:message 项,id 同家回放、否则补;空段 dropped;\n * - reasoning:同家且 replay 里是带 encrypted_content 的整项 → 原样放回;别家 / 没有加密项 → dropped;\n * - tool_call:function_call,arguments 是 JSON 字符串;fc_ 项 id 只在同一模型时带回。\n */\nfunction assistantItems(\n blocks: readonly IrBlock[],\n origin: ModelOrigin,\n target: ModelOrigin,\n landings: LandingRecord[],\n nextTextId: () => string,\n): ResponsesInputItem[] {\n const out: ResponsesInputItem[] = []\n const foreign = foreignOrigin(origin, target)\n const sameModel = !foreign && origin.model === target.model\n for (const b of blocks) {\n switch (b.type) {\n case \"text\": {\n if (b.text.length === 0) {\n land(landings, b.event, \"dropped\", \"none\", EMPTY_NOTE)\n break\n }\n const own = foreign ? {} : textItemId(b.replay)\n const id = own.id ?? nextTextId()\n out.push({\n type: \"message\",\n role: \"assistant\",\n id,\n status: \"completed\",\n content: [{ type: \"output_text\", text: b.text, annotations: [] }],\n ...(own.phase !== undefined ? { phase: own.phase } : {}),\n })\n land(\n landings,\n b.event,\n \"exact\",\n \"assistant-message\",\n own.id === undefined ? \"the item id is supplied by this package\" : undefined,\n )\n break\n }\n case \"thinking\": {\n if (foreign) {\n land(\n landings,\n b.event,\n \"dropped\",\n \"none\",\n `reasoning from ${origin.provider}/${origin.api} has no encrypted item of its own, so it is not replayed`,\n )\n break\n }\n // 加密项绑定产出它的模型(与 fc_ 项 id 同一取向):换了型号不放回,声明 dropped\n if (!sameModel) {\n land(\n landings,\n b.event,\n \"dropped\",\n \"none\",\n `the reasoning item comes from ${origin.model}, but this request targets ${target.model}; encrypted reasoning is only valid for the model that produced it, so it is not replayed`,\n )\n break\n }\n const item = reasoningItemOf(b.replay)\n if (!item) {\n land(\n landings,\n b.event,\n \"dropped\",\n \"none\",\n \"the reasoning item has no encrypted_content (it was not requested, or the stream broke), so it cannot be replayed under store:false\",\n )\n break\n }\n out.push({ ...item, type: \"reasoning\" } as Extract<ResponsesInputItem, { type: \"reasoning\" }>)\n land(landings, b.event, \"exact\", \"reasoning-item\")\n break\n }\n case \"tool_call\": {\n const itemId = sameModel && typeof b.replay.itemId === \"string\" ? b.replay.itemId : undefined\n out.push({\n type: \"function_call\",\n ...(itemId !== undefined ? { id: itemId } : {}),\n call_id: b.id,\n name: b.name,\n arguments: argumentsOf(b.args),\n })\n land(\n landings,\n b.event,\n \"exact\",\n \"function_call\",\n itemId === undefined && typeof b.replay.itemId === \"string\"\n ? \"the model changed, so the fc_ item id is not carried back\"\n : undefined,\n )\n break\n }\n }\n }\n return out\n}\n","/**\n * Server-Sent Events 解析(WHATWG 规范的字段子集):`event:` / `data:` / `id:`,多行 data 以 \\n 拼接,\n * 空行分发一条消息,`:` 开头是注释,`retry:` 与未知字段忽略。行尾兼容 \\r\\n、\\n、\\r。\n *\n * 比规范宽一处:流结束时缓冲区里还有没被空行收口的消息,也照样分发——部分上游最后一条事件后不发空行。\n * `data` 的 JSON 解析不在这里做:`[DONE]` 这类哨兵是各协议自己的约定。\n */\n\nexport interface SseMessage {\n event?: string\n data: string\n id?: string\n}\n\nexport async function* parseSse(body: ReadableStream<Uint8Array>): AsyncGenerator<SseMessage> {\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let buffer = \"\"\n let event: string | undefined\n let id: string | undefined\n const data: string[] = []\n\n const flush = (): SseMessage | undefined => {\n const msg: SseMessage = { data: data.join(\"\\n\") }\n if (event !== undefined) msg.event = event\n if (id !== undefined) msg.id = id\n const empty = data.length === 0 && event === undefined\n event = undefined\n id = undefined\n data.length = 0\n // 只有 id 或什么都没有的空消息不分发(规范:data 为空且无 event 时忽略)\n return empty ? undefined : msg\n }\n const line = (raw: string): SseMessage | undefined => {\n if (raw === \"\") return flush()\n if (raw.startsWith(\":\")) return undefined\n const colon = raw.indexOf(\":\")\n const field = colon === -1 ? raw : raw.slice(0, colon)\n let value = colon === -1 ? \"\" : raw.slice(colon + 1)\n if (value.startsWith(\" \")) value = value.slice(1)\n switch (field) {\n case \"data\":\n data.push(value)\n break\n case \"event\":\n event = value\n break\n case \"id\":\n id = value\n break\n default:\n break\n }\n return undefined\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n buffer += done ? decoder.decode() : decoder.decode(value, { stream: true })\n // 逐行切;最后一段可能是半行,留到下一块(done 时整段都算完整)\n let start = 0\n while (true) {\n const nl = buffer.indexOf(\"\\n\", start)\n const cr = buffer.indexOf(\"\\r\", start)\n let end = -1\n let skip = 1\n if (nl === -1 && cr === -1) break\n if (cr !== -1 && (nl === -1 || cr < nl)) {\n end = cr\n // \\r\\n 算一个换行;\\r 恰在块尾时看不到后面的 \\n,留到下一块再判\n if (cr === buffer.length - 1 && !done) break\n if (buffer[cr + 1] === \"\\n\") skip = 2\n } else end = nl\n const msg = line(buffer.slice(start, end))\n if (msg) yield msg\n start = end + skip\n }\n buffer = buffer.slice(start)\n if (done) break\n }\n if (buffer !== \"\") {\n const msg = line(buffer)\n if (msg) yield msg\n }\n const tail = flush()\n if (tail) yield tail\n } finally {\n reader.releaseLock()\n }\n}\n","/**\n * 一行拿到\"模型 + 降级层\":`deepseek(\"deepseek-flash\", { apiKey })`、`openaiChat(\"gpt-4o-mini\", { apiKey })`、\n * `openai(\"gpt-5-mini\", { apiKey })`(Responses)、`anthropic(\"claude-opus-5\", { apiKey })`;任何 OpenAI 兼容端点用\n * `chatCompletions(\"qwen-max\", { provider: \"qwen\", baseUrl, apiKey })`,任何 Anthropic 协议端点(DeepSeek 兼容端口、CF 网关)用\n * `anthropicMessages(id, { provider, baseUrl, apiKey })`,任何 Responses 协议端点用 `openaiResponses(id, { provider, baseUrl, apiKey })`。\n * 返回 BoundModel,直接给 `createAgent({ model })`;要多模型共享一个降级层就自己 new FetchLowering。\n *\n * 表内模型取内置定义再按选项覆盖;表外模型用保守缺省(128k 窗口、16k 输出、无推理、不收图),宿主按需覆盖。\n * 本包不读环境变量,apiKey 必填、由宿主决定来源(auth:\"none\" 时可给空串占位)。\n */\nimport type { BoundModel } from \"@reinsjs/core\"\nimport { FetchLowering, type FetchLoweringOptions } from \"./lowering.js\"\nimport {\n type AnthropicDialect,\n type ChatDialect,\n type FetchApi,\n type FetchModel,\n findBuiltin,\n type ResponsesDialect,\n} from \"./models.js\"\nimport type { ModelCost } from \"./usage.js\"\n\nexport interface ModelOptions {\n apiKey: string\n /** 协议根地址(Chat 在其后接 /chat/completions,Anthropic 接 /messages);表内模型缺省用厂商官方地址 */\n baseUrl?: string\n contextWindow?: number\n maxOutputTokens?: number\n reasoning?: boolean\n images?: boolean\n cost?: ModelCost\n /** 上游是否接受中途 role:\"system\";Chat 缺省 true,Anthropic 按模型族推断 */\n midConversationSystem?: boolean\n /** Chat 方言开关,见 models.ts ChatDialect */\n chat?: ChatDialect\n /** Anthropic 线的 beta 头与缓存断点处置,见 models.ts AnthropicDialect */\n anthropic?: AnthropicDialect\n /** Responses 线的说明角色与加密推理项开关,见 models.ts ResponsesDialect */\n responses?: ResponsesDialect\n /** 凭证怎么带;网关自带凭证头时用 \"none\" 并把头放 headers */\n auth?: FetchModel[\"auth\"]\n headers?: Record<string, string>\n /** 铺进请求体的额外字段(max_tokens、temperature、thinking …) */\n requestOptions?: Record<string, unknown>\n fetch?: typeof globalThis.fetch\n timeoutMs?: number\n trustMarkers?: boolean\n}\n\n/** @deprecated 改名为 ModelOptions(三条线共用同一组选项),保留别名 */\nexport type ChatModelOptions = ModelOptions\n\nexport interface ProviderModelOptions extends ModelOptions {\n /** 用作 ModelRef.provider 与 apiKey 回调的键;表外厂商必填 */\n provider: string\n}\n/** @deprecated 改名为 ProviderModelOptions */\nexport type ChatCompletionsOptions = ProviderModelOptions\n\nconst DEFAULTS = { contextWindow: 128_000, maxOutputTokens: 16_384, reasoning: false, images: false }\n\n/** 去掉值为 undefined 的键:exactOptionalPropertyTypes 下\"没给\"与\"给了 undefined\"要分开 */\nfunction defined<T extends object>(o: T): { [K in keyof T]?: Exclude<T[K], undefined> } {\n return Object.fromEntries(Object.entries(o).filter(([, v]) => v !== undefined)) as never\n}\n\n/** 内置定义打底,选项里给了的字段覆盖;表外模型从保守缺省起 */\nexport function definitionOf(\n provider: string,\n id: string,\n api: FetchApi,\n opts: Omit<ModelOptions, \"apiKey\" | \"requestOptions\" | \"fetch\" | \"timeoutMs\" | \"trustMarkers\">,\n): FetchModel {\n // 同 id 可能两条协议各有一份内置定义(OpenAI),按工厂指定的协议精确取\n const builtin = findBuiltin(provider, id, api)\n const base: FetchModel = builtin ?? { provider, id, api, baseUrl: opts.baseUrl ?? \"\", ...DEFAULTS }\n if (!builtin && !opts.baseUrl) {\n throw new RangeError(`model ${provider}/${id} is not in the built-in table, so baseUrl is required`)\n }\n const chat = base.chat || opts.chat ? { ...base.chat, ...defined(opts.chat ?? {}) } : undefined\n const anthropic =\n base.anthropic || opts.anthropic ? { ...base.anthropic, ...defined(opts.anthropic ?? {}) } : undefined\n const responses =\n base.responses || opts.responses ? { ...base.responses, ...defined(opts.responses ?? {}) } : undefined\n return {\n ...base,\n ...defined({\n baseUrl: opts.baseUrl,\n contextWindow: opts.contextWindow,\n maxOutputTokens: opts.maxOutputTokens,\n reasoning: opts.reasoning,\n images: opts.images,\n cost: opts.cost,\n midConversationSystem: opts.midConversationSystem,\n auth: opts.auth,\n headers: opts.headers,\n }),\n ...(chat ? { chat } : {}),\n ...(anthropic ? { anthropic } : {}),\n ...(responses ? { responses } : {}),\n }\n}\n\nfunction bound(provider: string, id: string, model: FetchModel, opts: ModelOptions): BoundModel {\n const loweringOpts: FetchLoweringOptions = {\n apiKey: (p) => (p === provider ? opts.apiKey : undefined),\n models: [model],\n ...(opts.requestOptions ? { requestOptions: () => opts.requestOptions ?? {} } : {}),\n ...(opts.fetch ? { fetch: opts.fetch } : {}),\n ...(opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : {}),\n ...(opts.trustMarkers !== undefined ? { trustMarkers: opts.trustMarkers } : {}),\n }\n return { model: { provider, id }, lowering: new FetchLowering(loweringOpts) }\n}\n\n/** 任何 OpenAI Chat Completions 兼容端点 */\nexport function chatCompletions(id: string, opts: ProviderModelOptions): BoundModel {\n return bound(opts.provider, id, definitionOf(opts.provider, id, \"openai-chat\", opts), opts)\n}\n\n/** DeepSeek 直连:缺省官方地址、开 reasoning_content 方言(带 tools 时缺它 400) */\nexport function deepseek(id: string, opts: ModelOptions): BoundModel {\n return chatCompletions(id, {\n provider: \"deepseek\",\n baseUrl: \"https://api.deepseek.com\",\n reasoning: true,\n images: true,\n ...opts,\n chat: { reasoningContent: true, ...opts.chat },\n })\n}\n\n/** OpenAI 官方 Chat Completions(推理系列请用 Responses 线的 openai()) */\nexport function openaiChat(id: string, opts: ModelOptions): BoundModel {\n return chatCompletions(id, { provider: \"openai\", baseUrl: \"https://api.openai.com/v1\", ...opts })\n}\n\n/**\n * 任何 OpenAI Responses 协议端点:Cloudflare AI Gateway 透传路径(`auth: \"none\"` + `cf-aig-authorization` 头)、\n * 兼容网关。表外模型从保守缺省起(reasoning 假、不收图),宿主按需声明;不认 developer 角色或 include 参数的上游用 `responses` 方言关掉。\n */\nexport function openaiResponses(id: string, opts: ProviderModelOptions): BoundModel {\n return bound(opts.provider, id, definitionOf(opts.provider, id, \"openai-responses\", opts), opts)\n}\n\n/**\n * OpenAI 官方 Responses:缺省官方地址、Bearer 鉴权;表内模型带价目与能力位。`reasoning` 参数不缺省设置——\n * gpt-5 缺省 medium、gpt-5.1 起缺省 none,开不开、开多深由宿主按型号在 requestOptions 里定(与 Anthropic 线的 thinking 同一原则)。\n */\nexport function openai(id: string, opts: ModelOptions): BoundModel {\n // 表外的新型号按\"推理、收图\"起(OpenAI 当前一代皆如此);表内的 gpt-4.1 等非推理型号以内置定义为准,不被这两个缺省盖掉\n const unknown = findBuiltin(\"openai\", id, \"openai-responses\") === undefined\n return openaiResponses(id, {\n provider: \"openai\",\n baseUrl: \"https://api.openai.com/v1\",\n ...(unknown ? { reasoning: true, images: true } : {}),\n ...opts,\n })\n}\n\n/**\n * 任何 Anthropic Messages 协议端点:DeepSeek 的兼容端口(`provider: \"deepseek\", baseUrl: \"https://api.deepseek.com/anthropic\"`)、\n * Cloudflare AI Gateway 透传路径(`auth: \"none\"` + `cf-aig-authorization` 头)。表外模型从保守缺省起(reasoning 假、不收图),宿主按需声明。\n */\nexport function anthropicMessages(id: string, opts: ProviderModelOptions): BoundModel {\n return bound(opts.provider, id, definitionOf(opts.provider, id, \"anthropic-messages\", opts), opts)\n}\n\n/** Anthropic 官方直连:缺省官方地址、x-api-key 鉴权;表内模型带价目与能力位 */\nexport function anthropic(id: string, opts: ModelOptions): BoundModel {\n return anthropicMessages(id, {\n provider: \"anthropic\",\n baseUrl: \"https://api.anthropic.com/v1\",\n reasoning: true,\n images: true,\n ...opts,\n })\n}\n","/**\n * OpenAI Responses 的有损矩阵(P7:有损必声明)。每条实际落点必须命中其中一条,矩阵里不能有死条目(loss-matrix.test.ts)。\n * 与 lowering-pi 的 \"openai-responses\" 表逐格对照:能 exact 的一样(user / assistant-message / reasoning-item / function_call /\n * function_call_output / developer / system)。不同处三格——无加密项或别家的 reasoning 这里 dropped 而非 pi-ai 的\n * \"降为正文 / 厂商看着办\"、tool_call 入参不是对象也照发(arguments 本就是 JSON 字符串,不必包 { value })、\n * tool_result 的 isError 以前缀表达(协议没有错误位)并按模型能力处置图片。\n */\nimport type { LandingSpec } from \"@reinsjs/core\"\nimport { NOT_SENT } from \"../chat/loss-matrix.js\"\n\nconst exact = (landing: string, note?: string, when?: string): LandingSpec => {\n const spec: LandingSpec = { kind: \"exact\", landing }\n if (note) spec.note = note\n if (when) spec.when = when\n return spec\n}\nconst lossy = (landing: string, note: string, when?: string): LandingSpec =>\n when ? { kind: \"lossy\", landing, note, when } : { kind: \"lossy\", landing, note }\nconst dropped = (landing: string, note: string, when?: string): LandingSpec =>\n when ? { kind: \"dropped\", landing, note, when } : { kind: \"dropped\", landing, note }\n\nexport const RESPONSES_LOSS_MATRIX: Readonly<Record<string, readonly LandingSpec[]>> = {\n \"core.user_message\": [\n exact(\"user\", \"a user message in input, as input_text / input_image blocks\"),\n lossy(\n \"user\",\n \"moved after that batch of tool results (the order changes), untrusted content escaped, or images replaced with placeholder text because the model takes none\",\n \"the user speaks up before all tool results are in / the content holds a </untrusted / it carries images the model does not take\",\n ),\n dropped(\n \"none\",\n \"the content is empty, so no empty message is sent\",\n \"the user message has no non-empty content\",\n ),\n ],\n \"core.model_text\": [\n exact(\n \"assistant-message\",\n \"a type:message assistant output item; each text segment of a turn becomes its own item; the item id is replayed when it comes from the same model, otherwise a new one is made up\",\n ),\n dropped(\"none\", \"empty text is not sent\", \"the text is an empty string\"),\n ],\n \"core.model_thinking\": [\n exact(\n \"reasoning-item\",\n \"the whole reasoning item (including encrypted_content) is replayed verbatim\",\n \"replay.thinkingSignature is a reasoning item with encrypted_content and comes from the same source (provider + api + model)\",\n ),\n dropped(\n \"none\",\n \"reasoning with no encrypted_content (the encrypted item was not requested, or the stream broke), from another source, or from another model of the same family (encrypted reasoning is only valid for the model that produced it) cannot be replayed, and is not downgraded to text\",\n ),\n ],\n \"core.tool_call\": [\n exact(\n \"function_call\",\n \"arguments is a JSON string, and non-object arguments are serialized as they are; the fc_ item id is replayed only for the same model (to stay clear of the pairing check)\",\n ),\n ],\n \"core.tool_result\": [\n exact(\n \"function_call_output\",\n \"matched by call_id; output is a string for text, or an array of content blocks when images are present; tool reference parts are expanded into text (Responses has no deferred-loading landing)\",\n ),\n lossy(\n \"function_call_output\",\n \"isError is expressed with a [tool error] prefix (the protocol has no error flag), or untrusted content is escaped, or images are replaced with placeholder text because the model takes none\",\n ),\n ],\n \"core.system_note\": [\n exact(\n \"developer\",\n \"a developer message anywhere in input\",\n \"a reasoning model (or responses.systemRole = developer)\",\n ),\n exact(\n \"system\",\n \"a system message anywhere in input\",\n \"a non-reasoning model (or responses.systemRole = system)\",\n ),\n lossy(\n \"developer\",\n \"a developer message, with the early close inside untrusted content escaped\",\n \"a note the host marked untrusted holds a </untrusted\",\n ),\n lossy(\n \"system\",\n \"a system message, with the early close inside untrusted content escaped\",\n \"same as above\",\n ),\n lossy(\n \"user-role\",\n \"wrapped in a <system_note> tag and sent with the user role\",\n \"the host declared midConversationSystem: false for an unusual upstream\",\n ),\n ],\n \"core.compaction\": [\n lossy(\n \"user-text\",\n \"the summary is rendered as user-role text, so the model cannot tell it apart from the user's own words\",\n ),\n ],\n ...NOT_SENT,\n}\n","/**\n * @reinsjs/lowering-fetch —— 降级层只用 fetch 的实现,零依赖、零 node:*。\n *\n * 事件 → 中间表示(分组、后移、trust 标注)→ 线协议请求体;SSE 流 → 事件草稿。\n * 三条线:OpenAI Chat Completions(含 DeepSeek 的 reasoning_content 方言)、Anthropic Messages、OpenAI Responses。\n * 每种事件在每条协议的落点见各协议的 LOSS_MATRIX,禁止静默丢弃。\n */\nexport { consumeAnthropicStream, usageOf as anthropicUsageOf } from \"./anthropic/from-stream.js\"\nexport { ANTHROPIC_LOSS_MATRIX } from \"./anthropic/loss-matrix.js\"\nexport {\n type AnthropicAssistantBlock,\n type AnthropicCacheControl,\n type AnthropicMessage,\n type AnthropicRequestBody,\n type AnthropicTool,\n type AnthropicUserBlock,\n encodeAnthropicRequest,\n MAX_ANTHROPIC_BREAKPOINTS,\n} from \"./anthropic/to-request.js\"\nexport { capabilitiesOf } from \"./capabilities.js\"\nexport { consumeChatStream, usageOf as chatUsageOf } from \"./chat/from-stream.js\"\nexport { CHAT_LOSS_MATRIX } from \"./chat/loss-matrix.js\"\nexport {\n type ChatContentPart,\n type ChatMessage,\n type ChatRequestBody,\n type ChatTool,\n type ChatToolCall,\n encodeChatRequest,\n} from \"./chat/to-request.js\"\nexport {\n anthropic,\n anthropicMessages,\n type ChatCompletionsOptions,\n type ChatModelOptions,\n chatCompletions,\n deepseek,\n definitionOf,\n type ModelOptions,\n openai,\n openaiChat,\n openaiResponses,\n type ProviderModelOptions,\n} from \"./factories.js\"\nexport { DEFAULT_TIMEOUT_MS, HttpError, postJson, requestSignals } from \"./http.js\"\nexport {\n eventsToIr,\n foreignOrigin,\n type IrBlock,\n type IrItem,\n type ModelOrigin,\n orderLandings,\n sameOrigin,\n} from \"./ir.js\"\nexport {\n ANTHROPIC_VERSION,\n type FetchLoweredPayload,\n FetchLowering,\n type FetchLoweringOptions,\n} from \"./lowering.js\"\nexport {\n type AnthropicDialect,\n BUILTIN_MODELS,\n type ChatDialect,\n endpointOf,\n type FetchApi,\n type FetchModel,\n findBuiltin,\n type MidSystemCacheBreakpoint,\n type ResponsesDialect,\n resolveModel,\n SUPPORTED_APIS,\n} from \"./models.js\"\nexport { consumeResponsesStream, usageOf as responsesUsageOf } from \"./responses/from-stream.js\"\nexport { RESPONSES_LOSS_MATRIX } from \"./responses/loss-matrix.js\"\nexport {\n encodeResponsesRequest,\n type ResponsesInputContent,\n type ResponsesInputItem,\n type ResponsesRequestBody,\n type ResponsesTool,\n reasoningItemOf,\n} from \"./responses/to-request.js\"\nexport { parseSse, type SseMessage } from \"./sse.js\"\nexport { costOf, type ModelCost } from \"./usage.js\"\n\nimport type { LossMatrix } from \"@reinsjs/core\"\nimport { ANTHROPIC_LOSS_MATRIX } from \"./anthropic/loss-matrix.js\"\nimport { CHAT_LOSS_MATRIX } from \"./chat/loss-matrix.js\"\nimport { RESPONSES_LOSS_MATRIX } from \"./responses/loss-matrix.js\"\n\n/** api → 事件 type → 可能落点;与 lowering-pi 的 LOSS_MATRIX 同形,逐格对照用 */\nexport const LOSS_MATRIX: LossMatrix = {\n \"openai-chat\": CHAT_LOSS_MATRIX,\n \"anthropic-messages\": ANTHROPIC_LOSS_MATRIX,\n \"openai-responses\": RESPONSES_LOSS_MATRIX,\n}\n\n/** 查某 api 下某事件 type 的声明落点;ext.* 归到通配项 */\nexport function declaredLandings(api: string, type: string): readonly import(\"@reinsjs/core\").LandingSpec[] {\n const table = LOSS_MATRIX[api]\n if (!table) return []\n return table[type] ?? (type.startsWith(\"ext.\") ? (table[\"ext.*\"] ?? []) : [])\n}\n"],"mappings":"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","names":["exact","lossy","dropped","lossy","num","usageOf","apply","outcomeOf","errorText","markUntrusted","renderToolReference","IMAGE_OMITTED","land","renderToolReference","markUntrusted","lossy","LoweringError","str","num","parseArguments","usageOf","apply","outcomeOf","errorText","renderToolReference","IMAGE_OMITTED","ERROR_PREFIX","EMPTY_NOTE","land","renderToolReference","argumentsOf","lossy","LoweringError","anthropic","exact","lossy","dropped"]}
|
|
1
|
+
{"version":3,"sources":["../src/usage.ts","../src/anthropic/from-stream.ts","../src/chat/loss-matrix.ts","../src/anthropic/loss-matrix.ts","../src/anthropic/to-request.ts","../src/ir.ts","../src/notes.ts","../src/capabilities.ts","../src/chat/from-stream.ts","../src/chat/to-request.ts","../src/lowering.ts","../src/http.ts","../src/models.ts","../src/responses/from-stream.ts","../src/responses/to-request.ts","../src/sse.ts","../src/factories.ts","../src/responses/loss-matrix.ts","../src/index.ts"],"sourcesContent":["/**\n * 用量与成本(三线共用)。`TokenUsage` 语义跟随 core:`input` 是**未命中缓存**的输入 token,缓存读 / 写另计。\n * 各协议的原生用量字段在各自 from-stream 里换算成这个形状,这里只算钱。\n */\nimport type { TokenUsage } from \"@reinsjs/core\"\n\n/** 每百万 token 的美元价。厂商有峰谷价的(DeepSeek)内置表存峰值价,算出来的是估算上限 */\nexport interface ModelCost {\n input: number\n output: number\n cacheRead: number\n cacheWrite: number\n}\n\n/** 算不出(没有价目)返回 undefined,LoweringOutcome.costUsd 相应缺省 */\nexport function costOf(usage: TokenUsage, cost: ModelCost | undefined): number | undefined {\n if (!cost) return undefined\n const perToken = (n: number | undefined, price: number) => ((n ?? 0) * price) / 1_000_000\n return (\n perToken(usage.input, cost.input) +\n perToken(usage.output, cost.output) +\n perToken(usage.cacheRead, cost.cacheRead) +\n perToken(usage.cacheWrite, cost.cacheWrite)\n )\n}\n","/**\n * Anthropic Messages 流 → 事件草稿。\n *\n * 只在流收尾时按拼好的内容块产出草稿(signature 在 content_block_stop 前才齐),增量经 onDelta 给 UI。\n * 中断或出错时把已拼出的部分内容也交出去——日志要记录\"发生过什么\",是否继续由循环决定。\n *\n * 事件形状(厂商 SSE,按 data.type 分派,不看 event: 行;F0 A7 实测):\n * message_start{ message: { id, model, usage: { input_tokens, cache_creation_input_tokens, cache_read_input_tokens } } }\n * content_block_start{ index, content_block: text | thinking | redacted_thinking | tool_use }\n * content_block_delta{ index, delta: text_delta | thinking_delta | signature_delta | input_json_delta }\n * content_block_stop{ index }\n * message_delta{ delta: { stop_reason, stop_sequence, stop_details? }, usage: { output_tokens, … } }\n * message_stop / ping / error{ error: { type, message } }\n * 未知字段一律忽略(厂商自带 \"p\" 填充;CF 网关原样透传)。\n */\nimport type { CoreEventDraft, LoweringOutcome, LoweringStreamContext, TokenUsage } from \"@reinsjs/core\"\nimport type { ModelOrigin } from \"../ir.js\"\nimport type { SseMessage } from \"../sse.js\"\nimport { costOf, type ModelCost } from \"../usage.js\"\n\ninterface AnthropicUsage {\n input_tokens?: unknown\n output_tokens?: unknown\n cache_creation_input_tokens?: unknown\n cache_read_input_tokens?: unknown\n}\n\ninterface AnthropicStreamEvent {\n type?: unknown\n message?: { id?: unknown; model?: unknown; usage?: AnthropicUsage | null }\n index?: unknown\n content_block?: {\n type?: unknown\n text?: unknown\n thinking?: unknown\n signature?: unknown\n data?: unknown\n id?: unknown\n name?: unknown\n input?: unknown\n }\n delta?: {\n type?: unknown\n text?: unknown\n thinking?: unknown\n signature?: unknown\n partial_json?: unknown\n stop_reason?: unknown\n stop_sequence?: unknown\n stop_details?: { category?: unknown; explanation?: unknown } | null\n }\n usage?: AnthropicUsage | null\n error?: { type?: unknown; message?: unknown }\n}\n\ntype Block =\n | { kind: \"text\"; text: string }\n | { kind: \"thinking\"; thinking: string; signature: string }\n | { kind: \"redacted_thinking\"; data: string }\n | { kind: \"tool_use\"; id: string; name: string; input: unknown; json: string }\n | { kind: \"other\"; type: string }\n\nexport interface AnthropicStreamInput {\n messages: AsyncIterable<SseMessage>\n origin: ModelOrigin\n cost?: ModelCost\n signal?: AbortSignal\n timedOut?: () => boolean\n timeoutMs?: number\n}\n\n/** pi-ai 对 redacted_thinking 的正文约定,两条降级路线的事件互换 */\nexport const REDACTED_THINKING_TEXT = \"[Reasoning redacted]\"\n\nfunction str(v: unknown): string | undefined {\n return typeof v === \"string\" ? v : undefined\n}\nfunction num(v: unknown): number | undefined {\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined\n}\n\n/** 入参 JSON 解析不了就原样存字符串(写侧会包成 { value }),空串按 {} */\nfunction parseInput(json: string, fallback: unknown): unknown {\n if (json.trim() === \"\") return typeof fallback === \"object\" && fallback !== null ? fallback : {}\n try {\n return JSON.parse(json) as unknown\n } catch {\n return json\n }\n}\n\nclass AnthropicAssembly {\n readonly blocks = new Map<number, Block>()\n start: AnthropicUsage | undefined\n delta: AnthropicUsage | undefined\n responseModel: string | undefined\n stopReason: string | undefined\n stopDetails: { category?: unknown; explanation?: unknown } | undefined\n error: { type: string; message: string } | undefined\n sawStop = false\n\n drafts(origin: ModelOrigin): CoreEventDraft[] {\n const out: CoreEventDraft[] = []\n for (const [, b] of [...this.blocks.entries()].sort((x, y) => x[0] - y[0])) {\n const replay: Record<string, unknown> = { ...origin }\n switch (b.kind) {\n case \"thinking\":\n // 签名在、正文为空(display omitted)也要留草稿:下一轮必须原样回放\n if (b.thinking.length === 0 && b.signature.length === 0) break\n if (b.signature.length > 0) replay.thinkingSignature = b.signature\n out.push({ type: \"core.model_thinking\", actor: \"model\", payload: { text: b.thinking }, replay })\n break\n case \"redacted_thinking\":\n replay.thinkingSignature = b.data\n replay.redacted = true\n out.push({\n type: \"core.model_thinking\",\n actor: \"model\",\n payload: { text: REDACTED_THINKING_TEXT },\n replay,\n })\n break\n case \"text\":\n if (b.text.length > 0)\n out.push({ type: \"core.model_text\", actor: \"model\", payload: { text: b.text }, replay })\n break\n case \"tool_use\":\n out.push({\n type: \"core.tool_call\",\n actor: \"model\",\n payload: { toolCallId: b.id, name: b.name, args: parseInput(b.json, b.input) },\n replay,\n })\n break\n case \"other\":\n break\n }\n }\n return out\n }\n\n hasToolUse(): boolean {\n for (const b of this.blocks.values()) if (b.kind === \"tool_use\") return true\n return false\n }\n}\n\n/**\n * Anthropic 的 input_tokens 本就不含缓存部分(与 core 语义一致);message_start 报输入侧,message_delta 报输出\n * (累计值)并可能再报一次输入侧,以后到的为准。\n */\nexport function usageOf(start: AnthropicUsage | undefined, delta: AnthropicUsage | undefined): TokenUsage {\n const pick = (k: keyof AnthropicUsage) => num(delta?.[k]) ?? num(start?.[k])\n const usage: TokenUsage = { input: pick(\"input_tokens\") ?? 0, output: pick(\"output_tokens\") ?? 0 }\n const read = pick(\"cache_read_input_tokens\")\n const write = pick(\"cache_creation_input_tokens\")\n if (read) usage.cacheRead = read\n if (write) usage.cacheWrite = write\n return usage\n}\n\nfunction apply(ev: AnthropicStreamEvent, a: AnthropicAssembly, ctx: LoweringStreamContext) {\n switch (ev.type) {\n case \"message_start\": {\n const model = str(ev.message?.model)\n if (model) a.responseModel = model\n if (ev.message?.usage) a.start = ev.message.usage\n break\n }\n case \"content_block_start\": {\n const index = num(ev.index)\n const cb = ev.content_block\n if (index === undefined || !cb) break\n const type = str(cb.type) ?? \"unknown\"\n switch (type) {\n case \"text\":\n a.blocks.set(index, { kind: \"text\", text: str(cb.text) ?? \"\" })\n break\n case \"thinking\":\n a.blocks.set(index, {\n kind: \"thinking\",\n thinking: str(cb.thinking) ?? \"\",\n signature: str(cb.signature) ?? \"\",\n })\n break\n case \"redacted_thinking\":\n a.blocks.set(index, { kind: \"redacted_thinking\", data: str(cb.data) ?? \"\" })\n break\n case \"tool_use\":\n a.blocks.set(index, {\n kind: \"tool_use\",\n id: str(cb.id) ?? \"\",\n name: str(cb.name) ?? \"\",\n input: cb.input,\n json: \"\",\n })\n break\n default:\n a.blocks.set(index, { kind: \"other\", type })\n }\n break\n }\n case \"content_block_delta\": {\n const index = num(ev.index)\n const d = ev.delta\n if (index === undefined || !d) break\n const b = a.blocks.get(index)\n if (!b) break\n switch (d.type) {\n case \"text_delta\": {\n const t = str(d.text)\n if (b.kind === \"text\" && t) {\n b.text += t\n ctx.onDelta?.({ kind: \"text\", index, delta: t })\n }\n break\n }\n case \"thinking_delta\": {\n const t = str(d.thinking)\n if (b.kind === \"thinking\" && t) {\n b.thinking += t\n ctx.onDelta?.({ kind: \"thinking\", index, delta: t })\n }\n break\n }\n case \"signature_delta\": {\n const s = str(d.signature)\n if (b.kind === \"thinking\" && s) b.signature += s\n break\n }\n case \"input_json_delta\": {\n const j = str(d.partial_json)\n if (b.kind === \"tool_use\" && j) {\n b.json += j\n ctx.onDelta?.({ kind: \"tool_args\", index, delta: j })\n }\n break\n }\n default:\n break\n }\n break\n }\n case \"message_delta\": {\n const reason = str(ev.delta?.stop_reason)\n if (reason) a.stopReason = reason\n if (ev.delta?.stop_details && typeof ev.delta.stop_details === \"object\")\n a.stopDetails = ev.delta.stop_details\n if (ev.usage) a.delta = { ...a.delta, ...ev.usage }\n break\n }\n case \"message_stop\":\n a.sawStop = true\n break\n case \"error\":\n a.error = { type: str(ev.error?.type) ?? \"error\", message: str(ev.error?.message) ?? \"\" }\n break\n default:\n // ping、content_block_stop 与未知事件:无事可做\n break\n }\n}\n\n/**\n * 停止原因:有 tool_use 块即 toolUse;end_turn / stop_sequence / pause_turn → stop;max_tokens 与\n * model_context_window_exceeded → length;refusal → error 并把 stop_details 写进 errorMessage(厂商分类器拒答,\n * 不是瞬断,core 不会重试);流里的 error 事件 → error(overloaded_error 的文案含 Overloaded,core 判可重试);\n * 没等到 message_stop 也没有 stop_reason → error \"stream ended before message_stop\"(可重试)。\n */\nfunction outcomeOf(a: AnthropicAssembly, cost: ModelCost | undefined): LoweringOutcome {\n const usage = usageOf(a.start, a.delta)\n const out: LoweringOutcome = { stopReason: \"stop\", usage }\n const c = costOf(usage, cost)\n if (c !== undefined) out.costUsd = c\n if (a.responseModel) out.responseModel = a.responseModel\n\n if (a.error) {\n out.stopReason = \"error\"\n out.errorMessage = `${a.error.type}: ${a.error.message}`\n return out\n }\n if (a.hasToolUse()) {\n out.stopReason = \"toolUse\"\n return out\n }\n switch (a.stopReason) {\n case \"end_turn\":\n case \"stop_sequence\":\n case \"pause_turn\":\n case \"tool_use\":\n break\n case \"max_tokens\":\n case \"model_context_window_exceeded\":\n out.stopReason = \"length\"\n break\n case \"refusal\": {\n out.stopReason = \"error\"\n const category = str(a.stopDetails?.category)\n const explanation = str(a.stopDetails?.explanation)\n out.errorMessage = `stop_reason=refusal${category ? ` (${category})` : \"\"}: the provider's classifier refused to answer${explanation ? `: ${explanation}` : \"\"}`\n break\n }\n case undefined:\n if (!a.sawStop) {\n out.stopReason = \"error\"\n out.errorMessage = \"stream ended before message_stop\"\n }\n break\n default:\n break\n }\n return out\n}\n\nexport async function* consumeAnthropicStream(\n input: AnthropicStreamInput,\n ctx: LoweringStreamContext = {},\n): AsyncGenerator<CoreEventDraft, LoweringOutcome> {\n const a = new AnthropicAssembly()\n try {\n for await (const msg of input.messages) {\n let ev: AnthropicStreamEvent\n try {\n ev = JSON.parse(msg.data) as AnthropicStreamEvent\n } catch {\n // 解析不了的一帧:跳过而不是整条流作废,末尾若因此缺 message_stop 会记 error\n continue\n }\n apply(ev, a, ctx)\n if (a.error) break\n }\n } catch (err) {\n yield* a.drafts(input.origin)\n const base = outcomeOf(a, input.cost)\n if (input.signal?.aborted) return { ...base, stopReason: \"aborted\", errorMessage: \"aborted by host\" }\n if (input.timedOut?.())\n return {\n ...base,\n stopReason: \"error\",\n errorMessage: `request timed out after ${input.timeoutMs ?? \"?\"}ms (stream ended before message_stop)`,\n }\n return { ...base, stopReason: \"error\", errorMessage: errorText(err) }\n }\n yield* a.drafts(input.origin)\n return outcomeOf(a, input.cost)\n}\n\nfunction errorText(err: unknown): string {\n if (err instanceof Error) {\n const cause = (err as { cause?: { code?: unknown } }).cause\n const code = typeof cause?.code === \"string\" ? ` (${cause.code})` : \"\"\n return `${err.message}${code}`\n }\n return String(err)\n}\n","/**\n * Chat Completions 的有损矩阵(P7:有损必声明)。事件 type → 可能落点;toRequest 记录的每条实际落点必须命中其中一条,\n * 矩阵里不能有从未命中的死条目(loss-matrix.test.ts)。新增事件类型或改落点不补表,测试就红。\n */\nimport type { LandingSpec } from \"@reinsjs/core\"\n\nconst exact = (landing: string, note?: string, when?: string): LandingSpec => {\n const spec: LandingSpec = { kind: \"exact\", landing }\n if (note) spec.note = note\n if (when) spec.when = when\n return spec\n}\nconst lossy = (landing: string, note: string, when?: string): LandingSpec =>\n when ? { kind: \"lossy\", landing, note, when } : { kind: \"lossy\", landing, note }\nconst dropped = (landing: string, note: string, when?: string): LandingSpec =>\n when ? { kind: \"dropped\", landing, note, when } : { kind: \"dropped\", landing, note }\n\n/** 不下发的运维事件:服务宿主与审计,信息由别的事件承载;投影默认已过滤,这里是第二道声明 */\nexport const NOT_SENT: Readonly<Record<string, readonly LandingSpec[]>> = {\n \"core.approval_request\": [\n dropped(\"none\", \"the approval outcome reaches the model through tool_result(isError)\"),\n ],\n \"core.approval_decision\": [dropped(\"none\", \"same as above\")],\n \"core.run_paused\": [dropped(\"none\", \"a run record; the perception module distills it into a system_note\")],\n \"core.run_resumed\": [dropped(\"none\", \"same as above\")],\n \"core.budget_usage\": [dropped(\"none\", \"same as above\")],\n \"core.memory_op\": [\n dropped(\n \"none\",\n \"an audit trail of memory reads and writes; the model already learned of them from the tool result\",\n ),\n ],\n \"core.handoff\": [\n dropped(\n \"none\",\n \"this session ends at the handoff; the new session's first user message carries the triggerMessage\",\n ),\n ],\n \"core.tools_bound\": [\n dropped(\n \"none\",\n \"a snapshot of the tool table; the loop announces changes to it in a separate system_note\",\n ),\n ],\n \"core.error\": [\n dropped(\n \"none\",\n \"provider errors are handled by the loop; tool errors already live in tool_result.isError\",\n ),\n ],\n \"ext.*\": [\n dropped(\n \"none\",\n \"host extension events have no general landing; translate the ones the model must see into core events in the projection layer\",\n ),\n ],\n}\n\nexport const CHAT_LOSS_MATRIX: Readonly<Record<string, readonly LandingSpec[]>> = {\n \"core.user_message\": [\n exact(\"user\"),\n lossy(\n \"user\",\n \"moved after that batch of tool results (the order changes), untrusted content escaped, or images replaced with placeholder text because the model takes none\",\n \"the user speaks up before all tool results are in / the content holds a </untrusted / it carries images the model does not take\",\n ),\n ],\n \"core.model_text\": [\n exact(\"assistant-content\"),\n lossy(\n \"merged-text\",\n \"multiple text segments of one turn are merged into a single string (assistant.content can only be a string)\",\n \"the turn holds more than one text segment\",\n ),\n ],\n \"core.model_thinking\": [\n exact(\n \"reasoning_content\",\n \"the DeepSeek dialect: the thinking text is filled back in verbatim\",\n \"the model has chat.reasoningContent on and the source is the same family\",\n ),\n dropped(\n \"none\",\n \"Chat Completions has no landing for replaying thinking (no signature, no encrypted item), or the source is another family\",\n ),\n ],\n \"core.tool_call\": [exact(\"tool_calls\", \"arguments is a JSON string\")],\n \"core.tool_result\": [\n exact(\n \"tool\",\n \"a role:tool message right after the assistant that carries the tool_calls; tool reference parts are expanded into text (Chat has no deferred-loading landing)\",\n ),\n lossy(\n \"tool\",\n \"isError is expressed with a [tool error] prefix (a tool message has no error flag), or untrusted content is escaped\",\n ),\n lossy(\n \"tool+lifted-images\",\n \"a tool message takes text only, so it keeps a pointer where each image was and the images move into a user message right after the whole batch of tool messages (the order and the role change); that message labels them as tool output, with the tool name, call id and index, and keeps the result's untrusted marking\",\n \"the result carries images and the model takes images (chat.liftToolImages is on by default)\",\n ),\n lossy(\n \"tool-text-only\",\n \"a tool message takes text only, so images are replaced with placeholder text\",\n \"the result carries images and the model takes no images, or chat.liftToolImages is false\",\n ),\n ],\n \"core.system_note\": [\n exact(\n \"system\",\n \"a mid-conversation system message\",\n \"the upstream accepts mid-conversation system (the default)\",\n ),\n lossy(\n \"system\",\n \"a mid-conversation system message, with the early close inside untrusted content escaped\",\n \"a note the host marked untrusted holds a </untrusted\",\n ),\n lossy(\n \"user-role\",\n \"wrapped in a <system_note> tag and sent with the user role\",\n \"the model declares midConversationSystem: false, or the note is a directive the model must act on (SystemNotePayload.directive)\",\n ),\n ],\n \"core.compaction\": [\n lossy(\n \"user-text\",\n \"the summary is rendered as user-role text, so the model cannot tell it apart from the user's own words\",\n ),\n ],\n ...NOT_SENT,\n}\n","/**\n * Anthropic Messages 的有损矩阵(P7:有损必声明)。每条实际落点必须命中其中一条,矩阵里不能有死条目(loss-matrix.test.ts)。\n * 与 lowering-pi 的 \"anthropic-messages\" 表逐格对照:能 exact 的一样(user / assistant-text / tool_use / tool_result /\n * thinking-block / system),不同处只有三格——无签名 thinking 这里 dropped 而非 pi-ai 的\"降为正文\"、redacted 单列、\n * tool_result 图片按模型能力处置。\n */\nimport type { LandingSpec } from \"@reinsjs/core\"\nimport { NOT_SENT } from \"../chat/loss-matrix.js\"\n\nconst exact = (landing: string, note?: string, when?: string): LandingSpec => {\n const spec: LandingSpec = { kind: \"exact\", landing }\n if (note) spec.note = note\n if (when) spec.when = when\n return spec\n}\nconst lossy = (landing: string, note: string, when?: string): LandingSpec =>\n when ? { kind: \"lossy\", landing, note, when } : { kind: \"lossy\", landing, note }\nconst dropped = (landing: string, note: string, when?: string): LandingSpec =>\n when ? { kind: \"dropped\", landing, note, when } : { kind: \"dropped\", landing, note }\n\nexport const ANTHROPIC_LOSS_MATRIX: Readonly<Record<string, readonly LandingSpec[]>> = {\n \"core.user_message\": [\n exact(\"user\"),\n lossy(\n \"user\",\n \"moved after that batch of tool results (the order changes), untrusted content escaped, or images replaced with placeholder text because the model takes none\",\n \"the user speaks up before all tool results are in / the content holds a </untrusted / it carries images the model does not take\",\n ),\n dropped(\n \"none\",\n \"the content is empty and Anthropic rejects empty text blocks\",\n \"the user message has no non-empty content\",\n ),\n ],\n \"core.model_text\": [\n exact(\n \"assistant-text\",\n \"a text block on the assistant; each text segment of a turn becomes its own block\",\n ),\n dropped(\n \"none\",\n \"empty text is not sent (the provider rejects empty text blocks)\",\n \"the text is an empty string\",\n ),\n ],\n \"core.model_thinking\": [\n exact(\n \"thinking-block\",\n \"replayed verbatim with its signature\",\n \"the replay has a thinkingSignature and comes from the same source (provider + api + model)\",\n ),\n exact(\n \"redacted-thinking\",\n \"redacted_thinking is replayed verbatim through its data\",\n \"replay.redacted is true\",\n ),\n dropped(\n \"none\",\n \"thinking with no signature (a broken stream), from another family, or from another model of the same family (a signature is only valid for the model that produced it) is rejected by the provider, so it is not replayed, and not downgraded to text either\",\n ),\n ],\n \"core.tool_call\": [\n exact(\"tool_use\"),\n lossy(\"wrapped-args\", \"non-object arguments are wrapped as { value }\", \"tool_call.args is not an object\"),\n ],\n \"core.tool_result\": [\n exact(\n \"tool_result\",\n \"in the user message right after the assistant that holds the tool_use; is_error is passed through; tool reference parts are expanded into text when the native capability is missing or the result is not trusted as system\",\n ),\n lossy(\n \"tool_result\",\n \"untrusted content is escaped, or images are replaced with placeholder text because the model takes none, or the referenced tool is absent from this request's tool table and its definition is expanded into text\",\n ),\n exact(\n \"tool-reference\",\n \"the result holds nothing but tool reference parts: a tool_reference block goes into the tool_result and the provider expands it in place into the full definition (the tool table stays byte-identical)\",\n \"the model supports defer_loading, the result is trusted as system, and every referenced tool is in this request's tool table\",\n ),\n lossy(\n \"tool-reference\",\n \"the reference block goes into the tool_result and the result's text segments move to a text block right after it in the same user message (a reference inside a tool_result cannot be mixed with text)\",\n \"the result holds both reference parts and text segments (explanatory text, untrusted markers)\",\n ),\n ],\n \"core.system_note\": [\n exact(\n \"system\",\n \"a mid-conversation system message carrying the text; it is placed before the next assistant message, or at the very end\",\n \"the model family supports mid-conversation system (Fable 5.x / Mythos 5.x / Opus 5 / Opus 4.8, or the host says so)\",\n ),\n lossy(\n \"system\",\n \"a mid-conversation system message, with the early close inside untrusted content escaped\",\n \"a note the host marked untrusted holds a </untrusted\",\n ),\n lossy(\n \"user-role\",\n \"wrapped in a <system_note> tag and sent with the user role\",\n \"the model family does not support mid-conversation system, or the placement rules forbid it (the previous message is an assistant, or the note would be first), or the note is a directive the model must act on (SystemNotePayload.directive)\",\n ),\n ],\n \"core.compaction\": [\n lossy(\n \"user-text\",\n \"the summary is rendered as user-role text, so the model cannot tell it apart from the user's own words\",\n ),\n ],\n ...NOT_SENT,\n}\n","/**\n * IR → Anthropic Messages 请求体,并为每条事件记落点。\n *\n * 与 Chat 线相比 Anthropic 规矩最多,这里逐条落实(规则原文 F0 实测,spikes/cf-gateway-fidelity):\n * - **tool_result 紧跟**:同批 tool_result 必须在 tool_use 所在 assistant 的下一条 user 里;后移由 IR 完成,这里只把连续的\n * user 侧内容(tool_result、用户消息、摘要)并进同一条 user(F0 A5b 实测同条 user 里 tool_result 后接文本可达);\n * - **中途 system 摆放**(S1):不能是首条、必须紧跟 user(含只带 tool_result 的 user)、后接 assistant 或收尾。所以说明\n * 一律攒到\"下一条 assistant 之前\"或末尾再放出;此刻前一条不是 user(是 assistant 或什么都没有)就退成 `<system_note>`\n * 框住的 user 文本,记 lossy(user-role)。放出位置比时间线晚了一条 user 的,仍算 exact(说明只换位置,见 AGENTS.md);\n * - **thinking 回放**:带 signature 原样回放(F0 A7b 接受、伪造签名 400);无签名(流中断)与来自别家的一律 dropped 声明——\n * 不像 pi-ai 那样降成正文,模型的私下推理不该以它\"说过的话\"出现在历史里;`redacted_thinking` 用 data 原样回放;\n * - **缓存断点**:最多 4 个。我们打三处——system 末块、tools 末项、最后一条 user 末块(厂商按前缀向前找命中,20 块回看窗口);\n * 说明殿后(末条是 system)时按 `midSystemCacheBreakpoint` 处置,缺省顶层 `cache_control`(B1 实测与不注入持平);\n * - `max_tokens` 必填:宿主 requestOptions 没给就用模型声明的 maxOutputTokens;`thinking` 不缺省设置——Opus 5 起厂商缺省\n * 就是 adaptive,是否开、开多深由宿主按模型代次决定(Fable 5.1 对 `type:\"disabled\"` 400);\n * - **延迟加载**(L1,spikes/l1-deferred-tools 实测):`ToolSpec.deferLoading` → `defer_loading: true`,工具留在 tools 块里、\n * 表整段不变;结果里的 `tool_reference` 段 → `tool_reference` 块由厂商就地展开。厂商规矩:tool_result 内引用不能与文本混放\n * (文本段改放同条 user 里紧随的 text 块,记 lossy);引用指向 tools 里没有的名字 400(整段历史都校验,所以未绑定的引用一律\n * 展开成文本);全部工具 defer_loading 400(此时不延迟);defer_loading 工具不能带 cache_control(断点打在最后一个非延迟工具上)。\n * 能力位关着(第三方上游)时 deferLoading 的工具不发、引用段展开成文本。\n */\nimport {\n type ContentPart,\n type Event,\n type LandingRecord,\n type LoweringCapabilities,\n renderToolReference,\n type ToolSpec,\n} from \"@reinsjs/core\"\nimport {\n DEFERRED_NOTE,\n ESCAPED_NOTE,\n foreignOrigin,\n type IrBlock,\n type IrItem,\n type ModelOrigin,\n orderLandings,\n} from \"../ir.js\"\nimport type { FetchModel } from \"../models.js\"\nimport { DIRECTIVE_NOTE, framedSummary, framedSystemNote } from \"../notes.js\"\n\nexport interface AnthropicCacheControl {\n type: \"ephemeral\"\n ttl?: \"5m\" | \"1h\"\n}\n\nexport type AnthropicUserBlock =\n | { type: \"text\"; text: string; cache_control?: AnthropicCacheControl }\n | {\n type: \"image\"\n source: { type: \"base64\"; media_type: string; data: string }\n cache_control?: AnthropicCacheControl\n }\n | {\n type: \"tool_result\"\n tool_use_id: string\n content?: AnthropicToolResultBlock[]\n is_error?: true\n cache_control?: AnthropicCacheControl\n }\n\n/** 文本与图片块:user 消息与 tool_result 内容共用的形状 */\nexport type AnthropicContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"image\"; source: { type: \"base64\"; media_type: string; data: string } }\n\nexport type AnthropicToolResultBlock =\n | AnthropicContentBlock\n /** 工具定义引用:厂商就地展开成完整定义,不能与其他块混放(L1) */\n | { type: \"tool_reference\"; tool_name: string }\n\nexport type AnthropicAssistantBlock =\n | { type: \"text\"; text: string }\n | { type: \"thinking\"; thinking: string; signature: string }\n | { type: \"redacted_thinking\"; data: string }\n | { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> }\n\nexport type AnthropicMessage =\n | { role: \"user\"; content: AnthropicUserBlock[] }\n | { role: \"assistant\"; content: AnthropicAssistantBlock[] }\n | { role: \"system\"; content: { type: \"text\"; text: string }[] }\n\nexport interface AnthropicTool {\n name: string\n description: string\n input_schema: Record<string, unknown>\n /** 声明但不载入上下文,历史里出现 tool_reference 后才可见;不能与 cache_control 同在(L1) */\n defer_loading?: true\n cache_control?: AnthropicCacheControl\n}\n\n/** 发出去的请求体本体。宿主的 requestOptions 先铺、我们的字段后盖:model / messages / system / tools / stream 不可被覆盖 */\nexport interface AnthropicRequestBody extends Record<string, unknown> {\n model: string\n max_tokens: number\n system?: { type: \"text\"; text: string; cache_control?: AnthropicCacheControl }[]\n messages: AnthropicMessage[]\n tools?: AnthropicTool[]\n stream: true\n cache_control?: AnthropicCacheControl\n}\n\nexport interface AnthropicEncodeInput {\n ir: readonly IrItem[]\n events: readonly Event[]\n model: FetchModel\n capabilities: LoweringCapabilities\n tools?: readonly ToolSpec[]\n systemPrompt?: string\n requestOptions?: Record<string, unknown>\n}\n\n/** Anthropic 每个请求最多 4 个断点(顶层自动缓存也占一个),超出即 400 */\nexport const MAX_ANTHROPIC_BREAKPOINTS = 4\n\nconst IMAGE_OMITTED = \"[image omitted: this model does not accept images]\"\nconst EMPTY_NOTE =\n \"the content is empty and Anthropic rejects empty text blocks, so the whole message is not sent\"\nconst MOVED_NOTE =\n \"moved to just after the next user message (a system message must follow a user message, and be followed by an assistant message or the end)\"\nconst REF_TEXT_ASIDE_NOTE =\n \"the result's text segments move to a text block after this batch of tool_result in the same user message (a reference inside a tool_result cannot be mixed with text, and tool_result must come first in a user message)\"\nconst REF_UNTRUSTED_NOTE =\n \"a tool reference in an untrusted result does not take the native landing (untrusted content must not light up tools for the model), so it is expanded into text\"\nconst REF_UNBOUND_NOTE =\n \"the referenced tool is absent from this request's tool table (the provider validates references across the whole history and answers 400 if one is missing), so the definition is expanded into text\"\n\nfunction land(\n out: LandingRecord[],\n e: Event,\n kind: LandingRecord[\"kind\"],\n landing: string,\n ...notes: (string | undefined)[]\n) {\n const note = notes.filter((n): n is string => Boolean(n)).join(\"; \")\n out.push(\n note\n ? { eventId: e.id, type: e.type, kind, landing, note }\n : { eventId: e.id, type: e.type, kind, landing },\n )\n}\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v)\n}\n\n/** 内容段 → Anthropic 块;空文本段跳过(厂商不接受空文本块),图片按模型能力处置,工具引用展开成文本(原生落点在 tool_result 分支另行处理) */\nfunction blocksOf(\n parts: readonly ContentPart[],\n images: boolean,\n): { blocks: AnthropicContentBlock[]; imagesDropped: boolean } {\n let imagesDropped = false\n const blocks: AnthropicContentBlock[] = []\n for (const p of parts) {\n if (p.type === \"text\") {\n if (p.text.length > 0) blocks.push({ type: \"text\", text: p.text })\n } else if (p.type === \"tool_reference\") {\n blocks.push({ type: \"text\", text: renderToolReference(p) })\n } else if (images) {\n blocks.push({ type: \"image\", source: { type: \"base64\", media_type: p.mime, data: p.data } })\n } else {\n imagesDropped = true\n blocks.push({ type: \"text\", text: IMAGE_OMITTED })\n }\n }\n return { blocks, imagesDropped }\n}\n\ninterface PendingNote {\n item: Extract<IrItem, { kind: \"system_note\" }>\n /** 放出位置比时间线晚了至少一条 user 侧内容 */\n moved: boolean\n}\n\nexport function encodeAnthropicRequest(input: AnthropicEncodeInput): {\n body: AnthropicRequestBody\n landings: LandingRecord[]\n} {\n const { model, capabilities } = input\n const target: ModelOrigin = { provider: model.provider, api: model.api, model: model.id }\n const dialect = model.anthropic ?? {}\n /** 本次请求工具表里的名字(含 deferLoading 的):tool_reference 只能指向它们,否则厂商 400 */\n const boundNames = new Set((input.tools ?? []).map((t) => t.name))\n const messages: AnthropicMessage[] = []\n const landings: LandingRecord[] = []\n /** 正在攒的 user 消息(tool_result、用户消息、摘要并进同一条) */\n let userRun: AnthropicUserBlock[] | null = null\n /** 引用结果里的文本段:厂商要求同条 user 里 tool_result 排在最前,所以攒到这批 tool_result 之后再放(L1 spike 形态 D 实测) */\n let asides: AnthropicUserBlock[] = []\n const pendingNotes: PendingNote[] = []\n\n const openUser = (): AnthropicUserBlock[] => {\n if (!userRun) userRun = []\n // 有说明在等着放出,而这里又来了 user 侧内容:说明的位置就比时间线晚了\n for (const n of pendingNotes) n.moved = true\n return userRun\n }\n const closeUser = () => {\n if (userRun && asides.length > 0) {\n const lastResult = userRun.map((b) => b.type).lastIndexOf(\"tool_result\")\n userRun.splice(lastResult + 1, 0, ...asides)\n asides = []\n }\n if (userRun && userRun.length > 0) messages.push({ role: \"user\", content: userRun })\n userRun = null\n }\n /** 说明归位:下一条 assistant 之前或末尾。前一条是 user / system 才能放 system,否则退成 user 文本 */\n const flushNotes = () => {\n closeUser()\n if (pendingNotes.length === 0) return\n const last = messages[messages.length - 1]\n if (last && last.role !== \"assistant\") {\n for (const { item, moved } of pendingNotes) {\n messages.push({ role: \"system\", content: [{ type: \"text\", text: item.text }] })\n land(\n landings,\n item.event,\n item.escaped ? \"lossy\" : \"exact\",\n \"system\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n moved ? MOVED_NOTE : undefined,\n )\n }\n } else {\n const why = last\n ? \"the previous message is an assistant, and a system message must follow a user message\"\n : \"a system message cannot come first\"\n messages.push({\n role: \"user\",\n content: pendingNotes.map(({ item }) => ({\n type: \"text\",\n text: framedSystemNote(item.noteKind, item.text),\n })),\n })\n for (const { item } of pendingNotes) {\n land(\n landings,\n item.event,\n \"lossy\",\n \"user-role\",\n `${why}, so it is wrapped in a <system_note> tag and sent with the user role`,\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n }\n }\n pendingNotes.length = 0\n }\n\n for (const item of input.ir) {\n switch (item.kind) {\n case \"user\": {\n const c = blocksOf(item.parts, capabilities.images)\n if (c.blocks.length === 0) {\n land(landings, item.event, \"dropped\", \"none\", EMPTY_NOTE)\n break\n }\n openUser().push(...c.blocks)\n const lossy = item.deferred || item.escaped || c.imagesDropped\n land(\n landings,\n item.event,\n lossy ? \"lossy\" : \"exact\",\n \"user\",\n item.deferred\n ? `the user message sits between a tool call and its results; ${DEFERRED_NOTE}`\n : undefined,\n item.escaped ? ESCAPED_NOTE : undefined,\n c.imagesDropped\n ? \"the model takes no images, so they are replaced with placeholder text\"\n : undefined,\n )\n break\n }\n case \"tool_result\": {\n const refs = item.parts.filter(\n (p): p is Extract<ContentPart, { type: \"tool_reference\" }> => p.type === \"tool_reference\",\n )\n const block: AnthropicUserBlock = { type: \"tool_result\", tool_use_id: item.toolCallId }\n if (item.isError) block.is_error = true\n // 原生落点只给 system 信任的结果(tool_find / skill_read 这类宿主配置的内容):untrusted 工具输出不能替模型点亮工具\n const trusted = item.event.trust === \"system\"\n if (\n refs.length > 0 &&\n capabilities.deferredTools &&\n trusted &&\n refs.every((r) => boundNames.has(r.name))\n ) {\n // 原生落点:tool_result 里只放引用块,厂商就地展开;其余段(说明文字、untrusted 标记)放同条 user 里紧随其后\n block.content = refs.map((r) => ({ type: \"tool_reference\", tool_name: r.name }))\n const rest = blocksOf(\n item.parts.filter((p) => p.type !== \"tool_reference\"),\n capabilities.images,\n )\n openUser().push(block)\n asides.push(...rest.blocks)\n const aside = rest.blocks.length > 0\n land(\n landings,\n item.event,\n aside || item.escaped || rest.imagesDropped ? \"lossy\" : \"exact\",\n \"tool-reference\",\n aside ? REF_TEXT_ASIDE_NOTE : undefined,\n rest.imagesDropped\n ? \"the model takes no images, so they are replaced with placeholder text\"\n : undefined,\n item.escaped ? ESCAPED_NOTE : undefined,\n )\n break\n }\n const c = blocksOf(item.parts, capabilities.images)\n if (c.blocks.length > 0) block.content = c.blocks\n openUser().push(block)\n const unbound = refs.length > 0 && capabilities.deferredTools && trusted\n const untrustedRefs = refs.length > 0 && capabilities.deferredTools && !trusted\n const lossy = item.escaped || c.imagesDropped || unbound\n land(\n landings,\n item.event,\n lossy ? \"lossy\" : \"exact\",\n \"tool_result\",\n unbound ? REF_UNBOUND_NOTE : undefined,\n untrustedRefs ? REF_UNTRUSTED_NOTE : undefined,\n c.imagesDropped\n ? \"the model takes no images, so they are replaced with placeholder text\"\n : undefined,\n item.escaped ? ESCAPED_NOTE : undefined,\n )\n break\n }\n case \"compaction\": {\n openUser().push({ type: \"text\", text: framedSummary(item.text) })\n land(\n landings,\n item.event,\n \"lossy\",\n \"user-text\",\n \"the summary is rendered as user-role text\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n break\n }\n case \"system_note\": {\n if (capabilities.midConversationSystem && !item.directive) {\n pendingNotes.push({ item, moved: false })\n } else {\n openUser().push({ type: \"text\", text: framedSystemNote(item.noteKind, item.text) })\n land(\n landings,\n item.event,\n \"lossy\",\n \"user-role\",\n item.directive\n ? DIRECTIVE_NOTE\n : \"the model does not support mid-conversation system, so it is wrapped in a <system_note> tag and sent with the user role\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n }\n break\n }\n case \"assistant\": {\n const content = assistantBlocks(item.blocks, item.origin, target, landings)\n // 全部块都没法下发(如只有无签名 thinking)时整条不发(空 content 的 assistant 厂商 400),user 侧内容继续并进同一条\n if (content.length === 0) break\n flushNotes()\n messages.push({ role: \"assistant\", content })\n break\n }\n case \"dropped\":\n land(landings, item.event, \"dropped\", \"none\", item.note)\n break\n }\n }\n flushNotes()\n\n const ro = input.requestOptions ?? {}\n // 宿主选项里的 system / tools 一律不透传:这两个字段只由事件与工具表决定,没有时也不能让宿主塞一份进来\n const { system: _system, tools: _tools, ...passthrough } = ro\n const body: AnthropicRequestBody = {\n ...passthrough,\n model: model.id,\n max_tokens: typeof ro.max_tokens === \"number\" ? ro.max_tokens : model.maxOutputTokens,\n messages,\n stream: true,\n }\n if (input.systemPrompt) body.system = [{ type: \"text\", text: input.systemPrompt }]\n if (input.tools && input.tools.length > 0) {\n const tools = encodeTools(input.tools, capabilities.deferredTools)\n if (tools.length > 0) body.tools = tools\n }\n if (dialect.cacheBreakpoints !== false) placeCacheBreakpoints(body, dialect)\n return { body, landings: orderLandings(input.events, landings) }\n}\n\n/**\n * 一轮模型输出 → assistant 的内容块。\n * - 正文:Anthropic 接受多个 text 块,逐段原样(空段跳过并声明);\n * - thinking:signature 在且来源同家(provider + api)→ thinking 块;redacted → redacted_thinking(data);\n * 无签名或别家 → dropped。同家不同型号(换代、日期后缀、网关改名)照发并备注,能否读由厂商定(读不了它会丢弃、不计费);\n * - tool_call:input 必须是对象,不是对象的包成 { value }(lossy wrapped-args)。\n */\nfunction assistantBlocks(\n blocks: readonly IrBlock[],\n origin: ModelOrigin,\n target: ModelOrigin,\n landings: LandingRecord[],\n): AnthropicAssistantBlock[] {\n const out: AnthropicAssistantBlock[] = []\n const foreign = foreignOrigin(origin, target)\n for (const b of blocks) {\n switch (b.type) {\n case \"text\":\n if (b.text.length === 0) {\n land(landings, b.event, \"dropped\", \"none\", EMPTY_NOTE)\n break\n }\n out.push({ type: \"text\", text: b.text })\n land(landings, b.event, \"exact\", \"assistant-text\")\n break\n case \"thinking\": {\n const signature = typeof b.replay.thinkingSignature === \"string\" ? b.replay.thinkingSignature : \"\"\n if (foreign) {\n land(\n landings,\n b.event,\n \"dropped\",\n \"none\",\n `thinking from ${origin.provider}/${origin.api} has no signature of its own, so it is not replayed`,\n )\n break\n }\n if (signature.length === 0) {\n land(\n landings,\n b.event,\n \"dropped\",\n \"none\",\n \"thinking with no signature (a broken stream) is rejected by the provider, so it is not replayed\",\n )\n break\n }\n // 签名绑定产出它的模型:换了型号照发厂商回 400(2026-09-15 eval resume fixture 实测,Sonnet 5 收到别的模型的签名)\n if (origin.model !== target.model) {\n land(\n landings,\n b.event,\n \"dropped\",\n \"none\",\n `the signature comes from ${origin.model}, but this request targets ${target.model}; a signature is only valid for the model that produced it, so the block is not replayed`,\n )\n break\n }\n if (b.replay.redacted === true) {\n out.push({ type: \"redacted_thinking\", data: signature })\n land(\n landings,\n b.event,\n \"exact\",\n \"redacted-thinking\",\n \"redacted_thinking is replayed verbatim through its data\",\n )\n } else {\n out.push({ type: \"thinking\", thinking: b.text, signature })\n land(landings, b.event, \"exact\", \"thinking-block\")\n }\n break\n }\n case \"tool_call\": {\n const wrapped = !isPlainObject(b.args)\n out.push({\n type: \"tool_use\",\n id: b.id,\n name: b.name,\n input: wrapped ? { value: b.args } : (b.args as Record<string, unknown>),\n })\n if (wrapped)\n land(\n landings,\n b.event,\n \"lossy\",\n \"wrapped-args\",\n \"non-object arguments are wrapped as { value } (tool_use.input must be an object)\",\n )\n else land(landings, b.event, \"exact\", \"tool_use\")\n break\n }\n }\n }\n return out\n}\n\n/**\n * 工具表 → tools 块(L1)。有原生能力:deferLoading → `defer_loading: true`,但全表都延迟时厂商 400,退成都不延迟;\n * 无原生能力:deferLoading 的工具直接不发(模型看不见也调不了,与过滤同义)。\n */\nexport function encodeTools(specs: readonly ToolSpec[], deferredTools: boolean): AnthropicTool[] {\n const shown = deferredTools ? specs : specs.filter((t) => t.deferLoading !== true)\n const allDeferred = deferredTools && shown.length > 0 && shown.every((t) => t.deferLoading === true)\n return shown.map((t): AnthropicTool => {\n const tool: AnthropicTool = { name: t.name, description: t.description, input_schema: t.inputSchema }\n if (deferredTools && t.deferLoading === true && !allDeferred) tool.defer_loading = true\n return tool\n })\n}\n\n/** 数请求里块级 cache_control 的个数:system 数组、tools 数组、messages 的内容块 */\nexport function countBlockBreakpoints(body: AnthropicRequestBody): number {\n const has = (b: unknown) => typeof b === \"object\" && b !== null && \"cache_control\" in b\n let n = 0\n for (const s of body.system ?? []) if (has(s)) n++\n for (const t of body.tools ?? []) if (has(t)) n++\n for (const m of body.messages) for (const b of m.content) if (has(b)) n++\n return n\n}\n\n/**\n * 三处断点:system 末块、tools 末项、最后一条 user 末块。末条是 system(说明殿后)时按处置模式:\n * automatic → 顶层 cache_control(宿主 requestOptions 已给顶层的不覆盖);previous-user → 找最后一条 user;drop → 不打。\n * 无论哪种,块级 + 顶层总数不超过 4。\n */\nfunction placeCacheBreakpoints(body: AnthropicRequestBody, dialect: NonNullable<FetchModel[\"anthropic\"]>) {\n const cc: AnthropicCacheControl =\n dialect.cacheTtl === \"1h\" ? { type: \"ephemeral\", ttl: \"1h\" } : { type: \"ephemeral\" }\n const budget = () => MAX_ANTHROPIC_BREAKPOINTS - countBlockBreakpoints(body) - (body.cache_control ? 1 : 0)\n\n const lastSystem = body.system?.[body.system.length - 1]\n if (lastSystem && budget() > 0) lastSystem.cache_control = cc\n // defer_loading 的工具不能带 cache_control(厂商 400),断点打在最后一个非延迟工具上\n const lastTool = [...(body.tools ?? [])].reverse().find((t) => t.defer_loading !== true)\n if (lastTool && budget() > 0) lastTool.cache_control = cc\n\n const last = body.messages[body.messages.length - 1]\n if (!last) return\n const markLastUser = (m: AnthropicMessage | undefined) => {\n if (m?.role !== \"user\") return\n const block = m.content[m.content.length - 1]\n if (block && budget() > 0) block.cache_control = cc\n }\n if (last.role === \"user\") {\n markLastUser(last)\n return\n }\n if (last.role !== \"system\") return\n switch (dialect.midSystemCacheBreakpoint ?? \"automatic\") {\n case \"automatic\":\n if (body.cache_control === undefined && budget() > 0) body.cache_control = cc\n break\n case \"previous-user\":\n markLastUser([...body.messages].reverse().find((m) => m.role === \"user\"))\n break\n case \"drop\":\n break\n }\n}\n","/**\n * 事件 → 中间表示(IR):三条线协议共用的一趟遍历。\n *\n * 这一步只做与协议无关的事:\n * 1. **分组**——连续的 model 事件(thinking / text / tool_call)合成一条 assistant 轮,遇到非 model 事件或来源变了就收口;\n * 2. **后移**——\"同批 tool_result 必须紧跟 tool_use\"是厂商硬规则,而时间线里说明、摘要、用户插话都可能落在两者之间;\n * 结果没到齐时它们先攒着,到齐后按原顺序放出(`deferred: true`)。日志顺序不动(宪法二),只在翻译产物里挪位;\n * 3. **trust 标注**——untrusted 内容包 `<untrusted source=…>`(core 的同一份纯函数),转义过的记 `escaped`。\n *\n * 每种事件落到线协议的哪个位置、算 exact 还是 lossy,由各协议的 encoder 决定并记 LandingRecord;IR 只提供判定所需的事实。\n * 输出顺序就是线上顺序;`orderLandings` 把 encoder 记下的落点按输入事件顺序排回去(LoweredRequest.landings 的契约)。\n */\nimport {\n type ContentPart,\n type CoreEvent,\n type Event,\n type LandingRecord,\n markUntrusted,\n markUntrustedText,\n needsUntrustedMark,\n type SystemNotePayload,\n untrustedSourceOf,\n} from \"@reinsjs/core\"\n\n/** 模型事件 replay 里记录的来源,产出与回放两头共用(与 lowering-pi 同字段,两条路线的事件可互换) */\nexport interface ModelOrigin {\n provider: string\n api: string\n model: string\n}\n\nexport type IrBlock =\n | { type: \"thinking\"; event: Event; text: string; replay: Record<string, unknown> }\n | { type: \"text\"; event: Event; text: string; replay: Record<string, unknown> }\n | {\n type: \"tool_call\"\n event: Event\n id: string\n name: string\n args: unknown\n replay: Record<string, unknown>\n }\n\nexport type IrItem =\n | { kind: \"user\"; event: Event; parts: ContentPart[]; escaped: boolean; deferred: boolean }\n | { kind: \"assistant\"; origin: ModelOrigin; blocks: IrBlock[]; at: number }\n | {\n kind: \"tool_result\"\n event: Event\n toolCallId: string\n name: string\n parts: ContentPart[]\n isError: boolean\n escaped: boolean\n /** 内容按 untrusted 包过标记时的来源标签(`tool:<name>`);没包就没有。Chat 线上浮图片时据此给附件同样标注 */\n untrustedSource?: string\n }\n | {\n kind: \"system_note\"\n event: Event\n noteKind: SystemNotePayload[\"kind\"]\n /** 注入者声明是要模型去做的指令:三条线都以带标签的 user 文本送达,不看 midConversationSystem */\n directive: boolean\n text: string\n escaped: boolean\n deferred: boolean\n }\n | { kind: \"compaction\"; event: Event; text: string; escaped: boolean; deferred: boolean }\n /** 运维事件与 ext.*:不下发,encoder 只记落点 */\n | { kind: \"dropped\"; event: Event; note: string }\n\nexport interface IrInput {\n events: readonly Event[]\n /** 当前请求的目标模型:replay 没写来源的模型事件按它算 */\n target: ModelOrigin\n /** trust=untrusted 的内容包 <untrusted source=…>(§14)。缺省 true;关掉是宿主自担风险 */\n trustMarkers?: boolean\n}\n\nexport const DEFERRED_NOTE =\n \"moved after that batch of tool results (tool results must immediately follow their call)\"\nexport const ESCAPED_NOTE = \"an early-closing </untrusted inside untrusted content was escaped\"\nexport const NOT_SENT_NOTE = \"operational event, not sent (the default projection already filters it)\"\n\nfunction originOf(replay: Record<string, unknown> | undefined, fallback: ModelOrigin): ModelOrigin {\n const r = (replay ?? {}) as Partial<ModelOrigin>\n return {\n provider: typeof r.provider === \"string\" ? r.provider : fallback.provider,\n api: typeof r.api === \"string\" ? r.api : fallback.api,\n model: typeof r.model === \"string\" ? r.model : fallback.model,\n }\n}\n\nexport function sameOrigin(a: ModelOrigin, b: ModelOrigin): boolean {\n return a.provider === b.provider && a.api === b.api && a.model === b.model\n}\n\n/**\n * 是否来自别家:只比 provider 与 api。响应里报告的模型 id 常与请求的不同(日期后缀、别名、网关改名),\n * 同家同协议下回放数据仍可用,不算有损。\n */\nexport function foreignOrigin(a: ModelOrigin, target: ModelOrigin): boolean {\n return a.provider !== target.provider || a.api !== target.api\n}\n\nexport function eventsToIr(input: IrInput): IrItem[] {\n const { target } = input\n const trustMarkers = input.trustMarkers !== false\n const items: IrItem[] = []\n let group: { origin: ModelOrigin; blocks: IrBlock[]; at: number } | null = null\n /** 已下发 tool_call、结果还没到的调用 id;非空即\"这批结果没到齐\" */\n const awaiting = new Set<string>()\n const deferred: IrItem[] = []\n\n const content = (e: Event, parts: readonly ContentPart[]): { parts: ContentPart[]; escaped: boolean } => {\n if (!trustMarkers || !needsUntrustedMark(e)) return { parts: [...parts], escaped: false }\n return markUntrusted(parts, untrustedSourceOf(e))\n }\n const text = (e: Event, s: string): { text: string; escaped: boolean } => {\n if (!trustMarkers || !needsUntrustedMark(e)) return { text: s, escaped: false }\n return markUntrustedText(s, untrustedSourceOf(e))\n }\n const release = () => {\n for (const d of deferred) items.push(d)\n deferred.length = 0\n }\n /** 说明 / 摘要 / 用户消息:结果没到齐就先攒着,item 上标 deferred */\n const place = (item: Extract<IrItem, { deferred: boolean }>) => {\n if (awaiting.size > 0) {\n deferred.push({ ...item, deferred: true })\n return\n }\n items.push(item)\n }\n const flush = () => {\n if (!group) return\n items.push({ kind: \"assistant\", origin: group.origin, blocks: group.blocks, at: group.at })\n for (const b of group.blocks) if (b.type === \"tool_call\") awaiting.add(b.id)\n group = null\n }\n /** 新的模型输出到来:这批调用的结果不会再来了(视图被切在结果之前),后移的一切放出 */\n const settle = () => {\n awaiting.clear()\n release()\n }\n const assistant = (e: Event, origin: ModelOrigin) => {\n if (group && !sameOrigin(group.origin, origin)) flush()\n if (!group) {\n settle()\n group = { origin, blocks: [], at: e.at }\n }\n return group\n }\n\n for (const raw of input.events) {\n const e = raw as CoreEvent\n switch (e.type) {\n case \"core.user_message\": {\n flush()\n const c = content(e, e.payload.content)\n place({ kind: \"user\", event: e, parts: c.parts, escaped: c.escaped, deferred: false })\n break\n }\n case \"core.model_thinking\": {\n assistant(e, originOf(e.replay, target)).blocks.push({\n type: \"thinking\",\n event: e,\n text: e.payload.text,\n replay: e.replay ?? {},\n })\n break\n }\n case \"core.model_text\": {\n assistant(e, originOf(e.replay, target)).blocks.push({\n type: \"text\",\n event: e,\n text: e.payload.text,\n replay: e.replay ?? {},\n })\n break\n }\n case \"core.tool_call\": {\n assistant(e, originOf(e.replay, target)).blocks.push({\n type: \"tool_call\",\n event: e,\n id: e.payload.toolCallId,\n name: e.payload.name,\n args: e.payload.args,\n replay: e.replay ?? {},\n })\n break\n }\n case \"core.tool_result\": {\n flush()\n const c = content(e, e.payload.content)\n items.push({\n kind: \"tool_result\",\n event: e,\n toolCallId: e.payload.toolCallId,\n name: e.payload.name,\n parts: c.parts,\n isError: e.payload.isError,\n escaped: c.escaped,\n ...(trustMarkers && needsUntrustedMark(e) ? { untrustedSource: untrustedSourceOf(e) } : {}),\n })\n awaiting.delete(e.payload.toolCallId)\n if (awaiting.size === 0) release()\n break\n }\n case \"core.system_note\": {\n flush()\n const t = text(e, e.payload.text)\n place({\n kind: \"system_note\",\n event: e,\n noteKind: e.payload.kind,\n directive: e.payload.directive === true,\n text: t.text,\n escaped: t.escaped,\n deferred: false,\n })\n break\n }\n case \"core.compaction\": {\n flush()\n const t = text(e, e.payload.summary)\n place({ kind: \"compaction\", event: e, text: t.text, escaped: t.escaped, deferred: false })\n break\n }\n case \"core.approval_request\":\n case \"core.approval_decision\":\n case \"core.run_paused\":\n case \"core.run_resumed\":\n case \"core.budget_usage\":\n case \"core.memory_op\":\n case \"core.handoff\":\n case \"core.tools_bound\":\n case \"core.error\":\n // 不下发的事件也不打断 assistant 分组:模型看不见它,它就不该切开模型的一轮输出\n items.push({ kind: \"dropped\", event: e, note: NOT_SENT_NOTE })\n break\n default:\n items.push({ kind: \"dropped\", event: raw, note: `no general landing for ${raw.type}` })\n }\n }\n flush()\n settle()\n return items\n}\n\n/** 把 encoder 记下的落点按输入事件顺序排回去:LoweredRequest.landings 承诺\"每条输入事件一条记录,顺序与输入一致\" */\nexport function orderLandings(events: readonly Event[], landings: readonly LandingRecord[]): LandingRecord[] {\n const index = new Map<string, number>()\n for (const [i, e] of events.entries()) index.set(e.id, i)\n return [...landings].sort((a, b) => (index.get(a.eventId) ?? 0) - (index.get(b.eventId) ?? 0))\n}\n","/**\n * 脑子说明与摘要落成文本时的包装。文案与 @reinsjs/lowering-pi 保持一致(模型在两条降级路线上看到同样的框),\n * 但两包互不依赖,这里各留一份——它们不是\"同一个值两处比对\",只是同一段提示语。\n */\nimport type { SystemNotePayload } from \"@reinsjs/core\"\n\n/** 不支持中途 system 的模型:用标签框住走 user 角色,让模型知道这不是用户说的 */\nexport function framedSystemNote(kind: SystemNotePayload[\"kind\"], text: string): string {\n return `<system_note kind=\"${kind}\">\\n${text}\\n</system_note>`\n}\n\n/**\n * 指令类说明(`SystemNotePayload.directive`)的落点说明:上游接受中途 system 也走带标签的 user 文本——\n * 有的上游收下中途 system 却不执行其中的指令(踩坑 42),user 文本两条实测线路都照做\n */\nexport const DIRECTIVE_NOTE =\n \"the note is a directive the model must act on, so it is wrapped in a <system_note> tag and sent with the user role\"\n\n/** compaction 摘要以 user 文本呈现时的前缀 */\nexport function framedSummary(summary: string): string {\n return `[Summary of earlier conversation]\\n${summary}`\n}\n","/**\n * 按模型声明能力(技术方案 §11)。脑子模块只看这些布尔值,不看模型名。\n */\nimport type { LoweringCapabilities } from \"@reinsjs/core\"\nimport type { FetchModel } from \"./models.js\"\n\n/**\n * S1 / F0 核实:Anthropic 带正文的中途 system 消息支持 Fable 5.x / Mythos 5.x / Opus 5 / Opus 4.8;Sonnet 5、Haiku 4.5 及更早\n * 回厂商原文 400。按 id 前缀匹配,带日期后缀的 id 也能命中;第三方 Anthropic 协议上游(如 DeepSeek 兼容端口)由宿主声明。\n */\nconst ANTHROPIC_MID_SYSTEM = /^claude-(fable-5|mythos-5|opus-5|opus-4-8)(-|$)/\n\n/** 服务端 task budget 仅 Opus 5 与 Fable 5.1(DECISIONS 2026-09-08) */\nconst ANTHROPIC_TASK_BUDGET = /^claude-(opus-5|fable-5-1)(-|$)/\n\nexport function capabilitiesOf(model: FetchModel): LoweringCapabilities {\n const base = {\n api: model.api,\n parallelTools: true,\n images: model.images ?? false,\n contextWindow: model.contextWindow,\n maxOutputTokens: model.maxOutputTokens,\n taskBudget: false,\n // 只有 Anthropic 线有 defer_loading / tool_reference 的原生落点(L1);其余线引用段展开成文本、deferLoading 的工具不发\n deferredTools: false,\n }\n switch (model.api) {\n case \"openai-chat\":\n return {\n ...base,\n // Chat 的 system 消息可出现在任意位置(OpenAI 官方与 DeepSeek 实测到达),宿主可对特殊上游关掉\n midConversationSystem: model.midConversationSystem ?? true,\n // 官方 Chat 没有 thinking 回放位;只有 DeepSeek 方言的 reasoning_content 能把思考原样回填\n thinkingReplay: model.reasoning && model.chat?.reasoningContent === true,\n }\n case \"anthropic-messages\":\n return {\n ...base,\n midConversationSystem: model.midConversationSystem ?? ANTHROPIC_MID_SYSTEM.test(model.id),\n // 带 signature 的 thinking 块可原样回放(F0 A7b 实测接受、伪造签名 400)\n thinkingReplay: model.reasoning,\n taskBudget: ANTHROPIC_TASK_BUDGET.test(model.id),\n // 官方模型 Haiku 4.5 起都支持(L1 spike 实测 Haiku 4.5 / Opus 5);第三方兼容上游由宿主声明\n deferredTools: model.anthropic?.deferredTools ?? model.provider === \"anthropic\",\n }\n case \"openai-responses\":\n return {\n ...base,\n // input 项里 developer / system 消息可出现在任意位置(F0 R3 实测中途 developer 到达),无归位需求\n midConversationSystem: model.midConversationSystem ?? true,\n // reasoning 项以 encrypted_content 原样回放(F0 R3 接受、伪造 400);关掉 encryptedReasoning 就没有可回放的东西\n thinkingReplay: model.reasoning && model.responses?.encryptedReasoning !== false,\n }\n default:\n return { ...base, midConversationSystem: model.midConversationSystem ?? false, thinkingReplay: false }\n }\n}\n","/**\n * Chat Completions 流 → 事件草稿。\n *\n * 只在流收尾时按拼好的块产出草稿(与 lowering-pi 同策略:日志里只存完整块),增量经 onDelta 给 UI。\n * 中断或出错时把已拼出的部分内容也交出去——日志要记录\"发生过什么\",是否继续由循环决定。\n *\n * chunk 形状(OpenAI 规范 + DeepSeek 已验证的 `delta.reasoning_content`):\n * choices[0].delta.{ content, reasoning_content, tool_calls[{ index, id?, function: { name?, arguments? } }] }\n * choices[0].finish_reason 在末块;usage 在带 stream_options.include_usage 的最后一个 chunk(choices 可能为空数组)\n * `data: [DONE]` 收尾。未知字段一律忽略(CF 网关会多个 \"p\",OpenAI 常带 system_fingerprint / obfuscation)。\n */\nimport type { CoreEventDraft, LoweringOutcome, LoweringStreamContext, TokenUsage } from \"@reinsjs/core\"\nimport type { ModelOrigin } from \"../ir.js\"\nimport type { SseMessage } from \"../sse.js\"\nimport { costOf, type ModelCost } from \"../usage.js\"\n\ninterface ChatChunk {\n model?: unknown\n choices?: {\n delta?: {\n content?: unknown\n reasoning_content?: unknown\n tool_calls?: { index?: unknown; id?: unknown; function?: { name?: unknown; arguments?: unknown } }[]\n }\n finish_reason?: unknown\n }[]\n usage?: ChatUsage | null\n}\n\ninterface ChatUsage {\n prompt_tokens?: unknown\n completion_tokens?: unknown\n prompt_tokens_details?: { cached_tokens?: unknown } | null\n /** DeepSeek 原生字段,与 prompt_tokens_details.cached_tokens 同值 */\n prompt_cache_hit_tokens?: unknown\n}\n\nexport interface ChatStreamInput {\n messages: AsyncIterable<SseMessage>\n origin: ModelOrigin\n cost?: ModelCost\n /** 宿主中止信号:读流被中止时据此判\"aborted\"还是本地超时 */\n signal?: AbortSignal\n timedOut?: () => boolean\n timeoutMs?: number\n}\n\n/** 拼装中的一轮输出 */\nclass ChatAssembly {\n reasoning = \"\"\n text = \"\"\n readonly calls = new Map<number, { id: string; name: string; args: string }>()\n finish: string | undefined\n usage: ChatUsage | undefined\n responseModel: string | undefined\n /** onDelta 用的块序号:按首次出现顺序分配 */\n private readonly blockIndex = new Map<string, number>()\n\n indexOf(key: string): number {\n let i = this.blockIndex.get(key)\n if (i === undefined) {\n i = this.blockIndex.size\n this.blockIndex.set(key, i)\n }\n return i\n }\n\n drafts(origin: ModelOrigin): CoreEventDraft[] {\n const out: CoreEventDraft[] = []\n const replay: Record<string, unknown> = { ...origin }\n if (this.reasoning.length > 0)\n out.push({ type: \"core.model_thinking\", actor: \"model\", payload: { text: this.reasoning }, replay })\n if (this.text.length > 0)\n out.push({ type: \"core.model_text\", actor: \"model\", payload: { text: this.text }, replay })\n for (const [, c] of [...this.calls.entries()].sort((a, b) => a[0] - b[0])) {\n out.push({\n type: \"core.tool_call\",\n actor: \"model\",\n payload: { toolCallId: c.id, name: c.name, args: parseArguments(c.args) },\n replay,\n })\n }\n return out\n }\n}\n\n/** 入参 JSON 解析不了就原样存字符串:工具校验会把错误告诉模型,写侧再原样送回(to-request.ts argumentsOf) */\nfunction parseArguments(raw: string): unknown {\n if (raw.trim() === \"\") return {}\n try {\n return JSON.parse(raw) as unknown\n } catch {\n return raw\n }\n}\n\nfunction num(v: unknown): number | undefined {\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined\n}\n\n/** OpenAI 的 prompt_tokens 含缓存命中部分;core 的 input 是未命中数,所以要减掉 */\nexport function usageOf(u: ChatUsage | undefined): TokenUsage {\n const prompt = num(u?.prompt_tokens) ?? 0\n const cached = num(u?.prompt_tokens_details?.cached_tokens) ?? num(u?.prompt_cache_hit_tokens) ?? 0\n const usage: TokenUsage = { input: Math.max(0, prompt - cached), output: num(u?.completion_tokens) ?? 0 }\n if (cached > 0) usage.cacheRead = cached\n return usage\n}\n\nfunction apply(chunk: ChatChunk, a: ChatAssembly, ctx: LoweringStreamContext) {\n if (typeof chunk.model === \"string\" && chunk.model !== \"\") a.responseModel = chunk.model\n if (chunk.usage && typeof chunk.usage === \"object\") a.usage = chunk.usage\n const choice = chunk.choices?.[0]\n if (!choice) return\n const d = choice.delta\n if (d) {\n if (typeof d.reasoning_content === \"string\" && d.reasoning_content !== \"\") {\n a.reasoning += d.reasoning_content\n ctx.onDelta?.({ kind: \"thinking\", index: a.indexOf(\"thinking\"), delta: d.reasoning_content })\n }\n if (typeof d.content === \"string\" && d.content !== \"\") {\n a.text += d.content\n ctx.onDelta?.({ kind: \"text\", index: a.indexOf(\"text\"), delta: d.content })\n }\n for (const tc of d.tool_calls ?? []) {\n const index = num(tc.index) ?? 0\n let call = a.calls.get(index)\n if (!call) {\n call = { id: \"\", name: \"\", args: \"\" }\n a.calls.set(index, call)\n }\n if (typeof tc.id === \"string\" && tc.id !== \"\") call.id = tc.id\n if (typeof tc.function?.name === \"string\" && tc.function.name !== \"\") call.name = tc.function.name\n if (typeof tc.function?.arguments === \"string\" && tc.function.arguments !== \"\") {\n call.args += tc.function.arguments\n ctx.onDelta?.({ kind: \"tool_args\", index: a.indexOf(`tool:${index}`), delta: tc.function.arguments })\n }\n }\n }\n if (typeof choice.finish_reason === \"string\") a.finish = choice.finish_reason\n}\n\n/**\n * 停止原因:有 tool_call 就是 toolUse(强制 tool_choice 时官方 finish_reason 是 stop,F0 实测);\n * content_filter / insufficient_system_resource(DeepSeek 服务端资源不足)/ aborted(服务端中止)都是\"没正常说完\",\n * 记 error 并把原因写进 errorMessage——core 只按文案判是否重试,资源不足那条写明 temporarily unavailable 让它值得再试。\n */\nfunction outcomeOf(a: ChatAssembly, cost: ModelCost | undefined, sawDone: boolean): LoweringOutcome {\n const usage = usageOf(a.usage)\n const out: LoweringOutcome = { stopReason: \"stop\", usage }\n const c = costOf(usage, cost)\n if (c !== undefined) out.costUsd = c\n if (a.responseModel) out.responseModel = a.responseModel\n\n if (a.calls.size > 0) out.stopReason = \"toolUse\"\n else {\n switch (a.finish) {\n case \"stop\":\n case \"tool_calls\":\n break\n case \"length\":\n out.stopReason = \"length\"\n break\n case \"content_filter\":\n out.stopReason = \"error\"\n out.errorMessage = \"finish_reason=content_filter: the provider's content filter cut this output short\"\n break\n case \"insufficient_system_resource\":\n out.stopReason = \"error\"\n out.errorMessage = \"finish_reason=insufficient_system_resource (service temporarily unavailable)\"\n break\n case \"aborted\":\n out.stopReason = \"error\"\n out.errorMessage = \"finish_reason=aborted: the server aborted this generation\"\n break\n case undefined:\n if (!sawDone || a.text.length === 0) {\n out.stopReason = \"error\"\n out.errorMessage = \"stream ended before finish_reason\"\n }\n break\n default:\n break\n }\n }\n return out\n}\n\nexport async function* consumeChatStream(\n input: ChatStreamInput,\n ctx: LoweringStreamContext = {},\n): AsyncGenerator<CoreEventDraft, LoweringOutcome> {\n const a = new ChatAssembly()\n let sawDone = false\n try {\n for await (const msg of input.messages) {\n if (msg.data === \"[DONE]\") {\n sawDone = true\n break\n }\n let chunk: ChatChunk\n try {\n chunk = JSON.parse(msg.data) as ChatChunk\n } catch {\n // 解析不了的一帧:跳过而不是整条流作废,末尾若因此缺 finish_reason 会记 error\n continue\n }\n apply(chunk, a, ctx)\n }\n } catch (err) {\n yield* a.drafts(input.origin)\n const base = outcomeOf(a, input.cost, false)\n if (input.signal?.aborted) return { ...base, stopReason: \"aborted\", errorMessage: \"aborted by host\" }\n if (input.timedOut?.())\n return {\n ...base,\n stopReason: \"error\",\n errorMessage: `request timed out after ${input.timeoutMs ?? \"?\"}ms (stream ended before finish_reason)`,\n }\n return { ...base, stopReason: \"error\", errorMessage: errorText(err) }\n }\n yield* a.drafts(input.origin)\n return outcomeOf(a, input.cost, sawDone)\n}\n\nfunction errorText(err: unknown): string {\n if (err instanceof Error) {\n const cause = (err as { cause?: { code?: unknown; message?: unknown } }).cause\n const code = typeof cause?.code === \"string\" ? ` (${cause.code})` : \"\"\n return `${err.message}${code}`\n }\n return String(err)\n}\n","/**\n * IR → OpenAI Chat Completions 请求体,并为每条事件记落点。\n *\n * 严格按 OpenAI 官方规范(Boss 定),方言只收 DeepSeek 已验证的 `reasoning_content`(见 models.ts ChatDialect)。\n * 角色只有 system / user / assistant / tool 四种,这是全包唯一出现\"角色\"的地方之一(宪法二)。\n *\n * Chat 线天然有损、矩阵里如实声明:\n * - thinking 没有回放位(无签名、无加密项)——除 DeepSeek 方言外 dropped;\n * - 没有显式缓存断点——什么都不做(厂商自动前缀缓存);\n * - assistant 的 content 是单个字符串(DeepSeek 只接受 string | null)——同一轮多段正文合并,lossy(merged-text);\n * - tool 消息没有错误位——isError 以文本前缀表达,lossy;\n * - tool 消息只收文本——模型收图时图片上浮到同批 tool 消息之后的一条 user 消息(lossy:换了位置与角色),\n * 不收图或方言关掉上浮时换成占位文本,lossy。\n */\nimport {\n type ContentPart,\n type Event,\n type LandingRecord,\n type LoweringCapabilities,\n markUntrusted,\n renderToolReference,\n type ToolSpec,\n} from \"@reinsjs/core\"\nimport {\n DEFERRED_NOTE,\n ESCAPED_NOTE,\n foreignOrigin,\n type IrBlock,\n type IrItem,\n orderLandings,\n} from \"../ir.js\"\nimport type { FetchModel } from \"../models.js\"\nimport { DIRECTIVE_NOTE, framedSummary, framedSystemNote } from \"../notes.js\"\n\nexport type ChatContentPart =\n | { type: \"text\"; text: string }\n | { type: \"image_url\"; image_url: { url: string } }\n\nexport interface ChatToolCall {\n id: string\n type: \"function\"\n function: { name: string; arguments: string }\n}\n\nexport type ChatMessage =\n | { role: \"system\"; content: string }\n | { role: \"user\"; content: string | ChatContentPart[] }\n | { role: \"assistant\"; content: string | null; tool_calls?: ChatToolCall[]; reasoning_content?: string }\n | { role: \"tool\"; tool_call_id: string; content: string }\n\nexport interface ChatTool {\n type: \"function\"\n function: { name: string; description: string; parameters: Record<string, unknown> }\n}\n\n/** 发出去的请求体本体。宿主的 requestOptions 先铺、我们的字段后盖:messages / tools / model / stream 不可被覆盖 */\nexport interface ChatRequestBody extends Record<string, unknown> {\n model: string\n messages: ChatMessage[]\n tools?: ChatTool[]\n stream: true\n stream_options: { include_usage: true }\n}\n\nexport interface ChatEncodeInput {\n ir: readonly IrItem[]\n events: readonly Event[]\n model: FetchModel\n capabilities: LoweringCapabilities\n tools?: readonly ToolSpec[]\n systemPrompt?: string\n requestOptions?: Record<string, unknown>\n}\n\nconst IMAGE_OMITTED = \"[image omitted: this model does not accept images]\"\nconst TOOL_IMAGE_OMITTED = \"[image omitted: tool messages carry text only]\"\nconst toolImagePointer = (n: number) => `[image ${n} attached in the next user message]`\nconst ERROR_PREFIX = \"[tool error]\\n\"\n\nfunction land(\n out: LandingRecord[],\n e: Event,\n kind: LandingRecord[\"kind\"],\n landing: string,\n ...notes: (string | undefined)[]\n) {\n const note = notes.filter((n): n is string => Boolean(n)).join(\"; \")\n out.push(\n note\n ? { eventId: e.id, type: e.type, kind, landing, note }\n : { eventId: e.id, type: e.type, kind, landing },\n )\n}\n\n/** 用户内容:只有一段文本就用字符串(最兼容),否则用 content parts;图片走 data: URL */\nfunction userContent(\n parts: readonly ContentPart[],\n images: boolean,\n): { content: string | ChatContentPart[]; imagesDropped: boolean } {\n let imagesDropped = false\n const out: ChatContentPart[] = parts.map((p) => {\n if (p.type === \"text\") return { type: \"text\", text: p.text }\n if (p.type === \"tool_reference\") return { type: \"text\", text: renderToolReference(p) }\n if (!images) {\n imagesDropped = true\n return { type: \"text\", text: IMAGE_OMITTED }\n }\n return { type: \"image_url\", image_url: { url: `data:${p.mime};base64,${p.data}` } }\n })\n if (out.length === 1 && out[0]?.type === \"text\") return { content: out[0].text, imagesDropped }\n return { content: out, imagesDropped }\n}\n\n/**\n * tool 消息只收文本:文本段以换行拼接。图片两种处置——`lift` 时原位留指路文字、图片本体收进 `images` 交给上浮,\n * 否则换占位。\n */\nfunction toolContent(\n parts: readonly ContentPart[],\n lift: boolean,\n): { text: string; imagesDropped: boolean; images: Extract<ContentPart, { type: \"image\" }>[] } {\n let imagesDropped = false\n const images: Extract<ContentPart, { type: \"image\" }>[] = []\n const text = parts\n .map((p) => {\n if (p.type === \"text\") return p.text\n if (p.type === \"tool_reference\") return renderToolReference(p)\n if (lift) {\n images.push(p)\n return toolImagePointer(images.length)\n }\n imagesDropped = true\n return TOOL_IMAGE_OMITTED\n })\n .join(\"\\n\")\n return { text, imagesDropped, images }\n}\n\n/**\n * 一条工具结果上浮出去的附件:先一行我们自己的说明(来自哪次调用、几张、是工具输出不是用户发言),\n * 再逐张 `image n:` + 图片。来源结果是 untrusted 的,图片段用 core 同一份 `markUntrusted` 包起来(说明行在标记外:\n * 那是降级层的话,不是工具的话);system 信任的结果不包。纯函数:同一条结果每轮译出逐字节一致(缓存前缀稳定)。\n */\nfunction liftedAttachment(\n item: Extract<IrItem, { kind: \"tool_result\" }>,\n images: readonly Extract<ContentPart, { type: \"image\" }>[],\n): ContentPart[] {\n const header: ContentPart = {\n type: \"text\",\n text: `[Attachments from tool result ${item.name} (call ${item.toolCallId}): ${images.length} image(s). This is tool output, not a message from the user.]`,\n }\n const body: ContentPart[] = images.flatMap((img, i) => [{ type: \"text\", text: `image ${i + 1}:` }, img])\n return [header, ...(item.untrustedSource ? markUntrusted(body, item.untrustedSource).parts : body)]\n}\n\n/** tool_call 入参回到线上是 JSON 字符串;读侧解析失败时存的是原始字符串,写侧原样送回 */\nfunction argumentsOf(args: unknown): string {\n return typeof args === \"string\" ? args : JSON.stringify(args ?? {})\n}\n\nexport function encodeChatRequest(input: ChatEncodeInput): {\n body: ChatRequestBody\n landings: LandingRecord[]\n} {\n const { model, capabilities } = input\n const target = { provider: model.provider, api: model.api, model: model.id }\n const reasoningContent = model.chat?.reasoningContent === true\n const liftImages = capabilities.images && model.chat?.liftToolImages !== false\n const messages: ChatMessage[] = []\n const landings: LandingRecord[] = []\n /**\n * 本批 tool 消息上浮的图片,遇到第一个**会下发的**非 tool_result 条目(或收尾)时作为一条 user 消息放出。\n * IR 把被后移的用户消息 / 说明排在整批之后,所以附件落在\"全部 tool 消息之后、后移内容之前\";\n * 但不下发的事件(运维事件、ext.* 留痕)不经后移、原位夹在同批结果之间,它们不能触发放出——\n * 否则附件插进两条 tool 消息之间,破坏 tool_calls → tool 配对(发前审查抓到)。\n */\n let lifted: ContentPart[] = []\n const releaseLifted = () => {\n if (lifted.length === 0) return\n messages.push({ role: \"user\", content: userContent(lifted, true).content })\n lifted = []\n }\n\n if (input.systemPrompt) messages.push({ role: \"system\", content: input.systemPrompt })\n\n for (const item of input.ir) {\n if (item.kind !== \"tool_result\" && item.kind !== \"dropped\") releaseLifted()\n switch (item.kind) {\n case \"user\": {\n const c = userContent(item.parts, capabilities.images)\n messages.push({ role: \"user\", content: c.content })\n const lossy = item.deferred || item.escaped || c.imagesDropped\n land(\n landings,\n item.event,\n lossy ? \"lossy\" : \"exact\",\n \"user\",\n item.deferred\n ? `the user message sits between a tool call and its results; ${DEFERRED_NOTE}`\n : undefined,\n item.escaped ? ESCAPED_NOTE : undefined,\n c.imagesDropped\n ? \"the model takes no images, so they are replaced with placeholder text\"\n : undefined,\n )\n break\n }\n case \"assistant\": {\n messages.push(assistantMessage(item.blocks, item.origin, target, reasoningContent, landings))\n break\n }\n case \"tool_result\": {\n const c = toolContent(item.parts, liftImages)\n messages.push({\n role: \"tool\",\n tool_call_id: item.toolCallId,\n content: item.isError ? ERROR_PREFIX + c.text : c.text,\n })\n const imagesLifted = c.images.length > 0\n if (imagesLifted) lifted.push(...liftedAttachment(item, c.images))\n const lossy = item.escaped || item.isError || c.imagesDropped || imagesLifted\n land(\n landings,\n item.event,\n lossy ? \"lossy\" : \"exact\",\n c.imagesDropped ? \"tool-text-only\" : imagesLifted ? \"tool+lifted-images\" : \"tool\",\n item.isError\n ? \"a Chat tool message has no error flag, so isError is expressed with a [tool error] prefix\"\n : undefined,\n c.imagesDropped\n ? \"a tool message takes text only, so images are replaced with placeholder text\"\n : undefined,\n imagesLifted\n ? \"a tool message takes text only, so its images move into a user message after this batch of tool messages, labelled as tool output\"\n : undefined,\n item.escaped ? ESCAPED_NOTE : undefined,\n )\n break\n }\n case \"system_note\": {\n if (capabilities.midConversationSystem && !item.directive) {\n messages.push({ role: \"system\", content: item.text })\n land(\n landings,\n item.event,\n item.escaped ? \"lossy\" : \"exact\",\n \"system\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n } else {\n messages.push({ role: \"user\", content: framedSystemNote(item.noteKind, item.text) })\n land(\n landings,\n item.event,\n \"lossy\",\n \"user-role\",\n item.directive\n ? DIRECTIVE_NOTE\n : \"the upstream does not accept mid-conversation system, so it is wrapped in a <system_note> tag and sent with the user role\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n }\n break\n }\n case \"compaction\": {\n messages.push({ role: \"user\", content: framedSummary(item.text) })\n land(\n landings,\n item.event,\n \"lossy\",\n \"user-text\",\n \"the summary is rendered as user-role text\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n break\n }\n case \"dropped\":\n land(landings, item.event, \"dropped\", \"none\", item.note)\n break\n }\n }\n releaseLifted()\n\n // 宿主选项里的 tools 不透传:工具表只由 input.tools 决定,没有时也不能让宿主塞一份进来\n const { tools: _tools, ...passthrough } = input.requestOptions ?? {}\n // Chat 没有\"声明但不载入\"的落点:deferLoading 的工具不发(模型看不见也调不了,与过滤同义;L1)\n const shownTools = (input.tools ?? []).filter((t) => t.deferLoading !== true)\n const body: ChatRequestBody = {\n ...passthrough,\n model: model.id,\n messages,\n ...(shownTools.length > 0\n ? {\n tools: shownTools.map(\n (t): ChatTool => ({\n type: \"function\",\n function: { name: t.name, description: t.description, parameters: t.inputSchema },\n }),\n ),\n }\n : {}),\n stream: true,\n stream_options: { include_usage: true },\n }\n return { body, landings: orderLandings(input.events, landings) }\n}\n\n/**\n * 一轮模型输出 → 一条 assistant 消息。\n * - 正文:Chat 的 assistant.content 是单个字符串,多段以空行合并,每段记 lossy(merged-text);\n * - thinking:开了 reasoning_content 方言且来源同家 → 回填(多段以换行拼接),否则 dropped;\n * 方言开着时**字段必须在**(DeepSeek 带 tools 的请求缺它 400),没有可回填的就给空串;\n * - tool_call:`arguments` 是 JSON 字符串。\n */\nfunction assistantMessage(\n blocks: readonly IrBlock[],\n origin: { provider: string; api: string; model: string },\n target: { provider: string; api: string; model: string },\n reasoningContent: boolean,\n landings: LandingRecord[],\n): ChatMessage {\n const texts = blocks.filter((b): b is Extract<IrBlock, { type: \"text\" }> => b.type === \"text\")\n const thinkings = blocks.filter((b): b is Extract<IrBlock, { type: \"thinking\" }> => b.type === \"thinking\")\n const calls = blocks.filter((b): b is Extract<IrBlock, { type: \"tool_call\" }> => b.type === \"tool_call\")\n const foreign = foreignOrigin(origin, target)\n\n for (const t of texts) {\n if (texts.length > 1)\n land(\n landings,\n t.event,\n \"lossy\",\n \"merged-text\",\n \"multiple text segments of one turn are merged into a single string\",\n )\n else land(landings, t.event, \"exact\", \"assistant-content\")\n }\n const replayable = reasoningContent && !foreign\n for (const t of thinkings) {\n if (replayable) land(landings, t.event, \"exact\", \"reasoning_content\")\n else if (reasoningContent)\n land(\n landings,\n t.event,\n \"dropped\",\n \"none\",\n `thinking from ${origin.provider}/${origin.api} is not filled back in for a model of another family`,\n )\n else\n land(\n landings,\n t.event,\n \"dropped\",\n \"none\",\n \"Chat Completions has no landing for replaying thinking (no signature, no encrypted item)\",\n )\n }\n for (const c of calls) land(landings, c.event, \"exact\", \"tool_calls\")\n\n const msg: ChatMessage = {\n role: \"assistant\",\n content: texts.length > 0 ? texts.map((t) => t.text).join(\"\\n\\n\") : null,\n }\n if (calls.length > 0) {\n msg.tool_calls = calls.map((c) => ({\n id: c.id,\n type: \"function\",\n function: { name: c.name, arguments: argumentsOf(c.args) },\n }))\n }\n if (reasoningContent) msg.reasoning_content = replayable ? thinkings.map((t) => t.text).join(\"\\n\") : \"\"\n return msg\n}\n","/**\n * FetchLowering:@reinsjs/core 的 Lowering 接口只用 fetch 的实现(零依赖、零 node:*)。\n *\n * 与 lowering-pi 的分工见 DECISIONS 2026-09-14「lowering-fetch 立项」:两包并存,宿主 import 谁用谁。\n * 这里 `LoweredRequest.payload.body` 就是真正发出去的请求体——没有第二跳改写,排查 400 直接看它。\n */\nimport {\n type CoreEventDraft,\n type LoweredRequest,\n type Lowering,\n type LoweringCapabilities,\n LoweringError,\n type LoweringOutcome,\n type LoweringStreamContext,\n type ModelRef,\n type ToRequestInput,\n} from \"@reinsjs/core\"\nimport { consumeAnthropicStream } from \"./anthropic/from-stream.js\"\nimport { encodeAnthropicRequest } from \"./anthropic/to-request.js\"\nimport { capabilitiesOf } from \"./capabilities.js\"\nimport { consumeChatStream } from \"./chat/from-stream.js\"\nimport { encodeChatRequest } from \"./chat/to-request.js\"\nimport { DEFAULT_TIMEOUT_MS, postJson, requestSignals } from \"./http.js\"\nimport { eventsToIr } from \"./ir.js\"\nimport { endpointOf, type FetchApi, type FetchModel, resolveModel } from \"./models.js\"\nimport { consumeResponsesStream } from \"./responses/from-stream.js\"\nimport { encodeResponsesRequest } from \"./responses/to-request.js\"\nimport { parseSse } from \"./sse.js\"\n\n/** Anthropic Messages 的协议版本头,当前唯一稳定值 */\nexport const ANTHROPIC_VERSION = \"2023-06-01\"\n\nexport interface FetchLoweringOptions {\n /** 按 provider 取 key;返回 undefined 视为未配置。本包不读环境变量,由宿主决定来源 */\n apiKey: (provider: string) => string | undefined\n /** 自定义 fetch(测试注入、代理、Workers 绑定);缺省 globalThis.fetch */\n fetch?: typeof globalThis.fetch\n /** 附加请求头,所有请求都带;模型级 headers 优先 */\n headers?: Record<string, string>\n /** 内置表之外的模型,或覆盖表内同名模型 */\n models?: readonly FetchModel[]\n /**\n * 铺进请求体的额外字段(max_tokens、temperature、DeepSeek 的 thinking / reasoning_effort、OpenAI 的\n * parallel_tool_calls …),键名以厂商文档为准。按模型返回,便于分族配置。messages / tools / model / stream 不可覆盖。\n */\n requestOptions?: (model: ModelRef) => Record<string, unknown>\n /** 整条请求(含读完流)的时限,缺省 600 000 ms;到点判 error(可重试),宿主 signal 中止判 aborted */\n timeoutMs?: number\n /**\n * trust 标注(技术方案 §14):trust=untrusted 的事件翻译时包上 `<untrusted source=\"tool:<name>\">…</untrusted>`,\n * 事件本身不动。缺省 true;传 false 关掉是宿主自担提示注入风险\n */\n trustMarkers?: boolean\n}\n\n/** 对外暴露的请求体:就是要 POST 的 JSON,鉴权头与 URL 在 stream 时才拼(不进 payload,日志里不落凭证) */\nexport interface FetchLoweredPayload {\n api: FetchApi\n body: Record<string, unknown>\n}\n\nexport class FetchLowering implements Lowering<FetchLoweredPayload> {\n private readonly extraModels: readonly FetchModel[]\n private readonly timeoutMs: number\n\n constructor(private readonly opts: FetchLoweringOptions) {\n this.extraModels = opts.models ?? []\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS\n }\n\n capabilities(ref: ModelRef): LoweringCapabilities {\n return capabilitiesOf(resolveModel(ref, this.extraModels))\n }\n\n toRequest(input: ToRequestInput): LoweredRequest<FetchLoweredPayload> {\n const model = resolveModel(input.model, this.extraModels)\n const capabilities = capabilitiesOf(model)\n const ir = eventsToIr({\n events: input.events,\n target: { provider: model.provider, api: model.api, model: model.id },\n ...(this.opts.trustMarkers !== undefined ? { trustMarkers: this.opts.trustMarkers } : {}),\n })\n const requestOptions = this.opts.requestOptions?.(input.model)\n const encodeInput = {\n ir,\n events: input.events,\n model,\n capabilities,\n ...(input.tools ? { tools: input.tools } : {}),\n ...(input.systemPrompt !== undefined ? { systemPrompt: input.systemPrompt } : {}),\n ...(requestOptions ? { requestOptions } : {}),\n }\n switch (model.api) {\n case \"openai-chat\": {\n const { body, landings } = encodeChatRequest(encodeInput)\n return { model: input.model, capabilities, landings, payload: { api: model.api, body } }\n }\n case \"anthropic-messages\": {\n const { body, landings } = encodeAnthropicRequest(encodeInput)\n return { model: input.model, capabilities, landings, payload: { api: model.api, body } }\n }\n case \"openai-responses\": {\n const { body, landings } = encodeResponsesRequest(encodeInput)\n return { model: input.model, capabilities, landings, payload: { api: model.api, body } }\n }\n default:\n throw new LoweringError(\"unsupported_api\", `unsupported wire protocol ${model.api}`, {\n api: model.api,\n })\n }\n }\n\n async *stream(\n req: LoweredRequest<FetchLoweredPayload>,\n ctx: LoweringStreamContext = {},\n ): AsyncGenerator<CoreEventDraft, LoweringOutcome> {\n const model = resolveModel(req.model, this.extraModels)\n const headers = this.headersFor(model)\n const signals = requestSignals(ctx.signal, this.timeoutMs)\n const res = await postJson({\n url: endpointOf(model),\n headers,\n body: req.payload.body,\n signal: signals.signal,\n ...(this.opts.fetch ? { fetch: this.opts.fetch } : {}),\n })\n if (!res.body) {\n return {\n stopReason: \"error\",\n usage: { input: 0, output: 0 },\n errorMessage: \"the response has no body\",\n }\n }\n const streamInput = {\n messages: parseSse(res.body),\n origin: { provider: model.provider, api: model.api, model: model.id },\n ...(model.cost ? { cost: model.cost } : {}),\n ...(ctx.signal ? { signal: ctx.signal } : {}),\n timedOut: signals.timedOut,\n timeoutMs: this.timeoutMs,\n }\n switch (req.payload.api) {\n case \"openai-chat\":\n return yield* consumeChatStream(streamInput, ctx)\n case \"anthropic-messages\":\n return yield* consumeAnthropicStream(streamInput, ctx)\n case \"openai-responses\":\n return yield* consumeResponsesStream(streamInput, ctx)\n default:\n throw new LoweringError(\"unsupported_api\", `unsupported wire protocol ${req.payload.api}`, {\n api: req.payload.api,\n })\n }\n }\n\n /**\n * 鉴权头按协议缺省(Chat / Responses bearer、Anthropic x-api-key),模型声明 auth:\"none\" 时凭证由 headers 自带。\n * Anthropic 线固定带 `anthropic-version`,`anthropic-beta` 只在模型声明了 betas 时带(F0 结论:用到才带);模型级 headers 最后盖。\n */\n private headersFor(model: FetchModel): Record<string, string> {\n const protocol: Record<string, string> = {}\n if (model.api === \"anthropic-messages\") {\n protocol[\"anthropic-version\"] = ANTHROPIC_VERSION\n const betas = model.anthropic?.betas\n if (betas && betas.length > 0) protocol[\"anthropic-beta\"] = betas.join(\",\")\n }\n const headers: Record<string, string> = { ...this.opts.headers, ...protocol, ...model.headers }\n const auth = model.auth ?? (model.api === \"anthropic-messages\" ? \"x-api-key\" : \"bearer\")\n if (auth === \"none\") return headers\n const apiKey = this.opts.apiKey(model.provider)\n if (!apiKey) {\n throw new LoweringError(\"missing_api_key\", `no API key configured for ${model.provider}`, {\n provider: model.provider,\n })\n }\n if (auth === \"bearer\") headers.authorization = `Bearer ${apiKey}`\n else headers[\"x-api-key\"] = apiKey\n return headers\n }\n}\n","/**\n * 三线共用的 fetch 封装:超时、宿主中止、非 2xx 转成带状态码的错误。\n *\n * 错误文案刻意用 \"<status> <body>\" 格式(与两家官方 SDK 同款):core 的瞬断判据(retry.ts)先看错误对象上的\n * `status` / `headers`,再看文案开头的三位数字,所以这里抛出的错误不用任何额外约定就能被正确判成\n * \"429 / 5xx 重试、400 不重试\"。`headers` 保留原样,`x-should-retry` 由 core 自己读。\n *\n * 不读环境变量、不碰 node:*,Workers / Deno / 浏览器同一份代码。\n */\n\nexport class HttpError extends Error {\n override readonly name = \"HttpError\"\n constructor(\n readonly status: number,\n readonly headers: Headers,\n /** 响应正文原文(厂商错误体或网关信封,不假定形状) */\n readonly body: string,\n readonly url: string,\n ) {\n super(`${status} ${body}`)\n }\n}\n\n/** 一次请求的时限(整条响应,含流式读完),与两家 SDK 缺省一致 */\nexport const DEFAULT_TIMEOUT_MS = 600_000\n\nexport interface RequestSignals {\n /** 交给 fetch 与流读取的组合信号 */\n signal: AbortSignal\n /** 中止后判定是哪一方:宿主中止(ctx.signal)还是本地超时 */\n timedOut: () => boolean\n}\n\n/**\n * 把宿主的 signal 与本地超时合成一个信号。超时到点后 `timedOut()` 为真;宿主中止优先(两者都发生时算宿主中止,\n * 因为宿主中止是有意为之、不该被当成瞬断重试)。\n */\nexport function requestSignals(hostSignal: AbortSignal | undefined, timeoutMs: number): RequestSignals {\n const timeout = AbortSignal.timeout(timeoutMs)\n const signal = hostSignal ? AbortSignal.any([hostSignal, timeout]) : timeout\n return { signal, timedOut: () => timeout.aborted && !hostSignal?.aborted }\n}\n\nexport interface PostJsonInput {\n url: string\n headers: Record<string, string>\n body: unknown\n signal: AbortSignal\n fetch?: typeof globalThis.fetch\n}\n\n/**\n * POST JSON;非 2xx 读完正文抛 HttpError。网络层失败(DNS、连接被掐、超时)由 fetch 自己抛出,原样上抛——\n * 那些错误对象上的 `cause.code` / `name` 正是 core 判瞬断要看的东西,包一层反而会盖掉。\n */\nexport async function postJson(input: PostJsonInput): Promise<Response> {\n const doFetch = input.fetch ?? globalThis.fetch\n const res = await doFetch(input.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", accept: \"text/event-stream\", ...input.headers },\n body: JSON.stringify(input.body),\n signal: input.signal,\n })\n if (!res.ok) {\n const text = await res.text().catch(() => \"\")\n throw new HttpError(res.status, res.headers, text, input.url)\n }\n return res\n}\n","/**\n * 模型表与解析。只放一张**最小表**(上下文窗口、能力位、价目),`ModelRef` 找不到就抛;宿主用 `models` 选项\n * 声明表外模型或覆盖表内字段(DECISIONS 2026-09-14 立项:表过期不阻塞使用)。\n *\n * 表里的数字来自厂商公开文档(2026-09-14 查阅);价目是每百万 token 美元,DeepSeek 有峰谷价、存的是峰值价。\n */\nimport { LoweringError, type ModelRef } from \"@reinsjs/core\"\nimport type { ModelCost } from \"./usage.js\"\n\n/** 本包实现的三条线协议(F1 Chat Completions、F2 Anthropic Messages、F3 OpenAI Responses) */\nexport type FetchApi = \"openai-chat\" | \"anthropic-messages\" | \"openai-responses\"\n\n/** 当前已实现、可发请求的协议;toRequest / stream 遇到别的就抛 unsupported_api */\nexport const SUPPORTED_APIS: ReadonlySet<string> = new Set<FetchApi>([\n \"openai-chat\",\n \"anthropic-messages\",\n \"openai-responses\",\n])\n\n/** 一个模型在本降级层眼里的全部描述。字段与 LoweringCapabilities 对齐,方言开关单独成组 */\nexport interface FetchModel {\n provider: string\n id: string\n api: FetchApi\n /** 协议根地址:Chat 在其后接 /chat/completions(OpenAI 给到 …/v1,DeepSeek 给到域名即可) */\n baseUrl: string\n contextWindow: number\n maxOutputTokens: number\n /** 模型会产出 thinking / reasoning */\n reasoning: boolean\n images?: boolean\n cost?: ModelCost\n /** 额外请求头(私有网关鉴权等),与降级层级别的 headers 合并、以模型级为准 */\n headers?: Record<string, string>\n name?: string\n /**\n * 是否接受会话中途的 `role:\"system\"` 消息(system_note 的 exact 落点)。缺省按协议定:Chat 为 true\n * (OpenAI 官方经 CF 网关、DeepSeek 直连 2026-09-14 均实测到达)。\n */\n midConversationSystem?: boolean\n /**\n * 凭证怎么带。缺省按协议:Chat / Responses 用 `Authorization: Bearer`,Anthropic 用 `x-api-key`。\n * \"none\" 表示凭证在 headers 里(如 Cloudflare AI Gateway 的 cf-aig-authorization),不再向 apiKey 回调要 key。\n */\n auth?: \"bearer\" | \"x-api-key\" | \"none\"\n /** Chat Completions 方言,只收已验证的扩展(Boss 定:严格按 OpenAI 规范,方言等真有人用再加) */\n chat?: ChatDialect\n /** Anthropic Messages 线的请求整形选项(beta 头、缓存断点处置) */\n anthropic?: AnthropicDialect\n /** OpenAI Responses 线的请求整形选项(说明角色、加密推理项) */\n responses?: ResponsesDialect\n}\n\nexport interface ResponsesDialect {\n /**\n * 系统提示与 system_note 用哪个角色。缺省:推理模型 developer、其它 system(与 lowering-pi 同一选择,矩阵同格)。\n * 第三方 Responses 兼容上游不认 developer 时改 \"system\"。\n */\n systemRole?: \"developer\" | \"system\"\n /**\n * 推理模型是否带 `include: [\"reasoning.encrypted_content\"]`(缺省 true)。`store: false` 下 OpenAI 不保存推理状态,\n * 只有加密项能把上一轮推理带回下一轮(F0 R3 实测回放接受、伪造 400);不带则 reasoning 项无法回放、一律 dropped。\n * 第三方兼容上游不认 include 参数时可关。\n */\n encryptedReasoning?: boolean\n}\n\nexport interface ChatDialect {\n /**\n * DeepSeek 的 `reasoning_content`(2026-09-14 直连实测):响应里思考正文与 `content` 平级;带 `tools` 的请求里\n * **每条** assistant 消息都必须回传该字段(缺了 400,空串可过),不带 tools 时忽略。开了:读侧 → core.model_thinking,\n * 写侧把自家 thinking 回填、没有就回空串。关着(OpenAI 官方):thinking 无处可放,矩阵记 dropped。\n */\n reasoningContent?: boolean\n /**\n * 工具结果里的图片上浮(2026-10-27,OnSet 需求):`role:\"tool\"` 消息只收文本,模型声明收图(`images: true`)时,\n * 同一 assistant 轮全部 tool 消息之后补一条 `role:\"user\"` 消息放这些图片,tool 消息原位留指路文字。缺省 true;\n * 上游不接受\"tool 之后紧跟带图 user\"时关掉,退回占位文本。DeepSeek 官方 2026-10-27 实测接受(spikes/chat-tool-images)。\n */\n liftToolImages?: boolean\n}\n\n/**\n * 感知说明殿后(messages 末条是 system)时,\"最后一条 user 末块\"的断点没处打,B1 实测三种处置(spikes/b1-perception-cache):\n * - \"automatic\"(缺省):改在请求顶层放 `cache_control`(Anthropic 自动缓存:断点落在最后一个可缓存块上),命中率与不注入持平;\n * - \"previous-user\":仍打在最后一条 user 的末块上,实测低 3~6 个点(后续请求对不上前一次写入的前缀);\n * - \"drop\":不打。只在上游自己会补自动缓存(如 DeepSeek 的兼容端口)时不吃亏。\n * 把断点留在 system 消息上实测几乎零命中,不提供。\n */\nexport type MidSystemCacheBreakpoint = \"automatic\" | \"previous-user\" | \"drop\"\n\nexport interface AnthropicDialect {\n /**\n * `anthropic-beta` 头的取值,用到才带(F0 结论:中途 system 不需要 beta;某些 beta 会抬高 reasoning_extraction\n * 拒答率)。模型级 `headers[\"anthropic-beta\"]` 若也给了,以 headers 为准。\n */\n betas?: readonly string[]\n /** 是否打缓存断点(system 末块、tools 末项、最后一条 user 末块)。缺省 true;上游不认断点时可关 */\n cacheBreakpoints?: boolean\n /** 断点存活期,缺省 5 分钟(不发 ttl 字段);\"1h\" 走 `{ type: \"ephemeral\", ttl: \"1h\" }` */\n cacheTtl?: \"5m\" | \"1h\"\n /** 说明殿后时的断点处置,缺省 \"automatic\" */\n midSystemCacheBreakpoint?: MidSystemCacheBreakpoint\n /**\n * 是否走 `defer_loading` + `tool_reference` 的原生延迟加载(L1,2026-09-15 经 CF 网关实测 Haiku 4.5 / Opus 5 均支持、GA 无 beta 头)。\n * 缺省:provider 为 \"anthropic\" 时开,第三方 Anthropic 协议上游(DeepSeek 兼容端口等)关——它们对这两个字段的态度各异,\n * 宿主实测接受后再显式打开。关着时 deferLoading 的工具不发、引用段展开成文本\n */\n deferredTools?: boolean\n}\n\nconst DEEPSEEK_BASE = \"https://api.deepseek.com\"\nconst ANTHROPIC_BASE = \"https://api.anthropic.com/v1\"\n\n/** Anthropic 官方价目(美元 / 百万 token,2026-09-15 查阅);缓存写按 1.25 倍、缓存读按 0.1 倍算(Fable 5.1 读价另有公布值) */\nconst anthropicModel = (id: string, cost: ModelCost, extra: Partial<FetchModel> = {}): FetchModel => ({\n provider: \"anthropic\",\n id,\n api: \"anthropic-messages\",\n baseUrl: ANTHROPIC_BASE,\n contextWindow: 1_000_000,\n maxOutputTokens: 128_000,\n reasoning: true,\n images: true,\n cost,\n ...extra,\n})\nconst HAIKU_4_5 = anthropicModel(\n \"claude-haiku-4-5\",\n { input: 1, output: 5, cacheRead: 0.1, cacheWrite: 1.25 },\n { contextWindow: 200_000, maxOutputTokens: 64_000 },\n)\nconst OPENAI_BASE = \"https://api.openai.com/v1\"\n\n/** DeepSeek 峰值价(美元 / 百万 token);谷时减半,算出的成本是上限 */\nconst DEEPSEEK_FLASH: FetchModel = {\n provider: \"deepseek\",\n id: \"deepseek-flash\",\n api: \"openai-chat\",\n baseUrl: DEEPSEEK_BASE,\n contextWindow: 1_000_000,\n maxOutputTokens: 384_000,\n reasoning: true,\n images: true,\n cost: { input: 0.3, output: 1.2, cacheRead: 0.006, cacheWrite: 0 },\n chat: { reasoningContent: true },\n}\n\n/** OpenAI Responses 线的型号(价目 2026-09-15 查阅;gpt-5.4 / 5.5 超过 272k 输入有加价档,这里存基础价、成本是下限) */\nconst responsesModel = (\n id: string,\n cost: ModelCost,\n extra: Partial<FetchModel> & { reasoning: boolean; contextWindow: number; maxOutputTokens: number },\n): FetchModel => ({\n provider: \"openai\",\n id,\n api: \"openai-responses\",\n baseUrl: OPENAI_BASE,\n images: true,\n cost,\n ...extra,\n})\nconst GPT5 = { reasoning: true, contextWindow: 400_000, maxOutputTokens: 128_000 }\nconst GPT5_LARGE = { reasoning: true, contextWindow: 272_000, maxOutputTokens: 128_000 }\nconst O_SERIES = { reasoning: true, contextWindow: 200_000, maxOutputTokens: 100_000 }\n\n/**\n * 内置最小表。同一 provider + id 可能两条协议各一份(OpenAI 的 gpt-4o-mini 等既能走 Chat 也能走 Responses):\n * `findBuiltin` 带 api 时精确取(工厂函数总是带),不带时取先列的一份——OpenAI 官方 id 的 Responses 条目列在前,所以\n * `resolveModel({ provider: \"openai\", id })` 缺省走 OpenAI 的主协议 Responses(F3 起;F1 时只有 Chat 条目),要走 Chat 用\n * `openaiChat()` 或在 `models` 里自己声明。Anthropic 列当前一代 + 常用上一代。\n */\nexport const BUILTIN_MODELS: readonly FetchModel[] = [\n anthropicModel(\"claude-fable-5-1\", { input: 10, output: 50, cacheRead: 0.25, cacheWrite: 12.5 }),\n anthropicModel(\"claude-opus-5\", { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 }),\n anthropicModel(\"claude-opus-4-8\", { input: 5, output: 25, cacheRead: 0.5, cacheWrite: 6.25 }),\n anthropicModel(\"claude-sonnet-5\", { input: 2, output: 10, cacheRead: 0.2, cacheWrite: 2.5 }),\n HAIKU_4_5,\n // 带日期后缀的正式 id 与短名同一份定义\n { ...HAIKU_4_5, id: \"claude-haiku-4-5-20251001\" },\n DEEPSEEK_FLASH,\n // 别名:模型列表里只有 deepseek-flash,请求带 deepseek-v4-flash 照样接受、响应报 deepseek-flash\n { ...DEEPSEEK_FLASH, id: \"deepseek-v4-flash\" },\n {\n provider: \"deepseek\",\n id: \"deepseek-v4-pro\",\n api: \"openai-chat\",\n baseUrl: DEEPSEEK_BASE,\n contextWindow: 1_000_000,\n maxOutputTokens: 384_000,\n reasoning: true,\n images: true,\n cost: { input: 1.32, output: 3.96, cacheRead: 0.044, cacheWrite: 0 },\n chat: { reasoningContent: true },\n },\n // ---- OpenAI Responses 线:OpenAI 官方的主协议,同 id 无协议解析时先取它;Chat 条目在后面\n responsesModel(\"gpt-5.5\", { input: 5, output: 30, cacheRead: 0.5, cacheWrite: 0 }, GPT5_LARGE),\n responsesModel(\"gpt-5.4\", { input: 2.5, output: 15, cacheRead: 0.25, cacheWrite: 0 }, GPT5_LARGE),\n responsesModel(\"gpt-5.4-mini\", { input: 0.75, output: 4.5, cacheRead: 0.075, cacheWrite: 0 }, GPT5),\n responsesModel(\"gpt-5.2\", { input: 1.75, output: 14, cacheRead: 0.175, cacheWrite: 0 }, GPT5),\n responsesModel(\"gpt-5.1\", { input: 1.25, output: 10, cacheRead: 0.125, cacheWrite: 0 }, GPT5),\n responsesModel(\"gpt-5\", { input: 1.25, output: 10, cacheRead: 0.125, cacheWrite: 0 }, GPT5),\n responsesModel(\"gpt-5-mini\", { input: 0.25, output: 2, cacheRead: 0.025, cacheWrite: 0 }, GPT5),\n responsesModel(\"gpt-5-nano\", { input: 0.05, output: 0.4, cacheRead: 0.005, cacheWrite: 0 }, GPT5),\n responsesModel(\"o3\", { input: 2, output: 8, cacheRead: 0.5, cacheWrite: 0 }, O_SERIES),\n responsesModel(\"o4-mini\", { input: 1.1, output: 4.4, cacheRead: 0.275, cacheWrite: 0 }, O_SERIES),\n responsesModel(\n \"gpt-4.1\",\n { input: 2, output: 8, cacheRead: 0.5, cacheWrite: 0 },\n { reasoning: false, contextWindow: 1_047_576, maxOutputTokens: 32_768 },\n ),\n responsesModel(\n \"gpt-4.1-mini\",\n { input: 0.4, output: 1.6, cacheRead: 0.1, cacheWrite: 0 },\n { reasoning: false, contextWindow: 1_047_576, maxOutputTokens: 32_768 },\n ),\n responsesModel(\n \"gpt-4o-mini\",\n { input: 0.15, output: 0.6, cacheRead: 0.075, cacheWrite: 0 },\n { reasoning: false, contextWindow: 128_000, maxOutputTokens: 16_384 },\n ),\n // ---- OpenAI Chat Completions 线的同款型号(openaiChat() 按协议精确取;无协议解析时上面的 Responses 条目优先)\n {\n provider: \"openai\",\n id: \"gpt-4o-mini\",\n api: \"openai-chat\",\n baseUrl: OPENAI_BASE,\n contextWindow: 128_000,\n maxOutputTokens: 16_384,\n reasoning: false,\n images: true,\n cost: { input: 0.15, output: 0.6, cacheRead: 0.075, cacheWrite: 0 },\n },\n {\n provider: \"openai\",\n id: \"gpt-4.1\",\n api: \"openai-chat\",\n baseUrl: OPENAI_BASE,\n contextWindow: 1_047_576,\n maxOutputTokens: 32_768,\n reasoning: false,\n images: true,\n cost: { input: 2, output: 8, cacheRead: 0.5, cacheWrite: 0 },\n },\n {\n provider: \"openai\",\n id: \"gpt-4.1-mini\",\n api: \"openai-chat\",\n baseUrl: OPENAI_BASE,\n contextWindow: 1_047_576,\n maxOutputTokens: 32_768,\n reasoning: false,\n images: true,\n cost: { input: 0.4, output: 1.6, cacheRead: 0.1, cacheWrite: 0 },\n },\n {\n provider: \"openai\",\n id: \"gpt-5-mini\",\n api: \"openai-chat\",\n baseUrl: OPENAI_BASE,\n contextWindow: 400_000,\n maxOutputTokens: 128_000,\n reasoning: true,\n images: true,\n cost: { input: 0.25, output: 2, cacheRead: 0.025, cacheWrite: 0 },\n },\n]\n\n/** 带 api 精确取该协议的条目;不带取先列的一份 */\nexport function findBuiltin(provider: string, id: string, api?: FetchApi): FetchModel | undefined {\n return BUILTIN_MODELS.find(\n (m) => m.provider === provider && m.id === id && (api === undefined || m.api === api),\n )\n}\n\n/** 宿主声明的优先于内置表 */\nexport function resolveModel(ref: ModelRef, extra: readonly FetchModel[] = []): FetchModel {\n const model =\n extra.find((m) => m.provider === ref.provider && m.id === ref.id) ?? findBuiltin(ref.provider, ref.id)\n if (!model) {\n throw new LoweringError(\n \"unsupported_model\",\n `unknown model ${ref.provider}/${ref.id}; the built-in table is a minimal set, declare the rest through the models option (or use a factory function)`,\n { provider: ref.provider, id: ref.id },\n )\n }\n if (!SUPPORTED_APIS.has(model.api)) {\n throw new LoweringError(\n \"unsupported_api\",\n `model ${ref.provider}/${ref.id} speaks ${model.api}, but this implementation currently supports only ${[...SUPPORTED_APIS].join(\" / \")}`,\n { api: model.api },\n )\n }\n return model\n}\n\n/** 协议端点:baseUrl 去掉尾部斜杠再接路径 */\nexport function endpointOf(model: FetchModel): string {\n const base = model.baseUrl.replace(/\\/+$/, \"\")\n switch (model.api) {\n case \"openai-chat\":\n return `${base}/chat/completions`\n case \"anthropic-messages\":\n return `${base}/messages`\n case \"openai-responses\":\n return `${base}/responses`\n }\n}\n","/**\n * OpenAI Responses 流 → 事件草稿。\n *\n * 只在流收尾时按拼好的输出项产出草稿(reasoning 项的 encrypted_content 在 output_item.done 才齐),增量经 onDelta 给 UI。\n * 中断或出错时把已拼出的部分内容也交出去——日志要记录\"发生过什么\",是否继续由循环决定。\n *\n * 事件形状(厂商 SSE,按 data.type 分派;F0 R2 实测事件序列完整):\n * response.created / response.in_progress { response: { id, model } }\n * response.output_item.added { output_index, item: reasoning | message | function_call | … }\n * response.reasoning_summary_part.added / response.reasoning_summary_text.delta { output_index, delta } / response.reasoning_text.delta\n * response.output_text.delta / response.refusal.delta { output_index, delta }\n * response.function_call_arguments.delta { output_index, delta } / response.function_call_arguments.done { arguments }\n * response.output_item.done { output_index, item } ← 项的最终形状(reasoning 带 encrypted_content、message 带 id)\n * response.completed / response.incomplete { response: { status, incomplete_details, usage, output } }\n * response.failed { response: { error: { code, message } } } / error { code, message }\n * 未知字段一律忽略(CF 网关会多个 \"p\")。\n */\nimport type { CoreEventDraft, LoweringOutcome, LoweringStreamContext, TokenUsage } from \"@reinsjs/core\"\nimport type { ModelOrigin } from \"../ir.js\"\nimport type { SseMessage } from \"../sse.js\"\nimport { costOf, type ModelCost } from \"../usage.js\"\n\ninterface ResponsesUsage {\n input_tokens?: unknown\n output_tokens?: unknown\n input_tokens_details?: { cached_tokens?: unknown; cache_write_tokens?: unknown } | null\n output_tokens_details?: { reasoning_tokens?: unknown } | null\n}\n\ninterface ResponsesItem {\n type?: unknown\n id?: unknown\n call_id?: unknown\n name?: unknown\n arguments?: unknown\n phase?: unknown\n encrypted_content?: unknown\n summary?: { type?: unknown; text?: unknown }[]\n content?: { type?: unknown; text?: unknown; refusal?: unknown }[]\n [k: string]: unknown\n}\n\ninterface ResponsesStreamEvent {\n type?: unknown\n output_index?: unknown\n item?: ResponsesItem\n delta?: unknown\n arguments?: unknown\n code?: unknown\n message?: unknown\n response?: {\n id?: unknown\n model?: unknown\n status?: unknown\n incomplete_details?: { reason?: unknown } | null\n usage?: ResponsesUsage | null\n output?: ResponsesItem[]\n error?: { code?: unknown; message?: unknown } | null\n }\n}\n\ntype Slot =\n | { kind: \"reasoning\"; id: string; summary: string; item: ResponsesItem | undefined }\n | { kind: \"message\"; id: string; text: string; phase: string | undefined }\n | { kind: \"function_call\"; id: string; callId: string; name: string; args: string }\n | { kind: \"other\"; type: string }\n\nexport interface ResponsesStreamInput {\n messages: AsyncIterable<SseMessage>\n origin: ModelOrigin\n cost?: ModelCost\n signal?: AbortSignal\n timedOut?: () => boolean\n timeoutMs?: number\n}\n\nfunction str(v: unknown): string | undefined {\n return typeof v === \"string\" ? v : undefined\n}\nfunction num(v: unknown): number | undefined {\n return typeof v === \"number\" && Number.isFinite(v) ? v : undefined\n}\n\n/** 入参 JSON 解析不了就原样存字符串(写侧原样送回),空串按 {} */\nfunction parseArguments(raw: string): unknown {\n if (raw.trim() === \"\") return {}\n try {\n return JSON.parse(raw) as unknown\n } catch {\n return raw\n }\n}\n\n/** reasoning 项的可见正文:summary 各段以空行拼接;没有 summary 的上游可能给 content(原文推理) */\nfunction reasoningText(item: ResponsesItem | undefined, fallback: string): string {\n if (!item) return fallback\n const summary = (item.summary ?? []).map((s) => str(s.text) ?? \"\").filter((t) => t.length > 0)\n if (summary.length > 0) return summary.join(\"\\n\\n\")\n const content = (item.content ?? []).map((c) => str(c.text) ?? \"\").filter((t) => t.length > 0)\n return content.length > 0 ? content.join(\"\\n\\n\") : fallback\n}\n\nfunction messageText(item: ResponsesItem | undefined, fallback: string): string {\n if (!item?.content) return fallback\n return item.content.map((c) => (c.type === \"refusal\" ? str(c.refusal) : str(c.text)) ?? \"\").join(\"\")\n}\n\nclass ResponsesAssembly {\n readonly slots = new Map<number, Slot>()\n responseId: string | undefined\n responseModel: string | undefined\n status: string | undefined\n incompleteReason: string | undefined\n usage: ResponsesUsage | undefined\n error: { code: string; message: string } | undefined\n sawTerminal = false\n\n slotFor(index: number, item: ResponsesItem): Slot {\n let slot = this.slots.get(index)\n if (slot) return slot\n const type = str(item.type) ?? \"unknown\"\n switch (type) {\n case \"reasoning\":\n slot = { kind: \"reasoning\", id: str(item.id) ?? \"\", summary: \"\", item: undefined }\n break\n case \"message\":\n slot = { kind: \"message\", id: str(item.id) ?? \"\", text: \"\", phase: str(item.phase) }\n break\n case \"function_call\":\n slot = {\n kind: \"function_call\",\n id: str(item.id) ?? \"\",\n callId: str(item.call_id) ?? \"\",\n name: str(item.name) ?? \"\",\n args: str(item.arguments) ?? \"\",\n }\n break\n default:\n slot = { kind: \"other\", type }\n }\n this.slots.set(index, slot)\n return slot\n }\n\n /** 项收尾:以厂商给的最终形状为准(reasoning 带 encrypted_content、message 带 id / phase、function_call 带完整 arguments) */\n finish(index: number, item: ResponsesItem) {\n const slot = this.slotFor(index, item)\n switch (slot.kind) {\n case \"reasoning\":\n slot.item = item\n slot.id = str(item.id) ?? slot.id\n slot.summary = reasoningText(item, slot.summary)\n break\n case \"message\":\n slot.id = str(item.id) ?? slot.id\n slot.phase = str(item.phase) ?? slot.phase\n slot.text = messageText(item, slot.text)\n break\n case \"function_call\":\n slot.id = str(item.id) ?? slot.id\n slot.callId = str(item.call_id) ?? slot.callId\n slot.name = str(item.name) ?? slot.name\n slot.args = str(item.arguments) ?? slot.args\n break\n case \"other\":\n break\n }\n }\n\n /**\n * Azure 等上游可能只在 response.completed 的 output 里给 encrypted_content(output_item.done 里没有),\n * 按 id 回填,让 store:false 的多轮回放不断(pi-ai 同一处置)。\n */\n backfill(output: ResponsesItem[] | undefined) {\n if (!output) return\n for (const item of output) {\n if (item.type !== \"reasoning\" || typeof item.encrypted_content !== \"string\") continue\n for (const slot of this.slots.values()) {\n if (slot.kind !== \"reasoning\" || slot.id !== item.id) continue\n if (!slot.item) slot.item = item\n else if (typeof slot.item.encrypted_content !== \"string\")\n slot.item = { ...slot.item, encrypted_content: item.encrypted_content }\n }\n }\n }\n\n hasFunctionCall(): boolean {\n for (const s of this.slots.values()) if (s.kind === \"function_call\") return true\n return false\n }\n\n drafts(origin: ModelOrigin): CoreEventDraft[] {\n const out: CoreEventDraft[] = []\n for (const [, s] of [...this.slots.entries()].sort((x, y) => x[0] - y[0])) {\n const replay: Record<string, unknown> = { ...origin }\n switch (s.kind) {\n case \"reasoning\": {\n const encrypted =\n typeof s.item?.encrypted_content === \"string\" && s.item.encrypted_content.length > 0\n // 没有加密项又没有可见摘要的 reasoning 项什么都承载不了;有加密项、摘要为空的也要留草稿(下一轮必须原样回放)\n if (!encrypted && s.summary.length === 0) break\n if (encrypted) replay.thinkingSignature = JSON.stringify(s.item)\n out.push({ type: \"core.model_thinking\", actor: \"model\", payload: { text: s.summary }, replay })\n break\n }\n case \"message\":\n if (s.text.length === 0) break\n if (s.id) replay.textSignature = s.id\n if (s.phase) replay.phase = s.phase\n out.push({ type: \"core.model_text\", actor: \"model\", payload: { text: s.text }, replay })\n break\n case \"function_call\":\n if (s.id) replay.itemId = s.id\n out.push({\n type: \"core.tool_call\",\n actor: \"model\",\n payload: { toolCallId: s.callId, name: s.name, args: parseArguments(s.args) },\n replay,\n })\n break\n case \"other\":\n break\n }\n }\n return out\n }\n}\n\n/**\n * OpenAI 的 input_tokens 含缓存命中与缓存写入部分(F0 R1 / R4 实测 `input_tokens_details.cached_tokens` / `cache_write_tokens`),\n * core 的 input 是未命中数,所以两者都要减掉。\n */\nexport function usageOf(u: ResponsesUsage | undefined): TokenUsage {\n const total = num(u?.input_tokens) ?? 0\n const cached = num(u?.input_tokens_details?.cached_tokens) ?? 0\n const written = num(u?.input_tokens_details?.cache_write_tokens) ?? 0\n const usage: TokenUsage = {\n input: Math.max(0, total - cached - written),\n output: num(u?.output_tokens) ?? 0,\n }\n if (cached > 0) usage.cacheRead = cached\n if (written > 0) usage.cacheWrite = written\n return usage\n}\n\nfunction apply(ev: ResponsesStreamEvent, a: ResponsesAssembly, ctx: LoweringStreamContext) {\n const type = str(ev.type)\n const index = num(ev.output_index)\n const slot = index === undefined ? undefined : a.slots.get(index)\n switch (type) {\n case \"response.created\":\n case \"response.in_progress\": {\n const id = str(ev.response?.id)\n const model = str(ev.response?.model)\n if (id) a.responseId = id\n if (model) a.responseModel = model\n break\n }\n case \"response.output_item.added\":\n if (index !== undefined && ev.item) a.slotFor(index, ev.item)\n break\n case \"response.reasoning_summary_part.added\":\n // 第二段起用空行隔开,与收尾时 summary 各段以 \"\\n\\n\" 拼接一致\n if (slot?.kind === \"reasoning\" && slot.summary.length > 0 && index !== undefined) {\n slot.summary += \"\\n\\n\"\n ctx.onDelta?.({ kind: \"thinking\", index, delta: \"\\n\\n\" })\n }\n break\n case \"response.reasoning_summary_text.delta\":\n case \"response.reasoning_text.delta\": {\n const d = str(ev.delta)\n if (slot?.kind === \"reasoning\" && d && index !== undefined) {\n slot.summary += d\n ctx.onDelta?.({ kind: \"thinking\", index, delta: d })\n }\n break\n }\n case \"response.output_text.delta\":\n case \"response.refusal.delta\": {\n const d = str(ev.delta)\n if (slot?.kind === \"message\" && d && index !== undefined) {\n slot.text += d\n ctx.onDelta?.({ kind: \"text\", index, delta: d })\n }\n break\n }\n case \"response.function_call_arguments.delta\": {\n const d = str(ev.delta)\n if (slot?.kind === \"function_call\" && d && index !== undefined) {\n slot.args += d\n ctx.onDelta?.({ kind: \"tool_args\", index, delta: d })\n }\n break\n }\n case \"response.function_call_arguments.done\": {\n const full = str(ev.arguments)\n if (slot?.kind === \"function_call\" && full !== undefined) slot.args = full\n break\n }\n case \"response.output_item.done\":\n if (index !== undefined && ev.item) a.finish(index, ev.item)\n break\n case \"response.completed\":\n case \"response.incomplete\": {\n a.sawTerminal = true\n const r = ev.response\n a.status = str(r?.status) ?? (type === \"response.completed\" ? \"completed\" : \"incomplete\")\n a.incompleteReason = str(r?.incomplete_details?.reason)\n if (r?.usage) a.usage = r.usage\n const model = str(r?.model)\n if (model) a.responseModel = model\n a.backfill(r?.output)\n break\n }\n case \"response.failed\": {\n a.sawTerminal = true\n a.status = \"failed\"\n const e = ev.response?.error\n a.error = {\n code: str(e?.code) ?? \"failed\",\n message: str(e?.message) ?? \"response.failed carries no error detail\",\n }\n if (ev.response?.usage) a.usage = ev.response.usage\n break\n }\n case \"error\":\n a.error = { code: str(ev.code) ?? \"error\", message: str(ev.message) ?? \"\" }\n break\n default:\n // response.output_text.done / content_part.* / reasoning_summary_part.done / 未知事件:无事可做\n break\n }\n}\n\n/**\n * 停止原因:流里的 error / response.failed → error(文案 \"<code>: <message>\",rate_limit_exceeded 之类 core 判可重试);\n * 有 function_call 项即 toolUse;completed → stop;incomplete + max_output_tokens → length、incomplete + content_filter → error\n * (厂商内容过滤,不重试);cancelled → error;没等到终态事件 → error \"stream ended before response.completed\"(可重试)。\n */\nfunction outcomeOf(a: ResponsesAssembly, cost: ModelCost | undefined): LoweringOutcome {\n const usage = usageOf(a.usage)\n const out: LoweringOutcome = { stopReason: \"stop\", usage }\n const c = costOf(usage, cost)\n if (c !== undefined) out.costUsd = c\n if (a.responseModel) out.responseModel = a.responseModel\n\n if (a.error) {\n out.stopReason = \"error\"\n out.errorMessage = `${a.error.code}: ${a.error.message}`\n return out\n }\n if (!a.sawTerminal) {\n out.stopReason = \"error\"\n out.errorMessage = \"stream ended before response.completed\"\n return out\n }\n if (a.hasFunctionCall()) {\n out.stopReason = \"toolUse\"\n return out\n }\n switch (a.status) {\n case \"completed\":\n break\n case \"incomplete\":\n if (a.incompleteReason === \"max_output_tokens\") out.stopReason = \"length\"\n else {\n out.stopReason = \"error\"\n out.errorMessage =\n a.incompleteReason === \"content_filter\"\n ? \"status=incomplete (content_filter): the provider's content filter cut this output short\"\n : `status=incomplete${a.incompleteReason ? ` (${a.incompleteReason})` : \"\"}: the provider did not finish`\n }\n break\n case \"cancelled\":\n case \"failed\":\n out.stopReason = \"error\"\n out.errorMessage = `status=${a.status}`\n break\n default:\n break\n }\n return out\n}\n\nexport async function* consumeResponsesStream(\n input: ResponsesStreamInput,\n ctx: LoweringStreamContext = {},\n): AsyncGenerator<CoreEventDraft, LoweringOutcome> {\n const a = new ResponsesAssembly()\n try {\n for await (const msg of input.messages) {\n if (msg.data === \"[DONE]\") break\n let ev: ResponsesStreamEvent\n try {\n ev = JSON.parse(msg.data) as ResponsesStreamEvent\n } catch {\n // 解析不了的一帧:跳过而不是整条流作废,末尾若因此缺终态事件会记 error\n continue\n }\n apply(ev, a, ctx)\n if (a.error) break\n }\n } catch (err) {\n yield* a.drafts(input.origin)\n const base = outcomeOf(a, input.cost)\n if (input.signal?.aborted) return { ...base, stopReason: \"aborted\", errorMessage: \"aborted by host\" }\n if (input.timedOut?.())\n return {\n ...base,\n stopReason: \"error\",\n errorMessage: `request timed out after ${input.timeoutMs ?? \"?\"}ms (stream ended before response.completed)`,\n }\n return { ...base, stopReason: \"error\", errorMessage: errorText(err) }\n }\n yield* a.drafts(input.origin)\n return outcomeOf(a, input.cost)\n}\n\nfunction errorText(err: unknown): string {\n if (err instanceof Error) {\n const cause = (err as { cause?: { code?: unknown } }).cause\n const code = typeof cause?.code === \"string\" ? ` (${cause.code})` : \"\"\n return `${err.message}${code}`\n }\n return String(err)\n}\n","/**\n * IR → OpenAI Responses 请求体,并为每条事件记落点。\n *\n * Responses 是三条线里规矩最少的一条,但有两处与\"时间线是唯一真源\"直接相关,这里逐条落实(规则原文 F0 实测,\n * spikes/cf-gateway-fidelity 的 R2 / R3 / R3b):\n * - **服务端不留状态**:`store: false` 强制、宿主传的 `previous_response_id` 剥掉。每个请求把模型该看到的历史全量放进 `input`,\n * 与别的两条线同一形状;OpenAI 侧的会话状态永远不是我们依赖的东西。\n * - **reasoning 回放判据是 encrypted_content**:推理模型缺省带 `include: [\"reasoning.encrypted_content\"]`,上一轮的 reasoning 项\n * (整项 JSON 存在事件 `replay.thinkingSignature` 里,与 lowering-pi 同字段)原样放回 `input`;没有加密项(未开 include、流中断)\n * 或来自别家的一律 dropped 声明,不降成正文。伪造的加密项厂商回原文 400,所以回放的必须是原件。\n * - **中途 system 不用归位**:`developer` / `system` 消息在 `input` 里任意位置合法(F0 R3 中途 developer 到达);推理模型用\n * developer、其它用 system(与 pi 版矩阵同格),宿主可用 `responses.systemRole` 钉死。\n * - **工具调用两个 id**:`call_id`(配对 function_call_output 用)是 core 的 toolCallId;`fc_` 项 id 存 `replay.itemId`,只在同一模型\n * 回放时带回——OpenAI 会校验 fc 项与 rs 项的配对,换了模型就不带(与 pi-ai 同一取向)。\n * - `reasoning` / `max_output_tokens` 不缺省设置:gpt-5 缺省 medium、gpt-5.1 起缺省 none,开不开由宿主按型号在 requestOptions 里定\n * (与 Anthropic 线的 thinking 同一原则)。\n */\nimport {\n type ContentPart,\n type Event,\n type LandingRecord,\n type LoweringCapabilities,\n renderToolReference,\n type ToolSpec,\n} from \"@reinsjs/core\"\nimport {\n DEFERRED_NOTE,\n ESCAPED_NOTE,\n foreignOrigin,\n type IrBlock,\n type IrItem,\n type ModelOrigin,\n orderLandings,\n} from \"../ir.js\"\nimport type { FetchModel } from \"../models.js\"\nimport { DIRECTIVE_NOTE, framedSummary, framedSystemNote } from \"../notes.js\"\n\nexport type ResponsesInputContent =\n | { type: \"input_text\"; text: string }\n | { type: \"input_image\"; image_url: string; detail: \"auto\" }\n\nexport type ResponsesInputItem =\n /** user / developer / system 消息 */\n | { role: \"user\" | \"developer\" | \"system\"; content: ResponsesInputContent[] }\n /** 上一轮的 assistant 正文:type:message 输出项原样放回 */\n | {\n type: \"message\"\n role: \"assistant\"\n id: string\n status: \"completed\"\n content: { type: \"output_text\"; text: string; annotations: [] }[]\n phase?: string\n }\n /** 上一轮的 reasoning 项:整项原样放回(id / summary / encrypted_content 等字段以厂商给的为准) */\n | { type: \"reasoning\"; id: string; encrypted_content: string; [k: string]: unknown }\n | { type: \"function_call\"; id?: string; call_id: string; name: string; arguments: string }\n | { type: \"function_call_output\"; call_id: string; output: string | ResponsesInputContent[] }\n\nexport interface ResponsesTool {\n type: \"function\"\n name: string\n description: string\n parameters: Record<string, unknown>\n /** 我们的 JSON Schema 不保证满足 strict 模式(additionalProperties:false、全部 required),一律不开 */\n strict: false\n}\n\n/** 发出去的请求体本体。宿主的 requestOptions 先铺、我们的字段后盖:model / input / tools / stream / store 不可被覆盖 */\nexport interface ResponsesRequestBody extends Record<string, unknown> {\n model: string\n input: ResponsesInputItem[]\n tools?: ResponsesTool[]\n stream: true\n store: false\n include?: string[]\n}\n\nexport interface ResponsesEncodeInput {\n ir: readonly IrItem[]\n events: readonly Event[]\n model: FetchModel\n capabilities: LoweringCapabilities\n tools?: readonly ToolSpec[]\n systemPrompt?: string\n requestOptions?: Record<string, unknown>\n}\n\nconst IMAGE_OMITTED = \"[image omitted: this model does not accept images]\"\nconst ERROR_PREFIX = \"[tool error]\\n\"\nconst EMPTY_NOTE = \"the content is empty, so no empty message is sent\"\nconst ENCRYPTED_INCLUDE = \"reasoning.encrypted_content\"\n\nfunction land(\n out: LandingRecord[],\n e: Event,\n kind: LandingRecord[\"kind\"],\n landing: string,\n ...notes: (string | undefined)[]\n) {\n const note = notes.filter((n): n is string => Boolean(n)).join(\"; \")\n out.push(\n note\n ? { eventId: e.id, type: e.type, kind, landing, note }\n : { eventId: e.id, type: e.type, kind, landing },\n )\n}\n\n/** 内容段 → 输入块;空文本段跳过,图片按模型能力处置 */\nfunction contentOf(\n parts: readonly ContentPart[],\n images: boolean,\n): { content: ResponsesInputContent[]; imagesDropped: boolean } {\n let imagesDropped = false\n const content: ResponsesInputContent[] = []\n for (const p of parts) {\n if (p.type === \"text\") {\n if (p.text.length > 0) content.push({ type: \"input_text\", text: p.text })\n } else if (p.type === \"tool_reference\") {\n content.push({ type: \"input_text\", text: renderToolReference(p) })\n } else if (images) {\n content.push({ type: \"input_image\", image_url: `data:${p.mime};base64,${p.data}`, detail: \"auto\" })\n } else {\n imagesDropped = true\n content.push({ type: \"input_text\", text: IMAGE_OMITTED })\n }\n }\n return { content, imagesDropped }\n}\n\n/** tool_call 入参回到线上是 JSON 字符串;读侧解析失败时存的是原始字符串,写侧原样送回 */\nfunction argumentsOf(args: unknown): string {\n return typeof args === \"string\" ? args : JSON.stringify(args ?? {})\n}\n\n/**\n * 正文项的 id:本家事件的 `replay.textSignature` 是厂商给的 msg_ id、`replay.phase` 是同一项的 phase\n * (lowering-pi 把两者存成 `{\"v\":1,\"id\":…,\"phase\":…}` JSON 签名,两种都认);\n * 没有就补一个——type:message 输入项要求带 id,pi-ai 也是这样补的(`msg_pi_<n>`),厂商接受。\n */\nfunction textItemId(replay: Record<string, unknown>): { id?: string; phase?: string } {\n const sig = replay.textSignature\n if (typeof sig !== \"string\" || sig.length === 0) return {}\n const ownPhase = typeof replay.phase === \"string\" && replay.phase.length > 0 ? { phase: replay.phase } : {}\n if (sig.startsWith(\"{\")) {\n try {\n const parsed = JSON.parse(sig) as { id?: unknown; phase?: unknown }\n if (typeof parsed.id === \"string\" && parsed.id.length > 0) {\n return typeof parsed.phase === \"string\" ? { id: parsed.id, phase: parsed.phase } : { id: parsed.id }\n }\n } catch {\n // 不是 JSON:按裸 id 处理\n }\n }\n // OpenAI 要求 id 不超过 64 字符,超长的当没有\n return sig.length > 64 ? {} : { id: sig, ...ownPhase }\n}\n\n/** replay.thinkingSignature 里存的 reasoning 项:必须是带非空 encrypted_content 的对象才可回放 */\nexport function reasoningItemOf(replay: Record<string, unknown>): Record<string, unknown> | undefined {\n const sig = replay.thinkingSignature\n if (typeof sig !== \"string\" || !sig.startsWith(\"{\")) return undefined\n try {\n const item = JSON.parse(sig) as Record<string, unknown>\n if (typeof item.encrypted_content !== \"string\" || item.encrypted_content.length === 0) return undefined\n return item\n } catch {\n return undefined\n }\n}\n\nexport function encodeResponsesRequest(input: ResponsesEncodeInput): {\n body: ResponsesRequestBody\n landings: LandingRecord[]\n} {\n const { model, capabilities } = input\n const target: ModelOrigin = { provider: model.provider, api: model.api, model: model.id }\n const dialect = model.responses ?? {}\n const systemRole = dialect.systemRole ?? (model.reasoning ? \"developer\" : \"system\")\n const items: ResponsesInputItem[] = []\n const landings: LandingRecord[] = []\n let textCounter = 0\n\n if (input.systemPrompt)\n items.push({ role: systemRole, content: [{ type: \"input_text\", text: input.systemPrompt }] })\n\n for (const item of input.ir) {\n switch (item.kind) {\n case \"user\": {\n const c = contentOf(item.parts, capabilities.images)\n if (c.content.length === 0) {\n land(landings, item.event, \"dropped\", \"none\", EMPTY_NOTE)\n break\n }\n items.push({ role: \"user\", content: c.content })\n const lossy = item.deferred || item.escaped || c.imagesDropped\n land(\n landings,\n item.event,\n lossy ? \"lossy\" : \"exact\",\n \"user\",\n item.deferred\n ? `the user message sits between a tool call and its results; ${DEFERRED_NOTE}`\n : undefined,\n item.escaped ? ESCAPED_NOTE : undefined,\n c.imagesDropped\n ? \"the model takes no images, so they are replaced with placeholder text\"\n : undefined,\n )\n break\n }\n case \"tool_result\": {\n const c = contentOf(item.parts, capabilities.images)\n const hasImage = c.content.some((b) => b.type === \"input_image\")\n const text = c.content\n .filter((b): b is Extract<ResponsesInputContent, { type: \"input_text\" }> => b.type === \"input_text\")\n .map((b) => b.text)\n .join(\"\\n\")\n const prefixed = item.isError ? ERROR_PREFIX + text : text\n // 只有文本就用字符串(最兼容);带图片时 output 为内容块数组(文本在前,前缀一并放进去)\n const output: string | ResponsesInputContent[] = hasImage\n ? [\n ...(prefixed.length > 0 ? [{ type: \"input_text\" as const, text: prefixed }] : []),\n ...c.content.filter((b) => b.type === \"input_image\"),\n ]\n : prefixed\n items.push({ type: \"function_call_output\", call_id: item.toolCallId, output })\n const lossy = item.escaped || item.isError || c.imagesDropped\n land(\n landings,\n item.event,\n lossy ? \"lossy\" : \"exact\",\n \"function_call_output\",\n item.isError\n ? \"the Responses function_call_output has no error flag, so isError is expressed with a [tool error] prefix\"\n : undefined,\n c.imagesDropped\n ? \"the model takes no images, so they are replaced with placeholder text\"\n : undefined,\n item.escaped ? ESCAPED_NOTE : undefined,\n )\n break\n }\n case \"compaction\": {\n items.push({ role: \"user\", content: [{ type: \"input_text\", text: framedSummary(item.text) }] })\n land(\n landings,\n item.event,\n \"lossy\",\n \"user-text\",\n \"the summary is rendered as user-role text\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n break\n }\n case \"system_note\": {\n if (capabilities.midConversationSystem && !item.directive) {\n items.push({ role: systemRole, content: [{ type: \"input_text\", text: item.text }] })\n land(\n landings,\n item.event,\n item.escaped ? \"lossy\" : \"exact\",\n systemRole,\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n } else {\n items.push({\n role: \"user\",\n content: [{ type: \"input_text\", text: framedSystemNote(item.noteKind, item.text) }],\n })\n land(\n landings,\n item.event,\n \"lossy\",\n \"user-role\",\n item.directive\n ? DIRECTIVE_NOTE\n : \"the host declared that this upstream does not support mid-conversation system, so it is wrapped in a <system_note> tag and sent with the user role\",\n item.escaped ? ESCAPED_NOTE : undefined,\n item.deferred ? DEFERRED_NOTE : undefined,\n )\n }\n break\n }\n case \"assistant\": {\n const out = assistantItems(\n item.blocks,\n item.origin,\n target,\n landings,\n () => `msg_reins_${++textCounter}`,\n )\n items.push(...out)\n break\n }\n case \"dropped\":\n land(landings, item.event, \"dropped\", \"none\", item.note)\n break\n }\n }\n\n const ro = input.requestOptions ?? {}\n // input / tools 只由事件与工具表决定;previous_response_id 与\"时间线是唯一真源\"冲突,一律不透传\n const { input: _input, tools: _tools, previous_response_id: _prev, ...passthrough } = ro\n const body: ResponsesRequestBody = {\n ...passthrough,\n model: model.id,\n input: items,\n stream: true,\n store: false,\n }\n // Responses 没有\"声明但不载入\"的落点:deferLoading 的工具不发(L1)\n const shownTools = (input.tools ?? []).filter((t) => t.deferLoading !== true)\n if (shownTools.length > 0) {\n body.tools = shownTools.map(\n (t): ResponsesTool => ({\n type: \"function\",\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n strict: false,\n }),\n )\n }\n if (model.reasoning && dialect.encryptedReasoning !== false) {\n const hostInclude = Array.isArray(ro.include)\n ? ro.include.filter((x): x is string => typeof x === \"string\")\n : []\n body.include = hostInclude.includes(ENCRYPTED_INCLUDE) ? hostInclude : [...hostInclude, ENCRYPTED_INCLUDE]\n }\n return { body, landings: orderLandings(input.events, landings) }\n}\n\n/**\n * 一轮模型输出 → 输出项列表(Responses 的 assistant 一轮是多个独立项,不像别家是一条消息里的多个块)。\n * - 正文:每段一个 type:message 项,id 同家回放、否则补;空段 dropped;\n * - reasoning:同家且 replay 里是带 encrypted_content 的整项 → 原样放回;别家 / 没有加密项 → dropped;\n * - tool_call:function_call,arguments 是 JSON 字符串;fc_ 项 id 只在同一模型时带回。\n */\nfunction assistantItems(\n blocks: readonly IrBlock[],\n origin: ModelOrigin,\n target: ModelOrigin,\n landings: LandingRecord[],\n nextTextId: () => string,\n): ResponsesInputItem[] {\n const out: ResponsesInputItem[] = []\n const foreign = foreignOrigin(origin, target)\n const sameModel = !foreign && origin.model === target.model\n for (const b of blocks) {\n switch (b.type) {\n case \"text\": {\n if (b.text.length === 0) {\n land(landings, b.event, \"dropped\", \"none\", EMPTY_NOTE)\n break\n }\n const own = foreign ? {} : textItemId(b.replay)\n const id = own.id ?? nextTextId()\n out.push({\n type: \"message\",\n role: \"assistant\",\n id,\n status: \"completed\",\n content: [{ type: \"output_text\", text: b.text, annotations: [] }],\n ...(own.phase !== undefined ? { phase: own.phase } : {}),\n })\n land(\n landings,\n b.event,\n \"exact\",\n \"assistant-message\",\n own.id === undefined ? \"the item id is supplied by this package\" : undefined,\n )\n break\n }\n case \"thinking\": {\n if (foreign) {\n land(\n landings,\n b.event,\n \"dropped\",\n \"none\",\n `reasoning from ${origin.provider}/${origin.api} has no encrypted item of its own, so it is not replayed`,\n )\n break\n }\n // 加密项绑定产出它的模型(与 fc_ 项 id 同一取向):换了型号不放回,声明 dropped\n if (!sameModel) {\n land(\n landings,\n b.event,\n \"dropped\",\n \"none\",\n `the reasoning item comes from ${origin.model}, but this request targets ${target.model}; encrypted reasoning is only valid for the model that produced it, so it is not replayed`,\n )\n break\n }\n const item = reasoningItemOf(b.replay)\n if (!item) {\n land(\n landings,\n b.event,\n \"dropped\",\n \"none\",\n \"the reasoning item has no encrypted_content (it was not requested, or the stream broke), so it cannot be replayed under store:false\",\n )\n break\n }\n out.push({ ...item, type: \"reasoning\" } as Extract<ResponsesInputItem, { type: \"reasoning\" }>)\n land(landings, b.event, \"exact\", \"reasoning-item\")\n break\n }\n case \"tool_call\": {\n const itemId = sameModel && typeof b.replay.itemId === \"string\" ? b.replay.itemId : undefined\n out.push({\n type: \"function_call\",\n ...(itemId !== undefined ? { id: itemId } : {}),\n call_id: b.id,\n name: b.name,\n arguments: argumentsOf(b.args),\n })\n land(\n landings,\n b.event,\n \"exact\",\n \"function_call\",\n itemId === undefined && typeof b.replay.itemId === \"string\"\n ? \"the model changed, so the fc_ item id is not carried back\"\n : undefined,\n )\n break\n }\n }\n }\n return out\n}\n","/**\n * Server-Sent Events 解析(WHATWG 规范的字段子集):`event:` / `data:` / `id:`,多行 data 以 \\n 拼接,\n * 空行分发一条消息,`:` 开头是注释,`retry:` 与未知字段忽略。行尾兼容 \\r\\n、\\n、\\r。\n *\n * 比规范宽一处:流结束时缓冲区里还有没被空行收口的消息,也照样分发——部分上游最后一条事件后不发空行。\n * `data` 的 JSON 解析不在这里做:`[DONE]` 这类哨兵是各协议自己的约定。\n */\n\nexport interface SseMessage {\n event?: string\n data: string\n id?: string\n}\n\nexport async function* parseSse(body: ReadableStream<Uint8Array>): AsyncGenerator<SseMessage> {\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let buffer = \"\"\n let event: string | undefined\n let id: string | undefined\n const data: string[] = []\n\n const flush = (): SseMessage | undefined => {\n const msg: SseMessage = { data: data.join(\"\\n\") }\n if (event !== undefined) msg.event = event\n if (id !== undefined) msg.id = id\n const empty = data.length === 0 && event === undefined\n event = undefined\n id = undefined\n data.length = 0\n // 只有 id 或什么都没有的空消息不分发(规范:data 为空且无 event 时忽略)\n return empty ? undefined : msg\n }\n const line = (raw: string): SseMessage | undefined => {\n if (raw === \"\") return flush()\n if (raw.startsWith(\":\")) return undefined\n const colon = raw.indexOf(\":\")\n const field = colon === -1 ? raw : raw.slice(0, colon)\n let value = colon === -1 ? \"\" : raw.slice(colon + 1)\n if (value.startsWith(\" \")) value = value.slice(1)\n switch (field) {\n case \"data\":\n data.push(value)\n break\n case \"event\":\n event = value\n break\n case \"id\":\n id = value\n break\n default:\n break\n }\n return undefined\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n buffer += done ? decoder.decode() : decoder.decode(value, { stream: true })\n // 逐行切;最后一段可能是半行,留到下一块(done 时整段都算完整)\n let start = 0\n while (true) {\n const nl = buffer.indexOf(\"\\n\", start)\n const cr = buffer.indexOf(\"\\r\", start)\n let end = -1\n let skip = 1\n if (nl === -1 && cr === -1) break\n if (cr !== -1 && (nl === -1 || cr < nl)) {\n end = cr\n // \\r\\n 算一个换行;\\r 恰在块尾时看不到后面的 \\n,留到下一块再判\n if (cr === buffer.length - 1 && !done) break\n if (buffer[cr + 1] === \"\\n\") skip = 2\n } else end = nl\n const msg = line(buffer.slice(start, end))\n if (msg) yield msg\n start = end + skip\n }\n buffer = buffer.slice(start)\n if (done) break\n }\n if (buffer !== \"\") {\n const msg = line(buffer)\n if (msg) yield msg\n }\n const tail = flush()\n if (tail) yield tail\n } finally {\n reader.releaseLock()\n }\n}\n","/**\n * 一行拿到\"模型 + 降级层\":`deepseek(\"deepseek-flash\", { apiKey })`、`openaiChat(\"gpt-4o-mini\", { apiKey })`、\n * `openai(\"gpt-5-mini\", { apiKey })`(Responses)、`anthropic(\"claude-opus-5\", { apiKey })`;任何 OpenAI 兼容端点用\n * `chatCompletions(\"qwen-max\", { provider: \"qwen\", baseUrl, apiKey })`,任何 Anthropic 协议端点(DeepSeek 兼容端口、CF 网关)用\n * `anthropicMessages(id, { provider, baseUrl, apiKey })`,任何 Responses 协议端点用 `openaiResponses(id, { provider, baseUrl, apiKey })`。\n * 返回 BoundModel,直接给 `createAgent({ model })`;要多模型共享一个降级层就自己 new FetchLowering。\n *\n * 表内模型取内置定义再按选项覆盖;表外模型用保守缺省(128k 窗口、16k 输出、无推理、不收图),宿主按需覆盖。\n * 本包不读环境变量,apiKey 必填、由宿主决定来源(auth:\"none\" 时可给空串占位)。\n */\nimport type { BoundModel } from \"@reinsjs/core\"\nimport { FetchLowering, type FetchLoweringOptions } from \"./lowering.js\"\nimport {\n type AnthropicDialect,\n type ChatDialect,\n type FetchApi,\n type FetchModel,\n findBuiltin,\n type ResponsesDialect,\n} from \"./models.js\"\nimport type { ModelCost } from \"./usage.js\"\n\nexport interface ModelOptions {\n apiKey: string\n /** 协议根地址(Chat 在其后接 /chat/completions,Anthropic 接 /messages);表内模型缺省用厂商官方地址 */\n baseUrl?: string\n contextWindow?: number\n maxOutputTokens?: number\n reasoning?: boolean\n images?: boolean\n cost?: ModelCost\n /** 上游是否接受中途 role:\"system\";Chat 缺省 true,Anthropic 按模型族推断 */\n midConversationSystem?: boolean\n /** Chat 方言开关,见 models.ts ChatDialect */\n chat?: ChatDialect\n /** Anthropic 线的 beta 头与缓存断点处置,见 models.ts AnthropicDialect */\n anthropic?: AnthropicDialect\n /** Responses 线的说明角色与加密推理项开关,见 models.ts ResponsesDialect */\n responses?: ResponsesDialect\n /** 凭证怎么带;网关自带凭证头时用 \"none\" 并把头放 headers */\n auth?: FetchModel[\"auth\"]\n headers?: Record<string, string>\n /** 铺进请求体的额外字段(max_tokens、temperature、thinking …) */\n requestOptions?: Record<string, unknown>\n fetch?: typeof globalThis.fetch\n timeoutMs?: number\n trustMarkers?: boolean\n}\n\n/** @deprecated 改名为 ModelOptions(三条线共用同一组选项),保留别名 */\nexport type ChatModelOptions = ModelOptions\n\nexport interface ProviderModelOptions extends ModelOptions {\n /** 用作 ModelRef.provider 与 apiKey 回调的键;表外厂商必填 */\n provider: string\n}\n/** @deprecated 改名为 ProviderModelOptions */\nexport type ChatCompletionsOptions = ProviderModelOptions\n\nconst DEFAULTS = { contextWindow: 128_000, maxOutputTokens: 16_384, reasoning: false, images: false }\n\n/** 去掉值为 undefined 的键:exactOptionalPropertyTypes 下\"没给\"与\"给了 undefined\"要分开 */\nfunction defined<T extends object>(o: T): { [K in keyof T]?: Exclude<T[K], undefined> } {\n return Object.fromEntries(Object.entries(o).filter(([, v]) => v !== undefined)) as never\n}\n\n/** 内置定义打底,选项里给了的字段覆盖;表外模型从保守缺省起 */\nexport function definitionOf(\n provider: string,\n id: string,\n api: FetchApi,\n opts: Omit<ModelOptions, \"apiKey\" | \"requestOptions\" | \"fetch\" | \"timeoutMs\" | \"trustMarkers\">,\n): FetchModel {\n // 同 id 可能两条协议各有一份内置定义(OpenAI),按工厂指定的协议精确取\n const builtin = findBuiltin(provider, id, api)\n const base: FetchModel = builtin ?? { provider, id, api, baseUrl: opts.baseUrl ?? \"\", ...DEFAULTS }\n if (!builtin && !opts.baseUrl) {\n throw new RangeError(`model ${provider}/${id} is not in the built-in table, so baseUrl is required`)\n }\n const chat = base.chat || opts.chat ? { ...base.chat, ...defined(opts.chat ?? {}) } : undefined\n const anthropic =\n base.anthropic || opts.anthropic ? { ...base.anthropic, ...defined(opts.anthropic ?? {}) } : undefined\n const responses =\n base.responses || opts.responses ? { ...base.responses, ...defined(opts.responses ?? {}) } : undefined\n return {\n ...base,\n ...defined({\n baseUrl: opts.baseUrl,\n contextWindow: opts.contextWindow,\n maxOutputTokens: opts.maxOutputTokens,\n reasoning: opts.reasoning,\n images: opts.images,\n cost: opts.cost,\n midConversationSystem: opts.midConversationSystem,\n auth: opts.auth,\n headers: opts.headers,\n }),\n ...(chat ? { chat } : {}),\n ...(anthropic ? { anthropic } : {}),\n ...(responses ? { responses } : {}),\n }\n}\n\nfunction bound(provider: string, id: string, model: FetchModel, opts: ModelOptions): BoundModel {\n const loweringOpts: FetchLoweringOptions = {\n apiKey: (p) => (p === provider ? opts.apiKey : undefined),\n models: [model],\n ...(opts.requestOptions ? { requestOptions: () => opts.requestOptions ?? {} } : {}),\n ...(opts.fetch ? { fetch: opts.fetch } : {}),\n ...(opts.timeoutMs !== undefined ? { timeoutMs: opts.timeoutMs } : {}),\n ...(opts.trustMarkers !== undefined ? { trustMarkers: opts.trustMarkers } : {}),\n }\n return { model: { provider, id }, lowering: new FetchLowering(loweringOpts) }\n}\n\n/** 任何 OpenAI Chat Completions 兼容端点 */\nexport function chatCompletions(id: string, opts: ProviderModelOptions): BoundModel {\n return bound(opts.provider, id, definitionOf(opts.provider, id, \"openai-chat\", opts), opts)\n}\n\n/** DeepSeek 直连:缺省官方地址、开 reasoning_content 方言(带 tools 时缺它 400) */\nexport function deepseek(id: string, opts: ModelOptions): BoundModel {\n return chatCompletions(id, {\n provider: \"deepseek\",\n baseUrl: \"https://api.deepseek.com\",\n reasoning: true,\n images: true,\n ...opts,\n chat: { reasoningContent: true, ...opts.chat },\n })\n}\n\n/** OpenAI 官方 Chat Completions(推理系列请用 Responses 线的 openai()) */\nexport function openaiChat(id: string, opts: ModelOptions): BoundModel {\n return chatCompletions(id, { provider: \"openai\", baseUrl: \"https://api.openai.com/v1\", ...opts })\n}\n\n/**\n * 任何 OpenAI Responses 协议端点:Cloudflare AI Gateway 透传路径(`auth: \"none\"` + `cf-aig-authorization` 头)、\n * 兼容网关。表外模型从保守缺省起(reasoning 假、不收图),宿主按需声明;不认 developer 角色或 include 参数的上游用 `responses` 方言关掉。\n */\nexport function openaiResponses(id: string, opts: ProviderModelOptions): BoundModel {\n return bound(opts.provider, id, definitionOf(opts.provider, id, \"openai-responses\", opts), opts)\n}\n\n/**\n * OpenAI 官方 Responses:缺省官方地址、Bearer 鉴权;表内模型带价目与能力位。`reasoning` 参数不缺省设置——\n * gpt-5 缺省 medium、gpt-5.1 起缺省 none,开不开、开多深由宿主按型号在 requestOptions 里定(与 Anthropic 线的 thinking 同一原则)。\n */\nexport function openai(id: string, opts: ModelOptions): BoundModel {\n // 表外的新型号按\"推理、收图\"起(OpenAI 当前一代皆如此);表内的 gpt-4.1 等非推理型号以内置定义为准,不被这两个缺省盖掉\n const unknown = findBuiltin(\"openai\", id, \"openai-responses\") === undefined\n return openaiResponses(id, {\n provider: \"openai\",\n baseUrl: \"https://api.openai.com/v1\",\n ...(unknown ? { reasoning: true, images: true } : {}),\n ...opts,\n })\n}\n\n/**\n * 任何 Anthropic Messages 协议端点:DeepSeek 的兼容端口(`provider: \"deepseek\", baseUrl: \"https://api.deepseek.com/anthropic\"`)、\n * Cloudflare AI Gateway 透传路径(`auth: \"none\"` + `cf-aig-authorization` 头)。表外模型从保守缺省起(reasoning 假、不收图),宿主按需声明。\n */\nexport function anthropicMessages(id: string, opts: ProviderModelOptions): BoundModel {\n return bound(opts.provider, id, definitionOf(opts.provider, id, \"anthropic-messages\", opts), opts)\n}\n\n/** Anthropic 官方直连:缺省官方地址、x-api-key 鉴权;表内模型带价目与能力位 */\nexport function anthropic(id: string, opts: ModelOptions): BoundModel {\n return anthropicMessages(id, {\n provider: \"anthropic\",\n baseUrl: \"https://api.anthropic.com/v1\",\n reasoning: true,\n images: true,\n ...opts,\n })\n}\n","/**\n * OpenAI Responses 的有损矩阵(P7:有损必声明)。每条实际落点必须命中其中一条,矩阵里不能有死条目(loss-matrix.test.ts)。\n * 与 lowering-pi 的 \"openai-responses\" 表逐格对照:能 exact 的一样(user / assistant-message / reasoning-item / function_call /\n * function_call_output / developer / system)。不同处三格——无加密项或别家的 reasoning 这里 dropped 而非 pi-ai 的\n * \"降为正文 / 厂商看着办\"、tool_call 入参不是对象也照发(arguments 本就是 JSON 字符串,不必包 { value })、\n * tool_result 的 isError 以前缀表达(协议没有错误位)并按模型能力处置图片。\n */\nimport type { LandingSpec } from \"@reinsjs/core\"\nimport { NOT_SENT } from \"../chat/loss-matrix.js\"\n\nconst exact = (landing: string, note?: string, when?: string): LandingSpec => {\n const spec: LandingSpec = { kind: \"exact\", landing }\n if (note) spec.note = note\n if (when) spec.when = when\n return spec\n}\nconst lossy = (landing: string, note: string, when?: string): LandingSpec =>\n when ? { kind: \"lossy\", landing, note, when } : { kind: \"lossy\", landing, note }\nconst dropped = (landing: string, note: string, when?: string): LandingSpec =>\n when ? { kind: \"dropped\", landing, note, when } : { kind: \"dropped\", landing, note }\n\nexport const RESPONSES_LOSS_MATRIX: Readonly<Record<string, readonly LandingSpec[]>> = {\n \"core.user_message\": [\n exact(\"user\", \"a user message in input, as input_text / input_image blocks\"),\n lossy(\n \"user\",\n \"moved after that batch of tool results (the order changes), untrusted content escaped, or images replaced with placeholder text because the model takes none\",\n \"the user speaks up before all tool results are in / the content holds a </untrusted / it carries images the model does not take\",\n ),\n dropped(\n \"none\",\n \"the content is empty, so no empty message is sent\",\n \"the user message has no non-empty content\",\n ),\n ],\n \"core.model_text\": [\n exact(\n \"assistant-message\",\n \"a type:message assistant output item; each text segment of a turn becomes its own item; the item id is replayed when it comes from the same model, otherwise a new one is made up\",\n ),\n dropped(\"none\", \"empty text is not sent\", \"the text is an empty string\"),\n ],\n \"core.model_thinking\": [\n exact(\n \"reasoning-item\",\n \"the whole reasoning item (including encrypted_content) is replayed verbatim\",\n \"replay.thinkingSignature is a reasoning item with encrypted_content and comes from the same source (provider + api + model)\",\n ),\n dropped(\n \"none\",\n \"reasoning with no encrypted_content (the encrypted item was not requested, or the stream broke), from another source, or from another model of the same family (encrypted reasoning is only valid for the model that produced it) cannot be replayed, and is not downgraded to text\",\n ),\n ],\n \"core.tool_call\": [\n exact(\n \"function_call\",\n \"arguments is a JSON string, and non-object arguments are serialized as they are; the fc_ item id is replayed only for the same model (to stay clear of the pairing check)\",\n ),\n ],\n \"core.tool_result\": [\n exact(\n \"function_call_output\",\n \"matched by call_id; output is a string for text, or an array of content blocks when images are present; tool reference parts are expanded into text (Responses has no deferred-loading landing)\",\n ),\n lossy(\n \"function_call_output\",\n \"isError is expressed with a [tool error] prefix (the protocol has no error flag), or untrusted content is escaped, or images are replaced with placeholder text because the model takes none\",\n ),\n ],\n \"core.system_note\": [\n exact(\n \"developer\",\n \"a developer message anywhere in input\",\n \"a reasoning model (or responses.systemRole = developer)\",\n ),\n exact(\n \"system\",\n \"a system message anywhere in input\",\n \"a non-reasoning model (or responses.systemRole = system)\",\n ),\n lossy(\n \"developer\",\n \"a developer message, with the early close inside untrusted content escaped\",\n \"a note the host marked untrusted holds a </untrusted\",\n ),\n lossy(\n \"system\",\n \"a system message, with the early close inside untrusted content escaped\",\n \"same as above\",\n ),\n lossy(\n \"user-role\",\n \"wrapped in a <system_note> tag and sent with the user role\",\n \"the host declared midConversationSystem: false for an unusual upstream, or the note is a directive the model must act on (SystemNotePayload.directive)\",\n ),\n ],\n \"core.compaction\": [\n lossy(\n \"user-text\",\n \"the summary is rendered as user-role text, so the model cannot tell it apart from the user's own words\",\n ),\n ],\n ...NOT_SENT,\n}\n","/**\n * @reinsjs/lowering-fetch —— 降级层只用 fetch 的实现,零依赖、零 node:*。\n *\n * 事件 → 中间表示(分组、后移、trust 标注)→ 线协议请求体;SSE 流 → 事件草稿。\n * 三条线:OpenAI Chat Completions(含 DeepSeek 的 reasoning_content 方言)、Anthropic Messages、OpenAI Responses。\n * 每种事件在每条协议的落点见各协议的 LOSS_MATRIX,禁止静默丢弃。\n */\nexport { consumeAnthropicStream, usageOf as anthropicUsageOf } from \"./anthropic/from-stream.js\"\nexport { ANTHROPIC_LOSS_MATRIX } from \"./anthropic/loss-matrix.js\"\nexport {\n type AnthropicAssistantBlock,\n type AnthropicCacheControl,\n type AnthropicMessage,\n type AnthropicRequestBody,\n type AnthropicTool,\n type AnthropicUserBlock,\n encodeAnthropicRequest,\n MAX_ANTHROPIC_BREAKPOINTS,\n} from \"./anthropic/to-request.js\"\nexport { capabilitiesOf } from \"./capabilities.js\"\nexport { consumeChatStream, usageOf as chatUsageOf } from \"./chat/from-stream.js\"\nexport { CHAT_LOSS_MATRIX } from \"./chat/loss-matrix.js\"\nexport {\n type ChatContentPart,\n type ChatMessage,\n type ChatRequestBody,\n type ChatTool,\n type ChatToolCall,\n encodeChatRequest,\n} from \"./chat/to-request.js\"\nexport {\n anthropic,\n anthropicMessages,\n type ChatCompletionsOptions,\n type ChatModelOptions,\n chatCompletions,\n deepseek,\n definitionOf,\n type ModelOptions,\n openai,\n openaiChat,\n openaiResponses,\n type ProviderModelOptions,\n} from \"./factories.js\"\nexport { DEFAULT_TIMEOUT_MS, HttpError, postJson, requestSignals } from \"./http.js\"\nexport {\n eventsToIr,\n foreignOrigin,\n type IrBlock,\n type IrItem,\n type ModelOrigin,\n orderLandings,\n sameOrigin,\n} from \"./ir.js\"\nexport {\n ANTHROPIC_VERSION,\n type FetchLoweredPayload,\n FetchLowering,\n type FetchLoweringOptions,\n} from \"./lowering.js\"\nexport {\n type AnthropicDialect,\n BUILTIN_MODELS,\n type ChatDialect,\n endpointOf,\n type FetchApi,\n type FetchModel,\n findBuiltin,\n type MidSystemCacheBreakpoint,\n type ResponsesDialect,\n resolveModel,\n SUPPORTED_APIS,\n} from \"./models.js\"\nexport { consumeResponsesStream, usageOf as responsesUsageOf } from \"./responses/from-stream.js\"\nexport { RESPONSES_LOSS_MATRIX } from \"./responses/loss-matrix.js\"\nexport {\n encodeResponsesRequest,\n type ResponsesInputContent,\n type ResponsesInputItem,\n type ResponsesRequestBody,\n type ResponsesTool,\n reasoningItemOf,\n} from \"./responses/to-request.js\"\nexport { parseSse, type SseMessage } from \"./sse.js\"\nexport { costOf, type ModelCost } from \"./usage.js\"\n\nimport type { LossMatrix } from \"@reinsjs/core\"\nimport { ANTHROPIC_LOSS_MATRIX } from \"./anthropic/loss-matrix.js\"\nimport { CHAT_LOSS_MATRIX } from \"./chat/loss-matrix.js\"\nimport { RESPONSES_LOSS_MATRIX } from \"./responses/loss-matrix.js\"\n\n/** api → 事件 type → 可能落点;与 lowering-pi 的 LOSS_MATRIX 同形,逐格对照用 */\nexport const LOSS_MATRIX: LossMatrix = {\n \"openai-chat\": CHAT_LOSS_MATRIX,\n \"anthropic-messages\": ANTHROPIC_LOSS_MATRIX,\n \"openai-responses\": RESPONSES_LOSS_MATRIX,\n}\n\n/** 查某 api 下某事件 type 的声明落点;ext.* 归到通配项 */\nexport function declaredLandings(api: string, type: string): readonly import(\"@reinsjs/core\").LandingSpec[] {\n const table = LOSS_MATRIX[api]\n if (!table) return []\n return table[type] ?? (type.startsWith(\"ext.\") ? (table[\"ext.*\"] ?? []) : [])\n}\n"],"mappings":"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","names":["exact","lossy","dropped","lossy","num","usageOf","apply","outcomeOf","errorText","markUntrusted","renderToolReference","IMAGE_OMITTED","land","renderToolReference","markUntrusted","lossy","LoweringError","str","num","parseArguments","usageOf","apply","outcomeOf","errorText","renderToolReference","IMAGE_OMITTED","ERROR_PREFIX","EMPTY_NOTE","land","renderToolReference","argumentsOf","lossy","LoweringError","anthropic","exact","lossy","dropped"]}
|