@namzu/openrouter 3.0.0 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,55 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.0.3
4
+
5
+ ### Patch Changes
6
+
7
+ - 567ada8: Updated package examples and evaluation fixtures for the SDK's `ToolRegistry`
8
+ removal. Browser, computer-use and LSP documentation now show toolsets; the
9
+ evals use `toolsets` when they call the kernel. Provider changes are test
10
+ fixture migrations only, with no provider runtime API change. Consumers that
11
+ pass tools to the SDK should use `toolsets: readonly Toolset[]` and wrap their
12
+ definitions with `toolset(source, definitions)`.
13
+
14
+ ## 3.0.2
15
+
16
+ ### Patch Changes
17
+
18
+ - 49491b9: The drivers now report more accurately how a response ended. The runtime uses this to tell a tool call the output limit cut off from one the model wrote badly.
19
+
20
+ - `@namzu/anthropic`: a tool call whose JSON does not parse no longer fails the whole stream with "the provider stream returned malformed data". The block close and the finish reason now reach the runtime. `model_context_window_exceeded` is reported as `length`, and `refusal` as `content_filter`. Both used to read as a normal `stop`.
21
+ - `@namzu/bedrock`: `model_context_window_exceeded` is reported as `length`, and `guardrail_intervened` as `content_filter`. A tool call opens with the id the driver keeps, so its arguments never arrive before an id.
22
+ - `@namzu/http`: the OpenAI dialect maps `finish_reason` instead of passing the server's string through. `function_call` becomes `tool_calls`; `max_tokens` and `max_output_tokens` become `length`; `model_length`, `context_length`, `context_length_exceeded` and `model_context_window_exceeded` become `length` with `finishDetail: 'context_window'`; `eos`, `eos_token`, `end_turn` and `stop_sequence` become `stop`. `error` fails the stream with a `ProviderRequestError` (`kind: 'server'`), as OpenRouter's does. A value it does not know reports no finish reason at all, which the runtime reads as a response that did not say how it ended, rather than as a normal finish. The Anthropic dialect gets the Anthropic mapping above and opens a tool call with the id its arguments carry.
23
+ - `@namzu/openrouter`: `finish_reason` is mapped the same way. `error` (the upstream model failed mid-generation) now fails the stream with a `ProviderRequestError` (`kind: 'server'`).
24
+ - `@namzu/deepseek`: `insufficient_system_resource` now fails the stream with a `ProviderRequestError` (`kind: 'server'`). It used to read as a finished answer.
25
+ - `@namzu/openai`: Codex's `response.incomplete` is reported as `length`, or as `content_filter` when that is the stated reason, with its usage. The stream used to end with no finish reason, so auto-continuation never ran.
26
+ - `@namzu/anthropic`, `@namzu/bedrock` and `@namzu/http`'s Anthropic dialect: a `model_context_window_exceeded` stop also carries `finishDetail: 'context_window'`, so the runtime does not ask the model to continue a reply that filled the whole context window.
27
+ - `@namzu/anthropic`, `@namzu/google` and `@namzu/openai` (Codex): the list of sources a driver appends after a hosted search now carries `contentOrigin: 'driver'` on its stream chunk. The text is unchanged. Without the mark, a tool call the output limit cut off before that list would be reported as malformed.
28
+
29
+ If you branch on `finishReason`, expect `length` or `content_filter` where you saw `stop` for these cases.
30
+
31
+ - 2d4ff9a: Earlier entries in this package's CHANGELOG no longer name one particular application built on namzu, or quote a path from outside this repository. This changes only the CHANGELOG.md that ships in the tarball; no code or types change, and there is nothing to do to upgrade.
32
+ - 49491b9: A response whose upstream backend reports its own context-window-exceeded reason (Anthropic's `model_context_window_exceeded`, or the words other OpenAI-compatible backends use) via OpenRouter's `native_finish_reason` now carries `finishDetail: 'context_window'` alongside `finishReason: 'length'`. OpenRouter normalizes every backend's finish reason to one of five values, so a proxied model's context-window stop and its output-token-limit stop both used to report a plain `'length'` finish; the runtime auto-continues that, sending a reply that had just filled the model's context window straight back in, in a prompt now longer than the window it had just overflowed. A plain output-limit `'length'` is unaffected: `finishDetail` is set only when `native_finish_reason` names the model's context window.
33
+
34
+ ## 3.0.1
35
+
36
+ ### Patch Changes
37
+
38
+ - 3641102: Prompt caching now places explicit breakpoints instead of sending a top-level
39
+ `cache_control: { type: 'auto' }`, a value OpenRouter does not define (its
40
+ top-level field takes `{ type: 'ephemeral' }` and puts the breakpoint on the
41
+ last cacheable block — with request-only context at the tail, the part the next
42
+ request replaces).
43
+
44
+ For `anthropic/`, `google/gemini` and `qwen/` models, the models OpenRouter
45
+ documents as needing explicit breakpoints, a cache request marks the last
46
+ static system message and the last non-system message before request-only
47
+ context, each inside a content part (a string becomes one text part). A system
48
+ message directly before the context is the step's guidance, which changes from
49
+ step to step, so it is passed over rather than marked. Other models, which
50
+ OpenRouter documents as caching automatically, are sent no marker and keep
51
+ their plain string content.
52
+
3
53
  ## 3.0.0
4
54
 
5
55
  ### Major Changes
@@ -642,8 +692,8 @@
642
692
  The kernel now emits a per-message and per-tool-input lifecycle on the
643
693
  event bus, and the provider contract collapses to a single streaming
644
694
  entry point. Together these unlock live tool-call rendering (Calling →
645
- Running → Done with incremental input) for SSE consumers — the cowork
646
- workspace surface that motivated the work in the first place.
695
+ Running → Done with incremental input) for SSE consumers — a live
696
+ workspace surface motivated the work in the first place.
647
697
 
