pi-smart-router 0.2.0 → 0.4.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 (61) hide show
  1. package/.pi/extensions/smart-router/index.ts +9 -0
  2. package/.pi/extensions/smart-router/pi-model-scope.ts +127 -20
  3. package/.pi/extensions/smart-router/planning-delegate.ts +318 -0
  4. package/.pi/extensions/smart-router/route-and-delegate.ts +21 -1
  5. package/.pi/extensions/smart-router/types.ts +3 -0
  6. package/README.md +51 -0
  7. package/config/benchmark-profiles.json +145 -0
  8. package/config/models.yaml.example +5 -0
  9. package/config/routing-calibration.json.example +14 -2
  10. package/dist/config/defaults.d.ts +2 -2
  11. package/dist/config/defaults.d.ts.map +1 -1
  12. package/dist/config/defaults.js +5 -3
  13. package/dist/config/defaults.js.map +1 -1
  14. package/dist/config/pi-model-mapper.d.ts +12 -2
  15. package/dist/config/pi-model-mapper.d.ts.map +1 -1
  16. package/dist/config/pi-model-mapper.js +91 -6
  17. package/dist/config/pi-model-mapper.js.map +1 -1
  18. package/dist/domain/matching/hydra-input.d.ts +6 -5
  19. package/dist/domain/matching/hydra-input.d.ts.map +1 -1
  20. package/dist/domain/matching/hydra-input.js +73 -6
  21. package/dist/domain/matching/hydra-input.js.map +1 -1
  22. package/dist/domain/pipeline/router-pipeline.d.ts +22 -1
  23. package/dist/domain/pipeline/router-pipeline.d.ts.map +1 -1
  24. package/dist/domain/pipeline/router-pipeline.js +135 -22
  25. package/dist/domain/pipeline/router-pipeline.js.map +1 -1
  26. package/dist/domain/routing/isotonic-calibrator.d.ts +56 -0
  27. package/dist/domain/routing/isotonic-calibrator.d.ts.map +1 -0
  28. package/dist/domain/routing/isotonic-calibrator.js +187 -0
  29. package/dist/domain/routing/isotonic-calibrator.js.map +1 -0
  30. package/dist/domain/routing/p-success-classifier.d.ts +53 -7
  31. package/dist/domain/routing/p-success-classifier.d.ts.map +1 -1
  32. package/dist/domain/routing/p-success-classifier.js +205 -21
  33. package/dist/domain/routing/p-success-classifier.js.map +1 -1
  34. package/dist/domain/types/entities.d.ts +54 -0
  35. package/dist/domain/types/entities.d.ts.map +1 -1
  36. package/dist/domain/types/index.d.ts +1 -1
  37. package/dist/domain/types/index.d.ts.map +1 -1
  38. package/dist/domain/types/schemas.d.ts +29 -0
  39. package/dist/domain/types/schemas.d.ts.map +1 -1
  40. package/dist/domain/types/schemas.js +57 -0
  41. package/dist/domain/types/schemas.js.map +1 -1
  42. package/dist/infrastructure/persistence/sqlite-store.d.ts.map +1 -1
  43. package/dist/infrastructure/persistence/sqlite-store.js +2 -1
  44. package/dist/infrastructure/persistence/sqlite-store.js.map +1 -1
  45. package/dist/infrastructure/telemetry/routing-telemetry.d.ts +20 -1
  46. package/dist/infrastructure/telemetry/routing-telemetry.d.ts.map +1 -1
  47. package/dist/infrastructure/telemetry/routing-telemetry.js +82 -2
  48. package/dist/infrastructure/telemetry/routing-telemetry.js.map +1 -1
  49. package/package.json +6 -3
  50. package/specs/001-build-smart-router/contracts/telemetry-contrib.schema.json +29 -1
  51. package/src/config/defaults.ts +6 -2
  52. package/src/config/pi-model-mapper.ts +110 -6
  53. package/src/domain/matching/hydra-input.ts +86 -7
  54. package/src/domain/pipeline/router-pipeline.ts +195 -29
  55. package/src/domain/routing/isotonic-calibrator.ts +255 -0
  56. package/src/domain/routing/p-success-classifier.ts +299 -26
  57. package/src/domain/types/entities.ts +58 -0
  58. package/src/domain/types/index.ts +4 -0
  59. package/src/domain/types/schemas.ts +73 -0
  60. package/src/infrastructure/persistence/sqlite-store.ts +2 -0
  61. package/src/infrastructure/telemetry/routing-telemetry.ts +127 -7
