agent-nuvira 2.6.14 → 2.7.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.
Files changed (99) hide show
  1. package/README.md +4 -2
  2. package/dist/cli/chat.d.ts +2 -0
  3. package/dist/cli/chat.d.ts.map +1 -1
  4. package/dist/cli/chat.js +107 -4
  5. package/dist/cli/chat.js.map +1 -1
  6. package/dist/cli/eval.d.ts.map +1 -1
  7. package/dist/cli/eval.js +14 -1
  8. package/dist/cli/eval.js.map +1 -1
  9. package/dist/cli/execute.d.ts +8 -0
  10. package/dist/cli/execute.d.ts.map +1 -1
  11. package/dist/cli/execute.js +105 -1
  12. package/dist/cli/execute.js.map +1 -1
  13. package/dist/cli/loop-executor.d.ts +81 -0
  14. package/dist/cli/loop-executor.d.ts.map +1 -0
  15. package/dist/cli/loop-executor.js +246 -0
  16. package/dist/cli/loop-executor.js.map +1 -0
  17. package/dist/config/types.d.ts +18 -0
  18. package/dist/config/types.d.ts.map +1 -1
  19. package/dist/fresh.d.ts +2 -0
  20. package/dist/fresh.d.ts.map +1 -0
  21. package/dist/fresh.js +2 -0
  22. package/dist/fresh.js.map +1 -0
  23. package/dist/inference/anthropic-adapter.d.ts +9 -0
  24. package/dist/inference/anthropic-adapter.d.ts.map +1 -1
  25. package/dist/inference/anthropic-adapter.js +143 -0
  26. package/dist/inference/anthropic-adapter.js.map +1 -1
  27. package/dist/inference/gemini-adapter.d.ts +8 -0
  28. package/dist/inference/gemini-adapter.d.ts.map +1 -1
  29. package/dist/inference/gemini-adapter.js +145 -0
  30. package/dist/inference/gemini-adapter.js.map +1 -1
  31. package/dist/inference/model-probe.d.ts.map +1 -1
  32. package/dist/inference/model-probe.js +14 -0
  33. package/dist/inference/model-probe.js.map +1 -1
  34. package/dist/inference/native-tools.d.ts +226 -0
  35. package/dist/inference/native-tools.d.ts.map +1 -0
  36. package/dist/inference/native-tools.js +389 -0
  37. package/dist/inference/native-tools.js.map +1 -0
  38. package/dist/learning/auto-router.d.ts +36 -4
  39. package/dist/learning/auto-router.d.ts.map +1 -1
  40. package/dist/learning/auto-router.js +103 -2
  41. package/dist/learning/auto-router.js.map +1 -1
  42. package/dist/learning/context-pruner.d.ts.map +1 -1
  43. package/dist/learning/context-pruner.js +4 -2
  44. package/dist/learning/context-pruner.js.map +1 -1
  45. package/dist/learning/engine-router.d.ts +90 -0
  46. package/dist/learning/engine-router.d.ts.map +1 -0
  47. package/dist/learning/engine-router.js +128 -0
  48. package/dist/learning/engine-router.js.map +1 -0
  49. package/dist/learning/eval-framework.d.ts +42 -1
  50. package/dist/learning/eval-framework.d.ts.map +1 -1
  51. package/dist/learning/eval-framework.js +163 -7
  52. package/dist/learning/eval-framework.js.map +1 -1
  53. package/dist/learning/routing-cache.d.ts +64 -0
  54. package/dist/learning/routing-cache.d.ts.map +1 -0
  55. package/dist/learning/routing-cache.js +100 -0
  56. package/dist/learning/routing-cache.js.map +1 -0
  57. package/dist/tools/loop-project-context.d.ts +47 -0
  58. package/dist/tools/loop-project-context.d.ts.map +1 -0
  59. package/dist/tools/loop-project-context.js +210 -0
  60. package/dist/tools/loop-project-context.js.map +1 -0
  61. package/dist/tools/loop-skill-hint.d.ts +110 -0
  62. package/dist/tools/loop-skill-hint.d.ts.map +1 -0
  63. package/dist/tools/loop-skill-hint.js +266 -0
  64. package/dist/tools/loop-skill-hint.js.map +1 -0
  65. package/dist/tools/registry.d.ts +10 -0
  66. package/dist/tools/registry.d.ts.map +1 -1
  67. package/dist/tools/registry.js +66 -9
  68. package/dist/tools/registry.js.map +1 -1
  69. package/dist/tools/release-sync.d.ts.map +1 -1
  70. package/dist/tools/release-sync.js +5 -4
  71. package/dist/tools/release-sync.js.map +1 -1
  72. package/dist/tools/tool-loop.d.ts +28 -0
  73. package/dist/tools/tool-loop.d.ts.map +1 -1
  74. package/dist/tools/tool-loop.js +182 -6
  75. package/dist/tools/tool-loop.js.map +1 -1
  76. package/dist/tools/toolsets.d.ts +33 -0
  77. package/dist/tools/toolsets.d.ts.map +1 -1
  78. package/dist/tools/toolsets.js +84 -0
  79. package/dist/tools/toolsets.js.map +1 -1
  80. package/dist/web-dashboard/chat-console.d.ts +31 -0
  81. package/dist/web-dashboard/chat-console.d.ts.map +1 -1
  82. package/dist/web-dashboard/chat-console.js +73 -0
  83. package/dist/web-dashboard/chat-console.js.map +1 -1
  84. package/dist/web-dashboard/loop-turn-telemetry.d.ts +27 -0
  85. package/dist/web-dashboard/loop-turn-telemetry.d.ts.map +1 -0
  86. package/dist/web-dashboard/loop-turn-telemetry.js +43 -0
  87. package/dist/web-dashboard/loop-turn-telemetry.js.map +1 -0
  88. package/dist/web-dashboard/server.d.ts +62 -1
  89. package/dist/web-dashboard/server.d.ts.map +1 -1
  90. package/dist/web-dashboard/server.js +205 -4
  91. package/dist/web-dashboard/server.js.map +1 -1
  92. package/dist/web-dashboard/src/types.d.ts +44 -0
  93. package/dist/web-dashboard/src/types.d.ts.map +1 -1
  94. package/package.json +1 -1
  95. package/src/web-dashboard/public/assets/{index-Cg9LaToa.js → index-C4frng1Q.js} +79 -79
  96. package/src/web-dashboard/public/assets/{index-Cg9LaToa.js.map → index-C4frng1Q.js.map} +1 -1
  97. package/src/web-dashboard/public/assets/index-C507EUWf.css +1 -0
  98. package/src/web-dashboard/public/index.html +2 -2
  99. package/src/web-dashboard/public/assets/index-B47v8pr1.css +0 -1
