agent-nuvira 3.3.9 → 3.3.11

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.
Files changed (153) hide show
  1. package/dist/agents/orchestrator.d.ts.map +1 -1
  2. package/dist/agents/orchestrator.js +6 -0
  3. package/dist/agents/orchestrator.js.map +1 -1
  4. package/dist/cli/chat.d.ts.map +1 -1
  5. package/dist/cli/chat.js +27 -17
  6. package/dist/cli/chat.js.map +1 -1
  7. package/dist/cli/config.d.ts +28 -0
  8. package/dist/cli/config.d.ts.map +1 -1
  9. package/dist/cli/config.js +155 -0
  10. package/dist/cli/config.js.map +1 -1
  11. package/dist/cli/eval.d.ts +8 -0
  12. package/dist/cli/eval.d.ts.map +1 -1
  13. package/dist/cli/eval.js +64 -0
  14. package/dist/cli/eval.js.map +1 -1
  15. package/dist/cli/loop-executor.d.ts +13 -0
  16. package/dist/cli/loop-executor.d.ts.map +1 -1
  17. package/dist/cli/loop-executor.js +22 -18
  18. package/dist/cli/loop-executor.js.map +1 -1
  19. package/dist/config/capability-mode.d.ts +122 -0
  20. package/dist/config/capability-mode.d.ts.map +1 -0
  21. package/dist/config/capability-mode.js +132 -0
  22. package/dist/config/capability-mode.js.map +1 -0
  23. package/dist/config/limits.d.ts +47 -0
  24. package/dist/config/limits.d.ts.map +1 -0
  25. package/dist/config/limits.js +64 -0
  26. package/dist/config/limits.js.map +1 -0
  27. package/dist/config/process-env.d.ts.map +1 -1
  28. package/dist/config/process-env.js +44 -0
  29. package/dist/config/process-env.js.map +1 -1
  30. package/dist/config/types.d.ts +77 -0
  31. package/dist/config/types.d.ts.map +1 -1
  32. package/dist/config/work-digest.d.ts +46 -0
  33. package/dist/config/work-digest.d.ts.map +1 -0
  34. package/dist/config/work-digest.js +80 -0
  35. package/dist/config/work-digest.js.map +1 -0
  36. package/dist/gateway/inbound-media.d.ts +18 -0
  37. package/dist/gateway/inbound-media.d.ts.map +1 -1
  38. package/dist/gateway/inbound-media.js +96 -2
  39. package/dist/gateway/inbound-media.js.map +1 -1
  40. package/dist/inference/anthropic-adapter.d.ts +6 -0
  41. package/dist/inference/anthropic-adapter.d.ts.map +1 -1
  42. package/dist/inference/anthropic-adapter.js +79 -8
  43. package/dist/inference/anthropic-adapter.js.map +1 -1
  44. package/dist/inference/gemini-adapter.d.ts +6 -0
  45. package/dist/inference/gemini-adapter.d.ts.map +1 -1
  46. package/dist/inference/gemini-adapter.js +73 -8
  47. package/dist/inference/gemini-adapter.js.map +1 -1
  48. package/dist/inference/groq-adapter.d.ts +3 -0
  49. package/dist/inference/groq-adapter.d.ts.map +1 -1
  50. package/dist/inference/groq-adapter.js +83 -40
  51. package/dist/inference/groq-adapter.js.map +1 -1
  52. package/dist/inference/interface.d.ts +7 -0
  53. package/dist/inference/interface.d.ts.map +1 -1
  54. package/dist/inference/model-probe.d.ts +17 -0
  55. package/dist/inference/model-probe.d.ts.map +1 -1
  56. package/dist/inference/model-probe.js +58 -1
  57. package/dist/inference/model-probe.js.map +1 -1
  58. package/dist/inference/model-validator.d.ts +16 -1
  59. package/dist/inference/model-validator.d.ts.map +1 -1
  60. package/dist/inference/model-validator.js +83 -2
  61. package/dist/inference/model-validator.js.map +1 -1
  62. package/dist/inference/nim-adapter.js +4 -4
  63. package/dist/inference/nim-adapter.js.map +1 -1
  64. package/dist/inference/openai-compat-adapter.d.ts +9 -0
  65. package/dist/inference/openai-compat-adapter.d.ts.map +1 -1
  66. package/dist/inference/openai-compat-adapter.js +101 -51
  67. package/dist/inference/openai-compat-adapter.js.map +1 -1
  68. package/dist/inference/openrouter-adapter.d.ts +3 -0
  69. package/dist/inference/openrouter-adapter.d.ts.map +1 -1
  70. package/dist/inference/openrouter-adapter.js +134 -57
  71. package/dist/inference/openrouter-adapter.js.map +1 -1
  72. package/dist/inference/reasoning-effort.d.ts +130 -0
  73. package/dist/inference/reasoning-effort.d.ts.map +1 -0
  74. package/dist/inference/reasoning-effort.js +237 -0
  75. package/dist/inference/reasoning-effort.js.map +1 -0
  76. package/dist/inference/route-resolver.d.ts +7 -0
  77. package/dist/inference/route-resolver.d.ts.map +1 -1
  78. package/dist/inference/route-resolver.js +2 -1
  79. package/dist/inference/route-resolver.js.map +1 -1
  80. package/dist/inference/sse.d.ts +6 -0
  81. package/dist/inference/sse.d.ts.map +1 -1
  82. package/dist/inference/sse.js +1 -0
  83. package/dist/inference/sse.js.map +1 -1
  84. package/dist/inference/tools.d.ts +13 -0
  85. package/dist/inference/tools.d.ts.map +1 -1
  86. package/dist/inference/tools.js +20 -2
  87. package/dist/inference/tools.js.map +1 -1
  88. package/dist/learning/autonomy-policy.d.ts +8 -0
  89. package/dist/learning/autonomy-policy.d.ts.map +1 -1
  90. package/dist/learning/autonomy-policy.js +34 -0
  91. package/dist/learning/autonomy-policy.js.map +1 -1
  92. package/dist/learning/capability-parity.d.ts +108 -0
  93. package/dist/learning/capability-parity.d.ts.map +1 -0
  94. package/dist/learning/capability-parity.js +154 -0
  95. package/dist/learning/capability-parity.js.map +1 -0
  96. package/dist/learning/cost-tracker.d.ts +28 -4
  97. package/dist/learning/cost-tracker.d.ts.map +1 -1
  98. package/dist/learning/cost-tracker.js +58 -8
  99. package/dist/learning/cost-tracker.js.map +1 -1
  100. package/dist/learning/eval-framework.d.ts +17 -0
  101. package/dist/learning/eval-framework.d.ts.map +1 -1
  102. package/dist/learning/eval-framework.js +63 -2
  103. package/dist/learning/eval-framework.js.map +1 -1
  104. package/dist/learning/model-capability.d.ts +94 -0
  105. package/dist/learning/model-capability.d.ts.map +1 -0
  106. package/dist/learning/model-capability.js +172 -0
  107. package/dist/learning/model-capability.js.map +1 -0
  108. package/dist/learning/model-registry.d.ts +33 -0
  109. package/dist/learning/model-registry.d.ts.map +1 -1
  110. package/dist/learning/model-registry.js +79 -0
  111. package/dist/learning/model-registry.js.map +1 -1
  112. package/dist/learning/reasoning-trace.d.ts +1 -1
  113. package/dist/learning/reasoning-trace.d.ts.map +1 -1
  114. package/dist/learning/reasoning-trace.js.map +1 -1
  115. package/dist/learning/resolve-options.d.ts.map +1 -1
  116. package/dist/learning/resolve-options.js +16 -3
  117. package/dist/learning/resolve-options.js.map +1 -1
  118. package/dist/learning/run-trace.d.ts +68 -0
  119. package/dist/learning/run-trace.d.ts.map +1 -1
  120. package/dist/learning/run-trace.js +101 -0
  121. package/dist/learning/run-trace.js.map +1 -1
  122. package/dist/tools/loop-skill-hint.d.ts +27 -0
  123. package/dist/tools/loop-skill-hint.d.ts.map +1 -1
  124. package/dist/tools/loop-skill-hint.js +189 -5
  125. package/dist/tools/loop-skill-hint.js.map +1 -1
  126. package/dist/tools/read-extract.d.ts +9 -3
  127. package/dist/tools/read-extract.d.ts.map +1 -1
  128. package/dist/tools/read-extract.js +70 -25
  129. package/dist/tools/read-extract.js.map +1 -1
  130. package/dist/tools/tool-loop.d.ts +120 -0
  131. package/dist/tools/tool-loop.d.ts.map +1 -1
  132. package/dist/tools/tool-loop.js +447 -5
  133. package/dist/tools/tool-loop.js.map +1 -1
  134. package/dist/web-dashboard/attachment-extract.d.ts +8 -1
  135. package/dist/web-dashboard/attachment-extract.d.ts.map +1 -1
  136. package/dist/web-dashboard/attachment-extract.js +14 -3
  137. package/dist/web-dashboard/attachment-extract.js.map +1 -1
  138. package/dist/web-dashboard/server.d.ts.map +1 -1
  139. package/dist/web-dashboard/server.js +160 -21
  140. package/dist/web-dashboard/server.js.map +1 -1
  141. package/dist/web-dashboard/src/types.d.ts +26 -0
  142. package/dist/web-dashboard/src/types.d.ts.map +1 -1
  143. package/dist/web-dashboard/workspace-guard.d.ts.map +1 -1
  144. package/dist/web-dashboard/workspace-guard.js +44 -4
  145. package/dist/web-dashboard/workspace-guard.js.map +1 -1
  146. package/package.json +1 -1
  147. package/src/web-dashboard/public/assets/index-BdKf5Xw2.js +207 -0
  148. package/src/web-dashboard/public/assets/index-BdKf5Xw2.js.map +1 -0
  149. package/src/web-dashboard/public/assets/index-C9eBskc9.css +1 -0
  150. package/src/web-dashboard/public/index.html +2 -2
  151. package/src/web-dashboard/public/assets/index-Beportyl.js +0 -207
  152. package/src/web-dashboard/public/assets/index-Beportyl.js.map +0 -1
  153. package/src/web-dashboard/public/assets/index-gtQyg9nm.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"openrouter-adapter.d.ts","sourceRoot":"","sources":["../../src/inference/openrouter-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC/G,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAoCtE;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,iBAAiB;IACzD,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAI5B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IA+C3E,gEAAgE;IAC1D,aAAa,CACjB,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,gBAAgB,CAAC;IA8B5B;;;OAGG;IACG,mBAAmB,CACvB,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,EAAE,gBAAgB,GAAG,SAAS,EACrC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAC/B,OAAO,CAAC,gBAAgB,CAAC;IAiCtB,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,GAAG,SAAS,EACrC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAC/B,OAAO,CAAC,MAAM,CAAC;IAmCZ,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC,OAAO,IAAI,MAAM;IAIX,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;CA6B/C"}