@@ -0,0 +1,145 @@
1
+ {
2
+ "version": 1,
3
+ "provenance": {
4
+ "source_urls": {
5
+ "swebench_verified": "https://www.swebench.com/",
6
+ "terminal_bench": "https://www.tbench.ai/leaderboard",
7
+ "livecodebench": "https://livecodebench.github.io/leaderboard.html",
8
+ "bfcl": "https://gorilla.cs.berkeley.edu/leaderboard.html"
9
+ },
10
+ "scrape_date": "2026-07-09",
11
+ "catalog_freeze_date": "2026-07-09"
12
+ },
13
+ "models": [
14
+ {
15
+ "model_id": "claude-3.5-haiku",
16
+ "capabilities": {
17
+ "reasoning": 0.5685,
18
+ "code_gen": 0.587,
19
+ "tool_use": 0.6095
20
+ },
21
+ "benchmark_sources": {
22
+ "bfcl": {
23
+ "raw_score": 70.6,
24
+ "normalized": 0.706
25
+ },
26
+ "livecodebench": {
27
+ "raw_score": 55,
28
+ "normalized": 0.55
29
+ },
30
+ "swebench_verified": {
31
+ "raw_score": 62.4,
32
+ "normalized": 0.624
33
+ },
34
+ "terminal_bench": {
35
+ "raw_score": 51.3,
36
+ "normalized": 0.513
37
+ }
38
+ }
39
+ },
40
+ {
41
+ "model_id": "claude-opus-4-5",
42
+ "capabilities": {
43
+ "reasoning": 0.767,
44
+ "code_gen": 0.7915,
45
+ "tool_use": 0.8035
46
+ },
47
+ "benchmark_sources": {
48
+ "bfcl": {
49
+ "raw_score": 88.2,
50
+ "normalized": 0.882
51
+ },
52
+ "livecodebench": {
53
+ "raw_score": 77.4,
54
+ "normalized": 0.774
55
+ },
56
+ "swebench_verified": {
57
+ "raw_score": 80.9,
58
+ "normalized": 0.809
59
+ },
60
+ "terminal_bench": {
61
+ "raw_score": 72.5,
62
+ "normalized": 0.725
63
+ }
64
+ }
65
+ },
66
+ {
67
+ "model_id": "claude-sonnet-4-6",
68
+ "capabilities": {
69
+ "reasoning": 0.738,
70
+ "code_gen": 0.7635,
71
+ "tool_use": 0.7625
72
+ },
73
+ "benchmark_sources": {
74
+ "bfcl": {
75
+ "raw_score": 84.5,
76
+ "normalized": 0.845
77
+ },
78
+ "livecodebench": {
79
+ "raw_score": 73.1,
80
+ "normalized": 0.731
81
+ },
82
+ "swebench_verified": {
83
+ "raw_score": 79.6,
84
+ "normalized": 0.7959999999999999
85
+ },
86
+ "terminal_bench": {
87
+ "raw_score": 68,
88
+ "normalized": 0.68
89
+ }
90
+ }
91
+ },
92
+ {
93
+ "model_id": "gemini-2.5-flash",
94
+ "capabilities": {
95
+ "reasoning": 0.5295,
96
+ "code_gen": 0.5525,
97
+ "tool_use": 0.5735
98
+ },
99
+ "benchmark_sources": {
100
+ "bfcl": {
101
+ "raw_score": 66.9,
102
+ "normalized": 0.669
103
+ },
104
+ "livecodebench": {
105
+ "raw_score": 52.4,
106
+ "normalized": 0.524
107
+ },
108
+ "swebench_verified": {
109
+ "raw_score": 58.1,
110
+ "normalized": 0.581
111
+ },
112
+ "terminal_bench": {
113
+ "raw_score": 47.8,
114
+ "normalized": 0.478
115
+ }
116
+ }
117
+ },
118
+ {
119
+ "model_id": "gpt-5.3-codex",
120
+ "capabilities": {
121
+ "reasoning": 0.796,
122
+ "code_gen": 0.833,
123
+ "tool_use": 0.8215
124
+ },
125
+ "benchmark_sources": {
126
+ "bfcl": {
127
+ "raw_score": 90.1,
128
+ "normalized": 0.9009999999999999
129
+ },
130
+ "livecodebench": {
131
+ "raw_score": 81.6,
132
+ "normalized": 0.816
133
+ },
134
+ "swebench_verified": {
135
+ "raw_score": 85,
136
+ "normalized": 0.85
137
+ },
138
+ "terminal_bench": {
139
+ "raw_score": 74.2,
140
+ "normalized": 0.742
141
+ }
142
+ }
143
+ }
144
+ ]
145
+ }
@@ -1,5 +1,10 @@
1
1
  # Example fleet catalog — copy to config/models.yaml and customize.
2
2
  # See specs/001-build-smart-router/data-model.md (ModelProfile) and docs/PRD.md §5.
3
+ #
4
+ # Capability scores in this file are static examples. At runtime, mapPiModelToProfile
5
+ # prefers benchmark-grounded profiles from config/benchmark-profiles.json (SP-136)
6
+ # when a model id has an ingest row; regex/pattern defaults apply otherwise.
7
+ # Regenerate the artifact with: npm run routing:ingest-benchmarks
3
8
 
