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.
- package/README.md +4 -2
- package/dist/cli/chat.d.ts +2 -0
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +107 -4
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/eval.d.ts.map +1 -1
- package/dist/cli/eval.js +14 -1
- package/dist/cli/eval.js.map +1 -1
- package/dist/cli/execute.d.ts +8 -0
- package/dist/cli/execute.d.ts.map +1 -1
- package/dist/cli/execute.js +105 -1
- package/dist/cli/execute.js.map +1 -1
- package/dist/cli/loop-executor.d.ts +81 -0
- package/dist/cli/loop-executor.d.ts.map +1 -0
- package/dist/cli/loop-executor.js +246 -0
- package/dist/cli/loop-executor.js.map +1 -0
- package/dist/config/types.d.ts +18 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/fresh.d.ts +2 -0
- package/dist/fresh.d.ts.map +1 -0
- package/dist/fresh.js +2 -0
- package/dist/fresh.js.map +1 -0
- package/dist/inference/anthropic-adapter.d.ts +9 -0
- package/dist/inference/anthropic-adapter.d.ts.map +1 -1
- package/dist/inference/anthropic-adapter.js +143 -0
- package/dist/inference/anthropic-adapter.js.map +1 -1
- package/dist/inference/gemini-adapter.d.ts +8 -0
- package/dist/inference/gemini-adapter.d.ts.map +1 -1
- package/dist/inference/gemini-adapter.js +145 -0
- package/dist/inference/gemini-adapter.js.map +1 -1
- package/dist/inference/model-probe.d.ts.map +1 -1
- package/dist/inference/model-probe.js +14 -0
- package/dist/inference/model-probe.js.map +1 -1
- package/dist/inference/native-tools.d.ts +226 -0
- package/dist/inference/native-tools.d.ts.map +1 -0
- package/dist/inference/native-tools.js +389 -0
- package/dist/inference/native-tools.js.map +1 -0
- package/dist/learning/auto-router.d.ts +36 -4
- package/dist/learning/auto-router.d.ts.map +1 -1
- package/dist/learning/auto-router.js +103 -2
- package/dist/learning/auto-router.js.map +1 -1
- package/dist/learning/context-pruner.d.ts.map +1 -1
- package/dist/learning/context-pruner.js +4 -2
- package/dist/learning/context-pruner.js.map +1 -1
- package/dist/learning/engine-router.d.ts +90 -0
- package/dist/learning/engine-router.d.ts.map +1 -0
- package/dist/learning/engine-router.js +128 -0
- package/dist/learning/engine-router.js.map +1 -0
- package/dist/learning/eval-framework.d.ts +42 -1
- package/dist/learning/eval-framework.d.ts.map +1 -1
- package/dist/learning/eval-framework.js +163 -7
- package/dist/learning/eval-framework.js.map +1 -1
- package/dist/learning/routing-cache.d.ts +64 -0
- package/dist/learning/routing-cache.d.ts.map +1 -0
- package/dist/learning/routing-cache.js +100 -0
- package/dist/learning/routing-cache.js.map +1 -0
- package/dist/tools/loop-project-context.d.ts +47 -0
- package/dist/tools/loop-project-context.d.ts.map +1 -0
- package/dist/tools/loop-project-context.js +210 -0
- package/dist/tools/loop-project-context.js.map +1 -0
- package/dist/tools/loop-skill-hint.d.ts +110 -0
- package/dist/tools/loop-skill-hint.d.ts.map +1 -0
- package/dist/tools/loop-skill-hint.js +266 -0
- package/dist/tools/loop-skill-hint.js.map +1 -0
- package/dist/tools/registry.d.ts +10 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +66 -9
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/release-sync.d.ts.map +1 -1
- package/dist/tools/release-sync.js +5 -4
- package/dist/tools/release-sync.js.map +1 -1
- package/dist/tools/tool-loop.d.ts +28 -0
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +182 -6
- package/dist/tools/tool-loop.js.map +1 -1
- package/dist/tools/toolsets.d.ts +33 -0
- package/dist/tools/toolsets.d.ts.map +1 -1
- package/dist/tools/toolsets.js +84 -0
- package/dist/tools/toolsets.js.map +1 -1
- package/dist/web-dashboard/chat-console.d.ts +31 -0
- package/dist/web-dashboard/chat-console.d.ts.map +1 -1
- package/dist/web-dashboard/chat-console.js +73 -0
- package/dist/web-dashboard/chat-console.js.map +1 -1
- package/dist/web-dashboard/loop-turn-telemetry.d.ts +27 -0
- package/dist/web-dashboard/loop-turn-telemetry.d.ts.map +1 -0
- package/dist/web-dashboard/loop-turn-telemetry.js +43 -0
- package/dist/web-dashboard/loop-turn-telemetry.js.map +1 -0
- package/dist/web-dashboard/server.d.ts +62 -1
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +205 -4
- package/dist/web-dashboard/server.js.map +1 -1
- package/dist/web-dashboard/src/types.d.ts +44 -0
- package/dist/web-dashboard/src/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/web-dashboard/public/assets/{index-Cg9LaToa.js → index-C4frng1Q.js} +79 -79
- package/src/web-dashboard/public/assets/{index-Cg9LaToa.js.map → index-C4frng1Q.js.map} +1 -1
- package/src/web-dashboard/public/assets/index-C507EUWf.css +1 -0
- package/src/web-dashboard/public/index.html +2 -2
- 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
|
|
190
|
-
* this value (0–1) are ELIMINATED
|
|
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
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAqB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACvH,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG/D,OAAO,EAAwC,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQ9F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM1D,wEAAwE;AACxE,eAAO,MAAM,UAAU,SAAS,CAAC;AAEjC,6EAA6E;AAC7E,eAAO,MAAM,aAAa,SAAS,CAAC;AAEpC,mCAAmC;AACnC,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC;AAE1F,0EAA0E;AAC1E,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAEnJ,iEAAiE;AACjE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,8DAA8D;AAC9D,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAM7D,CAAC;AAIF;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,uDAAuD;IACvD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;gBAErB,eAAe,EAAE,MAAM;CAOpC;AAED;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;gBAElD,OAAO,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAOjE;AAED,2CAA2C;AAC3C,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B,uEAAuE;IACvE,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,uFAAuF;IACvF,oBAAoB,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9E,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,qEAAqE;IACrE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,cAAc,CAAC;AAExE,oCAAoC;AACpC,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC7C,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,UAAU,EAAE,OAAO,CAAC;IACpB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IACtC,iEAAiE;IACjE,SAAS,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IACnE;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,yDAAyD;AACzD,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,UAAU,EAAE,eAAe,CAAC;IAC5B,sDAAsD;IACtD,WAAW,EAAE,WAAW,CAAC;IACzB,uEAAuE;IACvE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,0CAA0C;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC1C,8CAA8C;IAC9C,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,0FAA0F;IAC1F,aAAa,EAAE,cAAc,EAAE,CAAC;IAChC,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,QAAQ,EAAE,QAAQ,CAAC;IACnB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE;QACjB,qBAAqB,EAAE,MAAM,CAAC;QAC9B,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;QACvB,SAAS,EAAE,KAAK,CAAC;YACf,QAAQ,EAAE,MAAM,CAAC;YACjB,mBAAmB,EAAE,MAAM,CAAC;YAC5B,mBAAmB,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;YACnE,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,GAAG,CAAC,EAAE,MAAM,CAAC;SACd,CAAC,CAAC;KACJ,CAAC;CACH;AAcD;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAC;AA8G1C;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAS1G;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAErE;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,UAA4B,CAAC;AAShE,oEAAoE;AACpE,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAW/F,CAAC;AA4BF,iFAAiF;AACjF,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAKpF;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EACrD,QAAQ,CAAC,EAAE,YAAY,GACtB,MAAM,CAOR;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EACrD,QAAQ,CAAC,EAAE,YAAY,GACtB,MAAM,CAIR;AA0BD;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,eAAe,EAC3B,IAAI,GAAE,cAA2B,EACjC,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,GACpD,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAmBlC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,WAAW,CAyEvE;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,oBAAoB,EAClC,OAAO,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,GACxC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAYtF;AAID;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAuC;gBAE3C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAI3D;;;;;OAKG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,oBAAoB;IAevD,+DAA+D;IAC/D,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAAG,IAAI;IAIpE;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB;IA2DvF;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,0BAA0B;IAmFlC;;;;;;;;OAQG;IACH,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE,iBAAsB,EAC/B,aAAa,CAAC,EAAE,aAAa,GAC5B,eAAe;IAqxBlB;;;;;;;;;OASG;IACH,OAAO,CAAC,oBAAoB;IAyC5B;;;;;;;;;;;;;;OAcG;IACH,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,aAAa,EACtB,aAAa,CAAC,EAAE,aAAa,EAC7B,WAAW,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,EAC7E,cAAc,CAAC,EAAE,eAAe,GAC/B,IAAI;IAyDP;;;;;;;;OAQG;IACH,wBAAwB,CACtB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,eAAe,EAC3B,UAAU,GAAE,MAA4B,EACxC,UAAU,CAAC,EAAE,MAAM,EACnB,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM;IAwCT;;;;;;;;;OASG;IACH,OAAO,CAAC,cAAc;IAiBtB;;;;OAIG;IACH,kBAAkB,CAChB,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,aAAa,GAC5B;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IAgB9C;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAUvB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IASxB;;;;;;;;;OASG;IACH,OAAO,CAAC,qBAAqB;IAqB7B;;;;;;;;;;;;;;;OAeG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM;IA+ClH;;;;OAIG;IACH,oBAAoB,CAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,EAC9C,aAAa,CAAC,EAAE,aAAa,GAC5B,MAAM;IAOT;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IA2C9B;;;;OAIG;IACH,OAAO,CAAC,4BAA4B;IAwBpC,kDAAkD;IAClD,OAAO,CAAC,WAAW;IAmBnB,qDAAqD;IACrD,OAAO,CAAC,gBAAgB;CA0BzB;AAMD;;GAEG;AACH,wBAAgB,aAAa,IAAI,eAAe,CAK/C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
|
|
@@ -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 (
|
|
1091
|
+
if (servedCaps.speed < options.minSpeed)
|
|
991
1092
|
return false;
|
|
992
1093
|
}
|
|
993
1094
|
if (effectiveMinReasoning !== undefined) {
|
|
994
|
-
if (
|
|
1095
|
+
if (servedCaps.reasoning < effectiveMinReasoning)
|
|
995
1096
|
return false;
|
|
996
1097
|
}
|
|
997
1098
|
// ── M2.4 governance (non-PII rules) ─────────────────────────────
|