1
+ {"version":3,"file":"openrouter-adapter.d.ts","sourceRoot":"","sources":["../../src/inference/openrouter-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC/G,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAwEtE;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,iBAAiB;IACzD,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,OAAO,CAAC,MAAM,CAAiB;IAE/B,4FAA4F;IAC5F,OAAO,CAAC,gBAAgB;gBAUZ,MAAM,EAAE,cAAc;IAI5B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;YAgB7D,YAAY;IA6D1B,gEAAgE;IAC1D,aAAa,CACjB,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,gBAAgB,CAAC;IAuC5B;;;OAGG;IACG,mBAAmB,CACvB,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,EAAE,gBAAgB,GAAG,SAAS,EACrC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAC/B,OAAO,CAAC,gBAAgB,CAAC;IA0CtB,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,GAAG,SAAS,EACrC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAC/B,OAAO,CAAC,MAAM,CAAC;IAkDZ,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC,OAAO,IAAI,MAAM;IAIX,UAAU,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;CA+C/C"}
@@ -2,7 +2,9 @@ import { logger } from '../utils/logger.js';
2
2
  import { streamCompletion } from './sse.js';
3
3
  import { chatCompletionsWithTools, chatCompletionsWithToolsStream } from './tools.js';
4
4
  import { getModelTags } from './model-catalog.js';
5
- import { getCostTracker } from '../learning/cost-tracker.js';
5
+ import { getCostTracker, recordCallWithUsage } from '../learning/cost-tracker.js';
6
+ import { getModelRegistry } from '../learning/model-registry.js';
7
+ import { resolveReasoningRequest, withReasoningFallback, ambientReasoningEffort, reasoningShapeForProvider, reasoningRequestBody, SHAPE_DEFAULT_PARAM, } from './reasoning-effort.js';
6
8
  const OPENROUTER_BASE_URL = 'https://openrouter.ai/api/v1';
7
9
  /**
8
10
  * Common small models on OpenRouter that have low max_tokens.
@@ -24,6 +26,22 @@ function openRouterModelMaxTokens(model) {
24
26
  return 1024;
25
27
  return 4096;
26
28
  }
29
+ /**
30
+ * The exact cost OpenRouter billed for a call, when it reported one.
31
+ *
32
+ * This is authoritative: it already accounts for the account's credits, the
33
+ * model's real price (including `:free` ids), and any discount — so we record
34
+ * it verbatim instead of charging our generic per-provider rate. Returning
35
+ * `undefined` (not 0) keeps "no cost reported" distinct from "cost is zero".
36
+ */
37
+ function openRouterReportedCost(usage, body) {
38
+ const candidates = [usage?.cost, body?.cost];
39
+ for (const c of candidates) {
40
+ if (typeof c === 'number' && Number.isFinite(c))
41
+ return c;
42
+ }
43
+ return undefined;
44
+ }
27
45
  /**
28
46
  * OpenRouter Adapter
29
47
  * Routes requests through OpenRouter's multi-provider API
@@ -31,6 +49,17 @@ function openRouterModelMaxTokens(model) {
31
49
  export class OpenRouterAdapter {
32
50
  name = 'OpenRouter';
33
51
  config;
52
+ /** Resolve the request-side reasoning parameter (default-deny). See reasoning-effort.ts. */
53
+ reasoningRequest(model, options) {
54
+ if (options?.reasoningProbe) {
55
+ const shape = reasoningShapeForProvider('openrouter');
56
+ if (!shape)
57
+ return undefined;
58
+ const param = SHAPE_DEFAULT_PARAM[shape];
59
+ return { body: reasoningRequestBody({ param, shape }, 'low'), param, shape };
60
+ }
61
+ return resolveReasoningRequest('openrouter', model, options?.reasoningEffort ?? ambientReasoningEffort(), getModelRegistry());
62
+ }
34
63
  constructor(config) {
35
64
  this.config = config;
36
65
  }
@@ -40,6 +69,15 @@ export class OpenRouterAdapter {
40
69
  throw new Error('OpenRouter API key is not configured. Set OPENROUTER_API_KEY env var.');
41
70
  }
42
71
  const model = options?.model || this.config.model || 'mistralai/mistral-7b-instruct';
72
+ return withReasoningFallback({
73
+ provider: 'openrouter',
74
+ model,
75
+ request: this.reasoningRequest(model, options),
76
+ registry: getModelRegistry(),
77
+ run: (reasoningBody) => this.generateOnce(prompt, model, apiKey, options, reasoningBody),
78
+ });
79
+ }
80
+ async generateOnce(prompt, model, apiKey, options, reasoningBody) {
43
81
  const temperature = options?.temperature ?? this.config.temperature ?? 0.7;
44
82
  const maxTokens = Math.min(options?.maxTokens ?? this.config.maxTokens ?? 4096, openRouterModelMaxTokens(model));
45
83
  logger.debug(`OpenRouter: Generating with model=${model}, temperature=${temperature}, maxTokens=${maxTokens}`);
@@ -56,6 +94,7 @@ export class OpenRouterAdapter {
56
94
  messages: [{ role: 'user', content: prompt }],
57
95
  temperature,
58
96
  max_tokens: maxTokens,
97
+ ...reasoningBody,
59
98
  }),
