@zhixuan92/multi-model-agent-core 3.9.1 → 3.10.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/README.md +1 -1
- package/dist/model-profiles.json +201 -12
- package/dist/observability/events.d.ts +3 -3
- package/dist/review/quality-reviewer.d.ts +9 -0
- package/dist/review/quality-reviewer.d.ts.map +1 -1
- package/dist/review/quality-reviewer.js +31 -5
- package/dist/review/quality-reviewer.js.map +1 -1
- package/dist/review/spec-reviewer.d.ts +9 -0
- package/dist/review/spec-reviewer.d.ts.map +1 -1
- package/dist/review/spec-reviewer.js +25 -3
- package/dist/review/spec-reviewer.js.map +1 -1
- package/dist/routing/model-profiles.d.ts +73 -0
- package/dist/routing/model-profiles.d.ts.map +1 -1
- package/dist/routing/model-profiles.js +200 -26
- package/dist/routing/model-profiles.js.map +1 -1
- package/dist/run-tasks/reviewed-lifecycle.d.ts +22 -2
- package/dist/run-tasks/reviewed-lifecycle.d.ts.map +1 -1
- package/dist/run-tasks/reviewed-lifecycle.js +54 -26
- package/dist/run-tasks/reviewed-lifecycle.js.map +1 -1
- package/dist/telemetry/event-builder.d.ts +5 -25
- package/dist/telemetry/event-builder.d.ts.map +1 -1
- package/dist/telemetry/event-builder.js +174 -294
- package/dist/telemetry/event-builder.js.map +1 -1
- package/dist/telemetry/normalize.d.ts +18 -0
- package/dist/telemetry/normalize.d.ts.map +1 -0
- package/dist/telemetry/normalize.js +18 -0
- package/dist/telemetry/normalize.js.map +1 -0
- package/dist/telemetry/types.d.ts +969 -1816
- package/dist/telemetry/types.d.ts.map +1 -1
- package/dist/telemetry/types.js +204 -345
- package/dist/telemetry/types.js.map +1 -1
- package/dist/types.d.ts +48 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +61 -16
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -104,7 +104,7 @@ As of 3.4.0 every task-execution event the worker emits to the verbose stderr st
|
|
|
104
104
|
|
|
105
105
|
## What's new
|
|
106
106
|
|
|
107
|
-
Latest: **3.
|
|
107
|
+
Latest: **3.10.1** — V3 telemetry fixes in `event-builder.ts` and `reviewed-lifecycle.ts`: top-level token totals and `totalCostUSD` now read from `runResult.usage` (previously summed across hardcoded-zero stages and always emitted 0); per-stage `BaseStageStats` gains `inputTokens`/`outputTokens`/`cachedTokens`/`reasoningTokens`/`turnCount`/`toolCallCount`/`filesReadCount`/`filesWrittenCount` populated from runner usage and reviewer metrics; per-stage `costUSD` clamped ≥ 0. Full history: [CHANGELOG](https://github.com/zhixuan312/multi-model-agent/blob/master/CHANGELOG.md).
|
|
108
108
|
|
|
109
109
|
## Full documentation
|
|
110
110
|
|
package/dist/model-profiles.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"naming": "claude-{tier}-{major}-{minor} | claude-{major}-{tier}-{date} (3.x legacy)",
|
|
5
5
|
"rateSource": "https://docs.anthropic.com/en/docs/about-claude/models",
|
|
6
6
|
"rateLookupDate": "2026-04-17",
|
|
7
|
-
"defaults": { "supportsEffort": true, "inputTokenSoftLimit": 150000, "capabilities": ["web_search", "web_fetch"] },
|
|
7
|
+
"defaults": { "family": "claude", "supportsEffort": true, "inputTokenSoftLimit": 150000, "capabilities": ["web_search", "web_fetch"] },
|
|
8
8
|
"profiles": [
|
|
9
9
|
{ "prefix": "claude", "tier": "standard", "cost": "medium", "input": 3, "output": 15, "bestFor": "general Claude tasks (catch-all, Sonnet rates)" },
|
|
10
10
|
{ "prefix": "claude-opus", "tier": "reasoning", "cost": "high", "input": 5, "output": 25, "bestFor": "high-ambiguity tasks where error cost is high" },
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"naming": "gpt-{major}.{minor}[-{size}] — sizes: pro, mini, nano (no suffix = base)",
|
|
22
22
|
"rateSource": "https://developers.openai.com/api/docs/pricing",
|
|
23
23
|
"rateLookupDate": "2026-04-25",
|
|
24
|
-
"defaults": { "supportsEffort": true, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
24
|
+
"defaults": { "family": "openai", "supportsEffort": true, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
25
25
|
"profiles": [
|
|
26
26
|
{ "prefix": "gpt", "tier": "standard", "cost": "medium", "input": 2.5, "output": 15, "bestFor": "general GPT family tasks (catch-all)" },
|
|
27
27
|
{ "prefix": "gpt-5", "tier": "reasoning", "bestFor": "reasoning-tier coding and agentic workflows", "inputTokenSoftLimit": 1000000, "capabilities": ["web_search"] },
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"naming": "gemini-{major}[.{minor}]-{tier}-{suffix} — tiers: pro ($2/$12), flash ($0.50/$3)",
|
|
41
41
|
"rateSource": "https://cloud.google.com/vertex-ai/generative-ai/pricing",
|
|
42
42
|
"rateLookupDate": "2026-04-17",
|
|
43
|
-
"defaults": { "supportsEffort": false, "inputTokenSoftLimit": 200000, "capabilities": ["web_search"] },
|
|
43
|
+
"defaults": { "family": "gemini", "supportsEffort": false, "inputTokenSoftLimit": 200000, "capabilities": ["web_search"] },
|
|
44
44
|
"profiles": [
|
|
45
45
|
{ "prefix": "gemini", "tier": "standard", "cost": "low", "input": 0.5, "output": 3, "bestFor": "general Gemini tasks (catch-all, Flash rates)" },
|
|
46
46
|
{ "prefix": "gemini-3.1-pro", "tier": "reasoning", "cost": "medium", "input": 2, "output": 12, "bestFor": "long-context reasoning with large documents" },
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"naming": "grok-{major}[.{minor}]-{variant} — fast variant is ~15x cheaper than base",
|
|
54
54
|
"rateSource": "https://docs.x.ai/developers/models",
|
|
55
55
|
"rateLookupDate": "2026-04-17",
|
|
56
|
-
"defaults": { "supportsEffort": false, "inputTokenSoftLimit": 200000, "capabilities": ["web_search"] },
|
|
56
|
+
"defaults": { "family": "grok", "supportsEffort": false, "inputTokenSoftLimit": 200000, "capabilities": ["web_search"] },
|
|
57
57
|
"profiles": [
|
|
58
58
|
{ "prefix": "grok", "tier": "standard", "cost": "low", "input": 0.2, "output": 0.5, "bestFor": "general Grok tasks (catch-all, fast-tier rates)" },
|
|
59
59
|
{ "prefix": "grok-4", "tier": "reasoning", "cost": "medium", "input": 3, "output": 15, "bestFor": "reasoning and analysis tasks" },
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"naming": "mistral-{tier}-{version} — tiers: large ($0.50/$1.50), small ($0.10/$0.30)",
|
|
66
66
|
"rateSource": "https://mistral.ai/pricing",
|
|
67
67
|
"rateLookupDate": "2026-04-17",
|
|
68
|
-
"defaults": { "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
68
|
+
"defaults": { "family": "mistral", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
69
69
|
"profiles": [
|
|
70
70
|
{ "prefix": "mistral", "tier": "standard", "cost": "low", "input": 0.5, "output": 1.5, "bestFor": "general Mistral tasks (catch-all, Large rates)" },
|
|
71
71
|
{ "prefix": "mistral-large", "bestFor": "cost-effective frontier-class coding" },
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"naming": "deepseek-{variant}[-{size}] — V4 sizes: flash, pro; legacy variants are flat-priced",
|
|
78
78
|
"rateSource": "https://api-docs.deepseek.com/quick_start/pricing",
|
|
79
79
|
"rateLookupDate": "2026-04-27",
|
|
80
|
-
"defaults": { "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
80
|
+
"defaults": { "family": "deepseek", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
81
81
|
"profiles": [
|
|
82
82
|
{ "prefix": "deepseek", "tier": "standard", "cost": "low", "input": 0.3, "output": 0.5, "bestFor": "cost-effective coding and reasoning" },
|
|
83
83
|
{ "prefix": "deepseek-v4-flash", "input": 0.14, "output": 0.28, "bestFor": "cheapest DeepSeek V4 with 1M context", "inputTokenSoftLimit": 1000000 },
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"naming": "llama-{major}-{variant} | meta-llama/llama-{major}-{variant} (OpenRouter)",
|
|
90
90
|
"rateSource": "https://openrouter.ai/models",
|
|
91
91
|
"rateLookupDate": "2026-04-17",
|
|
92
|
-
"defaults": { "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
92
|
+
"defaults": { "family": "llama", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
93
93
|
"profiles": [
|
|
94
94
|
{ "prefix": "llama", "tier": "standard", "cost": "low", "input": 0.15, "output": 0.6, "bestFor": "general open-weight model tasks" },
|
|
95
95
|
{ "prefix": "llama-4", "bestFor": "cost-effective open-weight coding" },
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
"naming": "qwen{major}[.{minor}]-{tier} — no separator after 'qwen'",
|
|
102
102
|
"rateSource": "https://openrouter.ai/qwen/qwen3.5-plus-02-15",
|
|
103
103
|
"rateLookupDate": "2026-04-17",
|
|
104
|
-
"defaults": { "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
104
|
+
"defaults": { "family": "qwen", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
105
105
|
"profiles": [
|
|
106
106
|
{ "prefix": "qwen", "tier": "standard", "cost": "low", "input": 0.26, "output": 1.56, "bestFor": "cost-effective coding and multilingual tasks" }
|
|
107
107
|
]
|
|
@@ -111,7 +111,7 @@
|
|
|
111
111
|
"naming": "glm-{major}[.{minor}] — GLM-5 is ~30% more expensive than GLM-4",
|
|
112
112
|
"rateSource": "https://docs.z.ai/guides/overview/pricing",
|
|
113
113
|
"rateLookupDate": "2026-04-17",
|
|
114
|
-
"defaults": { "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
114
|
+
"defaults": { "family": "glm", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
115
115
|
"profiles": [
|
|
116
116
|
{ "prefix": "glm", "tier": "standard", "cost": "medium", "input": 1, "output": 3.2, "bestFor": "general GLM/Zhipu family tasks" },
|
|
117
117
|
{ "prefix": "glm-5", "bestFor": "bilingual Chinese/English coding" },
|
|
@@ -123,7 +123,7 @@
|
|
|
123
123
|
"naming": "kimi-k{generation}[.{minor}] | kimi-k{generation}-{variant}",
|
|
124
124
|
"rateSource": "https://platform.kimi.ai/docs/pricing/chat",
|
|
125
125
|
"rateLookupDate": "2026-04-17",
|
|
126
|
-
"defaults": { "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
126
|
+
"defaults": { "family": "kimi", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
127
127
|
"profiles": [
|
|
128
128
|
{ "prefix": "kimi", "tier": "standard", "cost": "low", "input": 0.6, "output": 3, "bestFor": "long-context tasks and coding" }
|
|
129
129
|
]
|
|
@@ -133,7 +133,7 @@
|
|
|
133
133
|
"naming": "command-r[-plus] — plus variant is flagship",
|
|
134
134
|
"rateSource": "https://cohere.com/pricing",
|
|
135
135
|
"rateLookupDate": "2026-04-17",
|
|
136
|
-
"defaults": { "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": ["web_search"] },
|
|
136
|
+
"defaults": { "family": "cohere", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": ["web_search"] },
|
|
137
137
|
"profiles": [
|
|
138
138
|
{ "prefix": "command-r", "tier": "standard", "cost": "medium", "input": 2.5, "output": 10, "bestFor": "RAG workflows and grounded generation" }
|
|
139
139
|
]
|
|
@@ -143,9 +143,198 @@
|
|
|
143
143
|
"naming": "MiniMax-M{major}.{minor}[-highspeed] — case-sensitive prefix",
|
|
144
144
|
"rateSource": "https://platform.minimax.io/docs/guides/pricing-paygo",
|
|
145
145
|
"rateLookupDate": "2026-04-17",
|
|
146
|
-
"defaults": { "supportsEffort": true, "inputTokenSoftLimit": 200000, "capabilities": [] },
|
|
146
|
+
"defaults": { "family": "minimax", "supportsEffort": true, "inputTokenSoftLimit": 200000, "capabilities": [] },
|
|
147
147
|
"profiles": [
|
|
148
148
|
{ "prefix": "MiniMax-M2", "tier": "standard", "cost": "low", "input": 0.3, "output": 1.2, "bestFor": "well-scoped coding and agent loops where cost matters", "avoidFor": "highest-stakes ambiguous work that needs top-tier judgment" }
|
|
149
149
|
]
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"provider": "microsoft",
|
|
153
|
+
"naming": "phi-{major}[-{variant}]",
|
|
154
|
+
"rateSource": "https://azure.microsoft.com/en-us/pricing/details/cognitive-services/openai-service/",
|
|
155
|
+
"rateLookupDate": "2026-04-29",
|
|
156
|
+
"defaults": { "family": "phi", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
157
|
+
"profiles": [
|
|
158
|
+
{ "prefix": "phi", "tier": "standard", "cost": "low", "bestFor": "efficient open-weight Microsoft models" }
|
|
159
|
+
]
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"provider": "google-open",
|
|
163
|
+
"naming": "gemma-{major}[.{minor}] — open-weight Gemma family",
|
|
164
|
+
"rateSource": "https://ai.google.dev/gemma",
|
|
165
|
+
"rateLookupDate": "2026-04-29",
|
|
166
|
+
"defaults": { "family": "gemma", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
167
|
+
"profiles": [
|
|
168
|
+
{ "prefix": "gemma", "tier": "standard", "cost": "low", "bestFor": "lightweight open-weight Google models" }
|
|
169
|
+
]
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"provider": "yi-01",
|
|
173
|
+
"naming": "yi-{tier}[-{version}]",
|
|
174
|
+
"rateLookupDate": "2026-04-29",
|
|
175
|
+
"defaults": { "family": "yi", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
176
|
+
"profiles": [
|
|
177
|
+
{ "prefix": "yi", "tier": "standard", "cost": "low", "bestFor": "bilingual Chinese/English open-weight models" }
|
|
178
|
+
]
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"provider": "perplexity",
|
|
182
|
+
"naming": "sonar[-{variant}] — Perplexity's online-grounded models",
|
|
183
|
+
"rateSource": "https://docs.perplexity.ai/guides/pricing",
|
|
184
|
+
"rateLookupDate": "2026-04-29",
|
|
185
|
+
"defaults": { "family": "sonar", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": ["web_search"] },
|
|
186
|
+
"profiles": [
|
|
187
|
+
{ "prefix": "sonar", "tier": "standard", "cost": "low", "bestFor": "online-grounded search-augmented tasks" }
|
|
188
|
+
]
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"provider": "amazon",
|
|
192
|
+
"naming": "nova[-{tier}][-{version}] — Amazon Bedrock native models",
|
|
193
|
+
"rateSource": "https://aws.amazon.com/bedrock/nova/pricing/",
|
|
194
|
+
"rateLookupDate": "2026-04-29",
|
|
195
|
+
"defaults": { "family": "nova", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
196
|
+
"profiles": [
|
|
197
|
+
{ "prefix": "nova", "tier": "standard", "cost": "low", "bestFor": "Amazon Bedrock native multimodal models" }
|
|
198
|
+
]
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"provider": "ai21",
|
|
202
|
+
"naming": "jamba-{major}[.{minor}] — Mamba-transformer hybrid",
|
|
203
|
+
"rateLookupDate": "2026-04-29",
|
|
204
|
+
"defaults": { "family": "jamba", "supportsEffort": false, "inputTokenSoftLimit": 256000, "capabilities": [] },
|
|
205
|
+
"profiles": [
|
|
206
|
+
{ "prefix": "jamba", "tier": "standard", "cost": "low", "bestFor": "long-context Mamba-transformer hybrid" }
|
|
207
|
+
]
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"provider": "ibm",
|
|
211
|
+
"naming": "granite-{major}[.{minor}]-{variant}",
|
|
212
|
+
"rateSource": "https://www.ibm.com/granite",
|
|
213
|
+
"rateLookupDate": "2026-04-29",
|
|
214
|
+
"defaults": { "family": "granite", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
215
|
+
"profiles": [
|
|
216
|
+
{ "prefix": "granite", "tier": "standard", "cost": "low", "bestFor": "enterprise open-weight IBM models" }
|
|
217
|
+
]
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"provider": "nvidia",
|
|
221
|
+
"naming": "nemotron-{major}[-{variant}]",
|
|
222
|
+
"rateSource": "https://build.nvidia.com/explore/discover",
|
|
223
|
+
"rateLookupDate": "2026-04-29",
|
|
224
|
+
"defaults": { "family": "nemotron", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
225
|
+
"profiles": [
|
|
226
|
+
{ "prefix": "nemotron", "tier": "standard", "cost": "low", "bestFor": "NVIDIA-optimized open-weight models" }
|
|
227
|
+
]
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"provider": "databricks",
|
|
231
|
+
"naming": "dbrx[-{variant}]",
|
|
232
|
+
"rateSource": "https://www.databricks.com/dbrx",
|
|
233
|
+
"rateLookupDate": "2026-04-29",
|
|
234
|
+
"defaults": { "family": "dbrx", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
235
|
+
"profiles": [
|
|
236
|
+
{ "prefix": "dbrx", "tier": "standard", "cost": "low", "bestFor": "mixture-of-experts enterprise models" }
|
|
237
|
+
]
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"provider": "snowflake",
|
|
241
|
+
"naming": "arctic[-{variant}]",
|
|
242
|
+
"rateSource": "https://www.snowflake.com/en/blog/snowflake-arctic-open-efficient-foundation-language-models-snowflake/",
|
|
243
|
+
"rateLookupDate": "2026-04-29",
|
|
244
|
+
"defaults": { "family": "arctic", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
245
|
+
"profiles": [
|
|
246
|
+
{ "prefix": "arctic", "tier": "standard", "cost": "low", "bestFor": "Dense-MoE hybrid Snowflake models" }
|
|
247
|
+
]
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"provider": "reka",
|
|
251
|
+
"naming": "reka-{tier}[-{version}]",
|
|
252
|
+
"rateLookupDate": "2026-04-29",
|
|
253
|
+
"defaults": { "family": "reka", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
254
|
+
"profiles": [
|
|
255
|
+
{ "prefix": "reka", "tier": "standard", "cost": "low", "bestFor": "multimodal frontier models" }
|
|
256
|
+
]
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"provider": "ai2",
|
|
260
|
+
"naming": "olmo-{major}[.{minor}][-{variant}] — fully open (data + code + weights)",
|
|
261
|
+
"rateLookupDate": "2026-04-29",
|
|
262
|
+
"defaults": { "family": "olmo", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
263
|
+
"profiles": [
|
|
264
|
+
{ "prefix": "olmo", "tier": "standard", "cost": "low", "bestFor": "fully open research models from AI2" }
|
|
265
|
+
]
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"provider": "nous-research",
|
|
269
|
+
"naming": "hermes-{major}[.{minor}][-{variant}]",
|
|
270
|
+
"rateLookupDate": "2026-04-29",
|
|
271
|
+
"defaults": { "family": "hermes", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
272
|
+
"profiles": [
|
|
273
|
+
{ "prefix": "hermes", "tier": "standard", "cost": "low", "bestFor": "fine-tuned open-weight reasoning models" }
|
|
274
|
+
]
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"provider": "microsoft-wizardlm",
|
|
278
|
+
"naming": "wizardlm-{major}[.{minor}][-{variant}]",
|
|
279
|
+
"rateLookupDate": "2026-04-29",
|
|
280
|
+
"defaults": { "family": "wizardlm", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
281
|
+
"profiles": [
|
|
282
|
+
{ "prefix": "wizardlm", "tier": "standard", "cost": "low", "bestFor": "instruction-following open-weight models" }
|
|
283
|
+
]
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"provider": "bigcode",
|
|
287
|
+
"naming": "starcoder{generation}[-{variant}]",
|
|
288
|
+
"rateSource": "https://huggingface.co/bigcode",
|
|
289
|
+
"rateLookupDate": "2026-04-29",
|
|
290
|
+
"defaults": { "family": "starcoder", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
291
|
+
"profiles": [
|
|
292
|
+
{ "prefix": "starcoder", "tier": "standard", "cost": "low", "bestFor": "code-generation open-weight models" }
|
|
293
|
+
]
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
"provider": "cognitive-computations",
|
|
297
|
+
"naming": "dolphin-{major}[.{minor}][-{variant}]",
|
|
298
|
+
"rateLookupDate": "2026-04-29",
|
|
299
|
+
"defaults": { "family": "dolphin", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
300
|
+
"profiles": [
|
|
301
|
+
{ "prefix": "dolphin", "tier": "standard", "cost": "low", "bestFor": "uncensored open-weight models" }
|
|
302
|
+
]
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
"provider": "openchat",
|
|
306
|
+
"naming": "openchat-{major}[.{minor}][-{variant}]",
|
|
307
|
+
"rateLookupDate": "2026-04-29",
|
|
308
|
+
"defaults": { "family": "openchat", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
309
|
+
"profiles": [
|
|
310
|
+
{ "prefix": "openchat", "tier": "standard", "cost": "low", "bestFor": "open-source chat-tuned models" }
|
|
311
|
+
]
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
"provider": "lmsys",
|
|
315
|
+
"naming": "vicuna-{major}[b][-{variant}]",
|
|
316
|
+
"rateLookupDate": "2026-04-29",
|
|
317
|
+
"defaults": { "family": "vicuna", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
318
|
+
"profiles": [
|
|
319
|
+
{ "prefix": "vicuna", "tier": "standard", "cost": "low", "bestFor": "LLaMA-finetuned chat models from LMSYS" }
|
|
320
|
+
]
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"provider": "shanghai-ai-lab",
|
|
324
|
+
"naming": "internlm{major}[.{minor}][-{variant}]",
|
|
325
|
+
"rateLookupDate": "2026-04-29",
|
|
326
|
+
"defaults": { "family": "internlm", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
327
|
+
"profiles": [
|
|
328
|
+
{ "prefix": "internlm", "tier": "standard", "cost": "low", "bestFor": "multilingual Chinese/English open-weight models" }
|
|
329
|
+
]
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
"provider": "baichuan",
|
|
333
|
+
"naming": "baichuan{generation}[-{variant}]",
|
|
334
|
+
"rateLookupDate": "2026-04-29",
|
|
335
|
+
"defaults": { "family": "baichuan", "supportsEffort": false, "inputTokenSoftLimit": 128000, "capabilities": [] },
|
|
336
|
+
"profiles": [
|
|
337
|
+
{ "prefix": "baichuan", "tier": "standard", "cost": "low", "bestFor": "Chinese-language open-weight models" }
|
|
338
|
+
]
|
|
150
339
|
}
|
|
151
340
|
]
|
|
@@ -214,9 +214,9 @@ export declare const VerifySkippedEvent: z.ZodObject<{
|
|
|
214
214
|
event: z.ZodLiteral<"verify_skipped">;
|
|
215
215
|
reason: z.ZodEnum<{
|
|
216
216
|
no_command: "no_command";
|
|
217
|
+
other: "other";
|
|
217
218
|
not_applicable: "not_applicable";
|
|
218
219
|
dirty_worktree: "dirty_worktree";
|
|
219
|
-
other: "other";
|
|
220
220
|
}>;
|
|
221
221
|
stage: z.ZodString;
|
|
222
222
|
}, z.core.$strict>;
|
|
@@ -370,9 +370,9 @@ export declare const StageStatsMapSchema: z.ZodObject<{
|
|
|
370
370
|
}>>;
|
|
371
371
|
skipReason: z.ZodNullable<z.ZodEnum<{
|
|
372
372
|
no_command: "no_command";
|
|
373
|
+
other: "other";
|
|
373
374
|
not_applicable: "not_applicable";
|
|
374
375
|
dirty_worktree: "dirty_worktree";
|
|
375
|
-
other: "other";
|
|
376
376
|
}>>;
|
|
377
377
|
}, z.core.$strip>;
|
|
378
378
|
spec_review: z.ZodObject<{
|
|
@@ -847,9 +847,9 @@ export declare const Event: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
847
847
|
event: z.ZodLiteral<"verify_skipped">;
|
|
848
848
|
reason: z.ZodEnum<{
|
|
849
849
|
no_command: "no_command";
|
|
850
|
+
other: "other";
|
|
850
851
|
not_applicable: "not_applicable";
|
|
851
852
|
dirty_worktree: "dirty_worktree";
|
|
852
|
-
other: "other";
|
|
853
853
|
}>;
|
|
854
854
|
stage: z.ZodString;
|
|
855
855
|
}, z.core.$strict>, z.ZodObject<{
|
|
@@ -28,6 +28,15 @@ export interface QualityReviewResult {
|
|
|
28
28
|
findings: string[];
|
|
29
29
|
errorReason?: string;
|
|
30
30
|
reason?: string;
|
|
31
|
+
/** Per-stage telemetry metrics from the review provider call. */
|
|
32
|
+
metrics?: QualityReviewMetrics;
|
|
33
|
+
}
|
|
34
|
+
export interface QualityReviewMetrics {
|
|
35
|
+
inputTokens: number;
|
|
36
|
+
outputTokens: number;
|
|
37
|
+
turnCount: number;
|
|
38
|
+
toolCallCount: number;
|
|
39
|
+
costUSD: number;
|
|
31
40
|
}
|
|
32
41
|
/** Backward-compat alias kept until reviewed-lifecycle is migrated to the new shape (Task 6). */
|
|
33
42
|
export type LegacyQualityReviewResult = QualityReviewResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-reviewer.d.ts","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,yCAAyC,CAAC;AAEjD;;;;;;;;GAQG;AACH;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,eAAe,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;IACxI,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"quality-reviewer.d.ts","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,yCAAyC,CAAC;AAEjD;;;;;;;;GAQG;AACH;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,eAAe,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;IACxI,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAsBD,iGAAiG;AACjG,MAAM,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;AAkB5D;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,EAAE,GAAG,IAAI,CAalF;AAED,UAAU,iBAAiB;IACzB,EAAE,EAAE,IAAI,CAAC;IACT,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AACD,UAAU,kBAAkB;IAC1B,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,aAAa,EAAE,GAC9B,iBAAiB,GAAG,kBAAkB,CAiDxC;AAED,wBAAsB,gBAAgB,CACpC,gBAAgB,EAAE,QAAQ,EAC1B,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EAClE,UAAU,EAAE,sBAAsB,EAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,MAAM,EAAE,EACtB,aAAa,CAAC,EAAE,MAAM,EACtB,0BAA0B,CAAC,EAAE,CAAC,GAAG,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,aAAa,EAAE,CAAA;CAAE,KAAK,MAAM,EACtH,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,WAAW,EACzB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,qBAAqB,EAAE,mBAAmB,KAAK,IAAI,GAC1E,OAAO,CAAC,mBAAmB,CAAC,CAkE9B"}
|
|
@@ -3,6 +3,24 @@ import { delegateWithEscalation } from '../delegate-with-escalation.js';
|
|
|
3
3
|
import { buildQualityReviewPrompt } from './reviewer-prompt.js';
|
|
4
4
|
import { parseStructuredReport } from '../reporting/structured-report.js';
|
|
5
5
|
import { workerFindingsSchema, } from '../executors/_shared/findings-schema.js';
|
|
6
|
+
function extractMetrics(r) {
|
|
7
|
+
return {
|
|
8
|
+
inputTokens: r.usage?.inputTokens ?? 0,
|
|
9
|
+
outputTokens: r.usage?.outputTokens ?? 0,
|
|
10
|
+
turnCount: r.turns ?? 0,
|
|
11
|
+
toolCallCount: r.toolCalls?.length ?? 0,
|
|
12
|
+
costUSD: r.usage?.costUSD ?? 0,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function addMetrics(a, b) {
|
|
16
|
+
return {
|
|
17
|
+
inputTokens: a.inputTokens + b.inputTokens,
|
|
18
|
+
outputTokens: a.outputTokens + b.outputTokens,
|
|
19
|
+
turnCount: a.turnCount + b.turnCount,
|
|
20
|
+
toolCallCount: a.toolCallCount + b.toolCallCount,
|
|
21
|
+
costUSD: a.costUSD + b.costUSD,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
6
24
|
const annotationItemSchema = z.object({
|
|
7
25
|
id: z.string().min(1),
|
|
8
26
|
reviewerConfidence: z.number().int().min(0).max(100),
|
|
@@ -108,9 +126,11 @@ export async function runQualityReview(reviewerProvider, packet, implReport, fil
|
|
|
108
126
|
const corePrompt = buildQualityReviewPrompt(packet, implReport, fileContents, toolCallLog);
|
|
109
127
|
const prompt = (evidenceBlock ? `${evidenceBlock}\n\n` : '') + corePrompt;
|
|
110
128
|
const reviewerSlot = reviewerProvider.name === 'standard' ? 'standard' : 'complex';
|
|
129
|
+
let metrics = { inputTokens: 0, outputTokens: 0, turnCount: 0, toolCallCount: 0, costUSD: 0 };
|
|
111
130
|
let result;
|
|
112
131
|
try {
|
|
113
132
|
result = await delegateWithEscalation({ prompt, agentType: reviewerSlot, briefQualityPolicy: 'off', timeoutMs: 120_000 }, [reviewerProvider], { explicitlyPinned: true, taskDeadlineMs, abortSignal, onProgress });
|
|
133
|
+
metrics = extractMetrics(result);
|
|
114
134
|
}
|
|
115
135
|
catch (err) {
|
|
116
136
|
return { status: 'error', findings: [], errorReason: `review agent threw: ${err instanceof Error ? err.message : String(err)}` };
|
|
@@ -119,7 +139,7 @@ export async function runQualityReview(reviewerProvider, packet, implReport, fil
|
|
|
119
139
|
if (result.status === 'api_error' || result.status === 'network_error' || result.status === 'timeout' || result.status === 'api_aborted') {
|
|
120
140
|
return { status: result.status, findings: [], errorReason: `review agent returned status: ${result.status}` };
|
|
121
141
|
}
|
|
122
|
-
return { status: 'error', findings: [], errorReason: `review agent returned status: ${result.status}
|
|
142
|
+
return { status: 'error', findings: [], errorReason: `review agent returned status: ${result.status}`, metrics };
|
|
123
143
|
}
|
|
124
144
|
let report = parseStructuredReport(result.output);
|
|
125
145
|
if (!report.summary) {
|
|
@@ -128,12 +148,13 @@ export async function runQualityReview(reviewerProvider, packet, implReport, fil
|
|
|
128
148
|
prompt: prompt + '\n\nIMPORTANT: Your response MUST begin with a "## Summary" section containing either "approved" or "changes_required". Follow this exact format.',
|
|
129
149
|
agentType: reviewerSlot, briefQualityPolicy: 'off', timeoutMs: 120_000,
|
|
130
150
|
}, [reviewerProvider], { explicitlyPinned: true, taskDeadlineMs, abortSignal, onProgress });
|
|
151
|
+
metrics = addMetrics(metrics, extractMetrics(retryResult));
|
|
131
152
|
if (retryResult.status === 'ok')
|
|
132
153
|
report = parseStructuredReport(retryResult.output);
|
|
133
154
|
}
|
|
134
155
|
catch { /* fall through */ }
|
|
135
156
|
if (!report.summary) {
|
|
136
|
-
return { status: 'error', findings: [], errorReason: 'reviewer output missing ## Summary section (after retry)' };
|
|
157
|
+
return { status: 'error', findings: [], errorReason: 'reviewer output missing ## Summary section (after retry)', metrics };
|
|
137
158
|
}
|
|
138
159
|
}
|
|
139
160
|
const summaryLower = report.summary.toLowerCase();
|
|
@@ -142,9 +163,10 @@ export async function runQualityReview(reviewerProvider, packet, implReport, fil
|
|
|
142
163
|
status: 'changes_required',
|
|
143
164
|
report,
|
|
144
165
|
findings: [...(report.deviationsFromBrief ?? []), ...(report.unresolved ?? [])],
|
|
166
|
+
metrics,
|
|
145
167
|
};
|
|
146
168
|
}
|
|
147
|
-
return { status: 'approved', report, findings: [] };
|
|
169
|
+
return { status: 'approved', report, findings: [], metrics };
|
|
148
170
|
}
|
|
149
171
|
async function runAnnotationReview(reviewerProvider, packet, workerOutput, qualityReviewPromptBuilder, taskDeadlineMs, abortSignal, onProgress) {
|
|
150
172
|
// Step 1: extract worker findings from worker output.
|
|
@@ -168,8 +190,10 @@ async function runAnnotationReview(reviewerProvider, packet, workerOutput, quali
|
|
|
168
190
|
const prompt = qualityReviewPromptBuilder({ workerOutput, brief: packet.prompt, workerFindings });
|
|
169
191
|
const reviewerSlot = reviewerProvider.name === 'standard' ? 'standard' : 'complex';
|
|
170
192
|
let result;
|
|
193
|
+
let metrics = { inputTokens: 0, outputTokens: 0, turnCount: 0, toolCallCount: 0, costUSD: 0 };
|
|
171
194
|
try {
|
|
172
195
|
result = await delegateWithEscalation({ prompt, agentType: reviewerSlot, briefQualityPolicy: 'off', timeoutMs: 120_000 }, [reviewerProvider], { explicitlyPinned: true, taskDeadlineMs, abortSignal, onProgress });
|
|
196
|
+
metrics = extractMetrics(result);
|
|
173
197
|
}
|
|
174
198
|
catch (err) {
|
|
175
199
|
return {
|
|
@@ -180,23 +204,25 @@ async function runAnnotationReview(reviewerProvider, packet, workerOutput, quali
|
|
|
180
204
|
}
|
|
181
205
|
if (result.status !== 'ok') {
|
|
182
206
|
if (result.status === 'api_error' || result.status === 'network_error' || result.status === 'timeout' || result.status === 'api_aborted') {
|
|
183
|
-
return { status: result.status, findings: [], errorReason: `review agent returned status: ${result.status}
|
|
207
|
+
return { status: result.status, findings: [], errorReason: `review agent returned status: ${result.status}`, metrics };
|
|
184
208
|
}
|
|
185
209
|
return {
|
|
186
210
|
status: 'error',
|
|
187
211
|
findings: [],
|
|
188
212
|
errorReason: `review agent returned status: ${result.status}`,
|
|
213
|
+
metrics,
|
|
189
214
|
};
|
|
190
215
|
}
|
|
191
216
|
// Step 4: parse + validate + merge annotations.
|
|
192
217
|
const merged = parseAndMergeAnnotations(result.output, workerFindings);
|
|
193
218
|
if (!merged.ok) {
|
|
194
|
-
return { status: 'error', findings: [], errorReason: merged.reason };
|
|
219
|
+
return { status: 'error', findings: [], errorReason: merged.reason, metrics };
|
|
195
220
|
}
|
|
196
221
|
return {
|
|
197
222
|
status: 'annotated',
|
|
198
223
|
annotatedFindings: merged.annotated,
|
|
199
224
|
findings: [],
|
|
225
|
+
metrics,
|
|
200
226
|
};
|
|
201
227
|
}
|
|
202
228
|
//# sourceMappingURL=quality-reviewer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-reviewer.js","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EACL,oBAAoB,GAGrB,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"quality-reviewer.js","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,15 @@ export interface SpecReviewResult {
|
|
|
7
7
|
findings: string[];
|
|
8
8
|
errorReason?: string;
|
|
9
9
|
reason?: string;
|
|
10
|
+
/** Per-stage telemetry metrics from the review provider call. */
|
|
11
|
+
metrics?: SpecReviewMetrics;
|
|
12
|
+
}
|
|
13
|
+
export interface SpecReviewMetrics {
|
|
14
|
+
inputTokens: number;
|
|
15
|
+
outputTokens: number;
|
|
16
|
+
turnCount: number;
|
|
17
|
+
toolCallCount: number;
|
|
18
|
+
costUSD: number;
|
|
10
19
|
}
|
|
11
20
|
export type SpecReviewOrSkipped = SpecReviewResult | SkippedReviewResult;
|
|
12
21
|
export declare function runSpecReview(reviewerProvider: Provider, packet: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-reviewer.d.ts","sourceRoot":"","sources":["../../src/review/spec-reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,OAAO,GAAG,WAAW,GAAG,eAAe,GAAG,SAAS,CAAC;IAC9F,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"spec-reviewer.d.ts","sourceRoot":"","sources":["../../src/review/spec-reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,OAAO,GAAG,WAAW,GAAG,eAAe,GAAG,SAAS,CAAC;IAC9F,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAsBzE,wBAAsB,aAAa,CACjC,gBAAgB,EAAE,QAAQ,EAC1B,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EAClE,UAAU,EAAE,sBAAsB,EAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,CAAC,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,MAAM,EACtB,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,WAAW,EACzB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,qBAAqB,EAAE,mBAAmB,KAAK,IAAI,GAC1E,OAAO,CAAC,gBAAgB,CAAC,CAyE3B"}
|
|
@@ -1,11 +1,30 @@
|
|
|
1
1
|
import { delegateWithEscalation } from '../delegate-with-escalation.js';
|
|
2
2
|
import { buildSpecReviewPrompt } from './reviewer-prompt.js';
|
|
3
3
|
import { parseStructuredReport } from '../reporting/structured-report.js';
|
|
4
|
+
function extractMetrics(r) {
|
|
5
|
+
return {
|
|
6
|
+
inputTokens: r.usage?.inputTokens ?? 0,
|
|
7
|
+
outputTokens: r.usage?.outputTokens ?? 0,
|
|
8
|
+
turnCount: r.turns ?? 0,
|
|
9
|
+
toolCallCount: r.toolCalls?.length ?? 0,
|
|
10
|
+
costUSD: r.usage?.costUSD ?? 0,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function addMetrics(a, b) {
|
|
14
|
+
return {
|
|
15
|
+
inputTokens: a.inputTokens + b.inputTokens,
|
|
16
|
+
outputTokens: a.outputTokens + b.outputTokens,
|
|
17
|
+
turnCount: a.turnCount + b.turnCount,
|
|
18
|
+
toolCallCount: a.toolCallCount + b.toolCallCount,
|
|
19
|
+
costUSD: a.costUSD + b.costUSD,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
4
22
|
export async function runSpecReview(reviewerProvider, packet, implReport, fileContents, toolCallLog, planContext, evidenceBlock, taskDeadlineMs, abortSignal, onProgress) {
|
|
5
23
|
const prompt = (evidenceBlock ? `${evidenceBlock}\n\n` : '') +
|
|
6
24
|
buildSpecReviewPrompt(packet, implReport, fileContents, toolCallLog, planContext);
|
|
7
25
|
const reviewerSlot = reviewerProvider.name === 'standard' ? 'standard' : 'complex';
|
|
8
26
|
const delegateOpts = { explicitlyPinned: true, taskDeadlineMs, abortSignal, onProgress };
|
|
27
|
+
let metrics = { inputTokens: 0, outputTokens: 0, turnCount: 0, toolCallCount: 0, costUSD: 0 };
|
|
9
28
|
let result;
|
|
10
29
|
try {
|
|
11
30
|
result = await delegateWithEscalation({
|
|
@@ -14,6 +33,7 @@ export async function runSpecReview(reviewerProvider, packet, implReport, fileCo
|
|
|
14
33
|
briefQualityPolicy: 'off',
|
|
15
34
|
timeoutMs: 120_000,
|
|
16
35
|
}, [reviewerProvider], delegateOpts);
|
|
36
|
+
metrics = extractMetrics(result);
|
|
17
37
|
}
|
|
18
38
|
catch (err) {
|
|
19
39
|
return { status: 'error', findings: [], errorReason: `review agent threw: ${err instanceof Error ? err.message : String(err)}` };
|
|
@@ -22,7 +42,7 @@ export async function runSpecReview(reviewerProvider, packet, implReport, fileCo
|
|
|
22
42
|
if (result.status === 'api_error' || result.status === 'network_error' || result.status === 'timeout') {
|
|
23
43
|
return { status: result.status, findings: [], errorReason: `review agent returned status: ${result.status}` };
|
|
24
44
|
}
|
|
25
|
-
return { status: 'error', findings: [], errorReason: `review agent returned status: ${result.status}
|
|
45
|
+
return { status: 'error', findings: [], errorReason: `review agent returned status: ${result.status}`, metrics };
|
|
26
46
|
}
|
|
27
47
|
// Design note: we only check summary presence, not full structured format.
|
|
28
48
|
// After Task 2's lenient parsing, most reviewer outputs will parse successfully — that's the goal.
|
|
@@ -38,13 +58,14 @@ export async function runSpecReview(reviewerProvider, packet, implReport, fileCo
|
|
|
38
58
|
briefQualityPolicy: 'off',
|
|
39
59
|
timeoutMs: 120_000,
|
|
40
60
|
}, [reviewerProvider], delegateOpts);
|
|
61
|
+
metrics = addMetrics(metrics, extractMetrics(retryResult));
|
|
41
62
|
if (retryResult.status === 'ok') {
|
|
42
63
|
report = parseStructuredReport(retryResult.output);
|
|
43
64
|
}
|
|
44
65
|
}
|
|
45
66
|
catch { /* fall through to error */ }
|
|
46
67
|
if (!report.summary) {
|
|
47
|
-
return { status: 'error', findings: [], errorReason: 'reviewer output missing ## Summary section (after retry)' };
|
|
68
|
+
return { status: 'error', findings: [], errorReason: 'reviewer output missing ## Summary section (after retry)', metrics };
|
|
48
69
|
}
|
|
49
70
|
}
|
|
50
71
|
const summaryLower = report.summary.toLowerCase();
|
|
@@ -53,8 +74,9 @@ export async function runSpecReview(reviewerProvider, packet, implReport, fileCo
|
|
|
53
74
|
status: 'changes_required',
|
|
54
75
|
report,
|
|
55
76
|
findings: [...(report.deviationsFromBrief ?? []), ...(report.unresolved ?? [])],
|
|
77
|
+
metrics,
|
|
56
78
|
};
|
|
57
79
|
}
|
|
58
|
-
return { status: 'approved', report, findings: [] };
|
|
80
|
+
return { status: 'approved', report, findings: [], metrics };
|
|
59
81
|
}
|
|
60
82
|
//# sourceMappingURL=spec-reviewer.js.map
|