@@ -0,0 +1,389 @@
1
+ /**
2
+ * Native tool-calling wire mapping (`src/inference/native-tools.ts`) —
3
+ * AGENTIC_CAPABILITY_ASSESSMENT Addendum v4 Phase 1.2 (the BLOCKING item).
4
+ *
5
+ * The loop engine (`runToolLoop`) speaks the OpenAI `ToolMessage`/`ToolSchema`
6
+ * shape. Groq/OpenRouter/OpenAI-compat/NIM ride the shared
7
+ * `chatCompletionsWithTools` helper (tools.ts). Gemini and Anthropic do NOT
8
+ * speak that protocol — the assessment found them at "0 generateTools matches,
9
+ * JSON-fallback only" and marked adapter parity as BLOCKING for loop-default,
10
+ * because prompt-parsed JSON tool calls are flakiest on exactly the models
11
+ * users route to.
12
+ *
13
+ * This module carries the two non-OpenAI wire mappings, so each adapter's
14
+ * `generateTools`/`generateToolsStream` is a thin fetch around tested
15
+ * translation code:
16
+ *
17
+ * Gemini (v1beta generateContent):
18
+ * system → systemInstruction.parts[].text
19
+ * user → role "user", parts[{text}]
20
+ * assistant → role "model", parts[{text}?, {functionCall:{name,args}}…]
21
+ * tool result → role "user", parts[{functionResponse:{name,response}}]
22
+ * tools → tools[{functionDeclarations:[…]}] (OpenAPI subset schema)
23
+ *
24
+ * Anthropic (v1/messages):
25
+ * system → top-level `system` string (concatenated)
26
+ * user → messages[{role:"user", content}]
27
+ * assistant+tc → content blocks: [{type:"text"}?, {type:"tool_use", id, name, input}…]
28
+ * tool result → user message with {type:"tool_result", tool_use_id, content}
29
+ * (consecutive tool messages merge into ONE user message —
30
+ * Anthropic requires tool_result blocks to live in the
31
+ * message immediately following the tool_use)
32
+ * tools → tools[{name, description, input_schema}]
33
+ *
34
+ * Correctness rules shared by both mappings:
35
+ * - Assistant tool_calls carry `arguments` as a JSON STRING (OpenAI wire
36
+ * convention); both mappings parse it defensively — a malformed argument
37
+ * string degrades to `{}` instead of throwing (the model retries in-loop).
38
+ * - Tool results keep their identity: Gemini keys functionResponse by tool
39
+ * NAME (recovered from the assistant toolCalls entry with the matching id),
40
+ * Anthropic by tool_use_id directly.
41
+ * - Synthetic tool-call ids (`call_1`…) are generated for Gemini, which has
42
+ * no id concept — they only need internal consistency within one thread.
43
+ */
44
+ // ─── Shared: defensive JSON argument parsing ────────────────────────────────
45
+ /** Parse an OpenAI-wire arguments JSON string → object ({} on any failure). */
46
+ export function parseToolArguments(argumentsJson) {
47
+ if (!argumentsJson)
48
+ return {};
49
+ try {
50
+ const parsed = JSON.parse(argumentsJson);
51
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
52
+ ? parsed
53
+ : {};
54
+ }
55
+ catch {
56
+ return {};
57
+ }
58
+ }
59
+ /**
60
+ * Strip JSON-Schema keywords Gemini's function-declaration validation rejects
61
+ * ($schema, additionalProperties, default, examples, exclusiveMinimum/Maximum,
62
+ * oneOf/anyOf/allOf/not — Gemini 1.x 400s on these) and flatten union types
63
+ * (`type: ["string","null"]` → `type: "string", nullable: true`). The OpenAPI
64
+ * subset Gemini accepts: type, description, enum, format, items, properties,
65
+ * required, nullable, minItems/maxItems, minLength/maxLength, minimum/maximum,
66
+ * pattern, title, readOnly, ignore.
67
+ */
68
+ export function toGeminiSchema(schema) {
69
+ if (!schema || typeof schema !== 'object')
70
+ return undefined;
71
+ const KEEP = new Set([
72
+ 'type', 'description', 'enum', 'format', 'items', 'properties', 'required',
73
+ 'nullable', 'minItems', 'maxItems', 'minLength', 'maxLength',
74
+ 'minimum', 'maximum', 'pattern', 'title',
75
+ ]);
76
+ const walk = (node) => {
77
+ if (!node || typeof node !== 'object')
78
+ return undefined;
79
+ const src = node;
80
+ const out = {};
81
+ for (const [k, v] of Object.entries(src)) {
82
+ if (!KEEP.has(k))
83
+ continue;
84
+ if (k === 'type' && Array.isArray(v)) {
85
+ // Union type → base type + nullable flag (Gemini's nullability form).
86
+ const nonNull = v.filter((t) => t !== 'null');
87
+ out.type = nonNull[0] ?? 'string';
88
+ if (v.includes('null'))
89
+ out.nullable = true;
90
+ continue;
91
+ }
92
+ if (k === 'items') {
93
+ out.items = walk(v) ?? {};
94
+ continue;
95
+ }
96
+ if (k === 'properties' && v && typeof v === 'object' && !Array.isArray(v)) {
97
+ const props = {};
98
+ for (const [pk, pv] of Object.entries(v)) {
99
+ const s = walk(pv);
100
+ if (s)
101
+ props[pk] = s;
102
+ }
103
+ out.properties = props;
104
+ continue;
105
+ }
106
+ out[k] = v;
107
+ }
108
+ // Gemini requires a concrete type on every property object.
109
+ if (!out.type && (out.properties || out.items))
110
+ out.type = 'object';
111
+ return out;
112
+ };
113
+ const result = walk(schema);
114
+ if (result && !result.type)
115
+ result.type = 'object';
116
+ return result;
117
+ }
118
+ /** ToolSchema[] → Gemini `tools` request entry. */
119
+ export function toGeminiFunctionDeclarations(tools) {
120
+ const declarations = tools.map((t) => {
121
+ const decl = { name: t.name, description: t.description };
122
+ const params = toGeminiSchema(t.parameters);
123
+ if (params && (params.properties || params.type === 'object'))
124
+ decl.parameters = params;
125
+ return decl;
126
+ });
127
+ return [{ functionDeclarations: declarations }];
128
+ }
129
+ /** Recover the tool NAME for a tool result from the assistant toolCalls entry with that id. */
130
+ function toolNameForCallId(messages, toolCallId) {
131
+ if (!toolCallId)
132
+ return undefined;
133
+ for (const m of messages) {
134
+ if (m.role !== 'assistant' || !m.toolCalls)
135
+ continue;
136
+ const match = m.toolCalls.find((tc) => tc.id === toolCallId);
137
+ if (match)
138
+ return match.name;
139
+ }
140
+ return undefined;
141
+ }
142
+ /**
143
+ * ToolMessage[] → Gemini `contents` + `systemInstruction`.
144
+ * Consecutive tool-result messages become one "user" content with one
145
+ * functionResponse part each (the loop pushes them individually, but a
146
+ * parallel-capable caller may batch them).
147
+ */
148
+ export function toGeminiContents(messages) {
149
+ let systemInstruction;
150
+ const contents = [];
151
+ for (const m of messages) {
152
+ if (m.role === 'system') {
153
+ if (!m.content)
154
+ continue;
155
+ if (!systemInstruction)
156
+ systemInstruction = { parts: [] };
157
+ systemInstruction.parts.push({ text: m.content });
158
+ continue;
159
+ }
160
+ if (m.role === 'user') {
161
+ if (m.content)
162
+ contents.push({ role: 'user', parts: [{ text: m.content }] });
163
+ continue;
164
+ }
165
+ if (m.role === 'assistant') {
166
+ const parts = [];
167
+ if (m.content)
168
+ parts.push({ text: m.content });
169
+ for (const tc of m.toolCalls ?? []) {
170
+ parts.push({ functionCall: { name: tc.name, args: parseToolArguments(tc.arguments) } });
171
+ }
172
+ if (parts.length > 0)
173
+ contents.push({ role: 'model', parts });
174
+ continue;
175
+ }
176
+ // role === 'tool' → functionResponse under role "user" (v1beta convention).
177
+ const name = toolNameForCallId(messages, m.toolCallId);
178
+ if (!name)
179
+ continue; // unpaired tool result — nothing Gemini can key it by
180
+ contents.push({
181
+ role: 'user',
182
+ parts: [{ functionResponse: { name, response: { result: m.content } } }],
183
+ });
184
+ }
185
+ return { systemInstruction, contents };
186
+ }
187
+ /** Parse a Gemini response body → the loop's ToolCallResponse. */
188
+ export function parseGeminiToolResponse(data) {
189
+ const parts = data.candidates?.[0]?.content?.parts ?? [];
190
+ let content = '';
191
+ const toolCalls = [];
192
+ for (const p of parts) {
193
+ if (typeof p.text === 'string' && p.text)
194
+ content += p.text;
195
+ if (p.functionCall?.name) {
196
+ toolCalls.push({
197
+ id: `call_${toolCalls.length + 1}`,
198
+ name: p.functionCall.name,
199
+ arguments: p.functionCall.args ?? {},
200
+ });
201
+ }
202
+ }
203
+ return { content, toolCalls };
204
+ }
205
+ /**
206
+ * Extract the text deltas from ONE Gemini SSE chunk (streamGenerateContent
207
+ * alt=sse): text parts stream to the caller immediately, functionCall parts
208
+ * accumulate. Returns null for non-data/[DONE]/unparseable lines.
209
+ */
210
+ export function parseGeminiToolSSEChunk(line) {
211
+ if (!line.startsWith('data: '))
212
+ return null;
213
+ const data = line.slice(6).trim();
214
+ if (!data || data === '[DONE]')
215
+ return null;
216
+ try {
217
+ const parsed = JSON.parse(data);
218
+ const parts = parsed.candidates?.[0]?.content?.parts ?? [];
219
+ let text = null;
220
+ const functionCalls = [];
221
+ for (const p of parts) {
222
+ if (typeof p.text === 'string' && p.text)
223
+ text = (text ?? '') + p.text;
224
+ if (p.functionCall?.name)
225
+ functionCalls.push({ name: p.functionCall.name, args: p.functionCall.args });
226
+ }
227
+ const usage = parsed.usageMetadata
228
+ ? { promptTokens: parsed.usageMetadata.promptTokenCount, completionTokens: parsed.usageMetadata.candidatesTokenCount }
229
+ : undefined;
230
+ return { text, functionCalls, usage };
231
+ }
232
+ catch {
233
+ return null;
234
+ }
235
+ }
236
+ /**
237
+ * ToolMessage[] → Anthropic `system` + `messages`.
238
+ * Consecutive tool results merge into ONE user message (tool_result blocks
239
+ * must immediately follow the tool_use they answer). Empty text is skipped;
240
+ * an assistant message with only toolCalls sends tool_use blocks with no
241
+ * text block (Anthropic accepts content arrays with tool_use only).
242
+ */
243
+ export function toAnthropicMessages(messages) {
244
+ let system;
245
+ const out = [];
246
+ // Pending tool_result blocks waiting to be flushed as one user message.
247
+ let pendingToolResults = [];
248
+ const flushToolResults = () => {
249
+ if (pendingToolResults.length > 0) {
250
+ out.push({ role: 'user', content: pendingToolResults });
251
+ pendingToolResults = [];
252
+ }
253
+ };
254
+ for (const m of messages) {
255
+ if (m.role === 'system') {
256
+ if (!m.content)
257
+ continue;
258
+ system = system ? `${system}\n${m.content}` : m.content;
259
+ continue;
260
+ }
261
+ if (m.role === 'user') {
262
+ flushToolResults();
263
+ if (m.content)
264
+ out.push({ role: 'user', content: m.content });
265
+ continue;
266
+ }
267
+ if (m.role === 'assistant') {
268
+ flushToolResults();
269
+ const blocks = [];
270
+ if (m.content)
271
+ blocks.push({ type: 'text', text: m.content });
272
+ for (const tc of m.toolCalls ?? []) {
273
+ blocks.push({ type: 'tool_use', id: tc.id, name: tc.name, input: parseToolArguments(tc.arguments) });
274
+ }
275
+ if (blocks.length > 0)
276
+ out.push({ role: 'assistant', content: blocks });
277
+ continue;
278
+ }
279
+ // role === 'tool' → tool_result block in the NEXT user message.
280
+ if (m.toolCallId) {
281
+ pendingToolResults.push({ type: 'tool_result', tool_use_id: m.toolCallId, content: m.content });
282
+ }
283
+ }
284
+ flushToolResults();
285
+ return { system, messages: out };
286
+ }
287
+ /** ToolSchema[] → Anthropic `tools` request entry. */
288
+ export function toAnthropicToolDefs(tools) {
289
+ return tools.map((t) => ({
290
+ name: t.name,
291
+ description: t.description,
292
+ input_schema: (t.parameters && typeof t.parameters === 'object' ? t.parameters : { type: 'object', properties: {} }),
293
+ }));
294
+ }
295
+ /** Parse an Anthropic Messages response body → the loop's ToolCallResponse. */
296
+ export function parseAnthropicToolResponse(data) {
297
+ let content = '';
298
+ const toolCalls = [];
299
+ for (const block of data.content ?? []) {
300
+ if (block.type === 'text' && block.text)
301
+ content += block.text;
302
+ if (block.type === 'tool_use' && block.name) {
303
+ toolCalls.push({
304
+ id: block.id || `call_${toolCalls.length + 1}`,
305
+ name: block.name,
306
+ arguments: block.input ?? {},
307
+ });
308
+ }
309
+ }
310
+ return { content, toolCalls };
311
+ }
312
+ // ─── Anthropic streaming accumulator ────────────────────────────────────────
313
+ /**
314
+ * Streaming state machine for Anthropic's event stream with tools.
315
+ * Feed every `data: {…}` SSE line; text deltas arrive via the returned
316
+ * `text` (deliver to onToken), tool_use blocks accumulate from
317
+ * content_block_start (id/name) + input_json_delta fragments and are
318
+ * finalized at message_stop via `finalize()`.
319
+ */
320
+ export class AnthropicToolStreamAccumulator {
321
+ blocks = [];
322
+ usage;
323
+ stopped = false;
324
+ /** Consume one parsed SSE event object. Returns text deltas to stream (or null). */
325
+ consume(event) {
326
+ switch (event.type) {
327
+ case 'content_block_start': {
328
+ const block = event.content_block;
329
+ if (block?.type === 'tool_use') {
330
+ this.blocks.push({ index: event.index ?? this.blocks.length, type: 'tool_use', id: block.id, name: block.name, inputJson: '' });
331
+ }
332
+ else if (block?.type === 'text') {
333
+ this.blocks.push({ index: event.index ?? this.blocks.length, type: 'text', text: block.text ?? '' });
334
+ }
335
+ return null;
336
+ }
337
+ case 'content_block_delta': {
338
+ const target = this.blocks.find((b) => b.index === (event.index ?? 0));
339
+ if (!target)
340
+ return null;
341
+ if (event.delta?.type === 'text_delta' && event.delta.text) {
342
+ target.text = (target.text ?? '') + event.delta.text;
343
+ return event.delta.text;
344
+ }
345
+ if (event.delta?.type === 'input_json_delta' && typeof event.delta.partial_json === 'string') {
346
+ target.inputJson = (target.inputJson ?? '') + event.delta.partial_json;
347
+ }
348
+ return null;
349
+ }
350
+ case 'message_delta': {
351
+ if (event.usage)
352
+ this.usage = { promptTokens: event.usage.input_tokens, completionTokens: event.usage.output_tokens };
353
+ return null;
354
+ }
355
+ case 'message_stop': {
356
+ this.stopped = true;
357
+ return null;
358
+ }
359
+ default:
360
+ return null;
361
+ }
362
+ }
363
+ /** Whether message_stop arrived (the stream is complete). */
364
+ get isStopped() {
365
+ return this.stopped;
366
+ }
367
+ /** Wire-usage captured from message_delta (undefined when the stream carried none). */
368
+ get streamUsage() {
369
+ return this.usage;
370
+ }
371
+ /** Finalize → the loop's ToolCallResponse (text joined, tool_use inputs parsed). */
372
+ finalize() {
373
+ let content = '';
374
+ const toolCalls = [];
375
+ for (const b of this.blocks) {
376
+ if (b.type === 'text' && b.text)
377
+ content += b.text;
378
+ if (b.type === 'tool_use' && b.name) {
379
+ toolCalls.push({
380
+ id: b.id || `call_${toolCalls.length + 1}`,
381
+ name: b.name,
382
+ arguments: parseToolArguments(b.inputJson || '{}'),
383
+ });
384
+ }
385
+ }
386
+ return { content, toolCalls };
387
+ }
388
+ }
389
+ //# sourceMappingURL=native-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-tools.js","sourceRoot":"","sources":["../../src/inference/native-tools.ts"],"names":[],"mappings":"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"}
@@ -186,13 +186,19 @@ export interface AutoRouterOptions {
186
186
  */
187
187
  maxCostUsd?: number;
188
188
  /**
189
- * Hard constraint: max latency score floor. Providers with speed below
190
- * this value (0–1) are ELIMINATED. (Higher speed = faster.)
189
+ * Hard constraint: max latency score floor. Providers whose SERVED MODEL
190
+ * has speed below this value (0–1) are ELIMINATED (not just scored lower).
191
+ * Judged on the model the router will actually serve (resolveModel — the
192
+ * configured pin or the task-resolved best model), refined by model-id
193
+ * evidence over the provider baseline. (Higher speed = faster.)
191
194
  */
192
195
  minSpeed?: number;
193
196
  /**
194
- * Hard constraint: min reasoning score. Providers with reasoning below
195
- * this value (0–1) are ELIMINATED.
197
+ * Hard constraint: min reasoning score. Providers whose SERVED MODEL has
198
+ * reasoning below this value (0–1) are ELIMINATED. Judged on the model the
199
+ * router will actually serve — a provider hosting both an 8b-instant and a
200
+ * 70b model is NOT eliminated because its baseline is weak: the task-resolved
201
+ * 70b model carries strong-model evidence and survives the gate.
196
202
  */
197
203
  minReasoning?: number;
198
204
  /**
@@ -528,6 +534,32 @@ export declare class AutoModelRouter {
528
534
  getCapabilities(provider: string): ProviderCapabilities;
529
535
  /** Update/override capability profiles (e.g., from config). */
530
536
  updateProfiles(profiles: Record<string, ProviderCapabilities>): void;
537
+ /**
538
+ * MODEL-LEVEL capability refinement (model-first-router parity): the
539
+ * provider's capability profile is a BASELINE — the model actually served
540
+ * may be much stronger or weaker. Refines the provider caps with evidence
541
+ * from the model id the router will serve for THIS task (resolveModel:
542
+ * the configured pin, or the task-resolved best model via pickBestModel).
543
+ *
544
+ * Evidence signals (all derived from the model id + registry measurements,
545
+ * no network):
546
+ * - parameter-size hints: larger parameter counts (70b > 13b > 8b > 3b/1b)
547
+ * raise reasoning; tiny param counts lower it;
548
+ * - tier words: 'large'/'max'/'opus'/'70b'/… raise; 'mini'/'tiny'/'small'/
549
+ * 'instant'/'flash'/'nano'/'lite' lower reasoning (flash/instant also
550
+ * RAISE speed — they are speed-optimized models);
551
+ * - frontier-keyword families (gpt-4/5-class, claude-3/4-class,
552
+ * gemini-2-class, deepseek-r1, llama-70b) raise reasoning;
553
+ * - registry latency: a model measured much slower than its provider
554
+ * baseline suggests a heavyweight (raises reasoning, lowers speed) and
555
+ * vice versa.
556
+ *
557
+ * Deliberately CONSERVATIVE: adjustments clamp to ±0.35 and never cross the
558
+ * 0..1 bounds; an unknown model id returns the provider baseline unchanged
559
+ * (the gate then behaves exactly as before — no behavior change for
560
+ * unresolvable evidence). Deterministic: same inputs → same caps.
561
+ */
562
+ getModelCapabilities(provider: string, model: string | undefined): ProviderCapabilities;
531
563
  /**
532
564
  * Default candidate providers — DYNAMIC (Issue 001): every provider the user
533
565
  * has credentials for participates, not just the 6 built-ins. The candidate
@@ -1 +1 @@
1
- {"version":3,"file":"auto-router.d.ts","sourceRoot":"","sources":["../../src/learning/auto-router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auto-router.d.ts","sourceRoot":"","sources":["../../src/learning/auto-router.ts"],"names":[],"mappings":"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"}
@@ -520,6 +520,90 @@ export class AutoModelRouter {
520
520
  updateProfiles(profiles) {
521
521
  this.profiles = { ...this.profiles, ...profiles };
522
522
  }
523
+ /**
524
+ * MODEL-LEVEL capability refinement (model-first-router parity): the
525
+ * provider's capability profile is a BASELINE — the model actually served
526
+ * may be much stronger or weaker. Refines the provider caps with evidence
527
+ * from the model id the router will serve for THIS task (resolveModel:
528
+ * the configured pin, or the task-resolved best model via pickBestModel).
529
+ *
530
+ * Evidence signals (all derived from the model id + registry measurements,
531
+ * no network):
532
+ * - parameter-size hints: larger parameter counts (70b > 13b > 8b > 3b/1b)
533
+ * raise reasoning; tiny param counts lower it;
534
+ * - tier words: 'large'/'max'/'opus'/'70b'/… raise; 'mini'/'tiny'/'small'/
535
+ * 'instant'/'flash'/'nano'/'lite' lower reasoning (flash/instant also
536
+ * RAISE speed — they are speed-optimized models);
537
+ * - frontier-keyword families (gpt-4/5-class, claude-3/4-class,
538
+ * gemini-2-class, deepseek-r1, llama-70b) raise reasoning;
539
+ * - registry latency: a model measured much slower than its provider
540
+ * baseline suggests a heavyweight (raises reasoning, lowers speed) and
541
+ * vice versa.
542
+ *
543
+ * Deliberately CONSERVATIVE: adjustments clamp to ±0.35 and never cross the
544
+ * 0..1 bounds; an unknown model id returns the provider baseline unchanged
545
+ * (the gate then behaves exactly as before — no behavior change for
546
+ * unresolvable evidence). Deterministic: same inputs → same caps.
547
+ */
548
+ getModelCapabilities(provider, model) {
549
+ const base = { ...this.getCapabilities(provider) };
550
+ if (!model || model === 'default')
551
+ return base;
552
+ const m = model.toLowerCase();
553
+ let reasoningAdj = 0;
554
+ let speedAdj = 0;
555
+ // Parameter-size evidence.
556
+ const params = /(\d+(?:\.\d+)?)b(?:\b|-|$)/.exec(m);
557
+ if (params) {
558
+ const b = parseFloat(params[1]);
559
+ if (b >= 60)
560
+ reasoningAdj += 0.25;
561
+ else if (b >= 30)
562
+ reasoningAdj += 0.15;
563
+ else if (b >= 12)
564
+ reasoningAdj += 0.05;
565
+ else if (b <= 4) {
566
+ reasoningAdj -= 0.2;
567
+ speedAdj += 0.15; // tiny models are fast
568
+ }
569
+ }
570
+ // Tier-word evidence.
571
+ const SLOW_TIER = /\b(large|max|opus|pro|ultra|frontier)\b/;
572
+ const FAST_TIER = /\b(mini|tiny|small|nano|lite|instant|flash|turbo|haiku)\b/;
573
+ if (SLOW_TIER.test(m))
574
+ reasoningAdj += 0.15;
575
+ if (FAST_TIER.test(m)) {
576
+ reasoningAdj -= 0.1;
577
+ speedAdj += 0.15;
578
+ }
579
+ // Frontier-family evidence (keyword match on the id).
580
+ if (/\b(gpt-[45]|o[134](?:-|$)|claude-[34]|gemini-2|deepseek-r1|qwen3|qwen-3)\b/.test(m) ||
581
+ /gpt-4|gpt-5|claude-3|claude-4|gemini-2/.test(m)) {
582
+ reasoningAdj += 0.2;
583
+ }
584
+ // Registry latency evidence: measured latency far from the provider
585
+ // baseline's implied speed. 0.5s ≈ fast tier, 10s+ ≈ heavyweight.
586
+ try {
587
+ const entry = getModelRegistry().getEntry(provider, model);
588
+ if (entry?.latencyMs) {
589
+ if (entry.latencyMs >= 10_000) {
590
+ reasoningAdj += 0.1;
591
+ speedAdj -= 0.1;
592
+ }
593
+ else if (entry.latencyMs <= 800) {
594
+ speedAdj += 0.1;
595
+ }
596
+ }
597
+ }
598
+ catch {
599
+ // Registry unavailable — id evidence only.
600
+ }
601
+ return {
602
+ ...base,
603
+ reasoning: Math.min(1, Math.max(0, base.reasoning + reasoningAdj)),
604
+ speed: Math.min(1, Math.max(0, base.speed + speedAdj)),
605
+ };
606
+ }
523
607
  /**
524
608
  * Default candidate providers — DYNAMIC (Issue 001): every provider the user
525
609
  * has credentials for participates, not just the 6 built-ins. The candidate
@@ -919,6 +1003,8 @@ export class AutoModelRouter {
919
1003
  // Mirrors ruflo's per-request maxCost/maxLatency/minQuality hard filters —
920
1004
  // violating providers are dropped (not just scored lower). If constraints
921
1005
  // eliminate everything, fall back to the full list rather than erroring.
1006
+ // minSpeed/minReasoning are judged on the SERVED MODEL (model-level
1007
+ // gating); maxCostUsd stays provider-typical (pricing is per provider).
922
1008
  // ── Free/local-first gate (allowPaid: false) ───────────────────────────
923
1009
  // Mirrors the assessment's "prefer free/local unless complexity demands":
924
1010
  // when the user disallows paid providers, ELIMINATE paid ones (typical
@@ -986,12 +1072,27 @@ export class AutoModelRouter {
986
1072
  return false;
987
1073
  }
988
1074
  }
1075
+ // minSpeed/minReasoning are judged on the MODEL the router will
1076
+ // actually serve (resolveModel: configured pin or task-resolved best
1077
+ // model), not the provider baseline — a provider hosting both an
1078
+ // 8b-instant and a 70b model must NOT be eliminated for its baseline
1079
+ // when the task resolves to the 70b (model-level gating, model-first-
1080
+ // router parity). resolveModel never throws; wrapped anyway so a gate
1081
+ // can never break routing.
1082
+ let servedModel;
1083
+ try {
1084
+ servedModel = this.resolveModel(s.provider, agentType, configManager, taskDescription);
1085
+ }
1086
+ catch {
1087
+ servedModel = undefined;
1088
+ }
1089
+ const servedCaps = this.getModelCapabilities(s.provider, servedModel);
989
1090
  if (options.minSpeed !== undefined) {
990
- if (this.getCapabilities(s.provider).speed < options.minSpeed)
1091
+ if (servedCaps.speed < options.minSpeed)
991
1092
  return false;
992
1093
  }
993
1094
  if (effectiveMinReasoning !== undefined) {
994
- if (this.getCapabilities(s.provider).reasoning < effectiveMinReasoning)
1095
+ if (servedCaps.reasoning < effectiveMinReasoning)
995
1096
  return false;
996
1097
  }
997
1098
  // ── M2.4 governance (non-PII rules) ─────────────────────────────