60
99
  });
61
100
  if (!response.ok) {
@@ -64,9 +103,14 @@ export class OpenRouterAdapter {
64
103
  }
65
104
  const data = (await response.json());
66
105
  const content = data.choices[0]?.message?.content || '';
67
- // Track cost
106
+ // Track cost — M2.2: prefer OpenRouter's own measured usage and its exact
107
+ // reported `cost`; fall back to a length-based estimate only when the
108
+ // response carried neither.
68
109
  try {
69
- getCostTracker().recordCallEstimated('openrouter', model, prompt, content);
110
+ const usage = data.usage;
111
+ recordCallWithUsage(getCostTracker(), 'openrouter', model, prompt, content, usage && typeof usage.prompt_tokens === 'number' && typeof usage.completion_tokens === 'number'
112
+ ? { promptTokens: usage.prompt_tokens, completionTokens: usage.completion_tokens }
113
+ : undefined, openRouterReportedCost(usage, data));
70
114
  }
71
115
  catch { /* Non-critical */ }
72
116
  return content;
@@ -77,30 +121,39 @@ export class OpenRouterAdapter {
77
121
  if (!apiKey)
78
122
  throw new Error('OpenRouter API key is not configured. Set OPENROUTER_API_KEY env var.');
79
123
  const model = options?.model || this.config.model || 'mistralai/mistral-7b-instruct';
80
- return chatCompletionsWithTools({
81
- baseUrl: OPENROUTER_BASE_URL,
82
- headers: {
83
- 'Authorization': `Bearer ${apiKey}`,
84
- 'HTTP-Referer': 'https://github.com/buff-cli/buff',
85
- 'X-Title': 'Buff CLI',
86
- },
124
+ return withReasoningFallback({
125
+ provider: 'openrouter',
87
126
  model,
88
- messages,
89
- tools,
90
- temperature: options?.temperature ?? this.config.temperature ?? 0.7,
91
- maxTokens: Math.min(options?.maxTokens ?? this.config.maxTokens ?? 4096, openRouterModelMaxTokens(model)),
92
- timeoutMs: this.config.timeoutMs ?? 30_000,
93
- // P4 — external cancellation (the dashboard Cancel button).
94
- signal: options?.signal,
95
- // Cost parity with generate(): meter tool-calling turns too.
96
- onCost: (promptText, contentText) => {
97
- try {
98
- getCostTracker().recordCallEstimated('openrouter', model, promptText, contentText);
99
- }
100
- catch {
101
- // Non-critical.
102
- }
103
- },
127
+ request: this.reasoningRequest(model, options),
128
+ registry: getModelRegistry(),
129
+ run: (reasoningBody) => chatCompletionsWithTools({
130
+ baseUrl: OPENROUTER_BASE_URL,
131
+ headers: {
132
+ 'Authorization': `Bearer ${apiKey}`,
133
+ 'HTTP-Referer': 'https://github.com/buff-cli/buff',
134
+ 'X-Title': 'Buff CLI',
135
+ },
136
+ model,
137
+ messages,
138
+ tools,
139
+ temperature: options?.temperature ?? this.config.temperature ?? 0.7,
140
+ maxTokens: Math.min(options?.maxTokens ?? this.config.maxTokens ?? 4096, openRouterModelMaxTokens(model)),
141
+ timeoutMs: this.config.timeoutMs ?? 30_000,
142
+ // P4 — external cancellation (the dashboard Cancel button).
143
+ signal: options?.signal,
144
+ // Cost parity with generate(): meter tool-calling turns too. The third
145
+ // arg carries the endpoint's usage (and OpenRouter's reported cost) when
146
+ // the helper captured it — otherwise this records an estimate.
147
+ onCost: (promptText, contentText, usage) => {
148
+ try {
149
+ recordCallWithUsage(getCostTracker(), 'openrouter', model, promptText, contentText, usage);
150
+ }
151
+ catch {
152
+ // Non-critical.
153
+ }
154
+ },
155
+ reasoningBody,
156
+ }),
104
157
  });
105
158
  }
106
159
  /**
@@ -112,31 +165,40 @@ export class OpenRouterAdapter {
112
165
  if (!apiKey)
113
166
  throw new Error('OpenRouter API key is not configured. Set OPENROUTER_API_KEY env var.');
114
167
  const model = options?.model || this.config.model || 'mistralai/mistral-7b-instruct';
115
- return chatCompletionsWithToolsStream({
116
- baseUrl: OPENROUTER_BASE_URL,
117
- headers: {
118
- 'Authorization': `Bearer ${apiKey}`,
119
- 'HTTP-Referer': 'https://github.com/buff-cli/buff',
120
- 'X-Title': 'Buff CLI',
121
- },
168
+ return withReasoningFallback({
169
+ provider: 'openrouter',
122
170
  model,
123
- messages,
124
- tools,
125
- temperature: options?.temperature ?? this.config.temperature ?? 0.7,
126
- maxTokens: Math.min(options?.maxTokens ?? this.config.maxTokens ?? 4096, openRouterModelMaxTokens(model)),
127
- timeoutMs: this.config.timeoutMs ?? 30_000,
128
- // P4 — external cancellation (the dashboard Cancel button).
129
- signal: options?.signal,
130
- // Cost parity with generate(): meter tool-calling turns too.
131
- onCost: (promptText, contentText) => {
132
- try {
133
- getCostTracker().recordCallEstimated('openrouter', model, promptText, contentText);
134
- }
135
- catch {
136
- // Non-critical.
137
- }
138
- },
139
- }, onToken);
171
+ request: this.reasoningRequest(model, options),
172
+ registry: getModelRegistry(),
173
+ run: (reasoningBody) => chatCompletionsWithToolsStream({
174
+ baseUrl: OPENROUTER_BASE_URL,
175
+ headers: {
176
+ 'Authorization': `Bearer ${apiKey}`,
177
+ 'HTTP-Referer': 'https://github.com/buff-cli/buff',
178
+ 'X-Title': 'Buff CLI',
179
+ },
180
+ model,
181
+ messages,
182
+ tools,
183
+ temperature: options?.temperature ?? this.config.temperature ?? 0.7,
184
+ maxTokens: Math.min(options?.maxTokens ?? this.config.maxTokens ?? 4096, openRouterModelMaxTokens(model)),
185
+ timeoutMs: this.config.timeoutMs ?? 30_000,
186
+ // P4 — external cancellation (the dashboard Cancel button).
187
+ signal: options?.signal,
188
+ // Cost parity with generate(): meter tool-calling turns too. The third
189
+ // arg carries the endpoint's usage (and OpenRouter's reported cost)
190
+ // captured from the final SSE chunk.
191
+ onCost: (promptText, contentText, usage) => {
192
+ try {
193
+ recordCallWithUsage(getCostTracker(), 'openrouter', model, promptText, contentText, usage);
194
+ }
195
+ catch {
196
+ // Non-critical.
197
+ }
198
+ },
199
+ reasoningBody,
200
+ }, onToken),
201
+ });
140
202
  }
141
203
  async generateStream(prompt, options, onToken) {
142
204
  const apiKey = this.config.apiKey;
@@ -147,15 +209,27 @@ export class OpenRouterAdapter {
147
209
  const temperature = options?.temperature ?? this.config.temperature ?? 0.7;
148
210
  const maxTokens = Math.min(options?.maxTokens ?? this.config.maxTokens ?? 4096, openRouterModelMaxTokens(model));
149
211
  logger.debug(`OpenRouter: Streaming with model=${model}, temperature=${temperature}, maxTokens=${maxTokens}`);
212
+ // M2.2: capture the endpoint-reported usage (and OpenRouter's `cost`) from
213
+ // the final SSE chunk when present. `usage: { include: true }` asks
214
+ // OpenRouter to emit it for streams — other OpenAI-compatible endpoints
215
+ // ignore the field.
216
+ let streamUsage;
150
217
  // OpenRouter uses OpenAI-compatible streaming SSE, same as Groq/NIM
151
- const fullContent = await streamCompletion(`${OPENROUTER_BASE_URL}/chat/completions`, {
152
- 'Authorization': `Bearer ${apiKey}`,
153
- 'HTTP-Referer': 'https://github.com/buff-cli/buff',
154
- 'X-Title': 'Buff CLI',
155
- }, { model, messages: [{ role: 'user', content: prompt }], temperature, max_tokens: maxTokens }, onToken);
156
- // Track cost for streaming response
218
+ const fullContent = await withReasoningFallback({
219
+ provider: 'openrouter',
220
+ model,
221
+ request: this.reasoningRequest(model, options),
222
+ registry: getModelRegistry(),
223
+ run: (reasoningBody) => streamCompletion(`${OPENROUTER_BASE_URL}/chat/completions`, {
224
+ 'Authorization': `Bearer ${apiKey}`,
225
+ 'HTTP-Referer': 'https://github.com/buff-cli/buff',
226
+ 'X-Title': 'Buff CLI',
227
+ }, { model, messages: [{ role: 'user', content: prompt }], temperature, max_tokens: maxTokens, usage: { include: true }, ...reasoningBody }, onToken, (u) => { streamUsage = u; }),
228
+ });
229
+ // Track cost for streaming response — measured usage + reported cost when
230
+ // the stream carried them, estimate otherwise.
157
231
  try {
158
- getCostTracker().recordCallEstimated('openrouter', model, prompt, fullContent);
232
+ recordCallWithUsage(getCostTracker(), 'openrouter', model, prompt, fullContent, streamUsage);
159
233
  }
160
234
  catch { /* Non-critical */ }
161
235
  return fullContent;
@@ -188,6 +262,9 @@ export class OpenRouterAdapter {
188
262
  description: m.description,
189
263
  tags: getModelTags(m.id),
190
264
  ...(ctx !== undefined ? { contextWindowTokens: ctx } : {}),
265
+ // Carried so the registry can learn reasoning-parameter support from
266
+ // the provider's own declaration (no probe / guess needed).
267
+ ...(Array.isArray(m.supported_parameters) ? { supportedParameters: m.supported_parameters } : {}),
191
268
  };
192
269
  });
