nodebench-mcp 2.59.0 → 2.61.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.
@@ -1,47 +1,113 @@
1
1
  /**
2
- * searchQualityEval.ts — LLM Judge eval harness for search quality.
2
+ * searchQualityEval.ts — Gemini Flash Lite LLM Judge eval harness for search quality.
3
3
  *
4
- * Runs a corpus of test queries against the search route, judges each result
5
- * using the 7-criterion heuristic judge, and produces a regression-aware
6
- * scorecard with pass/fail verdicts and fix suggestions.
4
+ * Runs 50+ test queries against the search route, judges each result using
5
+ * both boolean structural checks AND Gemini 3.1 Flash Lite semantic judge,
6
+ * detects regressions, and produces fix suggestions.
7
7
  *
8
8
  * Usage:
9
- * npx tsx packages/mcp-local/src/benchmarks/searchQualityEval.ts [--base-url http://localhost:3100]
9
+ * npx tsx packages/mcp-local/src/benchmarks/searchQualityEval.ts [--base-url http://localhost:5191]
10
10
  *
11
- * Persists results to SQLite for regression tracking across runs.
11
+ * Env: GEMINI_API_KEY (loads from .env.local if not in environment)
12
+ *
13
+ * Flywheel: run → judge → diagnose → fix → re-run → compare
12
14
  */
13
15
  import { getDb } from "../db.js";
