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.
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/orchestrator.js +6 -0
- package/dist/agents/orchestrator.js.map +1 -1
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +27 -17
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/config.d.ts +28 -0
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +155 -0
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/eval.d.ts +8 -0
- package/dist/cli/eval.d.ts.map +1 -1
- package/dist/cli/eval.js +64 -0
- package/dist/cli/eval.js.map +1 -1
- package/dist/cli/loop-executor.d.ts +13 -0
- package/dist/cli/loop-executor.d.ts.map +1 -1
- package/dist/cli/loop-executor.js +22 -18
- package/dist/cli/loop-executor.js.map +1 -1
- package/dist/config/capability-mode.d.ts +122 -0
- package/dist/config/capability-mode.d.ts.map +1 -0
- package/dist/config/capability-mode.js +132 -0
- package/dist/config/capability-mode.js.map +1 -0
- package/dist/config/limits.d.ts +47 -0
- package/dist/config/limits.d.ts.map +1 -0
- package/dist/config/limits.js +64 -0
- package/dist/config/limits.js.map +1 -0
- package/dist/config/process-env.d.ts.map +1 -1
- package/dist/config/process-env.js +44 -0
- package/dist/config/process-env.js.map +1 -1
- package/dist/config/types.d.ts +77 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/work-digest.d.ts +46 -0
- package/dist/config/work-digest.d.ts.map +1 -0
- package/dist/config/work-digest.js +80 -0
- package/dist/config/work-digest.js.map +1 -0
- package/dist/gateway/inbound-media.d.ts +18 -0
- package/dist/gateway/inbound-media.d.ts.map +1 -1
- package/dist/gateway/inbound-media.js +96 -2
- package/dist/gateway/inbound-media.js.map +1 -1
- package/dist/inference/anthropic-adapter.d.ts +6 -0
- package/dist/inference/anthropic-adapter.d.ts.map +1 -1
- package/dist/inference/anthropic-adapter.js +79 -8
- package/dist/inference/anthropic-adapter.js.map +1 -1
- package/dist/inference/gemini-adapter.d.ts +6 -0
- package/dist/inference/gemini-adapter.d.ts.map +1 -1
- package/dist/inference/gemini-adapter.js +73 -8
- package/dist/inference/gemini-adapter.js.map +1 -1
- package/dist/inference/groq-adapter.d.ts +3 -0
- package/dist/inference/groq-adapter.d.ts.map +1 -1
- package/dist/inference/groq-adapter.js +83 -40
- package/dist/inference/groq-adapter.js.map +1 -1
- package/dist/inference/interface.d.ts +7 -0
- package/dist/inference/interface.d.ts.map +1 -1
- package/dist/inference/model-probe.d.ts +17 -0
- package/dist/inference/model-probe.d.ts.map +1 -1
- package/dist/inference/model-probe.js +58 -1
- package/dist/inference/model-probe.js.map +1 -1
- package/dist/inference/model-validator.d.ts +16 -1
- package/dist/inference/model-validator.d.ts.map +1 -1
- package/dist/inference/model-validator.js +83 -2
- package/dist/inference/model-validator.js.map +1 -1
- package/dist/inference/nim-adapter.js +4 -4
- package/dist/inference/nim-adapter.js.map +1 -1
- package/dist/inference/openai-compat-adapter.d.ts +9 -0
- package/dist/inference/openai-compat-adapter.d.ts.map +1 -1
- package/dist/inference/openai-compat-adapter.js +101 -51
- package/dist/inference/openai-compat-adapter.js.map +1 -1
- package/dist/inference/openrouter-adapter.d.ts +3 -0
- package/dist/inference/openrouter-adapter.d.ts.map +1 -1
- package/dist/inference/openrouter-adapter.js +134 -57
- package/dist/inference/openrouter-adapter.js.map +1 -1
- package/dist/inference/reasoning-effort.d.ts +130 -0
- package/dist/inference/reasoning-effort.d.ts.map +1 -0
- package/dist/inference/reasoning-effort.js +237 -0
- package/dist/inference/reasoning-effort.js.map +1 -0
- package/dist/inference/route-resolver.d.ts +7 -0
- package/dist/inference/route-resolver.d.ts.map +1 -1
- package/dist/inference/route-resolver.js +2 -1
- package/dist/inference/route-resolver.js.map +1 -1
- package/dist/inference/sse.d.ts +6 -0
- package/dist/inference/sse.d.ts.map +1 -1
- package/dist/inference/sse.js +1 -0
- package/dist/inference/sse.js.map +1 -1
- package/dist/inference/tools.d.ts +13 -0
- package/dist/inference/tools.d.ts.map +1 -1
- package/dist/inference/tools.js +20 -2
- package/dist/inference/tools.js.map +1 -1
- package/dist/learning/autonomy-policy.d.ts +8 -0
- package/dist/learning/autonomy-policy.d.ts.map +1 -1
- package/dist/learning/autonomy-policy.js +34 -0
- package/dist/learning/autonomy-policy.js.map +1 -1
- package/dist/learning/capability-parity.d.ts +108 -0
- package/dist/learning/capability-parity.d.ts.map +1 -0
- package/dist/learning/capability-parity.js +154 -0
- package/dist/learning/capability-parity.js.map +1 -0
- package/dist/learning/cost-tracker.d.ts +28 -4
- package/dist/learning/cost-tracker.d.ts.map +1 -1
- package/dist/learning/cost-tracker.js +58 -8
- package/dist/learning/cost-tracker.js.map +1 -1
- package/dist/learning/eval-framework.d.ts +17 -0
- package/dist/learning/eval-framework.d.ts.map +1 -1
- package/dist/learning/eval-framework.js +63 -2
- package/dist/learning/eval-framework.js.map +1 -1
- package/dist/learning/model-capability.d.ts +94 -0
- package/dist/learning/model-capability.d.ts.map +1 -0
- package/dist/learning/model-capability.js +172 -0
- package/dist/learning/model-capability.js.map +1 -0
- package/dist/learning/model-registry.d.ts +33 -0
- package/dist/learning/model-registry.d.ts.map +1 -1
- package/dist/learning/model-registry.js +79 -0
- package/dist/learning/model-registry.js.map +1 -1
- package/dist/learning/reasoning-trace.d.ts +1 -1
- package/dist/learning/reasoning-trace.d.ts.map +1 -1
- package/dist/learning/reasoning-trace.js.map +1 -1
- package/dist/learning/resolve-options.d.ts.map +1 -1
- package/dist/learning/resolve-options.js +16 -3
- package/dist/learning/resolve-options.js.map +1 -1
- package/dist/learning/run-trace.d.ts +68 -0
- package/dist/learning/run-trace.d.ts.map +1 -1
- package/dist/learning/run-trace.js +101 -0
- package/dist/learning/run-trace.js.map +1 -1
- package/dist/tools/loop-skill-hint.d.ts +27 -0
- package/dist/tools/loop-skill-hint.d.ts.map +1 -1
- package/dist/tools/loop-skill-hint.js +189 -5
- package/dist/tools/loop-skill-hint.js.map +1 -1
- package/dist/tools/read-extract.d.ts +9 -3
- package/dist/tools/read-extract.d.ts.map +1 -1
- package/dist/tools/read-extract.js +70 -25
- package/dist/tools/read-extract.js.map +1 -1
- package/dist/tools/tool-loop.d.ts +120 -0
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +447 -5
- package/dist/tools/tool-loop.js.map +1 -1
- package/dist/web-dashboard/attachment-extract.d.ts +8 -1
- package/dist/web-dashboard/attachment-extract.d.ts.map +1 -1
- package/dist/web-dashboard/attachment-extract.js +14 -3
- package/dist/web-dashboard/attachment-extract.js.map +1 -1
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +160 -21
- package/dist/web-dashboard/server.js.map +1 -1
- package/dist/web-dashboard/src/types.d.ts +26 -0
- package/dist/web-dashboard/src/types.d.ts.map +1 -1
- package/dist/web-dashboard/workspace-guard.d.ts.map +1 -1
- package/dist/web-dashboard/workspace-guard.js +44 -4
- package/dist/web-dashboard/workspace-guard.js.map +1 -1
- package/package.json +1 -1
- package/src/web-dashboard/public/assets/index-BdKf5Xw2.js +207 -0
- package/src/web-dashboard/public/assets/index-BdKf5Xw2.js.map +1 -0
- package/src/web-dashboard/public/assets/index-C9eBskc9.css +1 -0
- package/src/web-dashboard/public/index.html +2 -2
- package/src/web-dashboard/public/assets/index-Beportyl.js +0 -207
- package/src/web-dashboard/public/assets/index-Beportyl.js.map +0 -1
- 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;
|
|
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
|
-
|
|
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
|
|
81
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
|
116
|
-
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
|
152
|
-
'
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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()
|
|
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":"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,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"openrouter-adapter.js","sourceRoot":"","sources":["../../src/inference/openrouter-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|