648
698
  ## Breaking changes
649
699
 
package/README.md CHANGED
@@ -62,7 +62,7 @@ for await (const chunk of provider.chatStream({
62
62
  ```
63
63
 
64
64
  `chatStream` is the only model entry point; a non-streaming call is that
65
- stream collected. In practice the kernel's run loop calls it and hands you
65
+ stream collected. In practice the kernel's turn loop calls it and hands you
66
66
  events.
67
67
 
68
68
  ## Reasoning
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,oBAAoB,EACpB,WAAW,EACX,SAAS,EACT,oBAAoB,EACpB,WAAW,EAGX,MAAM,YAAY,CAAA;AASnB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AA4KlD;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,oBAUrC,CAAA;AAED,qBAAa,kBAAmB,YAAW,WAAW;IACrD,QAAQ,CAAC,EAAE,gBAAe;IAC1B,QAAQ,CAAC,IAAI,gBAAe;IAC5B,QAAQ,CAAC,YAAY,uBAA0B;IAE/C,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAQ;gBAEX,MAAM,EAAE,gBAAgB;IAQpC,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,gBAAgB;IA4CjB,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG,aAAa,CAAC,WAAW,CAAC;IA4K3E;;;;;;;;;;;;;OAaG;IACG,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB1D;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAyB5F,uEAAuE;IACvE,OAAO,CAAC,cAAc,CAAC,CAAqB;IAEtC,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAsCtD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAWrC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,oBAAoB,EACpB,WAAW,EACX,SAAS,EACT,oBAAoB,EACpB,WAAW,EAGX,MAAM,YAAY,CAAA;AASnB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAuUlD;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,oBAUrC,CAAA;AAED,qBAAa,kBAAmB,YAAW,WAAW;IACrD,QAAQ,CAAC,EAAE,gBAAe;IAC1B,QAAQ,CAAC,IAAI,gBAAe;IAC5B,QAAQ,CAAC,YAAY,uBAA0B;IAE/C,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAQ;gBAEX,MAAM,EAAE,gBAAgB;IAQpC,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,gBAAgB;IA4CjB,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG,aAAa,CAAC,WAAW,CAAC;IA6K3E;;;;;;;;;;;;;OAaG;IACG,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB1D;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAyB5F,uEAAuE;IACvE,OAAO,CAAC,cAAc,CAAC,CAAqB;IAEtC,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAsCtD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAWrC"}
package/dist/client.js CHANGED
@@ -1,5 +1,152 @@
1
1
  import { ProviderRequestError, isCallerAbortError, isProviderRequestError, providerHttpError, providerVendorError, } from '@namzu/sdk';
2
2
  import { attributionHeaders } from '@namzu/sdk';
3
+ /**
4
+ * The words a proxied backend's own `native_finish_reason` uses for "the
5
+ * model's context window, not its output-token budget, is what ran out" —
6
+ * the same vocabulary `@namzu/http`'s `mapOpenAIFinish` reads from an
7
+ * OpenAI-compatible dialect, since OpenRouter's backends speak in exactly
8
+ * those dialects underneath its own normalisation.
9
+ */
10
+ const CONTEXT_WINDOW_NATIVE_REASONS = new Set([
11
+ 'model_context_window_exceeded',
12
+ 'model_length',
13
+ 'context_length',
14
+ 'context_length_exceeded',
15
+ ]);
16
+ /**
17
+ * OpenRouter's normalised `finish_reason`, as the finish fields of a stream
18
+ * chunk: `finishReason`, and `finishDetail: 'context_window'` when a
19
+ * `'length'` finish was the model's context window.
20
+ *
21
+ * `finish_reason` used to be cast straight through. `error` — the upstream
22
+ * failed mid-generation — then reached the runtime as a finish reason
23
+ * outside its union, and a tool call the failure cut off read as one the
24
+ * model had finished and got wrong. It is a failure, and is thrown as one.
25
+ *
26
+ * OpenRouter collapses every backend's own reason into one of five, so a
27
+ * proxied Anthropic model's context window and a proxied OpenAI model's
28
+ * output limit both arrive here as plain `'length'` — exactly the fold that
29
+ * made an lmstudio and http response cut off by its context window get
30
+ * auto-continued into a prompt longer than the window it had just filled.
31
+ * `native_finish_reason` carries the backend's own word for it verbatim
32
+ * (OpenRouter's API reference calls it "the raw finish_reason from the
33
+ * provider"), and is read here only to recover that one distinction.
34
+ */
35
+ function mapFinishReason(reason, nativeReason) {
36
+ switch (reason) {
37
+ case null:
38
+ case undefined:
39
+ case '':
40
+ return {};
41
+ case 'length':
42
+ return nativeReason && CONTEXT_WINDOW_NATIVE_REASONS.has(nativeReason)
43
+ ? { finishReason: 'length', finishDetail: 'context_window' }
44
+ : { finishReason: 'length' };
45
+ case 'tool_calls':
46
+ case 'function_call':
47
+ return { finishReason: 'tool_calls' };
48
+ case 'content_filter':
49
+ return { finishReason: 'content_filter' };
50
+ case 'error':
51
+ throw new ProviderRequestError({
52
+ kind: 'server',
53
+ providerId: 'openrouter',
54
+ detail: 'the upstream model failed while generating',
55
+ });
56
+ default:
57
+ return { finishReason: 'stop' };
58
+ }
59
+ }
60
+ /**
61
+ * Models whose upstream caches only where the request places an explicit
62
+ * `cache_control` breakpoint. OpenRouter's prompt-caching page
63
+ * (openrouter.ai/docs/features/prompt-caching) lists Anthropic Claude, Google
64
+ * Gemini ("only the last breakpoint" is used) and Alibaba Qwen ("requires
65
+ * explicit `cache_control`"); OpenAI, DeepSeek, Grok, Moonshot, Groq and Z.AI
66
+ * cache automatically and are sent no marker, so their messages keep the
67
+ * plain string shape they have always had.
68
+ */
69
+ function takesExplicitBreakpoints(model) {
70
+ const id = model.replace(/^~/, '').toLowerCase();
71
+ return id.startsWith('anthropic/') || id.startsWith('google/gemini') || id.startsWith('qwen/');
72
+ }
73
+ /**
74
+ * Request-only context the runtime appends after the conversation: a
75
+ * runtime-context user message of kind `step-context`. It changes from one
76
+ * request to the next, so a breakpoint after it caches a prefix no later
77
+ * request repeats. The same test as the Anthropic driver's.
78
+ */
79
+ function isRequestOnlyContext(msg) {
80
+ return (msg.role === 'user' &&
81
+ msg.source?.type === 'runtime-context' &&
82
+ msg.source.kind === 'step-context');
83
+ }
84
+ const EPHEMERAL = { type: 'ephemeral' };
85
+ /**
86
+ * Put a breakpoint on a formatted message's last content part, turning a
87
+ * string into a one-part array to carry it. Answers false when the message
88
+ * has no content to carry one — an assistant turn holding only tool calls.
89
+ *
90
+ * Always INSIDE a content part: a top-level `cache_control` on a `tool`
91
+ * message is not accepted by OpenRouter, while one inside its content part
92
+ * is (NousResearch/hermes-agent#57845, verified against
93
+ * `anthropic/claude-haiku-4.5`).
94
+ */
95
+ function markLastPart(message) {
96
+ const content = message.content;
97
+ if (typeof content === 'string') {
98
+ if (content.length === 0)
99
+ return false;
100
+ message.content = [{ type: 'text', text: content, cache_control: EPHEMERAL }];
101
+ return true;
102
+ }
103
+ if (Array.isArray(content) && content.length > 0) {
104
+ const last = content[content.length - 1];
105
+ if (last === null || typeof last !== 'object')
106
+ return false;
107
+ // A copy: the array is the caller's own message content.
108
+ message.content = [...content.slice(0, -1), { ...last, cache_control: EPHEMERAL }];
109
+ return true;
110
+ }
111
+ return false;
112
+ }
113
+ /**
114
+ * Explicit breakpoints for the runtime's cache request: one after the last
115
+ * static system message, one on the last non-system message before
116
+ * request-only context. Two of the four Anthropic allows.
117
+ *
118
+ * This replaces a top-level `cache_control: { type: 'auto' }`. OpenRouter
119
+ * defines the top-level field with `{ type: 'ephemeral' }` only, and applies
120
+ * it "to the last cacheable block" — which, with request-only context at the
121
+ * tail, is the context itself, so the cached prefix would never be read
122
+ * again.
123
+ *
124
+ * System messages are passed over when walking back: the runtime places a
125
+ * step's preamble (host `step.system`, step skills, the policy notice,
126
+ * `turn` contributions) as a system message directly before the context,
127
+ * and its text changes from step to step, so a marker there would end the
128
+ * prefix on bytes the next request does not repeat.
129
+ */
130
+ function applyCacheBreakpoints(source, formatted) {
131
+ let lastStatic = -1;
132
+ let historyEnd = source.length;
133
+ for (const [i, msg] of source.entries()) {
134
+ if (msg.role === 'system' && msg.cacheHint === 'cache')
135
+ lastStatic = i;
136
+ if (historyEnd === source.length && isRequestOnlyContext(msg))
137
+ historyEnd = i;
138
+ }
139
+ const staticMessage = lastStatic >= 0 ? formatted[lastStatic] : undefined;
140
+ if (staticMessage)
141
+ markLastPart(staticMessage);
142
+ for (let i = historyEnd - 1; i > lastStatic; i--) {
143
+ if (source[i]?.role === 'system')
144
+ continue;
145
+ const message = formatted[i];
146
+ if (message && markLastPart(message))
147
+ return;
148
+ }
149
+ }
3
150
  const OPENROUTER_BASE_URL = process.env.OPENROUTER_BASE_URL ?? 'https://openrouter.ai/api/v1';
4
151
  /**
5
152
  * A rate OpenRouter published for a model, or nothing.
@@ -230,8 +377,8 @@ export class OpenRouterProvider {
230
377
  body.repetition_penalty = params.repetitionPenalty;
231
378
  if (params.stop)
232
379
  body.stop = params.stop;
233
- if (params.cacheControl) {
234
- body.cache_control = params.cacheControl;
380
+ if (params.cacheControl && takesExplicitBreakpoints(params.model)) {
381
+ applyCacheBreakpoints(params.messages, body.messages);
235
382
  }
236
383
  // Refused, not dropped, when this wire cannot carry the level asked
237
384
  // for — see `formatReasoning`.
@@ -355,7 +502,7 @@ export class OpenRouterProvider {
355
502
  content,
356
503
  toolCalls,
357
504
  },
358
- finishReason: choice.finish_reason,
505
+ ...mapFinishReason(choice.finish_reason, choice.native_finish_reason),
359
506
  usage: parsed.usage ? parseUsage(parsed.usage) : undefined,
360
507
  };
361
508
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@namzu/openrouter",
3
- "version": "3.0.0",
3
+ "version": "3.0.3",
4
4
  "description": "OpenRouter LLM provider for @namzu/sdk. Access to 200+ models (Claude, GPT-4, Llama, Mixtral) via OpenRouter's unified API.",
5
5
  "license": "FSL-1.1-MIT",
6
6
  "engines": {
@@ -55,7 +55,7 @@
55
55
  "@types/node": "^22.19.17",
56
56
  "typescript": "^5.5.0",
57
57
  "vitest": "^4.1.11",
58
- "@namzu/sdk": "^43.0.0"
58
+ "@namzu/sdk": "^48.0.0"
59
59
  },
60
60
  "scripts": {
61
61
  "build": "tsc --build",
package/src/client.ts CHANGED
@@ -17,6 +17,161 @@ import {
17
17
  import { attributionHeaders } from '@namzu/sdk'
18
18
  import type { OpenRouterConfig } from './types.js'
19
19
 
20
+ /**
21
+ * The words a proxied backend's own `native_finish_reason` uses for "the
22
+ * model's context window, not its output-token budget, is what ran out" —
23
+ * the same vocabulary `@namzu/http`'s `mapOpenAIFinish` reads from an
24
+ * OpenAI-compatible dialect, since OpenRouter's backends speak in exactly
25
+ * those dialects underneath its own normalisation.
26
+ */
27
+ const CONTEXT_WINDOW_NATIVE_REASONS = new Set([
28
+ 'model_context_window_exceeded',
29
+ 'model_length',
30
+ 'context_length',
31
+ 'context_length_exceeded',
32
+ ])
33
+
34
+ /**
35
+ * OpenRouter's normalised `finish_reason`, as the finish fields of a stream
36
+ * chunk: `finishReason`, and `finishDetail: 'context_window'` when a
37
+ * `'length'` finish was the model's context window.
38
+ *
39
+ * `finish_reason` used to be cast straight through. `error` — the upstream
40
+ * failed mid-generation — then reached the runtime as a finish reason
41
+ * outside its union, and a tool call the failure cut off read as one the
42
+ * model had finished and got wrong. It is a failure, and is thrown as one.
43
+ *
44
+ * OpenRouter collapses every backend's own reason into one of five, so a
45
+ * proxied Anthropic model's context window and a proxied OpenAI model's
46
+ * output limit both arrive here as plain `'length'` — exactly the fold that
47
+ * made an lmstudio and http response cut off by its context window get
48
+ * auto-continued into a prompt longer than the window it had just filled.
49
+ * `native_finish_reason` carries the backend's own word for it verbatim
50
+ * (OpenRouter's API reference calls it "the raw finish_reason from the
51
+ * provider"), and is read here only to recover that one distinction.
52
+ */
53
+ function mapFinishReason(
54
+ reason: string | null | undefined,
55
+ nativeReason: string | null | undefined,
56
+ ): Pick<StreamChunk, 'finishReason' | 'finishDetail'> {
57
+ switch (reason) {
58
+ case null:
59
+ case undefined:
60
+ case '':
61
+ return {}
62
+ case 'length':
63
+ return nativeReason && CONTEXT_WINDOW_NATIVE_REASONS.has(nativeReason)
64
+ ? { finishReason: 'length', finishDetail: 'context_window' }
65
+ : { finishReason: 'length' }
66
+ case 'tool_calls':
67
+ case 'function_call':
68
+ return { finishReason: 'tool_calls' }
69
+ case 'content_filter':
70
+ return { finishReason: 'content_filter' }
71
+ case 'error':
72
+ throw new ProviderRequestError({
73
+ kind: 'server',
74
+ providerId: 'openrouter',
75
+ detail: 'the upstream model failed while generating',
76
+ })
77
+ default:
78
+ return { finishReason: 'stop' }
79
+ }
80
+ }
81
+
82
+ /**
83
+ * Models whose upstream caches only where the request places an explicit
84
+ * `cache_control` breakpoint. OpenRouter's prompt-caching page
85
+ * (openrouter.ai/docs/features/prompt-caching) lists Anthropic Claude, Google
86
+ * Gemini ("only the last breakpoint" is used) and Alibaba Qwen ("requires
87
+ * explicit `cache_control`"); OpenAI, DeepSeek, Grok, Moonshot, Groq and Z.AI
88
+ * cache automatically and are sent no marker, so their messages keep the
89
+ * plain string shape they have always had.
90
+ */
91
+ function takesExplicitBreakpoints(model: string): boolean {
92
+ const id = model.replace(/^~/, '').toLowerCase()
93
+ return id.startsWith('anthropic/') || id.startsWith('google/gemini') || id.startsWith('qwen/')
94
+ }
95
+
96
+ /**
97
+ * Request-only context the runtime appends after the conversation: a
98
+ * runtime-context user message of kind `step-context`. It changes from one
99
+ * request to the next, so a breakpoint after it caches a prefix no later
100
+ * request repeats. The same test as the Anthropic driver's.
101
+ */
102
+ function isRequestOnlyContext(msg: ChatCompletionParams['messages'][number]): boolean {
103
+ return (
104
+ msg.role === 'user' &&
105
+ msg.source?.type === 'runtime-context' &&
106
+ msg.source.kind === 'step-context'
107
+ )
108
+ }
109
+
110
+ const EPHEMERAL = { type: 'ephemeral' } as const
111
+
112
+ /**
113
+ * Put a breakpoint on a formatted message's last content part, turning a
114
+ * string into a one-part array to carry it. Answers false when the message
115
+ * has no content to carry one — an assistant turn holding only tool calls.
116
+ *
117
+ * Always INSIDE a content part: a top-level `cache_control` on a `tool`
118
+ * message is not accepted by OpenRouter, while one inside its content part
119
+ * is (NousResearch/hermes-agent#57845, verified against
120
+ * `anthropic/claude-haiku-4.5`).
121
+ */
122
+ function markLastPart(message: { content?: unknown }): boolean {
123
+ const content = message.content
124
+ if (typeof content === 'string') {
125
+ if (content.length === 0) return false
126
+ message.content = [{ type: 'text', text: content, cache_control: EPHEMERAL }]
127
+ return true
128
+ }
129
+ if (Array.isArray(content) && content.length > 0) {
130
+ const last = content[content.length - 1]
131
+ if (last === null || typeof last !== 'object') return false
132
+ // A copy: the array is the caller's own message content.
133
+ message.content = [...content.slice(0, -1), { ...last, cache_control: EPHEMERAL }]
134
+ return true
135
+ }
136
+ return false
137
+ }
138
+
139
+ /**
140
+ * Explicit breakpoints for the runtime's cache request: one after the last
141
+ * static system message, one on the last non-system message before
142
+ * request-only context. Two of the four Anthropic allows.
143
+ *
144
+ * This replaces a top-level `cache_control: { type: 'auto' }`. OpenRouter
145
+ * defines the top-level field with `{ type: 'ephemeral' }` only, and applies
146
+ * it "to the last cacheable block" — which, with request-only context at the
147
+ * tail, is the context itself, so the cached prefix would never be read
148
+ * again.
149
+ *
150
+ * System messages are passed over when walking back: the runtime places a
151
+ * step's preamble (host `step.system`, step skills, the policy notice,
152
+ * `turn` contributions) as a system message directly before the context,
153
+ * and its text changes from step to step, so a marker there would end the
154
+ * prefix on bytes the next request does not repeat.
155
+ */
156
+ function applyCacheBreakpoints(
157
+ source: ChatCompletionParams['messages'],
158
+ formatted: { content?: unknown }[],
159
+ ): void {
160
+ let lastStatic = -1
161
+ let historyEnd = source.length
162
+ for (const [i, msg] of source.entries()) {
163
+ if (msg.role === 'system' && msg.cacheHint === 'cache') lastStatic = i
164
+ if (historyEnd === source.length && isRequestOnlyContext(msg)) historyEnd = i
165
+ }
166
+ const staticMessage = lastStatic >= 0 ? formatted[lastStatic] : undefined
167
+ if (staticMessage) markLastPart(staticMessage)
168
+ for (let i = historyEnd - 1; i > lastStatic; i--) {
169
+ if (source[i]?.role === 'system') continue
170
+ const message = formatted[i]
171
+ if (message && markLastPart(message)) return
172
+ }
173
+ }
174
+
20
175
  const OPENROUTER_BASE_URL = process.env.OPENROUTER_BASE_URL ?? 'https://openrouter.ai/api/v1'
21
176
 
22
177
  /**
@@ -289,8 +444,8 @@ export class OpenRouterProvider implements LLMProvider {
289
444
  if (params.repetitionPenalty !== undefined) body.repetition_penalty = params.repetitionPenalty
290
445
  if (params.stop) body.stop = params.stop
291
446
 
292
- if (params.cacheControl) {
293
- body.cache_control = params.cacheControl
447
+ if (params.cacheControl && takesExplicitBreakpoints(params.model)) {
448
+ applyCacheBreakpoints(params.messages, body.messages as { content?: unknown }[])
294
449
  }
295
450
 
296
451
  // Refused, not dropped, when this wire cannot carry the level asked
@@ -392,7 +547,8 @@ export class OpenRouterProvider implements LLMProvider {
392
547
  function?: { name?: string; arguments?: string }
393
548
  }>
394
549
  }
395
- finish_reason?: string
550
+ finish_reason?: string | null
551
+ native_finish_reason?: string | null
396
552
  }>
397
553
  usage?: RawUsage
398
554
  }
@@ -446,7 +602,7 @@ export class OpenRouterProvider implements LLMProvider {
446
602
  content,
447
603
  toolCalls,
448
604
  },
449
- finishReason: choice.finish_reason as StreamChunk['finishReason'],
605
+ ...mapFinishReason(choice.finish_reason, choice.native_finish_reason),
450
606
  usage: parsed.usage ? parseUsage(parsed.usage) : undefined,
451
607
  }
452
608
  }