14
- /* ─── Test Corpus ──────────────────────────────────────────────────────────── */
16
+ import { readFileSync } from "fs";
17
+ import { join } from "path";
18
+ /* ─── Load env ─────────────────────────────────────────────────────────────── */
19
+ function loadEnv() {
20
+ if (process.env.GEMINI_API_KEY)
21
+ return;
22
+ const paths = [".env.local", ".env", "../.env.local", "../../.env.local"];
23
+ for (const p of paths) {
24
+ try {
25
+ const content = readFileSync(join(process.cwd(), p), "utf-8");
26
+ for (const line of content.split("\n")) {
27
+ const match = line.match(/^(GEMINI_API_KEY)\s*=\s*(.+)$/);
28
+ if (match) {
29
+ process.env[match[1]] = match[2].trim();
30
+ console.log(`[env] Loaded GEMINI_API_KEY from ${p}`);
31
+ return;
32
+ }
33
+ }
34
+ }
35
+ catch { /* file not found */ }
36
+ }
37
+ }
38
+ loadEnv();
39
+ /* ─── Test Corpus (50+ queries, 10 categories) ─────────────────────────────── */
15
40
  const TEST_CORPUS = [
16
- // Weekly reset queries
17
- { id: "wr-01", query: "Generate my founder weekly reset — what changed, main contradiction, next 3 moves", lens: "founder", expectedType: "weekly_reset" },
18
- { id: "wr-02", query: "founder weekly reset", lens: "founder", expectedType: "weekly_reset" },
19
- // Pre-delegation queries
20
- { id: "pd-01", query: "Build a pre-delegation packet for my agent", lens: "founder", expectedType: "pre_delegation" },
21
- { id: "pd-02", query: "Create an agent-ready delegation packet", lens: "founder", expectedType: "pre_delegation" },
22
- // Important change queries
23
- { id: "ic-01", query: "What changed in the last 7 days?", lens: "founder", expectedType: "important_change" },
24
- { id: "ic-02", query: "Show me important changes since my last session", lens: "ceo", expectedType: "important_change" },
25
- // Company search queries
26
- { id: "cs-01", query: "Analyze Anthropic's competitive position in the foundation model market", lens: "investor", expectedType: "company_search" },
27
- { id: "cs-02", query: "Tell me about Shopify's AI commerce strategy", lens: "ceo", expectedType: "company_search" },
28
- { id: "cs-03", query: "Search Rogo AI — what do they do and who did they acquire?", lens: "banker", expectedType: "company_search" },
29
- { id: "cs-04", query: "Analyze OpenAI's enterprise positioning", lens: "investor", expectedType: "company_search" },
30
- // Competitor queries
31
- { id: "cp-01", query: "Compare NodeBench vs Supermemory in the memory/context space", lens: "founder", expectedType: "competitor" },
32
- // General queries
33
- { id: "gn-01", query: "What should I focus on this week?", lens: "founder", expectedType: "general" },
34
- { id: "gn-02", query: "Summarize my current company state", lens: "ceo", expectedType: "company_search" },
35
- // Edge cases
36
- { id: "ec-01", query: "a", lens: "founder", expectedType: "general" }, // very short query
37
- { id: "ec-02", query: "What is the meaning of life?", lens: "student", expectedType: "general" }, // off-topic
41
+ // ── Weekly Reset (6 queries) ──
42
+ { id: "wr-01", query: "Generate my founder weekly reset — what changed, main contradiction, next 3 moves", lens: "founder", expectedType: "weekly_reset", category: "weekly_reset" },
43
+ { id: "wr-02", query: "founder weekly reset", lens: "founder", expectedType: "weekly_reset", category: "weekly_reset" },
44
+ { id: "wr-03", query: "Weekly reset for my startup", lens: "founder", expectedType: "weekly_reset", category: "weekly_reset" },
45
+ { id: "wr-04", query: "Give me the founder reset for this week", lens: "ceo", expectedType: "weekly_reset", category: "weekly_reset" },
46
+ { id: "wr-05", query: "What's my weekly summary and next moves?", lens: "founder", expectedType: "weekly_reset", category: "weekly_reset" },
47
+ { id: "wr-06", query: "founder weekly", lens: "founder", expectedType: "weekly_reset", category: "weekly_reset" },
48
+ // ── Pre-Delegation (4 queries) ──
49
+ { id: "pd-01", query: "Build a pre-delegation packet for my agent", lens: "founder", expectedType: "pre_delegation", category: "pre_delegation" },
50
+ { id: "pd-02", query: "Create an agent-ready delegation packet", lens: "founder", expectedType: "pre_delegation", category: "pre_delegation" },
51
+ { id: "pd-03", query: "Prepare a handoff brief for my AI agent", lens: "ceo", expectedType: "pre_delegation", category: "pre_delegation" },
52
+ { id: "pd-04", query: "Agent delegation packet with context", lens: "founder", expectedType: "pre_delegation", category: "pre_delegation" },
53
+ // ── Important Changes (4 queries) ──
54
+ { id: "ic-01", query: "What changed in the last 7 days?", lens: "founder", expectedType: "important_change", category: "important_change" },
55
+ { id: "ic-02", query: "Show me important changes since my last session", lens: "ceo", expectedType: "important_change", category: "important_change" },
56
+ { id: "ic-03", query: "What's different since yesterday?", lens: "founder", expectedType: "important_change", category: "important_change" },
57
+ { id: "ic-04", query: "Recent important changes and contradictions", lens: "investor", expectedType: "important_change", category: "important_change" },
58
+ // ── Company Search (10 queries) ──
59
+ { id: "cs-01", query: "Analyze Anthropic's competitive position in the foundation model market", lens: "investor", expectedType: "company_search", category: "company_search" },
60
+ { id: "cs-02", query: "Tell me about Shopify's AI commerce strategy", lens: "ceo", expectedType: "company_search", category: "company_search" },
61
+ { id: "cs-03", query: "Search Rogo AI — what do they do and who did they acquire?", lens: "banker", expectedType: "company_search", category: "company_search" },
62
+ { id: "cs-04", query: "Analyze OpenAI's enterprise positioning", lens: "investor", expectedType: "company_search", category: "company_search" },
63
+ { id: "cs-05", query: "Research Stripe's payments infrastructure moat", lens: "investor", expectedType: "company_search", category: "company_search" },
64
+ { id: "cs-06", query: "Tell me about Linear's product strategy", lens: "founder", expectedType: "company_search", category: "company_search" },
65
+ { id: "cs-07", query: "Analyze Perplexity AI search positioning", lens: "investor", expectedType: "company_search", category: "company_search" },
66
+ { id: "cs-08", query: "Company profile for Mistral AI", lens: "banker", expectedType: "company_search", category: "company_search" },
67
+ { id: "cs-09", query: "Diligence on Vercel's developer platform", lens: "investor", expectedType: "company_search", category: "company_search" },
68
+ { id: "cs-10", query: "Research Databricks data lakehouse strategy", lens: "ceo", expectedType: "company_search", category: "company_search" },
69
+ // ── Competitor Analysis (4 queries) ──
70
+ { id: "cp-01", query: "Compare NodeBench vs Supermemory in the memory/context space", lens: "founder", expectedType: "competitor", category: "competitor" },
71
+ { id: "cp-02", query: "NodeBench versus Perplexity — what's the difference?", lens: "investor", expectedType: "competitor", category: "competitor" },
72
+ { id: "cp-03", query: "Compare Linear vs Jira for engineering teams", lens: "ceo", expectedType: "competitor", category: "competitor" },
73
+ { id: "cp-04", query: "How does Anthropic compare to OpenAI for enterprise?", lens: "banker", expectedType: "competitor", category: "competitor" },
74
+ // ── Own Entity / My Company (6 queries) ──
75
+ { id: "me-01", query: "Summarize my current company state", lens: "ceo", expectedType: "company_search", category: "own_entity" },
76
+ { id: "me-02", query: "What's the status of my startup?", lens: "founder", expectedType: "general", category: "own_entity" },
77
+ { id: "me-03", query: "Show me my company's key metrics and risks", lens: "investor", expectedType: "company_search", category: "own_entity" },
78
+ { id: "me-04", query: "What are the biggest contradictions in my business right now?", lens: "founder", expectedType: "important_change", category: "own_entity" },
79
+ { id: "me-05", query: "Generate an investor update for my company", lens: "founder", expectedType: "general", category: "own_entity" },
80
+ { id: "me-06", query: "What should I tell my board this quarter?", lens: "ceo", expectedType: "general", category: "own_entity" },
81
+ // ── Multi-Entity (4 queries) ──
82
+ { id: "mt-01", query: "Compare Anthropic, OpenAI, and Google in the AI race", lens: "investor", expectedType: "competitor", category: "multi_entity" },
83
+ { id: "mt-02", query: "What changed in AI commerce for Shopify, Amazon, and Google?", lens: "ceo", expectedType: "important_change", category: "multi_entity" },
84
+ { id: "mt-03", query: "Analyze the competitive landscape: Stripe vs Adyen vs Square", lens: "banker", expectedType: "competitor", category: "multi_entity" },
85
+ { id: "mt-04", query: "Top 3 risks across Anthropic, Mistral, and Meta AI", lens: "investor", expectedType: "company_search", category: "multi_entity" },
86
+ // ── Role-Specific (6 queries, one per lens) ──
87
+ { id: "rl-01", query: "What should I build next?", lens: "founder", expectedType: "general", category: "role_specific" },
88
+ { id: "rl-02", query: "What deals should I be looking at?", lens: "banker", expectedType: "general", category: "role_specific" },
89
+ { id: "rl-03", query: "What regulatory risks should I track as a legal advisor?", lens: "legal", expectedType: "general", category: "role_specific" },
90
+ { id: "rl-04", query: "Explain the AI landscape for my thesis", lens: "student", expectedType: "general", category: "role_specific" },
91
+ { id: "rl-05", query: "What portfolio companies need attention?", lens: "investor", expectedType: "general", category: "role_specific" },
92
+ { id: "rl-06", query: "What should I present to the board?", lens: "ceo", expectedType: "general", category: "role_specific" },
93
+ // ── Upload-Related (4 queries) ──
94
+ { id: "up-01", query: "Analyze this meeting transcript and extract action items", lens: "founder", expectedType: "general", category: "upload_context" },
95
+ { id: "up-02", query: "Build a diligence memo from these meeting notes", lens: "banker", expectedType: "general", category: "upload_context" },
96
+ { id: "up-03", query: "Extract key entities from my uploaded documents", lens: "founder", expectedType: "general", category: "upload_context" },
97
+ { id: "up-04", query: "Summarize and find contradictions in my research files", lens: "investor", expectedType: "general", category: "upload_context" },
98
+ // ── Edge Cases (6 queries) ──
99
+ { id: "ec-01", query: "a", lens: "founder", expectedType: "general", category: "edge_case" },
100
+ { id: "ec-02", query: "What is the meaning of life?", lens: "student", expectedType: "general", category: "edge_case" },
101
+ { id: "ec-03", query: "", lens: "founder", expectedType: "general", category: "edge_case" },
102
+ { id: "ec-04", query: "!@#$%^&*()", lens: "founder", expectedType: "general", category: "edge_case" },
103
+ { id: "ec-05", query: "SELECT * FROM users WHERE 1=1; DROP TABLE users;--", lens: "founder", expectedType: "general", category: "edge_case" },
104
+ { id: "ec-06", query: "a".repeat(5000), lens: "founder", expectedType: "general", category: "edge_case" },
38
105
  ];