193
270
  }
@@ -1 +1 @@
1
- {"version":3,"file":"openrouter-adapter.js","sourceRoot":"","sources":["../../src/inference/openrouter-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openrouter-adapter.js","sourceRoot":"","sources":["../../src/inference/openrouter-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,EACpB,mBAAmB,GAEpB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAE3D;;;;GAIG;AACH,MAAM,4BAA4B,GAAa;IAC7C,kBAAkB;IAClB,eAAe;IACf,yBAAyB;IACzB,cAAc;IACd,gBAAgB;IAChB,YAAY;IACZ,gBAAgB;CACjB,CAAC;AAEF,2DAA2D;AAC3D,SAAS,wBAAwB,CAAC,KAAa;IAC7C,IAAI,4BAA4B,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC;AAkBD;;;;;;;GAOG;AACH,SAAS,sBAAsB,CAAC,KAAuB,EAAE,IAAwB;IAC/E,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,YAAY,CAAC;IACrB,MAAM,CAAiB;IAE/B,4FAA4F;IACpF,gBAAgB,CAAC,KAAa,EAAE,OAA0B;QAChE,IAAI,OAAO,EAAE,cAAc,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,yBAAyB,CAAC,YAAY,CAAC,CAAC;YACtD,IAAI,CAAC,KAAK;gBAAE,OAAO,SAAS,CAAC;YAC7B,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACzC,OAAO,EAAE,IAAI,EAAE,oBAAoB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC/E,CAAC;QACD,OAAO,uBAAuB,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,IAAI,sBAAsB,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAChI,CAAC;IAED,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,OAA0B;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QAC3F,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,+BAA+B,CAAC;QACrF,OAAO,qBAAqB,CAAC;YAC3B,QAAQ,EAAE,YAAY;YACtB,KAAK;YACL,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC;YAC9C,QAAQ,EAAE,gBAAgB,EAAE;YAC5B,GAAG,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;SACzF,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,MAAc,EACd,KAAa,EACb,MAAc,EACd,OAAqC,EACrC,aAAsC;QAEtC,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC;QAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,EACnD,wBAAwB,CAAC,KAAK,CAAC,CAChC,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,qCAAqC,KAAK,iBAAiB,WAAW,eAAe,SAAS,EAAE,CAAC,CAAC;QAE/G,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,mBAAmB,mBAAmB,EAAE;YACtE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,MAAM,EAAE;gBACnC,cAAc,EAAE,kBAAkB;gBAClC,cAAc,EAAE,kCAAkC;gBAClD,SAAS,EAAE,UAAU;aACtB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK;gBACL,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;gBAC7C,WAAW;gBACX,UAAU,EAAE,SAAS;gBACrB,GAAG,aAAa;aACjB,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;QAExD,0EAA0E;QAC1E,sEAAsE;QACtE,4BAA4B;QAC5B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACzB,mBAAmB,CACjB,cAAc,EAAE,EAChB,YAAY,EACZ,KAAK,EACL,MAAM,EACN,OAAO,EACP,KAAK,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,iBAAiB,KAAK,QAAQ;gBAC7F,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,aAAa,EAAE,gBAAgB,EAAE,KAAK,CAAC,iBAAiB,EAAE;gBAClF,CAAC,CAAC,SAAS,EACb,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,CACpC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAE9B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,aAAa,CACjB,QAAuB,EACvB,KAAmB,EACnB,OAA0B;QAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACtG,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,+BAA+B,CAAC;QACrF,OAAO,qBAAqB,CAAC;YAC3B,QAAQ,EAAE,YAAY;YACtB,KAAK;YACL,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC;YAC9C,QAAQ,EAAE,gBAAgB,EAAE;YAC5B,GAAG,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,wBAAwB,CAAC;gBACjD,OAAO,EAAE,mBAAmB;gBAC5B,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU,MAAM,EAAE;oBACnC,cAAc,EAAE,kCAAkC;oBAClD,SAAS,EAAE,UAAU;iBACtB;gBACD,KAAK;gBACL,QAAQ;gBACR,KAAK;gBACL,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,GAAG;gBACnE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE,wBAAwB,CAAC,KAAK,CAAC,CAAC;gBACzG,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM;gBAC1C,4DAA4D;gBAC5D,MAAM,EAAE,OAAO,EAAE,MAAM;gBACvB,uEAAuE;gBACvE,yEAAyE;gBACzE,+DAA+D;gBAC/D,MAAM,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE;oBACzC,IAAI,CAAC;wBACH,mBAAmB,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;oBAC7F,CAAC;oBAAC,MAAM,CAAC;wBACP,gBAAgB;oBAClB,CAAC;gBACH,CAAC;gBACD,aAAa;aACZ,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,mBAAmB,CACvB,QAAuB,EACvB,KAAmB,EACnB,OAAqC,EACrC,OAAgC;QAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACtG,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,+BAA+B,CAAC;QACrF,OAAO,qBAAqB,CAAC;YAC3B,QAAQ,EAAE,YAAY;YACtB,KAAK;YACL,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC;YAC9C,QAAQ,EAAE,gBAAgB,EAAE;YAC5B,GAAG,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,8BAA8B,CACtD;gBACE,OAAO,EAAE,mBAAmB;gBAC5B,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU,MAAM,EAAE;oBACnC,cAAc,EAAE,kCAAkC;oBAClD,SAAS,EAAE,UAAU;iBACtB;gBACD,KAAK;gBACL,QAAQ;gBACR,KAAK;gBACL,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,GAAG;gBACnE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE,wBAAwB,CAAC,KAAK,CAAC,CAAC;gBACzG,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM;gBAC1C,4DAA4D;gBAC5D,MAAM,EAAE,OAAO,EAAE,MAAM;gBACvB,uEAAuE;gBACvE,oEAAoE;gBACpE,qCAAqC;gBACrC,MAAM,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE;oBACzC,IAAI,CAAC;wBACH,mBAAmB,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;oBAC7F,CAAC;oBAAC,MAAM,CAAC;wBACP,gBAAgB;oBAClB,CAAC;gBACH,CAAC;gBACD,aAAa;aACd,EACD,OAAO,CACR;SACA,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,MAAc,EACd,OAAqC,EACrC,OAAgC;QAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QAC3F,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,+BAA+B,CAAC;QACrF,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC;QAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,EACnD,wBAAwB,CAAC,KAAK,CAAC,CAChC,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,oCAAoC,KAAK,iBAAiB,WAAW,eAAe,SAAS,EAAE,CAAC,CAAC;QAE9G,2EAA2E;QAC3E,oEAAoE;QACpE,wEAAwE;QACxE,oBAAoB;QACpB,IAAI,WAA6F,CAAC;QAElG,oEAAoE;QACpE,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC;YAC9C,QAAQ,EAAE,YAAY;YACtB,KAAK;YACL,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC;YAC9C,QAAQ,EAAE,gBAAgB,EAAE;YAC5B,GAAG,EAAE,CAAC,aAAa,EAAE,EAAE,CACrB,gBAAgB,CACd,GAAG,mBAAmB,mBAAmB,EACzC;gBACE,eAAe,EAAE,UAAU,MAAM,EAAE;gBACnC,cAAc,EAAE,kCAAkC;gBAClD,SAAS,EAAE,UAAU;aACtB,EACD,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,aAAa,EAAE,EACxI,OAAO,EACP,CAAC,CAAC,EAAE,EAAE,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAC5B;SACJ,CAAC,CAAC;QAEH,0EAA0E;QAC1E,+CAA+C;QAC/C,IAAI,CAAC;YACH,mBAAmB,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAC/F,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAE9B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,OAAO,gCAAgC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,aAAa,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC;IAChJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,mBAAmB,SAAS,EAAE;gBAC5D,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,MAAM,EAAE,EAAE;aACjD,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,EAAE,CAAC;YAC5B,wEAAwE;YACxE,oEAAoE;YACpE,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CASlC,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAC1B,CAAC,CAMA,EAAE,EAAE;gBACH,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ,IAAI,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;gBACxG,OAAO;oBACL,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE;oBACpB,QAAQ,EAAE,YAAY;oBACtB,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxB,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1D,qEAAqE;oBACrE,4DAA4D;oBAC5D,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAClG,CAAC;YACJ,CAAC,CACF,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Reasoning effort — ask a model to reason harder, WITHOUT breaking the models
3
+ * that can't.
4
+ *
5
+ * WHY THIS EXISTS
6
+ * ---------------
7
+ * The `max` capability mode raises a routing FLOOR (it requires a strong served
8
+ * model — see `capability-mode.ts`). That decides WHICH model answers; it does
9
+ * nothing about HOW HARD that model thinks. Provider-side reasoning controls
10
+ * are what close that last gap, and until now no adapter sent one: a request to
11
+ * a reasoning-capable model looked identical to a request to a toy.
12
+ *
13
+ * The obvious naive fix — hardcode per-model support and send the parameter —
14
+ * is wrong in both directions and rots immediately:
15
+ * - a model that does NOT accept the parameter 400s the whole turn, and
16
+ * - a model that DOES accept it is capped by a list that stopped being true
17
+ * the day the provider shipped it.
18
+ *
19
+ * So this module is built on three rules:
20
+ *
21
+ * 1. GENERIC, NOT PER-PROVIDER-POLICY. The policy asks for an EFFORT
22
+ * (`low|medium|high`) in provider-neutral terms; the wire spelling is a
23
+ * property of the provider, translated here. Adding a provider is data.
24
+ * 2. DEFAULT-DENY. The parameter is emitted ONLY when the ModelRegistry has
25
+ * positively recorded that the exact provider × model accepts it. Absent
26
+ * evidence ⇒ send nothing ⇒ behave exactly as before. A model the provider
27
+ * adds tomorrow is never sent a parameter it hasn't been verified for.
28
+ * 3. CLOSED-LOOP. Providers change under us, so a "verified" flag can go
29
+ * stale. A rejected parameter (400/422 naming the field) is DETECTED,
30
+ * recorded as `learned-unsupported`, and the call is RETRIED ONCE without
31
+ * it. Worst case the knob silently does nothing; it can never fail a turn
32
+ * that would otherwise succeed.
33
+ *
34
+ * The knob is an UPLIFT, never a requirement. Every path here is safe to take:
35
+ * the only request that carries the parameter is one the registry vouches for,
36
+ * and even that path self-heals on rejection.
37
+ */
38
+ import type { ReasoningCapability, ReasoningEffort, ReasoningShape } from '../config/types.js';
39
+ /** The default wire parameter name for each shape. */
40
+ export declare const SHAPE_DEFAULT_PARAM: Record<ReasoningShape, string>;
41
+ /**
42
+ * The wire shape a provider uses for a reasoning control, or `undefined` when
43
+ * we have no wired shape for it. Data, not policy — the mapping lives here so
44
+ * adding a provider is a one-line edit and nothing else.
45
+ */
46
+ export declare function reasoningShapeForProvider(provider: string): ReasoningShape | undefined;
47
+ /**
48
+ * Merge a flattened reasoning fragment into an OpenAI-family request body
49
+ * (flat keys). Returns the body unchanged when there is nothing to add.
50
+ */
51
+ export declare function mergeFlatReasoning(body: Record<string, unknown>, reasoningBody: Record<string, unknown> | undefined): Record<string, unknown>;
52
+ /**
53
+ * Derive a reasoning capability from a provider's OWN advertised parameter
54
+ * list (e.g. OpenRouter `/models` `supported_parameters`). The strongest
55
+ * evidence available — the provider telling us — so it seeds the registry at
56
+ * list time, before any probe. Returns `undefined` when nothing is advertised.
57
+ */
58
+ export declare function reasoningCapabilityFromAdvertised(supportedParameters: readonly string[] | undefined, now?: number): ReasoningCapability | undefined;
59
+ /**
60
+ * The narrow slice of the ModelRegistry this module needs. Structural so tests
61
+ * (and callers) can pass a stub, and so the inference layer never imports the
62
+ * whole registry just for a lookup.
63
+ */
64
+ export interface ReasoningRegistryLike {
65
+ getReasoningCapability(provider: string, model: string): ReasoningCapability | undefined;
66
+ markReasoningUnsupported(provider: string, model: string, param: string): void;
67
+ }
68
+ /** A resolved request-side reasoning parameter (body fragment + its name). */
69
+ export interface ReasoningRequest {
70
+ /** Body keys to merge into the provider request. */
71
+ body: Record<string, unknown>;
72
+ /** The wire parameter name — used to recognise a rejection. */
73
+ param: string;
74
+ shape: ReasoningShape;
75
+ }
76
+ /**
77
+ * Build the request-body fragment for a verified capability at a given effort.
78
+ * Pure. Unknown shapes fall back to the OpenAI `reasoning_effort` string.
79
+ */
80
+ export declare function reasoningRequestBody(cap: Pick<ReasoningCapability, 'param' | 'shape'>, effort: ReasoningEffort): Record<string, unknown>;
81
+ /**
82
+ * Resolve the request-side reasoning parameter for a provider × model, or
83
+ * `undefined` when none should be sent.
84
+ *
85
+ * DEFAULT-DENY: returns a request only when the registry has a `supported:true`
86
+ * capability for this exact pair. Everything else (no entry, unsupported,
87
+ * mismatched model) returns `undefined`, so the caller sends nothing extra.
88
+ */
89
+ export declare function resolveReasoningRequest(provider: string, model: string, effort: ReasoningEffort | undefined, registry: ReasoningRegistryLike | undefined): ReasoningRequest | undefined;
90
+ /**
91
+ * True when an error looks like the provider REJECTED our reasoning parameter
92
+ * (rather than failing for an unrelated reason).
93
+ *
94
+ * Deliberately narrow: we require a 4xx client status AND either the parameter
95
+ * name appearing in the message, or an explicit "unsupported/unknown/invalid
96
+ * <parameter|field>" phrasing. A generic 400 without either is NOT treated as a
97
+ * disagreement about the parameter — guessing here would silently drop the knob
98
+ * on unrelated failures and never learn the truth.
99
+ */
100
+ export declare function isReasoningParamRejection(error: unknown, param: string): boolean;
101
+ /** Calls `run` with a reasoning body fragment; retries once without it on rejection. */
102
+ export interface ReasoningFallbackOptions<T> {
103
+ provider: string;
104
+ model: string;
105
+ /** The resolved request, or undefined to run with no parameter at all. */
106
+ request: ReasoningRequest | undefined;
107
+ registry: ReasoningRegistryLike | undefined;
108
+ /** Runs the request. `extra` is the body fragment to merge (empty on retry). */
109
+ run: (extra: Record<string, unknown>) => Promise<T>;
110
+ }
111
+ /**
112
+ * Run a request with the reasoning parameter (when one was resolved), and if the
113
+ * provider REJECTS it, learn that fact and retry ONCE without the parameter.
114
+ *
115
+ * This is the safety net that makes the knob safe against a stale/unverified
116
+ * capability: the worst case is one extra round trip, never a failed turn. On a
117
+ * rejection we mark the pair `learned-unsupported` so the very next call skips
118
+ * the parameter entirely (default-deny now has positive negative evidence).
119
+ *
120
+ * A no-op wrapper when `request` is undefined: the call runs exactly as before.
121
+ */
122
+ export declare function withReasoningFallback<T>(opts: ReasoningFallbackOptions<T>): Promise<T>;
123
+ /**
124
+ * The ambient reasoning effort for this process (from the capability mode), for
125
+ * an adapter that was handed no explicit `options.reasoningEffort`. Reading the
126
+ * env is free; the config-file path is threaded explicitly by the routing
127
+ * layer, and this covers the env/default case.
128
+ */
129
+ export declare function ambientReasoningEffort(): ReasoningEffort | undefined;
130
+ //# sourceMappingURL=reasoning-effort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoning-effort.d.ts","sourceRoot":"","sources":["../../src/inference/reasoning-effort.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAG/F,sDAAsD;AACtD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAI9D,CAAC;AA0CF;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAGtF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACjD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGzB;AAQD;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAC/C,mBAAmB,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EAClD,GAAG,GAAE,MAAmB,GACvB,mBAAmB,GAAG,SAAS,CAYjC;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAAC;IACzF,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAChF;AAED,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,cAAc,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,OAAO,CAAC,EACjD,MAAM,EAAE,eAAe,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWzB;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,GAAG,SAAS,EACnC,QAAQ,EAAE,qBAAqB,GAAG,SAAS,GAC1C,gBAAgB,GAAG,SAAS,CAc9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAQhF;AAED,wFAAwF;AACxF,MAAM,WAAW,wBAAwB,CAAC,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,OAAO,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACtC,QAAQ,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC5C,gFAAgF;IAChF,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CACrD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CAAC,CAAC,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAgB5F;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,eAAe,GAAG,SAAS,CAMpE"}