@namzu/openrouter 2.4.0 → 3.0.0

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,72 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - e83dfe5: `listModels()` omits `inputPrice` and `outputPrice` for a model this driver has no rate for, instead of reporting the rate as `0`.
8
+
9
+ The returned `ModelInfo[]` is the published signature that moved: both fields are optional on it now, so read them as `number | undefined`. Their runtime values changed too, and that half is not caught by a type — a key that used to be present is now absent, and code that defaulted it with `?? 0` will keep doing exactly what this release stopped doing for you.
10
+
11
+ What each driver does now:
12
+
13
+ - **`@namzu/anthropic`** — the live listing from `models.list` carries no rates, so it omits both. The bundled offline catalogue still carries its real published prices, unchanged.
14
+ - **`@namzu/openai`** — `client.models.list` publishes no rates, so both are omitted. `codex` likewise.
15
+ - **`@namzu/deepseek`** — the account listing and the bundled known-model list are unrated here, so both are omitted.
16
+ - **`@namzu/google`** — the two-row price table still prices `gemini-2.5-flash` and `gemini-2.5-pro`; every other model the API returns is now unpriced rather than free.
17
+ - **`@namzu/openrouter`** — a model whose listing carries no `pricing` block is unpriced. A model the vendor prices at `"0"` is still free and still reports `0`, which is the distinction this release is about.
18
+
19
+ An absent rate means unknown, and a consumer that shows one should say so rather than `$0.00`. `@namzu/sdk`'s `ModelInfo.inputPrice` carries the reasoning.
20
+
21
+ ### Minor Changes
22
+
23
+ - e5411cc: Send and surface reasoning.
24
+
25
+ The driver now carries the SDK's thinking controls onto OpenRouter's unified `reasoning`
26
+ object — `thinking: { type: 'enabled', budgetTokens }` becomes `{ enabled: true, max_tokens }`,
27
+ `adaptive` becomes `{ enabled: true }`, `disabled` becomes `{ enabled: false }`, and `effort`
28
+ becomes `{ effort }` — and streams the model's thinking back on the reasoning channel
29
+ instead of dropping it. `effort: 'max'` and `effort: 'ultra'` are refused rather than sent:
30
+ this wire cannot carry those levels, and an effort that arrives as a different depth is
31
+ indistinguishable from one that was honoured.
32
+
33
+ What a host observes: a caller that set `thinking` or `effort` used to get
34
+ `OpenRouterProvider does not implement thinking`; the request is now made. Reasoning blocks
35
+ arrive on the assistant message for every model that returns them (verified against
36
+ `nvidia/nemotron-3.5-lightning:free`, which returns both `reasoning` and `reasoning_details`),
37
+ and `usage.reasoningTokens` reports the thinking share of the completion tokens the vendor
38
+ already billed. The text is emitted once, not twice: OpenRouter sends it in both fields, and
39
+ the indexed `reasoning_details` form is the one used.
40
+
41
+ ## 2.4.1
42
+
43
+ ### Patch Changes
44
+
45
+ - 8d5223b: Nothing a consumer installs or calls changes, and that is the whole of this
46
+ release. `vitest` moves from `^3.2.6` to `^4.1.11` in the `devDependencies` of
47
+ all nineteen packages that declared it, and `@vitest/coverage-v8` moves with it
48
+ in `@namzu/sdk`. Every occurrence is a devDependency — checked, not assumed —
49
+ so `dependencies`, `peerDependencies`, exports, types, defaults and the wire
50
+ shape are untouched, and the published tarballs differ from the previous
51
+ release only in `package.json#devDependencies`.
52
+
53
+ The reason is a security fix with no 3.x backport. `GHSA-82fw-gwwq-j7x9`
54
+ ("Path Traversal / Arbitrary File Read via `@vitest/mocker` Redirect Mock")
55
+ covers `vitest` and `@vitest/mocker` from `2.1.0` up to `4.1.11`, so `^3.2.6`
56
+ can only be resolved by leaving the 3.x line. `4.1.11` is the first patched
57
+ release and is what the lockfile now resolves for both.
58
+
59
+ What this costs anyone who works on the repository rather than with it: the
60
+ upgrade was not a version bump. Vitest 4 changed test discovery, coverage
61
+ configuration, mock construction and reporter output, and each of those broke
62
+ something here that had to be migrated rather than worked around. Those fixes
63
+ are all under `__tests__/`, `vitest.config.ts` files and `scripts/`, none of
64
+ which is published, which is why this is a patch and not a major.
65
+
66
+ You do not need to do anything. If you pin `vitest` yourself to run this
67
+ project's own suites, note that the config files it ships are now written for
68
+ `>= 4.1.11` and will not run under 3.x.
69
+
3
70
  ## 2.4.0