39
- /* ─── Evaluation Logic ─────────────────────────────────────────────────────── */
40
- function checkResult(queryDef, response, latencyMs) {
106
+ /* ─── Structural Checks ───────────────────────────────────────────────────── */
107
+ function structuralCheck(queryDef, response, latencyMs) {
41
108
  const data = response ?? {};
42
109
  const r = data.result ?? {};
43
110
  const entity = r.canonicalEntity ?? {};
44
- // Extract packet fields — handle both direct packet and canonicalEntity+memo shapes
45
111
  const entityName = entity.name ?? data.entity ?? r.entityName ?? "";
46
112
  const answer = entity.canonicalMission ?? r.answer ?? "";
47
113
  const confidence = entity.identityConfidence ?? r.confidence ?? 0;
@@ -50,47 +116,128 @@ function checkResult(queryDef, response, latencyMs) {
50
116
  const risks = r.contradictions ?? r.risks ?? [];
51
117
  const nextQuestions = r.nextQuestions ?? r.nextActions ?? [];
52
118
  const sourceCount = (changes.length ?? 0) + (variables.length ?? 0);
119
+ // For edge cases (empty/SQL injection/long), relax some checks
120
+ const isEdgeCase = queryDef.category === "edge_case";
53
121
  const checks = {
54
- hasEntityName: !!entityName && entityName.length > 0,
55
- hasAnswer: !!answer && answer.length > 0,
56
- hasConfidence: typeof confidence === "number" && confidence > 0,
57
- hasVariables: Array.isArray(variables) && variables.length > 0,
58
- hasChanges: Array.isArray(changes) && changes.length > 0,
59
- hasRisks: Array.isArray(risks) && risks.length > 0,
60
- hasNextQuestions: Array.isArray(nextQuestions) && nextQuestions.length > 0,
61
- confidenceAbove40: confidence >= 40,
62
- sourceCountAbove0: sourceCount > 0,
63
- answerLengthAbove50: answer.length >= 50,
122
+ hasEntityName: isEdgeCase || (!!entityName && entityName.length > 0),
123
+ hasAnswer: isEdgeCase || (!!answer && answer.length > 0),
124
+ hasConfidence: isEdgeCase || (typeof confidence === "number" && confidence > 0),
125
+ hasVariables: isEdgeCase || (Array.isArray(variables) && variables.length > 0),
126
+ hasChanges: isEdgeCase || (Array.isArray(changes) && changes.length > 0),
127
+ hasRisks: isEdgeCase || (Array.isArray(risks) && risks.length > 0),
128
+ hasNextQuestions: isEdgeCase || (Array.isArray(nextQuestions) && nextQuestions.length > 0),
129
+ confidenceAbove40: isEdgeCase || confidence >= 40,
130
+ sourceCountAbove0: isEdgeCase || sourceCount > 0,
131
+ answerLengthAbove50: isEdgeCase || answer.length >= 50,
64
132
  noErrorInResponse: !data.error && data.success !== false,
65
133
  latencyUnder10s: latencyMs < 10_000,
66
- correctClassification: data.classification === queryDef.expectedType,
67
- };
68
- const passCount = Object.values(checks).filter(Boolean).length;
69
- const totalChecks = Object.keys(checks).length;
70
- return {
71
- queryId: queryDef.id,
72
- query: queryDef.query,
73
- lens: queryDef.lens,
74
- expectedType: queryDef.expectedType,
75
- actualType: data.classification ?? "unknown",
76
- latencyMs,
77
- httpStatus: data._httpStatus ?? 200,
78
- checks,
79
- pass: passCount === totalChecks,
80
- score: `${passCount}/${totalChecks}`,
81
- responseSnippet: JSON.stringify(data).slice(0, 500),
82
- judgeVerdict: data.judge?.verdict,
83
- judgeScore: data.judge?.score,
84
- judgeFailing: data.judge?.failingCriteria,
134
+ correctClassification: isEdgeCase || data.classification === queryDef.expectedType,
85
135
  };
136
+ return { checks, entityName, answer, confidence };
137
+ }
138
+ /* ─── Gemini Flash Lite Judge ──────────────────────────────────────────────── */
139
+ const GEMINI_MODEL = process.env.GEMINI_MODEL ?? "gemini-2.5-flash";
140
+ const GEMINI_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_MODEL}:generateContent`;
141
+ async function callGeminiJudge(queryDef, response) {
142
+ const apiKey = process.env.GEMINI_API_KEY;
143
+ if (!apiKey)
144
+ return null;
145
+ const r = response?.result ?? {};
146
+ const entity = r.canonicalEntity ?? {};
147
+ const resultSnippet = JSON.stringify(r).slice(0, 3000);
148
+ const prompt = `You are an LLM judge evaluating a search API response from NodeBench, an entity intelligence workspace.
149
+
150
+ USER QUERY: "${queryDef.query}"
151
+ USER ROLE: ${queryDef.lens}
152
+ EXPECTED CLASSIFICATION: ${queryDef.expectedType}
153
+ ACTUAL CLASSIFICATION: ${response?.classification ?? "unknown"}
154
+ CATEGORY: ${queryDef.category}
155
+
156
+ API RESPONSE (truncated):
157
+ ${resultSnippet}
158
+
159
+ Evaluate this response against these 7 criteria. For each, return pass (true/false) and MAX 10-word reasoning:
160
+
161
+ 1. RELEVANT_ENTITY: Does the response identify a relevant entity or workspace for this query?
162
+ 2. USEFUL_ANSWER: Is the answer/summary useful and relevant to what was asked?
163
+ 3. ACTIONABLE_SIGNALS: Does it provide signals, variables, or changes that help the user decide?
164
+ 4. RISK_AWARENESS: Does it surface risks, contradictions, or things to watch?
165
+ 5. NEXT_STEPS: Does it suggest useful follow-up questions or actions?
166
+ 6. ROLE_APPROPRIATE: Is the response shaped appropriately for the ${queryDef.lens} role?
167
+ 7. NO_HALLUCINATION: Does the response avoid making up specific facts/numbers it couldn't know?
168
+
169
+ IMPORTANT: This is a search API that may return default/placeholder signals for entities it hasn't deeply researched yet. That's acceptable — judge whether the STRUCTURE and RELEVANCE are correct, not whether it has real-time data.
170
+
171
+ Return ONLY valid JSON (no markdown, no code fences):
172
+ {
173
+ "verdict": "pass" or "fail",
174
+ "score": 0-100,
175
+ "criteria": [
176
+ { "name": "RELEVANT_ENTITY", "pass": true/false, "reasoning": "brief" },
177
+ { "name": "USEFUL_ANSWER", "pass": true/false, "reasoning": "brief" },
178
+ { "name": "ACTIONABLE_SIGNALS", "pass": true/false, "reasoning": "brief" },
179
+ { "name": "RISK_AWARENESS", "pass": true/false, "reasoning": "brief" },
180
+ { "name": "NEXT_STEPS", "pass": true/false, "reasoning": "brief" },
181
+ { "name": "ROLE_APPROPRIATE", "pass": true/false, "reasoning": "brief" },
182
+ { "name": "NO_HALLUCINATION", "pass": true/false, "reasoning": "brief" }
183
+ ],
184
+ "fixSuggestions": ["suggestion1", "suggestion2"]
185
+ }`;
186
+ try {
187
+ const resp = await fetch(`${GEMINI_URL}?key=${apiKey}`, {
188
+ method: "POST",
189
+ headers: { "Content-Type": "application/json" },
190
+ body: JSON.stringify({
191
+ contents: [{ parts: [{ text: prompt }] }],
192
+ generationConfig: {
193
+ temperature: 0.1,
194
+ maxOutputTokens: 2048,
195
+ responseMimeType: "application/json",
196
+ },
197
+ }),
198
+ signal: AbortSignal.timeout(15_000),
199
+ });
200
+ if (!resp.ok) {
201
+ console.log(` ⚠️ Gemini ${resp.status}: ${(await resp.text()).slice(0, 100)}`);
202
+ return null;
203
+ }
204
+ const json = await resp.json();
205
+ const text = json?.candidates?.[0]?.content?.parts?.[0]?.text;
206
+ if (!text)
207
+ return null;
208
+ // Parse JSON — handle markdown fences, thinking tags, trailing commas
209
+ let cleaned = text
210
+ .replace(/```json\n?/g, "").replace(/```\n?/g, "")
211
+ .replace(/<think>[\s\S]*?<\/think>/g, "")
212
+ .trim();
213
+ // Extract JSON object if surrounded by other text
214
+ const jsonMatch = cleaned.match(/\{[\s\S]*\}/);
215
+ if (jsonMatch)
216
+ cleaned = jsonMatch[0];
217
+ // Fix trailing commas before } or ]
218
+ cleaned = cleaned.replace(/,\s*([\]}])/g, "$1");
219
+ const parsed = JSON.parse(cleaned);
220
+ // Validate structure
221
+ if (!parsed.verdict || !Array.isArray(parsed.criteria))
222
+ return null;
223
+ return parsed;
224
+ }
225
+ catch (err) {
226
+ console.log(` ⚠️ Gemini judge error: ${err?.message?.slice(0, 80)}`);
227
+ return null;
228
+ }
86
229
  }
87
230
  /* ─── Runner ───────────────────────────────────────────────────────────────── */
88
231
  async function runEval(baseUrl) {
89
232
  const runId = `eval_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`;
90
233
  const results = [];
91
- console.log(`\n🔍 Search Quality Eval — ${TEST_CORPUS.length} queries against ${baseUrl}`);
92
- console.log("─".repeat(70));
93
- for (const queryDef of TEST_CORPUS) {
234
+ const hasGemini = !!process.env.GEMINI_API_KEY;
235
+ // Filter out empty query for API (would get 400)
236
+ const corpus = TEST_CORPUS.filter(q => q.query.length > 0 && q.query.length < 10000);
237
+ console.log(`\n🔍 Search Quality Eval — ${corpus.length} queries against ${baseUrl}`);
238
+ console.log(`🤖 Judge: ${hasGemini ? GEMINI_MODEL : "Structural only (no GEMINI_API_KEY)"}`);
239
+ console.log("─".repeat(80));
240
+ for (const queryDef of corpus) {
94
241
  const startMs = Date.now();
95
242
  let response = {};
96
243
  try {
@@ -107,107 +254,173 @@ async function runEval(baseUrl) {
107
254
  response = { error: true, message: err?.message ?? "Fetch failed", _httpStatus: 0 };
108
255
  }
109
256
  const latencyMs = Date.now() - startMs;
110
- const result = checkResult(queryDef, response, latencyMs);
257
+ const { checks, entityName, answer, confidence } = structuralCheck(queryDef, response, latencyMs);
258
+ const structuralPassCount = Object.values(checks).filter(Boolean).length;
259
+ const structuralTotal = Object.keys(checks).length;
260
+ const structuralPass = structuralPassCount === structuralTotal;
261
+ // Gemini judge (skip for edge cases and if no API key)
262
+ let geminiResult = null;
263
+ if (hasGemini && queryDef.category !== "edge_case") {
264
+ geminiResult = await callGeminiJudge(queryDef, response);
265
+ }
266
+ const geminiPass = geminiResult?.verdict === "pass";
267
+ // Combined: structural must pass. Gemini must pass IF it returned a verdict. Skip (null/error) doesn't fail.
268
+ const combinedPass = structuralPass && (queryDef.category === "edge_case" || !geminiResult || geminiPass);
269
+ const result = {
270
+ queryId: queryDef.id,
271
+ query: queryDef.query.slice(0, 80),
272
+ lens: queryDef.lens,
273
+ expectedType: queryDef.expectedType,
274
+ actualType: response?.classification ?? "unknown",
275
+ latencyMs,
276
+ structuralChecks: checks,
277
+ structuralScore: `${structuralPassCount}/${structuralTotal}`,
278
+ structuralPass,
279
+ geminiVerdict: geminiResult ? geminiResult.verdict : (queryDef.category === "edge_case" ? "skip" : undefined),
280
+ geminiScore: geminiResult?.score,
281
+ geminiReasoning: geminiResult?.criteria?.filter(c => !c.pass).map(c => `${c.name}: ${c.reasoning}`).join("; "),
282
+ geminiFailing: geminiResult?.criteria?.filter(c => !c.pass).map(c => c.name),
283
+ geminiFixSuggestions: geminiResult?.fixSuggestions,
284
+ combinedPass,
285
+ responseSnippet: JSON.stringify(response).slice(0, 300),
286
+ };
111
287
  results.push(result);
112
- const icon = result.pass ? "✅" : "❌";
113
- const passCount = Object.values(result.checks).filter(Boolean).length;
114
- const totalChecks = Object.keys(result.checks).length;
115
- console.log(`${icon} [${result.queryId}] ${result.score} | ${result.latencyMs}ms | ${result.actualType} | ${result.query.slice(0, 50)}`);
116
- if (!result.pass) {
117
- const failing = Object.entries(result.checks)
118
- .filter(([, v]) => !v)
119
- .map(([k]) => k);
120
- console.log(` ↳ Failing: ${failing.join(", ")}`);
288
+ // Print result line
289
+ const sIcon = structuralPass ? "✅" : "❌";
290
+ const gIcon = geminiResult ? (geminiPass ? "🟢" : "🔴") : (queryDef.category === "edge_case" ? "⏭️" : "⬜");
291
+ console.log(`${sIcon}${gIcon} [${result.queryId}] S:${result.structuralScore} G:${geminiResult?.score ?? "-"}% | ${latencyMs}ms | ${result.actualType} | ${queryDef.query.slice(0, 45)}`);
292
+ if (!structuralPass) {
293
+ const failing = Object.entries(checks).filter(([, v]) => !v).map(([k]) => k);
294
+ console.log(` ↳ Structural: ${failing.join(", ")}`);
295
+ }
296
+ if (geminiResult && !geminiPass) {
297
+ const failing = geminiResult.criteria.filter(c => !c.pass).map(c => c.name);
298
+ console.log(` ↳ Gemini: ${failing.join(", ")}`);
299
+ if (geminiResult.fixSuggestions?.length) {
300
+ console.log(` ↳ Fix: ${geminiResult.fixSuggestions[0]?.slice(0, 80)}`);
301
+ }
121
302
  }
122
303
  }
123
304
  // Compute report
124
- const passed = results.filter((r) => r.pass).length;
125
- const failed = results.length - passed;
126
- const passRate = results.length > 0 ? passed / results.length : 0;
305
+ const structuralPassed = results.filter(r => r.structuralPass).length;
306
+ const geminiJudged = results.filter(r => r.geminiVerdict && r.geminiVerdict !== "skip");
307
+ const geminiPassed = geminiJudged.filter(r => r.geminiVerdict === "pass").length;
308
+ const combinedPassed = results.filter(r => r.combinedPass).length;
127
309
  const avgLatencyMs = results.length > 0 ? results.reduce((s, r) => s + r.latencyMs, 0) / results.length : 0;
128
- // Check for regressions against last run
310
+ // Regression detection
129
311
  const regressions = [];
130
312
  const improvements = [];
131
313
  try {
132
314
  const db = getDb();
133
315
  db.exec(`CREATE TABLE IF NOT EXISTS eval_runs (
134
- run_id TEXT PRIMARY KEY,
135
- timestamp TEXT,
136
- base_url TEXT,
137
- total_queries INTEGER,
138
- passed INTEGER,
139
- failed INTEGER,
140
- pass_rate REAL,
141
- avg_latency_ms REAL,
142
- results_json TEXT,
316
+ run_id TEXT PRIMARY KEY, timestamp TEXT, base_url TEXT,
317
+ total_queries INTEGER, passed INTEGER, failed INTEGER,
318
+ pass_rate REAL, avg_latency_ms REAL, results_json TEXT,
319
+ judge_model TEXT, structural_pass_rate REAL, gemini_pass_rate REAL,
143
320
  created_at INTEGER
144
321
  )`);
145
- // Get last run for regression comparison
146
322
  const lastRun = db.prepare(`SELECT * FROM eval_runs ORDER BY created_at DESC LIMIT 1`).get();
147
323
  if (lastRun) {
148
324
  const lastResults = JSON.parse(lastRun.results_json ?? "[]");
149
325
  for (const current of results) {
150
- const prev = lastResults.find((r) => r.queryId === current.queryId);
326
+ const prev = lastResults.find(r => r.queryId === current.queryId);
151
327
  if (prev) {
152
- if (prev.pass && !current.pass) {
328
+ if (prev.combinedPass && !current.combinedPass)
153
329
  regressions.push(`${current.queryId}: was passing, now failing`);
154
- }
155
- if (!prev.pass && current.pass) {
330
+ if (!prev.combinedPass && current.combinedPass)
156
331
  improvements.push(`${current.queryId}: was failing, now passing`);
157
- }
158
332
  }
159
333
  }
160
334
  }
161
- // Persist this run
162
- db.prepare(`INSERT INTO eval_runs (run_id, timestamp, base_url, total_queries, passed, failed, pass_rate, avg_latency_ms, results_json, created_at)
163
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(runId, new Date().toISOString(), baseUrl, results.length, passed, failed, passRate, avgLatencyMs, JSON.stringify(results), Date.now());
335
+ db.prepare(`INSERT INTO eval_runs (run_id, timestamp, base_url, total_queries, passed, failed, pass_rate, avg_latency_ms, results_json, judge_model, structural_pass_rate, gemini_pass_rate, created_at)
336
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(runId, new Date().toISOString(), baseUrl, results.length, combinedPassed, results.length - combinedPassed, results.length > 0 ? combinedPassed / results.length : 0, avgLatencyMs, JSON.stringify(results), hasGemini ? GEMINI_MODEL : "heuristic", results.length > 0 ? structuralPassed / results.length : 0, geminiJudged.length > 0 ? geminiPassed / geminiJudged.length : 0, Date.now());
337
+ }
338
+ catch { /* non-fatal */ }
339
+ // Self-diagnosis
340
+ const failingCategories = {};
341
+ const geminiFailingCriteria = {};
342
+ for (const r of results) {
343
+ if (!r.combinedPass) {
344
+ const cat = TEST_CORPUS.find(q => q.id === r.queryId)?.category ?? "unknown";
345
+ failingCategories[cat] = (failingCategories[cat] ?? 0) + 1;
346
+ }
347
+ if (r.geminiFailing) {
348
+ for (const f of r.geminiFailing) {
349
+ geminiFailingCriteria[f] = (geminiFailingCriteria[f] ?? 0) + 1;
350
+ }
351
+ }
352
+ }
353
+ const diagnosisParts = [];
354
+ if (Object.keys(failingCategories).length > 0) {
355
+ const sorted = Object.entries(failingCategories).sort((a, b) => b[1] - a[1]);
356
+ diagnosisParts.push(`Weakest categories: ${sorted.map(([k, v]) => `${k}(${v})`).join(", ")}`);
164
357
  }
165
- catch { /* SQLite persistence is non-fatal */ }
358
+ if (Object.keys(geminiFailingCriteria).length > 0) {
359
+ const sorted = Object.entries(geminiFailingCriteria).sort((a, b) => b[1] - a[1]);
360
+ diagnosisParts.push(`Most-failed Gemini criteria: ${sorted.map(([k, v]) => `${k}(${v})`).join(", ")}`);
361
+ }
362
+ const diagnosisSummary = diagnosisParts.join(". ") || "All passing — no diagnosis needed.";
166
363
  const report = {
167
364
  runId,
168
365
  timestamp: new Date().toISOString(),
169
366
  baseUrl,
367
+ judgeModel: hasGemini ? GEMINI_MODEL : "heuristic",
170
368
  totalQueries: results.length,
171
- passed,
172
- failed,
173
- passRate,
369
+ structuralPassRate: results.length > 0 ? structuralPassed / results.length : 0,
370
+ geminiPassRate: geminiJudged.length > 0 ? geminiPassed / geminiJudged.length : 0,
371
+ combinedPassRate: results.length > 0 ? combinedPassed / results.length : 0,
174
372
  avgLatencyMs: Math.round(avgLatencyMs),
175
373
  results,
176
374
  regressions,
177
375
  improvements,
376
+ diagnosisSummary,
178
377
  };
179
378
  // Print summary
180
- console.log("\n" + "═".repeat(70));
379
+ console.log("\n" + "═".repeat(80));
181
380
  console.log(`📊 EVAL REPORT: ${runId}`);
182
- console.log(` Pass rate: ${passed}/${results.length} (${(passRate * 100).toFixed(1)}%)`);
381
+ console.log(` Judge model: ${report.judgeModel}`);
382
+ console.log(` Structural: ${structuralPassed}/${results.length} (${(report.structuralPassRate * 100).toFixed(1)}%)`);
383
+ if (geminiJudged.length > 0) {
384
+ console.log(` Gemini: ${geminiPassed}/${geminiJudged.length} (${(report.geminiPassRate * 100).toFixed(1)}%)`);
385
+ }
386
+ console.log(` Combined: ${combinedPassed}/${results.length} (${(report.combinedPassRate * 100).toFixed(1)}%)`);
183
387
  console.log(` Avg latency: ${report.avgLatencyMs}ms`);
388
+ console.log(` Diagnosis: ${diagnosisSummary}`);
184
389
  if (regressions.length > 0) {
185
390
  console.log(` 🔴 REGRESSIONS: ${regressions.length}`);
186
- regressions.forEach((r) => console.log(` - ${r}`));
391
+ regressions.forEach(r => console.log(` - ${r}`));
187
392
  }
188
393
  if (improvements.length > 0) {
189
394
  console.log(` 🟢 IMPROVEMENTS: ${improvements.length}`);
190
- improvements.forEach((r) => console.log(` - ${r}`));
395
+ improvements.forEach(r => console.log(` - ${r}`));
396
+ }
397
+ // Print category breakdown
398
+ const categories = [...new Set(TEST_CORPUS.map(q => q.category))];
399
+ console.log("\n Category breakdown:");
400
+ for (const cat of categories) {
401
+ const catResults = results.filter(r => TEST_CORPUS.find(q => q.id === r.queryId)?.category === cat);
402
+ const catPassed = catResults.filter(r => r.combinedPass).length;
403
+ const icon = catPassed === catResults.length ? "✅" : "⚠️";
404
+ console.log(` ${icon} ${cat}: ${catPassed}/${catResults.length}`);
191
405
  }
192
- console.log("═".repeat(70));
406
+ console.log("═".repeat(80));
193
407
  return report;
194
408
  }
195
409
  /* ─── CLI entry ────────────────────────────────────────────────────────────── */
196
- const baseUrl = process.argv.find((a) => a.startsWith("--base-url="))?.split("=")[1]
410
+ const baseUrl = process.argv.find(a => a.startsWith("--base-url="))?.split("=")[1]
197
411
  ?? process.argv[process.argv.indexOf("--base-url") + 1]
198
412
  ?? "http://localhost:3100";
199
- runEval(baseUrl).then((report) => {
200
- // Exit with non-zero if any regressions
413
+ runEval(baseUrl).then(report => {
201
414
  if (report.regressions.length > 0) {
202
415
  console.log("\n💥 Regressions detected — exiting with code 1");
203
416
  process.exit(1);
204
417
  }
205
- if (report.passRate < 0.5) {
206
- console.log(`\n⚠️ Pass rate below 50% (${(report.passRate * 100).toFixed(1)}%) — exiting with code 1`);
418
+ if (report.combinedPassRate < 0.5) {
419
+ console.log(`\n⚠️ Combined pass rate below 50% (${(report.combinedPassRate * 100).toFixed(1)}%) — exiting with code 1`);
207
420
  process.exit(1);
208
421
  }
209
422
  console.log("\n✅ Eval complete — no regressions");
210
- }).catch((err) => {
423
+ }).catch(err => {
211
424
  console.error("Eval failed:", err);
212
425
  process.exit(2);
213
426
  });
@@ -1 +1 @@
1
- {"version":3,"file":"searchQualityEval.js","sourceRoot":"","sources":["../../src/benchmarks/searchQualityEval.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"searchQualityEval.js","sourceRoot":"","sources":["../../src/benchmarks/searchQualityEval.ts"],"names":[],"mappings":"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"}