auto-model-router 0.30.0 → 0.30.1
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/.omp-plugin/marketplace.json +2 -2
- package/package.json +1 -1
- package/src/eval/tasks.ts +40 -0
- package/test/eval.test.ts +8 -0
|
@@ -7,14 +7,14 @@
|
|
|
7
7
|
},
|
|
8
8
|
"metadata": {
|
|
9
9
|
"description": "auto-model-router: a local cost/complexity-aware model router for Oh My Pi, backed by OpenRouter",
|
|
10
|
-
"version": "0.30.
|
|
10
|
+
"version": "0.30.1",
|
|
11
11
|
"pluginRoot": "."
|
|
12
12
|
},
|
|
13
13
|
"plugins": [
|
|
14
14
|
{
|
|
15
15
|
"name": "auto-model-router",
|
|
16
16
|
"description": "Local cost/complexity-aware model router for Oh My Pi, backed by OpenRouter. Runs in-process, routes per turn by price and task complexity, with budget caps, mid-stream escalation, and cache-aware hysteresis.",
|
|
17
|
-
"version": "0.30.
|
|
17
|
+
"version": "0.30.1",
|
|
18
18
|
"author": {
|
|
19
19
|
"name": "drewappling",
|
|
20
20
|
"email": "drewappling@gmail.com"
|
package/package.json
CHANGED
package/src/eval/tasks.ts
CHANGED
|
@@ -307,6 +307,46 @@ export const EVAL_TASKS: readonly EvalTask[] = [
|
|
|
307
307
|
return words.every((w) => known.includes(w)) ? 1 : 0.5;
|
|
308
308
|
},
|
|
309
309
|
},
|
|
310
|
+
|
|
311
|
+
// ---- harder still. The first hard band was aced 6/6 by deepseek-v4.1-flash, so it was
|
|
312
|
+
// not measuring a ceiling either. These need multi-step state tracking with no shortcut:
|
|
313
|
+
// the answer cannot be recalled, only computed, and one slip anywhere changes it.
|
|
314
|
+
{
|
|
315
|
+
id: "coding/stack-machine",
|
|
316
|
+
axis: "coding",
|
|
317
|
+
complexity: "hard",
|
|
318
|
+
system: JSON_ONLY,
|
|
319
|
+
user: "A stack machine starts with an empty stack. Execute: PUSH 4, PUSH 7, ADD, PUSH 3, SWAP, SUB, PUSH 2, MUL, DUP, ADD.\nSUB pops a then b and pushes b-a. SWAP exchanges the top two. DUP duplicates the top. Reply with the final stack, bottom to top, comma separated.",
|
|
320
|
+
// 4 | 4,7 | 11 | 11,3 | 3,11 | 3-11=-8 | -8,2 | -16 | -16,-16 | -32
|
|
321
|
+
grade: (o) => answerScore(o, "-32"),
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
id: "intel/ledger-balance",
|
|
325
|
+
axis: "intelligence",
|
|
326
|
+
complexity: "hard",
|
|
327
|
+
system: JSON_ONLY,
|
|
328
|
+
user: "An account starts at 0. Apply in order: +120, -45, then double the balance, -30, then halve the balance (round DOWN to a whole number), +7, then subtract a tenth of the balance (round DOWN), finally -1. Reply with the final balance alone.",
|
|
329
|
+
// 0→120→75→150→120→60→67; a tenth of 67 floors to 6 ⇒ 61; −1 ⇒ 60
|
|
330
|
+
grade: (o) => answerScore(o, "60"),
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
id: "intel/constraint-conflict",
|
|
334
|
+
axis: "intelligence",
|
|
335
|
+
complexity: "hard",
|
|
336
|
+
system: "Follow every constraint. If two constraints cannot both hold, say IMPOSSIBLE and nothing else.",
|
|
337
|
+
user: "Give a single whole number that is greater than 10, less than 20, divisible by 4, and odd. Reply with the number, or IMPOSSIBLE.",
|
|
338
|
+
// No odd multiple of 4 exists: recognising the contradiction is the capability.
|
|
339
|
+
grade: (o) => (/\bimpossible\b/i.test(o) ? 1 : 0),
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
id: "coding/regex-backtrack",
|
|
343
|
+
axis: "coding",
|
|
344
|
+
complexity: "hard",
|
|
345
|
+
system: JSON_ONLY,
|
|
346
|
+
user: "In JavaScript, give the result of each, one per line, in order:\n(1) 'aaa'.replace(/a*/g, 'X')\n(2) 'a1b2'.match(/[a-z](?=\\d)/g).join('')\n(3) /^(a+)+$/.test('aaab')\n(4) 'x.y.z'.split('.', 2).join('|')\n(5) 'abc'.replace(/(b)/, '[$1$$]')",
|
|
347
|
+
// Empty match at end ⇒ "XX"; lookahead ⇒ "ab"; false; "x|y"; "$$" is a literal $ ⇒ "a[b$]c"
|
|
348
|
+
grade: (o) => multiAnswerCoverage(o, ["XX", "ab", "false", "x|y", "a[b$]c"]),
|
|
349
|
+
},
|
|
310
350
|
];
|
|
311
351
|
|
|
312
352
|
/**
|
package/test/eval.test.ts
CHANGED
|
@@ -117,6 +117,14 @@ describe("calibration", () => {
|
|
|
117
117
|
expect(hard.find((t) => t.id === "coding/sort-lexicographic")!.grade("[9, 10, 80]")).toBeLessThan(1);
|
|
118
118
|
expect(hard.find((t) => t.id === "intel/collatz-steps")!.grade("1")).toBeLessThan(1);
|
|
119
119
|
expect(hard.find((t) => t.id === "intel/strict-format")!.grade("Red, blue, and yellow.")).toBeLessThan(1);
|
|
120
|
+
// The second hard band: computable only, no recall shortcut.
|
|
121
|
+
expect(hard.find((t) => t.id === "coding/stack-machine")!.grade("-32")).toBe(1);
|
|
122
|
+
expect(hard.find((t) => t.id === "coding/stack-machine")!.grade("-16")).toBeLessThan(1);
|
|
123
|
+
expect(hard.find((t) => t.id === "intel/ledger-balance")!.grade("60")).toBe(1);
|
|
124
|
+
expect(hard.find((t) => t.id === "intel/ledger-balance")!.grade("61")).toBeLessThan(1);
|
|
125
|
+
expect(hard.find((t) => t.id === "intel/constraint-conflict")!.grade("IMPOSSIBLE")).toBe(1);
|
|
126
|
+
expect(hard.find((t) => t.id === "intel/constraint-conflict")!.grade("12")).toBe(0);
|
|
127
|
+
expect(hard.find((t) => t.id === "coding/regex-backtrack")!.grade("XX\nab\nfalse\nx|y\na[b$]c")).toBe(1);
|
|
120
128
|
});
|
|
121
129
|
|
|
122
130
|
test("fitCalibration + toLocalFeedScores place a target on the AA scale", () => {
|