4
71
 
5
72
  ### Minor Changes
package/README.md CHANGED
@@ -65,6 +65,35 @@ for await (const chunk of provider.chatStream({
65
65
  stream collected. In practice the kernel's run loop calls it and hands you
66
66
  events.
67
67
 
68
+ ## Reasoning
69
+
70
+ The driver carries the SDK's thinking controls and returns what the model thinks:
71
+
72
+ ```ts
73
+ import { registerOpenRouter, OpenRouterProvider } from '@namzu/openrouter'
74
+
75
+ registerOpenRouter()
76
+ const provider = new OpenRouterProvider({ apiKey: 'sk-example' })
77
+
78
+ for await (const chunk of provider.chatStream({
79
+ model: 'nvidia/nemotron-3.5-lightning:free',
80
+ messages: [{ role: 'user', content: 'What is 17 times 3?' }],
81
+ thinking: { type: 'enabled', budgetTokens: 4_096 },
82
+ })) {
83
+ if (chunk.delta.reasoning?.text) process.stderr.write(chunk.delta.reasoning.text)
84
+ if (chunk.delta.content) process.stdout.write(chunk.delta.content)
85
+ }
86
+ ```
87
+
88
+ `thinking: { type: 'enabled', budgetTokens }` is sent as `reasoning: { enabled: true,
89
+ max_tokens }`, `adaptive` as `{ enabled: true }`, `disabled` as `{ enabled: false }`, and
90
+ `effort` as `{ effort }`. `effort: 'max'` and `'ultra'` are refused rather than sent — this
91
+ wire cannot carry those levels. Reasoning arrives on the kernel's reasoning channel with an
92
+ index per block and a `done` marker when output starts, and `usage.reasoningTokens` reports
93
+ the thinking share of the completion tokens OpenRouter already bills as output. OpenRouter
94
+ sends each fragment twice (a flat `reasoning` string and the indexed `reasoning_details`);
95
+ the driver emits it once.
96
+
68
97
  ## Documentation
69
98
 
70
99
  - [Namzu docs](https://github.com/cogitave/namzu/tree/main/docs)
@@ -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;AAUnB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAwClD;;;;;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;IAqCjB,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG,aAAa,CAAC,WAAW,CAAC;IAmI3E;;;;;;;;;;;;;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;IAkCtD,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;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"}
package/dist/client.js CHANGED
@@ -1,6 +1,36 @@
1
- import { ProviderRequestError, assertThinkingUnsupported, isCallerAbortError, isProviderRequestError, providerHttpError, providerVendorError, } from '@namzu/sdk';
1
+ import { ProviderRequestError, isCallerAbortError, isProviderRequestError, providerHttpError, providerVendorError, } from '@namzu/sdk';
2
2
  import { attributionHeaders } from '@namzu/sdk';
3
3
  const OPENROUTER_BASE_URL = process.env.OPENROUTER_BASE_URL ?? 'https://openrouter.ai/api/v1';
4
+ /**
5
+ * A rate OpenRouter published for a model, or nothing.
6
+ *
7
+ * This listing is the one place both answers arrive on the same field and
8
+ * only one of them used to survive. OpenRouter states each rate as a decimal
9
+ * string of USD per token and states `"0"` for the models it serves at no
10
+ * charge — so `?? '0'` did not default a missing price, it asserted one: every
11
+ * model whose pricing block was absent was reported as free, which is a claim
12
+ * about a bill. Absence now stays absent, a published `"0"` is still a real
13
+ * zero, and a value that does not parse is treated as absence rather than
14
+ * `NaN` — which would reach a consumer as a total nobody can read.
15
+ *
16
+ * See `ModelInfo.inputPrice`.
17
+ */
18
+ function pricePerMillion(raw) {
19
+ if (raw === undefined)
20
+ return undefined;
21
+ const parsed = Number.parseFloat(raw);
22
+ return Number.isFinite(parsed) ? parsed * 1_000_000 : undefined;
23
+ }
24
+ /**
25
+ * The reasoning breakdown, when the vendor reports one.
26
+ *
27
+ * `completion_tokens` already includes these — OpenRouter bills thinking as
28
+ * output — so this is a SUBSET, never an addition. It is reported rather than
29
+ * dropped because it is the only measure of how much of a turn was spent
30
+ * thinking, which is what a reader of `/cost` is looking at when a reasoning
31
+ * model looks expensive. Absent stays absent: a vendor that does not report
32
+ * the split has not reported zero.
33
+ */
4
34
  function parseUsage(raw) {
5
35
  if (!raw) {
6
36
  return {
@@ -11,12 +41,87 @@ function parseUsage(raw) {
11
41
  cacheWriteTokens: 0,
12
42
  };
13
43
  }
44
+ const reasoningTokens = raw.completion_tokens_details?.reasoning_tokens;
14
45
  return {
15
46
  promptTokens: raw.prompt_tokens,
16
47
  completionTokens: raw.completion_tokens,
17
48
  totalTokens: raw.total_tokens,
18
49
  cachedTokens: raw.prompt_tokens_details?.cached_tokens ?? raw.cache_read_input_tokens ?? 0,
19
50
  cacheWriteTokens: raw.cache_creation_input_tokens ?? 0,
51
+ ...(reasoningTokens !== undefined ? { reasoningTokens } : {}),
52
+ };
53
+ }
54
+ /**
55
+ * Map one frame's reasoning onto the kernel's channel.
56
+ *
57
+ * The wire sends the same text twice: a flat `delta.reasoning` string AND a
58
+ * `delta.reasoning_details` array. Emitting both would double every block, so
59
+ * the array wins whenever it is present — it is the one that carries the index
60
+ * and the signature — and the flat string is the fallback for a vendor that
61
+ * sends only that.
62
+ *
63
+ * An empty array means the frame carried no reasoning at all; it is not a
64
+ * statement that the flat field should be trusted.
65
+ */
66
+ function parseReasoning(details, flat) {
67
+ if (details && details.length > 0) {
68
+ const mapped = [];
69
+ for (const [position, detail] of details.entries()) {
70
+ const index = typeof detail.index === 'number' ? detail.index : position;
71
+ if (detail.type === 'reasoning.encrypted') {
72
+ if (detail.data)
73
+ mapped.push({ index, type: 'redacted_thinking', encrypted: detail.data });
74
+ continue;
75
+ }
76
+ if (typeof detail.text !== 'string' || detail.text.length === 0)
77
+ continue;
78
+ mapped.push({
79
+ index,
80
+ type: 'thinking',
81
+ text: detail.text,
82
+ ...(detail.signature ? { signature: detail.signature } : {}),
83
+ });
84
+ }
85
+ return mapped;
86
+ }
87
+ return typeof flat === 'string' && flat.length > 0
88
+ ? [{ index: 0, type: 'thinking', text: flat }]
89
+ : [];
90
+ }
91
+ /**
92
+ * The effort levels this wire can carry.
93
+ *
94
+ * OpenRouter's unified `reasoning.effort` publishes exactly these. The SDK's
95
+ * `max` and `ultra` are OpenAI-model-specific names with no equivalent here,
96
+ * and a driver must not send one and hope: an effort that arrives as a
97
+ * different depth is indistinguishable from one that was honoured.
98
+ */
99
+ const OPENROUTER_REASONING_EFFORT = ['none', 'minimal', 'low', 'medium', 'high', 'xhigh'];
100
+ /**
101
+ * Map the SDK's thinking controls onto OpenRouter's unified `reasoning` object.
102
+ *
103
+ * `undefined` means "say nothing", which leaves the vendor's own default in
104
+ * place — the only correct answer for a driver that was asked for nothing.
105
+ */
106
+ function formatReasoning(thinking, effort) {
107
+ if (effort !== undefined) {
108
+ const carried = OPENROUTER_REASONING_EFFORT.includes(effort);
109
+ if (!carried) {
110
+ throw new Error(`OpenRouterProvider cannot carry effort "${effort}". Its reasoning.effort accepts ${OPENROUTER_REASONING_EFFORT.join(', ')}. Sending a different level would return a perfectly ordinary completion that no caller could tell apart from the one that was asked for.`);
111
+ }
112
+ return { effort };
113
+ }
114
+ if (!thinking || thinking.type === undefined)
115
+ return undefined;
116
+ if (thinking.type === 'disabled')
117
+ return { enabled: false };
118
+ // 'adaptive' has no separate spelling on this wire: the model decides its
119
+ // own depth, which is what `enabled: true` without a budget expresses.
120
+ // 'enabled' fixes the depth with budgetTokens, so it carries the cap.
121
+ const budgetTokens = thinking.type === 'enabled' ? thinking.budgetTokens : undefined;
122
+ return {
123
+ enabled: true,
124
+ ...(budgetTokens !== undefined ? { max_tokens: budgetTokens } : {}),
20
125
  };
21
126
  }
22
127
  function formatToolChoice(tc) {
@@ -128,13 +233,18 @@ export class OpenRouterProvider {
128
233
  if (params.cacheControl) {
129
234
  body.cache_control = params.cacheControl;
130
235
  }
236
+ // Refused, not dropped, when this wire cannot carry the level asked
237
+ // for — see `formatReasoning`.
238
+ const reasoning = formatReasoning(params.thinking, params.effort);
239
+ if (reasoning !== undefined) {
240
+ body.reasoning = reasoning;
241
+ }
131
242
  if (params.responseFormat) {
132
243
  body.response_format = params.responseFormat;
133
244
  }
134
245
  return body;
135
246
  }
136
247
  async *chatStream(params) {
137
- assertThinkingUnsupported('OpenRouterProvider', params);
138
248
  const body = this.buildRequestBody(params, true);
139
249
  const timeout = AbortSignal.timeout(this.config.timeout ?? 120_000);
140
250
  // Compose the caller abort with the request timeout so a Stop cancels the
@@ -180,6 +290,9 @@ export class OpenRouterProvider {
180
290
  const reader = response.body.getReader();
181
291
  const decoder = new TextDecoder();
182
292
  let buffer = '';
293
+ // Reasoning blocks this stream has opened and not yet closed, in the
294
+ // order the wire reported them.
295
+ const openReasoning = new Set();
183
296
  try {
184
297
  while (true) {
185
298
  params.signal?.throwIfAborted();
@@ -207,20 +320,52 @@ export class OpenRouterProvider {
207
320
  const choice = parsed.choices[0];
208
321
  if (!choice)
209
322
  continue;
210
- yield {
211
- id: parsed.id,
212
- delta: {
213
- content: choice.delta.content,
214
- toolCalls: choice.delta.tool_calls?.map((tc) => ({
215
- index: tc.index,
216
- id: tc.id,
217
- type: tc.type,
218
- function: tc.function,
219
- })),
220
- },
221
- finishReason: choice.finish_reason,
222
- usage: parsed.usage ? parseUsage(parsed.usage) : undefined,
223
- };
323
+ const fragments = parseReasoning(choice.delta.reasoning_details, choice.delta.reasoning);
324
+ const content = choice.delta.content;
325
+ const toolCalls = choice.delta.tool_calls?.map((tc) => ({
326
+ index: tc.index,
327
+ id: tc.id,
328
+ type: tc.type,
329
+ function: tc.function,
330
+ }));
331
+ // A block closes when output starts, which is the only boundary
332
+ // this wire gives: without it a consumer's reasoning pane never
333
+ // receives `done` and stays open for the life of the run. An
334
+ // empty `content` is NOT output — every reasoning frame on this
335
+ // wire carries `"content":""`, so treating it as the boundary
336
+ // would close each block on the frame that opened it.
337
+ if ((typeof content === 'string' && content.length > 0) || toolCalls?.length) {
338
+ for (const index of openReasoning) {
339
+ yield { id: parsed.id, delta: { reasoning: { index, done: true } } };
340
+ }
341
+ openReasoning.clear();
342
+ }
343
+ const [firstFragment, ...restFragments] = fragments;
344
+ if (firstFragment)
345
+ openReasoning.add(firstFragment.index);
346
+ if (firstFragment ||
347
+ content !== undefined ||
348
+ toolCalls !== undefined ||
349
+ choice.finish_reason !== undefined ||
350
+ parsed.usage !== undefined) {
351
+ yield {
352
+ id: parsed.id,
353
+ delta: {
354
+ ...(firstFragment ? { reasoning: firstFragment } : {}),
355
+ content,
356
+ toolCalls,
357
+ },
358
+ finishReason: choice.finish_reason,
359
+ usage: parsed.usage ? parseUsage(parsed.usage) : undefined,
360
+ };
361
+ }
362
+ // The delta shape carries one reasoning object per chunk, so a
363
+ // frame reporting several blocks rides in sequence rather than
364
+ // being collapsed into one — order is what replay echoes back.
365
+ for (const fragment of restFragments) {
366
+ openReasoning.add(fragment.index);
367
+ yield { id: parsed.id, delta: { reasoning: fragment } };
368
+ }
224
369
  }
225
370
  catch (parseErr) {
226
371
  if (isProviderRequestError(parseErr))
@@ -332,16 +477,20 @@ export class OpenRouterProvider {
332
477
  }
333
478
  const data = (await response.json());
334
479
  signal?.throwIfAborted();
335
- return data.data.map((m) => ({
336
- id: m.id,
337
- name: m.name,
338
- contextWindow: m.context_length,
339
- maxOutputTokens: m.top_provider?.max_completion_tokens ?? 4096,
340
- inputPrice: Number.parseFloat(m.pricing?.prompt ?? '0') * 1_000_000,
341
- outputPrice: Number.parseFloat(m.pricing?.completion ?? '0') * 1_000_000,
342
- supportsToolUse: true,
343
- supportsStreaming: true,
344
- }));
480
+ return data.data.map((m) => {
481
+ const inputPrice = pricePerMillion(m.pricing?.prompt);
482
+ const outputPrice = pricePerMillion(m.pricing?.completion);
483
+ return {
484
+ id: m.id,
485
+ name: m.name,
486
+ contextWindow: m.context_length,
487
+ maxOutputTokens: m.top_provider?.max_completion_tokens ?? 4096,
488
+ ...(inputPrice !== undefined ? { inputPrice } : {}),
489
+ ...(outputPrice !== undefined ? { outputPrice } : {}),
490
+ supportsToolUse: true,
491
+ supportsStreaming: true,
492
+ };
493
+ });
345
494
  }
346
495
  async healthCheck() {
347
496
  try {
@@ -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": "2.4.0",
3
+ "version": "3.0.0",
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": {
@@ -54,8 +54,8 @@
54
54
  "@biomejs/biome": "^1.9.4",
55
55
  "@types/node": "^22.19.17",
56
56
  "typescript": "^5.5.0",
57
- "vitest": "^3.2.6",
58
- "@namzu/sdk": "^37.0.0"
57
+ "vitest": "^4.1.11",
58
+ "@namzu/sdk": "^43.0.0"
59
59
  },
60
60
  "scripts": {
61
61
  "build": "tsc --build",
package/src/client.ts CHANGED
@@ -9,7 +9,6 @@ import type {
9
9
  } from '@namzu/sdk'
10
10
  import {
11
11
  ProviderRequestError,
12
- assertThinkingUnsupported,
13
12
  isCallerAbortError,
14
13
  isProviderRequestError,
15
14
  providerHttpError,
@@ -20,6 +19,26 @@ import type { OpenRouterConfig } from './types.js'
20
19
 
21
20
  const OPENROUTER_BASE_URL = process.env.OPENROUTER_BASE_URL ?? 'https://openrouter.ai/api/v1'
22
21
 
22
+ /**
23
+ * A rate OpenRouter published for a model, or nothing.
24
+ *
25
+ * This listing is the one place both answers arrive on the same field and
26
+ * only one of them used to survive. OpenRouter states each rate as a decimal
27
+ * string of USD per token and states `"0"` for the models it serves at no
28
+ * charge — so `?? '0'` did not default a missing price, it asserted one: every
29
+ * model whose pricing block was absent was reported as free, which is a claim
30
+ * about a bill. Absence now stays absent, a published `"0"` is still a real
31
+ * zero, and a value that does not parse is treated as absence rather than
32
+ * `NaN` — which would reach a consumer as a total nobody can read.
33
+ *
34
+ * See `ModelInfo.inputPrice`.
35
+ */
36
+ function pricePerMillion(raw: string | undefined): number | undefined {
37
+ if (raw === undefined) return undefined
38
+ const parsed = Number.parseFloat(raw)
39
+ return Number.isFinite(parsed) ? parsed * 1_000_000 : undefined
40
+ }
41
+
23
42
  interface RawUsage {
24
43
  prompt_tokens: number
25
44
  completion_tokens: number
@@ -27,11 +46,24 @@ interface RawUsage {
27
46
  prompt_tokens_details?: {
28
47
  cached_tokens?: number
29
48
  }
49
+ completion_tokens_details?: {
50
+ reasoning_tokens?: number
51
+ }
30
52
  cache_discount?: number
31
53
  cache_read_input_tokens?: number
32
54
  cache_creation_input_tokens?: number
33
55
  }
34
56
 
57
+ /**
58
+ * The reasoning breakdown, when the vendor reports one.
59
+ *
60
+ * `completion_tokens` already includes these — OpenRouter bills thinking as
61
+ * output — so this is a SUBSET, never an addition. It is reported rather than
62
+ * dropped because it is the only measure of how much of a turn was spent
63
+ * thinking, which is what a reader of `/cost` is looking at when a reasoning
64
+ * model looks expensive. Absent stays absent: a vendor that does not report
65
+ * the split has not reported zero.
66
+ */
35
67
  function parseUsage(raw?: RawUsage): TokenUsage {
36
68
  if (!raw) {
37
69
  return {
@@ -42,12 +74,111 @@ function parseUsage(raw?: RawUsage): TokenUsage {
42
74
  cacheWriteTokens: 0,
43
75
  }
44
76
  }
77
+ const reasoningTokens = raw.completion_tokens_details?.reasoning_tokens
45
78
  return {
46
79
  promptTokens: raw.prompt_tokens,
47
80
  completionTokens: raw.completion_tokens,
48
81
  totalTokens: raw.total_tokens,
49
82
  cachedTokens: raw.prompt_tokens_details?.cached_tokens ?? raw.cache_read_input_tokens ?? 0,
50
83
  cacheWriteTokens: raw.cache_creation_input_tokens ?? 0,
84
+ ...(reasoningTokens !== undefined ? { reasoningTokens } : {}),
85
+ }
86
+ }
87
+
88
+ /**
89
+ * One entry of OpenRouter's unified `reasoning_details`.
90
+ *
91
+ * `reasoning.text` and `reasoning.summary` carry visible text; the encrypted
92
+ * form carries an opaque payload this driver must pass through unchanged, or
93
+ * a replaying caller loses the block it paid for.
94
+ */
95
+ interface RawReasoningDetail {
96
+ type?: string
97
+ text?: string
98
+ signature?: string
99
+ data?: string
100
+ index?: number
101
+ }
102
+
103
+ type ReasoningDelta = NonNullable<StreamChunk['delta']['reasoning']>
104
+
105
+ /**
106
+ * Map one frame's reasoning onto the kernel's channel.
107
+ *
108
+ * The wire sends the same text twice: a flat `delta.reasoning` string AND a
109
+ * `delta.reasoning_details` array. Emitting both would double every block, so
110
+ * the array wins whenever it is present — it is the one that carries the index
111
+ * and the signature — and the flat string is the fallback for a vendor that
112
+ * sends only that.
113
+ *
114
+ * An empty array means the frame carried no reasoning at all; it is not a
115
+ * statement that the flat field should be trusted.
116
+ */
117
+ function parseReasoning(
118
+ details: readonly RawReasoningDetail[] | undefined,
119
+ flat: string | null | undefined,
120
+ ): ReasoningDelta[] {
121
+ if (details && details.length > 0) {
122
+ const mapped: ReasoningDelta[] = []
123
+ for (const [position, detail] of details.entries()) {
124
+ const index = typeof detail.index === 'number' ? detail.index : position
125
+ if (detail.type === 'reasoning.encrypted') {
126
+ if (detail.data) mapped.push({ index, type: 'redacted_thinking', encrypted: detail.data })
127
+ continue
128
+ }
129
+ if (typeof detail.text !== 'string' || detail.text.length === 0) continue
130
+ mapped.push({
131
+ index,
132
+ type: 'thinking',
133
+ text: detail.text,
134
+ ...(detail.signature ? { signature: detail.signature } : {}),
135
+ })
136
+ }
137
+ return mapped
138
+ }
139
+ return typeof flat === 'string' && flat.length > 0
140
+ ? [{ index: 0, type: 'thinking', text: flat }]
141
+ : []
142
+ }
143
+
144
+ /**
145
+ * The effort levels this wire can carry.
146
+ *
147
+ * OpenRouter's unified `reasoning.effort` publishes exactly these. The SDK's
148
+ * `max` and `ultra` are OpenAI-model-specific names with no equivalent here,
149
+ * and a driver must not send one and hope: an effort that arrives as a
150
+ * different depth is indistinguishable from one that was honoured.
151
+ */
152
+ const OPENROUTER_REASONING_EFFORT = ['none', 'minimal', 'low', 'medium', 'high', 'xhigh'] as const
153
+
154
+ /**
155
+ * Map the SDK's thinking controls onto OpenRouter's unified `reasoning` object.
156
+ *
157
+ * `undefined` means "say nothing", which leaves the vendor's own default in
158
+ * place — the only correct answer for a driver that was asked for nothing.
159
+ */
160
+ function formatReasoning(
161
+ thinking: ChatCompletionParams['thinking'],
162
+ effort: ChatCompletionParams['effort'],
163
+ ): Record<string, unknown> | undefined {
164
+ if (effort !== undefined) {
165
+ const carried = (OPENROUTER_REASONING_EFFORT as readonly string[]).includes(effort)
166
+ if (!carried) {
167
+ throw new Error(
168
+ `OpenRouterProvider cannot carry effort "${effort}". Its reasoning.effort accepts ${OPENROUTER_REASONING_EFFORT.join(', ')}. Sending a different level would return a perfectly ordinary completion that no caller could tell apart from the one that was asked for.`,
169
+ )
170
+ }
171
+ return { effort }
172
+ }
173
+ if (!thinking || thinking.type === undefined) return undefined
174
+ if (thinking.type === 'disabled') return { enabled: false }
175
+ // 'adaptive' has no separate spelling on this wire: the model decides its
176
+ // own depth, which is what `enabled: true` without a budget expresses.
177
+ // 'enabled' fixes the depth with budgetTokens, so it carries the cap.
178
+ const budgetTokens = thinking.type === 'enabled' ? thinking.budgetTokens : undefined
179
+ return {
180
+ enabled: true,
181
+ ...(budgetTokens !== undefined ? { max_tokens: budgetTokens } : {}),
51
182
  }
52
183
  }
53
184
 
@@ -162,6 +293,13 @@ export class OpenRouterProvider implements LLMProvider {
162
293
  body.cache_control = params.cacheControl
163
294
  }
164
295
 
296
+ // Refused, not dropped, when this wire cannot carry the level asked
297
+ // for — see `formatReasoning`.
298
+ const reasoning = formatReasoning(params.thinking, params.effort)
299
+ if (reasoning !== undefined) {
300
+ body.reasoning = reasoning
301
+ }
302
+
165
303
  if (params.responseFormat) {
166
304
  body.response_format = params.responseFormat
167
305
  }
@@ -170,7 +308,6 @@ export class OpenRouterProvider implements LLMProvider {
170
308
  }
171
309
 
172
310
  async *chatStream(params: ChatCompletionParams): AsyncIterable<StreamChunk> {
173
- assertThinkingUnsupported('OpenRouterProvider', params)
174
311
  const body = this.buildRequestBody(params, true)
175
312
 
176
313
  const timeout = AbortSignal.timeout(this.config.timeout ?? 120_000)
@@ -219,6 +356,9 @@ export class OpenRouterProvider implements LLMProvider {
219
356
  const reader = response.body.getReader()
220
357
  const decoder = new TextDecoder()
221
358
  let buffer = ''
359
+ // Reasoning blocks this stream has opened and not yet closed, in the
360
+ // order the wire reported them.
361
+ const openReasoning = new Set<number>()
222
362
 
223
363
  try {
224
364
  while (true) {
@@ -243,6 +383,8 @@ export class OpenRouterProvider implements LLMProvider {
243
383
  choices: Array<{
244
384
  delta: {
245
385
  content?: string
386
+ reasoning?: string | null
387
+ reasoning_details?: RawReasoningDetail[]
246
388
  tool_calls?: Array<{
247
389
  index: number
248
390
  id?: string
@@ -265,19 +407,56 @@ export class OpenRouterProvider implements LLMProvider {
265
407
  const choice = parsed.choices[0]
266
408
  if (!choice) continue
267
409
 
268
- yield {
269
- id: parsed.id,
270
- delta: {
271
- content: choice.delta.content,
272
- toolCalls: choice.delta.tool_calls?.map((tc) => ({
273
- index: tc.index,
274
- id: tc.id,
275
- type: tc.type as 'function' | undefined,
276
- function: tc.function,
277
- })),
278
- },
279
- finishReason: choice.finish_reason as StreamChunk['finishReason'],
280
- usage: parsed.usage ? parseUsage(parsed.usage) : undefined,
410
+ const fragments = parseReasoning(choice.delta.reasoning_details, choice.delta.reasoning)
411
+ const content = choice.delta.content
412
+ const toolCalls = choice.delta.tool_calls?.map((tc) => ({
413
+ index: tc.index,
414
+ id: tc.id,
415
+ type: tc.type as 'function' | undefined,
416
+ function: tc.function,
417
+ }))
418
+
419
+ // A block closes when output starts, which is the only boundary
420
+ // this wire gives: without it a consumer's reasoning pane never
421
+ // receives `done` and stays open for the life of the run. An
422
+ // empty `content` is NOT output — every reasoning frame on this
423
+ // wire carries `"content":""`, so treating it as the boundary
424
+ // would close each block on the frame that opened it.
425
+ if ((typeof content === 'string' && content.length > 0) || toolCalls?.length) {
426
+ for (const index of openReasoning) {
427
+ yield { id: parsed.id, delta: { reasoning: { index, done: true } } }
428
+ }
429
+ openReasoning.clear()
430
+ }
431
+
432
+ const [firstFragment, ...restFragments] = fragments
433
+ if (firstFragment) openReasoning.add(firstFragment.index)
434
+
435
+ if (
436
+ firstFragment ||
437
+ content !== undefined ||
438
+ toolCalls !== undefined ||
439
+ choice.finish_reason !== undefined ||
440
+ parsed.usage !== undefined
441
+ ) {
442
+ yield {
443
+ id: parsed.id,
444
+ delta: {
445
+ ...(firstFragment ? { reasoning: firstFragment } : {}),
446
+ content,
447
+ toolCalls,
448
+ },
449
+ finishReason: choice.finish_reason as StreamChunk['finishReason'],
450
+ usage: parsed.usage ? parseUsage(parsed.usage) : undefined,
451
+ }
452
+ }
453
+
454
+ // The delta shape carries one reasoning object per chunk, so a
455
+ // frame reporting several blocks rides in sequence rather than
456
+ // being collapsed into one — order is what replay echoes back.
457
+ for (const fragment of restFragments) {
458
+ openReasoning.add(fragment.index)
459
+ yield { id: parsed.id, delta: { reasoning: fragment } }
281
460
  }
282
461
  } catch (parseErr) {
283
462
  if (isProviderRequestError(parseErr)) throw parseErr
@@ -403,16 +582,20 @@ export class OpenRouterProvider implements LLMProvider {
403
582
  }
404
583
  signal?.throwIfAborted()
405
584
 
406
- return data.data.map((m) => ({
407
- id: m.id,
408
- name: m.name,
409
- contextWindow: m.context_length,
410
- maxOutputTokens: m.top_provider?.max_completion_tokens ?? 4096,
411
- inputPrice: Number.parseFloat(m.pricing?.prompt ?? '0') * 1_000_000,
412
- outputPrice: Number.parseFloat(m.pricing?.completion ?? '0') * 1_000_000,
413
- supportsToolUse: true,
414
- supportsStreaming: true,
415
- }))
585
+ return data.data.map((m) => {
586
+ const inputPrice = pricePerMillion(m.pricing?.prompt)
587
+ const outputPrice = pricePerMillion(m.pricing?.completion)
588
+ return {
589
+ id: m.id,
590
+ name: m.name,
591
+ contextWindow: m.context_length,
592
+ maxOutputTokens: m.top_provider?.max_completion_tokens ?? 4096,
593
+ ...(inputPrice !== undefined ? { inputPrice } : {}),
594
+ ...(outputPrice !== undefined ? { outputPrice } : {}),
595
+ supportsToolUse: true,
596
+ supportsStreaming: true,
597
+ }
598
+ })
416
599
  }
417
600
 
418
601
  async healthCheck(): Promise<boolean> {