4
9
  models:
5
10
  - id: local-gemma-4-7b
@@ -1,14 +1,17 @@
1
1
  {
2
- "version": 1,
2
+ "version": 2,
3
3
  "minimum_training_samples": {
4
4
  "hydra_projection": 100,
5
5
  "triage_thresholds": 50,
6
6
  "p_success_weights": 30,
7
+ "isotonic_calibrator": 30,
7
8
  "routing_centroids": 10
8
9
  },
9
10
  "hydra_projection": {
10
- "version": 1,
11
+ "version": 2,
11
12
  "embedding_dim": 384,
13
+ "prefix_schema_version": 2,
14
+ "prefix_flag_count": 7,
12
15
  "weights": [
13
16
  0,
14
17
  0,
@@ -1205,6 +1208,15 @@
1205
1208
  ],
1206
1209
  "trained_sample_count": 0
1207
1210
  },
1211
+ "isotonic_calibrator": {
1212
+ "version": 1,
1213
+ "min_training_samples": 30,
1214
+ "x_knots": [0, 1],
1215
+ "y_knots": [0, 1],
1216
+ "trained_sample_count": 0,
1217
+ "holdout_ece_raw": null,
1218
+ "holdout_ece_calibrated": null
1219
+ },
1208
1220
  "routing_centroids": {
1209
1221
  "version": 1,
1210
1222
  "embedding_dim": 384,
@@ -3,8 +3,8 @@
3
3
  * Values sourced from specs/001-build-smart-router/data-model.md § Configuration (Operator).
4
4
  */
5
5
  import { type OperatorConfig } from '../domain/types/schemas.js';
6
- export { DEFAULT_SAAR_CONFIG, resolveSaarConfigFromEnv } from '../domain/types/schemas.js';
7
- /** Merge operator env overrides onto defaults (SAAR section only today). */
6
+ export { DEFAULT_PLANNING_DELEGATE_CONFIG, DEFAULT_SAAR_CONFIG, resolvePlanningDelegateConfigFromEnv, resolveSaarConfigFromEnv } from '../domain/types/schemas.js';
7
+ /** Merge operator env overrides onto defaults (SAAR and planning delegate sections). */
8
8
  export declare function resolveOperatorConfigFromEnv(base?: OperatorConfig): OperatorConfig;
9
9
  export declare const DEFAULT_OPERATOR_CONFIG: Readonly<OperatorConfig>;
10
10
  //# sourceMappingURL=defaults.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAE3F,4EAA4E;AAC5E,wBAAgB,4BAA4B,CAC1C,IAAI,GAAE,cAAwC,GAC7C,cAAc,CAKhB;AAED,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,cAAc,CA2BnD,CAAC"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,gCAAgC,EAAE,mBAAmB,EAAE,oCAAoC,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEnK,wFAAwF;AACxF,wBAAgB,4BAA4B,CAC1C,IAAI,GAAE,cAAwC,GAC7C,cAAc,CAMhB;AAED,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,cAAc,CA4BnD,CAAC"}
@@ -2,14 +2,15 @@
2
2
  * Operator configuration defaults (FR-021).
3
3
  * Values sourced from specs/001-build-smart-router/data-model.md § Configuration (Operator).
4
4
  */
5
- import { DEFAULT_SAAR_CONFIG, resolveSaarConfigFromEnv, } from '../domain/types/schemas.js';
5
+ import { DEFAULT_PLANNING_DELEGATE_CONFIG, DEFAULT_SAAR_CONFIG, resolvePlanningDelegateConfigFromEnv, resolveSaarConfigFromEnv, } from '../domain/types/schemas.js';
6
6
  import { DEFAULT_LOW_INTENSITY_WEIGHTS } from '../domain/routing/tier-features.js';
7
- export { DEFAULT_SAAR_CONFIG, resolveSaarConfigFromEnv } from '../domain/types/schemas.js';
8
- /** Merge operator env overrides onto defaults (SAAR section only today). */
7
+ export { DEFAULT_PLANNING_DELEGATE_CONFIG, DEFAULT_SAAR_CONFIG, resolvePlanningDelegateConfigFromEnv, resolveSaarConfigFromEnv } from '../domain/types/schemas.js';
8
+ /** Merge operator env overrides onto defaults (SAAR and planning delegate sections). */
9
9
  export function resolveOperatorConfigFromEnv(base = DEFAULT_OPERATOR_CONFIG) {
10
10
  return {
11
11
  ...base,
12
12
  saar: resolveSaarConfigFromEnv(base.saar),
13
+ planning_delegate: resolvePlanningDelegateConfigFromEnv(base.planning_delegate),
13
14
  };
14
15
  }
15
16
  export const DEFAULT_OPERATOR_CONFIG = {
@@ -39,5 +40,6 @@ export const DEFAULT_OPERATOR_CONFIG = {
39
40
  p_success_alpha: 0.5,
40
41
  },
41
42
  saar: DEFAULT_SAAR_CONFIG,
43
+ planning_delegate: DEFAULT_PLANNING_DELEGATE_CONFIG,
42
44
  };
43
45
  //# sourceMappingURL=defaults.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,mBAAmB,EACnB,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAE3F,4EAA4E;AAC5E,MAAM,UAAU,4BAA4B,CAC1C,OAAuB,uBAAuB;IAE9C,OAAO;QACL,GAAG,IAAI;QACP,IAAI,EAAE,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAA6B;IAC/D,SAAS,EAAE;QACT,WAAW,EAAE,GAAG;QAChB,cAAc,EAAE,GAAG;QACnB,gBAAgB,EAAE,IAAI;KACvB;IACD,eAAe,EAAE;QACf,SAAS,EAAE,CAAC;KACb;IACD,OAAO,EAAE;QACP,cAAc,EAAE,EAAE;KACnB;IACD,KAAK,EAAE;QACL,kBAAkB,EAAE,EAAE;QACtB,4BAA4B,EAAE,CAAC;QAC/B,qBAAqB,EAAE,EAAE;KAC1B;IACD,KAAK,EAAE;QACL,mBAAmB,EAAE,0BAA0B;KAChD;IACD,aAAa,EAAE;QACb,OAAO,EAAE,6BAA6B;QACtC,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,GAAG;KACrB;IACD,IAAI,EAAE,mBAAmB;CACjB,CAAC"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,gCAAgC,EAChC,mBAAmB,EACnB,oCAAoC,EACpC,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,OAAO,EAAE,gCAAgC,EAAE,mBAAmB,EAAE,oCAAoC,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEnK,wFAAwF;AACxF,MAAM,UAAU,4BAA4B,CAC1C,OAAuB,uBAAuB;IAE9C,OAAO;QACL,GAAG,IAAI;QACP,IAAI,EAAE,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;QACzC,iBAAiB,EAAE,oCAAoC,CAAC,IAAI,CAAC,iBAAiB,CAAC;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAA6B;IAC/D,SAAS,EAAE;QACT,WAAW,EAAE,GAAG;QAChB,cAAc,EAAE,GAAG;QACnB,gBAAgB,EAAE,IAAI;KACvB;IACD,eAAe,EAAE;QACf,SAAS,EAAE,CAAC;KACb;IACD,OAAO,EAAE;QACP,cAAc,EAAE,EAAE;KACnB;IACD,KAAK,EAAE;QACL,kBAAkB,EAAE,EAAE;QACtB,4BAA4B,EAAE,CAAC;QAC/B,qBAAqB,EAAE,EAAE;KAC1B;IACD,KAAK,EAAE;QACL,mBAAmB,EAAE,0BAA0B;KAChD;IACD,aAAa,EAAE;QACb,OAAO,EAAE,6BAA6B;QACtC,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,GAAG;KACrB;IACD,IAAI,EAAE,mBAAmB;IACzB,iBAAiB,EAAE,gCAAgC;CAC3C,CAAC"}
@@ -2,10 +2,20 @@
2
2
  * Pi model registry → ModelProfile mapper.
3
3
  *
4
4
  * Maps pi `Model` objects (provider + id) to router fleet entries using
5
- * pattern-based lookup for known families. Unknown models receive conservative
6
- * economical-cloud defaults.
5
+ * pattern-based lookup for known families. When `config/benchmark-profiles.json`
6
+ * contains a row for the model id (SP-134/136 ingest output), capability
7
+ * vectors are grounded in benchmark scores instead of regex defaults.
8
+ * Unknown models or missing benchmark rows receive conservative pattern defaults.
7
9
  */
8
10
  import type { ModelLimits, ModelProfile, Tier } from '../domain/types/entities.js';
11
+ /** Checked-in ingest artifact from `npm run routing:ingest-benchmarks` (SP-134). */
12
+ export declare const DEFAULT_BENCHMARK_PROFILES_PATH: string;
13
+ /**
14
+ * Test hook — override benchmark artifact path (null disables benchmark grounding).
15
+ */
16
+ export declare function setBenchmarkProfilesPathForTests(filePath: string | null): void;
17
+ /** Test hook — clear cached benchmark artifact between cases. */
18
+ export declare function resetBenchmarkProfilesCacheForTests(): void;
9
19
  /** Pi registry `Model.cost` shape — per-token USD rates. */
10
20
  export interface PiRegistryCost {
11
21
  readonly input: number;
@@ -1 +1 @@
1
- {"version":3,"file":"pi-model-mapper.d.ts","sourceRoot":"","sources":["../../src/config/pi-model-mapper.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAEV,WAAW,EAGX,YAAY,EACZ,IAAI,EACL,MAAM,6BAA6B,CAAC;AAErC,4DAA4D;AAC5D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC;CAChC;AAiBD,yFAAyF;AACzF,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAIpE,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAE/D;AAwDD;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,IAAM,CAAC;AAqIpD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAuBrE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,EAAE,CAEpF"}
1
+ {"version":3,"file":"pi-model-mapper.d.ts","sourceRoot":"","sources":["../../src/config/pi-model-mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAEV,WAAW,EAGX,YAAY,EACZ,IAAI,EACL,MAAM,6BAA6B,CAAC;AAErC,oFAAoF;AACpF,eAAO,MAAM,+BAA+B,QAA+C,CAAC;AAqB5F;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAG9E;AAED,iEAAiE;AACjE,wBAAgB,mCAAmC,IAAI,IAAI,CAG1D;AA+DD,4DAA4D;AAC5D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC;CAChC;AAiBD,yFAAyF;AACzF,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAIpE,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAE/D;AAwDD;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,IAAM,CAAC;AAqIpD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAuBrE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,EAAE,CAEpF"}
@@ -2,9 +2,94 @@
2
2
  * Pi model registry → ModelProfile mapper.
3
3
  *
4
4
  * Maps pi `Model` objects (provider + id) to router fleet entries using
5
- * pattern-based lookup for known families. Unknown models receive conservative
6
- * economical-cloud defaults.
5
+ * pattern-based lookup for known families. When `config/benchmark-profiles.json`
6
+ * contains a row for the model id (SP-134/136 ingest output), capability
7
+ * vectors are grounded in benchmark scores instead of regex defaults.
8
+ * Unknown models or missing benchmark rows receive conservative pattern defaults.
7
9
  */
10
+ import { existsSync, readFileSync } from 'node:fs';
11
+ import { resolve } from 'node:path';
12
+ import { z } from 'zod';
13
+ /** Checked-in ingest artifact from `npm run routing:ingest-benchmarks` (SP-134). */
14
+ export const DEFAULT_BENCHMARK_PROFILES_PATH = resolve('config', 'benchmark-profiles.json');
15
+ const benchmarkCapabilitiesSchema = z.object({
16
+ reasoning: z.number().min(0).max(1),
17
+ code_gen: z.number().min(0).max(1),
18
+ tool_use: z.number().min(0).max(1),
19
+ });
20
+ const benchmarkModelRowSchema = z.object({
21
+ model_id: z.string().min(1),
22
+ capabilities: benchmarkCapabilitiesSchema,
23
+ });
24
+ const benchmarkProfilesArtifactSchema = z.object({
25
+ version: z.literal(1),
26
+ models: z.array(benchmarkModelRowSchema).min(1),
27
+ });
28
+ let benchmarkProfilesPathOverride;
29
+ let benchmarkCapabilitiesByModelId;
30
+ /**
31
+ * Test hook — override benchmark artifact path (null disables benchmark grounding).
32
+ */
33
+ export function setBenchmarkProfilesPathForTests(filePath) {
34
+ benchmarkProfilesPathOverride = filePath;
35
+ benchmarkCapabilitiesByModelId = undefined;
36
+ }
37
+ /** Test hook — clear cached benchmark artifact between cases. */
38
+ export function resetBenchmarkProfilesCacheForTests() {
39
+ benchmarkProfilesPathOverride = undefined;
40
+ benchmarkCapabilitiesByModelId = undefined;
41
+ }
42
+ function resolveBenchmarkProfilesPath() {
43
+ if (benchmarkProfilesPathOverride === null) {
44
+ return null;
45
+ }
46
+ return benchmarkProfilesPathOverride ?? DEFAULT_BENCHMARK_PROFILES_PATH;
47
+ }
48
+ function loadBenchmarkCapabilitiesMap() {
49
+ if (benchmarkCapabilitiesByModelId !== undefined) {
50
+ return benchmarkCapabilitiesByModelId;
51
+ }
52
+ const filePath = resolveBenchmarkProfilesPath();
53
+ if (filePath === null || !existsSync(filePath)) {
54
+ benchmarkCapabilitiesByModelId = null;
55
+ return null;
56
+ }
57
+ try {
58
+ const raw = readFileSync(filePath, 'utf8');
59
+ const parsed = JSON.parse(raw);
60
+ const result = benchmarkProfilesArtifactSchema.safeParse(parsed);
61
+ if (!result.success) {
62
+ throw new Error(result.error.message);
63
+ }
64
+ const map = new Map();
65
+ for (const row of result.data.models) {
66
+ map.set(row.model_id, { ...row.capabilities });
67
+ }
68
+ benchmarkCapabilitiesByModelId = map;
69
+ return map;
70
+ }
71
+ catch (err) {
72
+ console.warn('benchmark profiles artifact invalid; using regex capability defaults', {
73
+ path: filePath,
74
+ error: err instanceof Error ? err.message : String(err),
75
+ });
76
+ benchmarkCapabilitiesByModelId = null;
77
+ return null;
78
+ }
79
+ }
80
+ function lookupBenchmarkCapabilities(modelId) {
81
+ return loadBenchmarkCapabilitiesMap()?.get(modelId);
82
+ }
83
+ function withBenchmarkCapabilities(defaults, modelId) {
84
+ const grounded = lookupBenchmarkCapabilities(modelId);
85
+ if (grounded === undefined) {
86
+ return defaults;
87
+ }
88
+ return {
89
+ ...defaults,
90
+ capabilities: { ...grounded },
91
+ };
92
+ }
8
93
  const LOCAL_PROVIDERS = new Set(['lmstudio', 'ollama']);
9
94
  /** Conservative context limits when YAML and LiteLLM registry have no entry (SP-092). */
10
95
  export const DEFAULT_MODEL_LIMITS = {
@@ -196,16 +281,16 @@ export function mapPiModelToProfile(input) {
196
281
  id: input.id,
197
282
  ...(input.name !== undefined ? { name: input.name } : {}),
198
283
  };
199
- return buildProfile(localInput, LOCAL_DEFAULTS);
284
+ return buildProfile(localInput, withBenchmarkCapabilities(LOCAL_DEFAULTS, input.id));
200
285
  }
201
286
  if (input.id === OPAQUE_FLEET_DEFAULT_ID) {
202
- return buildProfile(input, CURSOR_AUTO_DEFAULTS);
287
+ return buildProfile(input, withBenchmarkCapabilities(CURSOR_AUTO_DEFAULTS, input.id));
203
288
  }
204
289
  const matched = matchPatternRules(input.id);
205
290
  if (matched) {
206
- return buildProfile(input, matched);
291
+ return buildProfile(input, withBenchmarkCapabilities(matched, input.id));
207
292
  }
208
- return buildProfile(input, UNKNOWN_DEFAULTS);
293
+ return buildProfile(input, withBenchmarkCapabilities(UNKNOWN_DEFAULTS, input.id));
209
294
  }
210
295
  /**
211
296
  * Map an array of pi registry models to a router fleet catalog.
@@ -1 +1 @@
1
- {"version":3,"file":"pi-model-mapper.js","sourceRoot":"","sources":["../../src/config/pi-model-mapper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pi-model-mapper.js","sourceRoot":"","sources":["../../src/config/pi-model-mapper.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,16 @@
1
1
  /**
2
- * HyDRA embedding input builder — SP-112, GitHub #60.
2
+ * HyDRA embedding input builder — SP-112, SP-138, GitHub #60, #76.
3
3
  *
4
- * Prefixes prompt text with session metadata so requirement vectors reflect
5
- * turn context, not only the latest user string.
4
+ * Prefixes the latest user turn with session metadata so requirement vectors
5
+ * reflect turn context, not only the latest user string. Prior assistant
6
+ * responses are excluded from the encoder body per HyDRA reference (#76).
6
7
  */
7
8
  import type { RoutingRequest } from '../types/index.js';
8
9
  import type { TriageResult } from '../triage/triage-engine.js';
9
10
  /**
10
- * Build HyDRA encoder input: metadata prefix + prompt text.
11
+ * Build HyDRA encoder input: seven-flag metadata prefix + latest user text.
11
12
  *
12
- * Format: `[turns:N|tools:0|tokens:N|type:...] {prompt_text}`
13
+ * Format: `[turns:N|tools:0|tokens:N|type:...|compact:0|loop:0|attach:0] {text}`
13
14
  *
14
15
  * Metadata affects capability prediction only; tier selection uses the
15
16
  * cluster/feature gate (SP-103) separately.
@@ -1 +1 @@
1
- {"version":3,"file":"hydra-input.d.ts","sourceRoot":"","sources":["../../../src/domain/matching/hydra-input.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAsB/D;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,YAAY,GACpB,MAAM,CAWR"}
1
+ {"version":3,"file":"hydra-input.d.ts","sourceRoot":"","sources":["../../../src/domain/matching/hydra-input.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAW,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAiG/D;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,YAAY,GACpB,MAAM,CAcR"}
@@ -1,9 +1,21 @@
1
1
  /**
2
- * HyDRA embedding input builder — SP-112, GitHub #60.
2
+ * HyDRA embedding input builder — SP-112, SP-138, GitHub #60, #76.
3
3
  *
4
- * Prefixes prompt text with session metadata so requirement vectors reflect
5
- * turn context, not only the latest user string.
4
+ * Prefixes the latest user turn with session metadata so requirement vectors
5
+ * reflect turn context, not only the latest user string. Prior assistant
6
+ * responses are excluded from the encoder body per HyDRA reference (#76).
6
7
  */
8
+ const FAILURE_PATTERNS = [
9
+ 'error',
10
+ 'fail',
11
+ 'exception',
12
+ 'timed out',
13
+ 'timeout',
14
+ 'econnrefused',
15
+ 'enotfound',
16
+ 'econnreset',
17
+ 'epipe',
18
+ ];
7
19
  function resolveMessageCount(request) {
8
20
  return request.messages?.length ?? 0;
9
21
  }
@@ -19,10 +31,62 @@ function resolveEstimatedInputTokens(request) {
19
31
  function resolveTurnType(request) {
20
32
  return request.turn_type ?? 'unknown';
21
33
  }
34
+ function resolveCompactionFlag(request) {
35
+ return request.compaction_flag ? 1 : 0;
36
+ }
37
+ function looksLikeToolFailure(content) {
38
+ const lower = content.toLowerCase();
39
+ return FAILURE_PATTERNS.some((pattern) => lower.includes(pattern));
40
+ }
41
+ /**
42
+ * Observational loop-pressure flag: 1 when the latest tool message looks
43
+ * like a failure. Mirrors loop-escalation heuristics without session pin state.
44
+ */
45
+ function resolveLoopPressure(request) {
46
+ const messages = request.messages;
47
+ if (!messages || messages.length === 0) {
48
+ return 0;
49
+ }
50
+ for (let i = messages.length - 1; i >= 0; i--) {
51
+ const message = messages[i];
52
+ if (message.role === 'tool') {
53
+ return looksLikeToolFailure(message.content) ? 1 : 0;
54
+ }
55
+ }
56
+ return 0;
57
+ }
58
+ function messageHasAttachmentIndicator(message) {
59
+ if (message.tool_blocks && message.tool_blocks.length > 0) {
60
+ return true;
61
+ }
62
+ if (message.role !== 'user') {
63
+ return false;
64
+ }
65
+ const lower = message.content.toLowerCase();
66
+ return lower.includes('data:image');
67
+ }
68
+ function resolveAttachmentFlag(request) {
69
+ return request.messages?.some((message) => messageHasAttachmentIndicator(message)) ? 1 : 0;
70
+ }
71
+ /**
72
+ * Latest user turn text only — excludes prior assistant responses (#76).
73
+ */
74
+ function resolveHydraPromptText(request) {
75
+ const messages = request.messages;
76
+ if (messages) {
77
+ for (let i = messages.length - 1; i >= 0; i--) {
78
+ const message = messages[i];
79
+ if (message.role === 'user' && message.content.trim()) {
80
+ return message.content;
81
+ }
82
+ }
83
+ }
84
+ return request.prompt_text;
85
+ }
22
86
  /**
23
- * Build HyDRA encoder input: metadata prefix + prompt text.
87
+ * Build HyDRA encoder input: seven-flag metadata prefix + latest user text.
24
88
  *
25
- * Format: `[turns:N|tools:0|tokens:N|type:...] {prompt_text}`
89
+ * Format: `[turns:N|tools:0|tokens:N|type:...|compact:0|loop:0|attach:0] {text}`
26
90
  *
27
91
  * Metadata affects capability prediction only; tier selection uses the
28
92
  * cluster/feature gate (SP-103) separately.
@@ -34,7 +98,10 @@ export function buildHydraInput(request, triage) {
34
98
  `tools:${resolveHasToolContext(request) ? 1 : 0}`,
35
99
  `tokens:${resolveEstimatedInputTokens(request)}`,
36
100
  `type:${resolveTurnType(request)}`,
101
+ `compact:${resolveCompactionFlag(request)}`,
102
+ `loop:${resolveLoopPressure(request)}`,
103
+ `attach:${resolveAttachmentFlag(request)}`,
37
104
  ].join('|');
38
- return `[${flags}] ${request.prompt_text}`;
105
+ return `[${flags}] ${resolveHydraPromptText(request)}`;
39
106
  }
40
107
  //# sourceMappingURL=hydra-input.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hydra-input.js","sourceRoot":"","sources":["../../../src/domain/matching/hydra-input.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,SAAS,mBAAmB,CAAC,OAAuB;IAClD,OAAO,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAuB;IACpD,IAAI,OAAO,CAAC,SAAS,KAAK,aAAa,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC;AAC/E,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAuB;IAC1D,OAAO,OAAO,CAAC,sBAAsB,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,eAAe,CAAC,OAAuB;IAC9C,OAAO,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC;AACxC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAuB,EACvB,MAAqB;IAErB,KAAK,MAAM,CAAC;IAEZ,MAAM,KAAK,GAAG;QACZ,SAAS,mBAAmB,CAAC,OAAO,CAAC,EAAE;QACvC,SAAS,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;QACjD,UAAU,2BAA2B,CAAC,OAAO,CAAC,EAAE;QAChD,QAAQ,eAAe,CAAC,OAAO,CAAC,EAAE;KACnC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEZ,OAAO,IAAI,KAAK,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"hydra-input.js","sourceRoot":"","sources":["../../../src/domain/matching/hydra-input.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@
8
8
  * → safe_default → context_overflow_fallback
9
9
  * Any stage failure falls back to safeCloudDefault(); never throws to host.
10
10
  */
11
- import type { ModelProfile, PriceCatalog, RoutingDecision, RoutingRequest, SaarConfig, Tier } from '../types/index.js';
11
+ import type { ModelProfile, PlanningDelegateConfig, PriceCatalog, RoutingDecision, RoutingRequest, SaarConfig, Tier } from '../types/index.js';
12
12
  import type { LowIntensityConfig } from '../types/schemas.js';
13
13
  import type { HardwareProbeConfig, SystemInfo } from '../../infrastructure/hardware/hardware-probe.js';
14
14
  import type { HttpFetchPort, LocalZeroTierConfig } from '../../infrastructure/local/local-zero-tier.js';
@@ -19,6 +19,7 @@ import type { LoopEscalationConfig } from '../pinning/loop-escalation.js';
19
19
  import { RoutingTelemetryEmitter } from '../../infrastructure/telemetry/routing-telemetry.js';
20
20
  import type { HydraMatcher as HydraMatcherType } from '../matching/hydra-matcher.js';
21
21
  import type { ClusterMatcher, ClusterMatchResult } from '../matching/cluster-matcher.js';
22
+ import { type IsotonicCalibratorArtifact } from '../routing/isotonic-calibrator.js';
22
23
  import { type PSuccessWeights } from '../routing/p-success-classifier.js';
23
24
  export interface StageResult {
24
25
  readonly decided: boolean;
@@ -62,8 +63,13 @@ export interface PipelineOptions {
62
63
  /** Preloaded P(success) weights for tests; lazy-loads artifact when omitted (SP-105). */
63
64
  readonly pSuccessWeights?: PSuccessWeights;
64
65
  readonly pSuccessWeightsPath?: string;
66
+ /** Preloaded isotonic calibrator for tests; lazy-loads bundle when omitted (SP-133). */
67
+ readonly isotonicCalibrator?: IsotonicCalibratorArtifact | null;
68
+ readonly routingCalibrationPath?: string;
65
69
  /** SAAR pin policy (SP-123). Must match sessionPinner.saarConfig when enabled. */
66
70
  readonly saarConfig?: SaarConfig;
71
+ /** Planning delegate operator knobs (SP-143, #71). Defaults to operator config. */
72
+ readonly planningDelegateConfig?: PlanningDelegateConfig;
67
73
  }
68
74
  export declare class RouterPipeline {
69
75
  private readonly stages;
@@ -82,17 +88,23 @@ export declare class RouterPipeline {
82
88
  private currentTierHintReasonCode;
83
89
  private currentLowIntensityScore;
84
90
  private currentPSuccessCheap;
91
+ private currentPSuccessRaw;
92
+ private currentPSuccessCalibrated;
85
93
  private currentPSuccessAlpha;
86
94
  private currentExpectedCostByTier;
87
95
  private currentLocalEligibleReason;
88
96
  private pSuccessWeightsLoaded;
89
97
  private cachedPSuccessWeights;
98
+ private isotonicCalibratorLoaded;
99
+ private cachedIsotonicCalibrator;
90
100
  private currentContextFitRejected;
91
101
  private currentContextFitViableCount;
92
102
  private contextOverflowPreferredProvider;
93
103
  private contextOverflowTriggered;
94
104
  /** Internal breakeven gate reason for SP-126 explain wiring. */
95
105
  private currentBreakevenReason;
106
+ /** Planning delegate observability for SP-143 explain/telemetry wiring. */
107
+ private currentPlanningDelegate;
96
108
  constructor(fleet: readonly ModelProfile[], options?: PipelineOptions);
97
109
  route(request: RoutingRequest, fleetOverride?: readonly ModelProfile[]): Promise<RoutingDecision>;
98
110
  /**
@@ -160,6 +172,14 @@ export declare class RouterPipeline {
160
172
  private isSaarPlanningBufferActive;
161
173
  private static readonly TURN_TIER_MAP;
162
174
  private turnEnvelope;
175
+ private resolvePlanningDirectFallbackReason;
176
+ private resolvePlanningDelegateConfig;
177
+ /**
178
+ * SP-143: emit planning_delegate when enabled; otherwise record direct fallback
179
+ * observability and return null so breakeven-gated direct frontier can proceed.
180
+ */
181
+ private tryPlanningDelegateDecision;
182
+ private setPlanningDelegateDirectFallback;
163
183
  /**
164
184
  * Runs after turn_envelope and context_fit, before session_pin. Computes low-intensity score
165
185
  * from structural signals and optional cluster match; sets tier_hint and constrains
@@ -169,6 +189,7 @@ export declare class RouterPipeline {
169
189
  private selectExpectedCostTierHint;
170
190
  private logExpectedCostExplain;
171
191
  private resolvePSuccessWeights;
192
+ private resolveIsotonicCalibrator;
172
193
  private resolveTierHint;
173
194
  private resolveLowIntensityTierHint;
174
195
  private isLocalZeroTierReady;