{"version":3,"sources":["../src/agent/eval/evaluator.ts"],"names":[],"mappings":"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","file":"chunk-ULEPOIQI.mjs","sourcesContent":["/**\n * EADK Evaluation Framework\n *\n * Trajectory + response evaluation for agent quality assessment.\n * Google ADK eval pattern.\n */\n\nimport type {\n  EADKAgent,\n  EvalCase,\n  EvalResult,\n  EvalMetric,\n  EvalContext,\n  RunConfig,\n} from '../core/types';\n\nexport interface EvalConfig {\n  /** Metrics to evaluate */\n  metrics: EvalMetric[];\n  /** Pass threshold (0-1, default: 0.7) */\n  passThreshold?: number;\n  /** Run config overrides for eval */\n  runConfig?: RunConfig;\n  /** Concurrency limit */\n  concurrency?: number;\n}\n\nexport interface EvalSuiteResult {\n  cases: EvalResult[];\n  averageScore: number;\n  passRate: number;\n  metricAverages: Record<string, number>;\n  totalDurationMs: number;\n}\n\n/**\n * Evaluate an agent against a set of test cases.\n */\nexport async function evaluate(\n  agent: EADKAgent,\n  cases: EvalCase[],\n  config: EvalConfig\n): Promise<EvalSuiteResult> {\n  const startTime = Date.now();\n  const threshold = config.passThreshold ?? 0.7;\n  const concurrency = config.concurrency ?? 5;\n  const results: EvalResult[] = [];\n\n  // Process in batches for concurrency control\n  for (let i = 0; i < cases.length; i += concurrency) {\n    const batch = cases.slice(i, i + concurrency);\n    const batchResults = await Promise.all(\n      batch.map((testCase) =>\n        evaluateCase(agent, testCase, config.metrics, config.runConfig)\n      )\n    );\n    results.push(...batchResults);\n  }\n\n  // Compute aggregate metrics\n  const metricTotals: Record<string, number[]> = {};\n  for (const result of results) {\n    for (const [name, score] of Object.entries(result.metrics)) {\n      if (!metricTotals[name]) metricTotals[name] = [];\n      metricTotals[name].push(score);\n    }\n  }\n\n  const metricAverages: Record<string, number> = {};\n  for (const [name, values] of Object.entries(metricTotals)) {\n    metricAverages[name] = values.reduce((a, b) => a + b, 0) / values.length;\n  }\n\n  const averageScore =\n    results.reduce((sum, r) => sum + r.score, 0) / results.length;\n  const passRate =\n    results.filter((r) => r.score >= threshold).length / results.length;\n\n  // Mark pass/fail\n  for (const result of results) {\n    result.passed = result.score >= threshold;\n  }\n\n  return {\n    cases: results,\n    averageScore,\n    passRate,\n    metricAverages,\n    totalDurationMs: Date.now() - startTime,\n  };\n}\n\nasync function evaluateCase(\n  agent: EADKAgent,\n  testCase: EvalCase,\n  metrics: EvalMetric[],\n  runConfig?: RunConfig\n): Promise<EvalResult> {\n  const startTime = Date.now();\n\n  // Run the agent\n  const agentResult = await agent.run(testCase.input, runConfig);\n\n  // Evaluate each metric\n  const evalCtx: EvalContext = {\n    case: testCase,\n    toolCalls: agentResult.toolCalls,\n    messages: agentResult.messages,\n  };\n\n  const metricScores: Record<string, number> = {};\n  for (const metric of metrics) {\n    metricScores[metric.name] = await metric.evaluate(\n      testCase.expectedOutput,\n      agentResult.output,\n      evalCtx\n    );\n  }\n\n  // Overall score is average of all metrics\n  const scores = Object.values(metricScores);\n  const score =\n    scores.length > 0 ? scores.reduce((a, b) => a + b, 0) / scores.length : 0;\n\n  return {\n    case: testCase,\n    actualOutput: agentResult.output,\n    actualToolCalls: agentResult.toolCalls,\n    score,\n    metrics: metricScores,\n    durationMs: Date.now() - startTime,\n    passed: false, // Will be set by evaluate()\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Built-in Metrics\n// ---------------------------------------------------------------------------\n\n/**\n * Exact match metric — checks if output exactly matches expected.\n */\nexport const exactMatch: EvalMetric = {\n  name: 'exact_match',\n  evaluate: async (expected, actual) => {\n    if (!expected) return 0;\n    return expected.trim() === actual.trim() ? 1 : 0;\n  },\n};\n\n/**\n * Contains metric — checks if output contains expected substring.\n */\nexport const contains: EvalMetric = {\n  name: 'contains',\n  evaluate: async (expected, actual) => {\n    if (!expected) return 0;\n    return actual.toLowerCase().includes(expected.toLowerCase()) ? 1 : 0;\n  },\n};\n\n/**\n * Length ratio metric — penalizes outputs that are too short or too long.\n */\nexport const lengthRatio: EvalMetric = {\n  name: 'length_ratio',\n  evaluate: async (expected, actual) => {\n    if (!expected) return actual.length > 0 ? 1 : 0;\n    const ratio = actual.length / expected.length;\n    // Score drops off as ratio deviates from 1\n    return Math.max(0, 1 - Math.abs(1 - ratio));\n  },\n};\n\n/**\n * Tool usage metric — checks if expected tools were called.\n */\nexport const toolUsage: EvalMetric = {\n  name: 'tool_usage',\n  evaluate: async (_expected, _actual, ctx) => {\n    if (\n      !ctx.case.expectedToolCalls ||\n      ctx.case.expectedToolCalls.length === 0\n    ) {\n      return 1;\n    }\n\n    const expectedNames = new Set(\n      ctx.case.expectedToolCalls.map((t) => t.name)\n    );\n    const actualNames = new Set(ctx.toolCalls.map((t) => t.name));\n\n    let matches = 0;\n    for (const name of expectedNames) {\n      if (actualNames.has(name)) matches++;\n    }\n\n    return matches / expectedNames.size;\n  },\n};\n\n/**\n * Create a custom regex-based metric.\n */\nexport function createRegexMetric(name: string, pattern: RegExp): EvalMetric {\n  return {\n    name,\n    evaluate: async (_expected, actual) => {\n      return pattern.test(actual) ? 1 : 0;\n    },\n  };\n}\n"]}