@ai-sdk-tool/eval 0.1.3 → 0.1.5

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 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/reporters/console.ts","../src/reporters/console.debug.ts","../src/reporters/json.ts","../src/reporters/index.ts","../src/evaluate.ts","../src/benchmarks/json-generation.ts","../src/utils/paths.ts","../src/benchmarks/bfcl.ts","../src/benchmarks/bfcl/ast-checker.ts"],"sourcesContent":["// Core evaluation function\nexport { evaluate } from \"./evaluate\";\n\n// Built-in benchmarks\nexport {\n jsonGenerationBenchmark,\n jsonGenerationSchemaOnlyBenchmark,\n} from \"./benchmarks/json-generation\";\nexport {\n bfclSimpleBenchmark,\n bfclParallelBenchmark,\n bfclMultipleBenchmark,\n bfclParallelMultipleBenchmark,\n} from \"./benchmarks/bfcl\";\n\n// Core interfaces for custom benchmarks\nexport type {\n LanguageModelV2Benchmark,\n BenchmarkResult,\n EvaluateOptions,\n ReporterType,\n} from \"./interfaces\";\n","import { EvaluationResult } from \"../interfaces\";\n\n// Basic ANSI color codes for console output\nconst colors = {\n reset: \"\\x1b[0m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n magenta: \"\\x1b[35m\",\n gray: \"\\x1b[90m\",\n};\n\nfunction printResult(result: EvaluationResult) {\n const { model, modelKey, benchmark, result: benchmarkResult } = result;\n const status = benchmarkResult.success\n ? `${colors.green}✔ SUCCESS${colors.reset}`\n : `${colors.red}✖ FAILURE${colors.reset}`;\n\n console.log(\n `\\n ${colors.cyan}[${model}]${colors.reset}${modelKey ? ` ${colors.gray}(${modelKey})${colors.reset}` : \"\"} - ${colors.magenta}${benchmark}${colors.reset}`\n );\n console.log(\n ` └ ${status} | Score: ${colors.yellow}${benchmarkResult.score.toFixed(2)}${colors.reset}`\n );\n\n const metrics = Object.entries(benchmarkResult.metrics);\n if (metrics.length > 0) {\n console.log(\" Metrics:\");\n for (const [key, value] of metrics) {\n console.log(` - ${key}: ${value}`);\n }\n }\n\n if (benchmarkResult.error) {\n console.log(\n ` ${colors.red}Error: ${benchmarkResult.error.message}${colors.reset}`\n );\n }\n}\n\nexport function consoleReporter(results: EvaluationResult[]): void {\n console.log(\"\\n--- 📊 Evaluation Report ---\");\n for (const result of results) {\n printResult(result);\n }\n console.log(\"\\n---------------------------\\n\");\n}\n","import { EvaluationResult } from \"../interfaces\";\n\nconst colors = {\n reset: \"\\x1b[0m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n magenta: \"\\x1b[35m\",\n gray: \"\\x1b[90m\",\n bold: \"\\x1b[1m\",\n underline: \"\\x1b[4m\",\n};\n\nfunction colorizeDiffLine(line: string): string {\n if (line.startsWith(\"+\")) return `${colors.green}${line}${colors.reset}`;\n if (line.startsWith(\"-\")) return `${colors.red}${line}${colors.reset}`;\n if (line.startsWith(\"@\"))\n return `${colors.cyan}${colors.bold}${line}${colors.reset}`;\n return line;\n}\n\nfunction uniqueLines(lines: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const l of lines) {\n if (seen.has(l)) continue;\n seen.add(l);\n out.push(l);\n }\n return out;\n}\n\nfunction suggestFixFromDiff(parsed: any): string[] {\n const suggestions: string[] = [];\n const { error_type, expected, actual, diff } = parsed ?? {};\n\n if (\n (diff && diff.some((d: string) => d.includes(\"function name\"))) ||\n (diff && diff.some((d: string) => d.includes(\"missing function:\")))\n ) {\n const expectedName = expected?.function;\n const actualName = actual?.function;\n if (expectedName && actualName && expectedName !== actualName) {\n suggestions.push(\n `Call the function '${expectedName}' instead of '${actualName}'.`\n );\n }\n if (Array.isArray(expected?.functions)) {\n suggestions.push(\n `Ensure tool calls include: ${expected.functions.join(\", \")}.`\n );\n }\n }\n\n if (\n diff &&\n diff.some((d: string) => d.startsWith(\"- missing required param:\"))\n ) {\n const missing = diff\n .filter((d: string) => d.startsWith(\"- missing required param:\"))\n .map((d: string) => d.replace(\"- missing required param: \", \"\"));\n if (missing.length) {\n suggestions.push(`Add required parameter(s): ${missing.join(\", \")}.`);\n }\n }\n\n if (diff && diff.some((d: string) => d.startsWith(\"+ unexpected param:\"))) {\n const extras = diff\n .filter((d: string) => d.startsWith(\"+ unexpected param:\"))\n .map((d: string) => d.replace(\"+ unexpected param: \", \"\"));\n if (extras.length) {\n suggestions.push(`Remove unexpected parameter(s): ${extras.join(\", \")}.`);\n }\n }\n\n if (diff && diff.some((d: string) => d.startsWith(\"@@ param \"))) {\n const targets = diff\n .filter((d: string) => d.startsWith(\"@@ param \"))\n .map((d: string) => d.replace(\"@@ param \", \"\"));\n for (const param of targets) {\n const allowedLine = diff.find((d: string) =>\n d.startsWith(\"- expected one of:\")\n );\n if (allowedLine) {\n const allowed = allowedLine.replace(\"- expected one of: \", \"\");\n suggestions.push(`Set '${param}' to one of: ${allowed}.`);\n } else {\n suggestions.push(`Adjust '${param}' to an allowed value.`);\n }\n }\n }\n\n if (suggestions.length === 0 && typeof error_type === \"string\") {\n if (error_type.includes(\"missing_required\")) {\n suggestions.push(\n \"Add all required parameters defined by the tool schema.\"\n );\n } else if (error_type.includes(\"unexpected_param\")) {\n suggestions.push(\"Remove parameters not present in the tool schema.\");\n } else if (error_type.includes(\"wrong_count\")) {\n suggestions.push(\n \"Adjust the number of tool calls to match expected count.\"\n );\n } else if (error_type.includes(\"wrong_func_name\")) {\n suggestions.push(\"Use the exact expected function name from the schema.\");\n } else if (error_type.includes(\"value_error\")) {\n suggestions.push(\"Choose a value from the allowed options.\");\n }\n }\n\n return uniqueLines(suggestions);\n}\n\nexport function consoleDebugReporter(results: EvaluationResult[]): void {\n console.log(\"\\n--- 📊 Evaluation Report (debug) ---\");\n for (const r of results) {\n const { model, modelKey, benchmark, result } = r;\n const status = result.success\n ? `${colors.green}✔ SUCCESS${colors.reset}`\n : `${colors.red}✖ FAILURE${colors.reset}`;\n\n console.log(\n `\\n ${colors.cyan}[${model}]${colors.reset}${modelKey ? ` ${colors.gray}(${modelKey})${colors.reset}` : \"\"} - ${colors.magenta}${benchmark}${colors.reset}`\n );\n console.log(\n ` └ ${status} | Score: ${colors.yellow}${result.score.toFixed(2)}${colors.reset}`\n );\n\n const metrics = Object.entries(result.metrics);\n if (metrics.length > 0) {\n console.log(\" Metrics:\");\n for (const [k, v] of metrics) console.log(` - ${k}: ${v}`);\n }\n\n if (result.logs && result.logs.length) {\n // Print only failure-related logs prominently. Pass logs stay compact.\n const failLogs = result.logs.filter(\n l =>\n l.startsWith(\"[FAIL]\") ||\n l.startsWith(\"[ERROR]\") ||\n l.startsWith(\"[FATAL]\") ||\n l.startsWith(\"[STACK]\") ||\n l.startsWith(\"[DEBUG-FAIL]\")\n );\n const hasFails = failLogs.length > 0;\n if (hasFails) {\n console.log(` ${colors.bold}Failure details:${colors.reset}`);\n // Build set of IDs that have structured debug entries to prevent duplicate prints\n const debugIds = new Set<string>();\n for (const l of failLogs) {\n if (l.startsWith(\"[DEBUG-FAIL]\")) {\n try {\n const parsed = JSON.parse(l.replace(/^\\[DEBUG-FAIL\\] /, \"\"));\n if (parsed?.id) debugIds.add(String(parsed.id));\n } catch {}\n }\n }\n for (const line of failLogs) {\n // Highlight test id and reasons\n if (line.startsWith(\"[FAIL]\")) {\n // Skip duplicate [FAIL] if we also have a [DEBUG-FAIL] for same id\n const m = line.match(/^\\[FAIL\\]\\s+([^:]+):/);\n const failId = m?.[1];\n if (failId && debugIds.has(failId)) continue;\n console.log(` ${colors.red}${line}${colors.reset}`);\n } else if (line.startsWith(\"[ERROR]\") || line.startsWith(\"[FATAL]\")) {\n console.log(` ${colors.yellow}${line}${colors.reset}`);\n } else if (line.startsWith(\"[STACK]\")) {\n console.log(` ${colors.gray}${line}${colors.reset}`);\n } else if (line.startsWith(\"[DEBUG-FAIL]\")) {\n // Attempt to pretty print embedded diffs\n const payload = line.replace(/^\\[DEBUG-FAIL\\] /, \"\");\n try {\n const parsed = JSON.parse(payload);\n const { id, expected, actual, message, diff } = parsed;\n console.log(\n ` ${colors.underline}${id}${colors.reset} ${message ? \"- \" + message : \"\"}`\n );\n if (diff && Array.isArray(diff)) {\n for (const dLine of diff)\n console.log(\" \" + colorizeDiffLine(dLine));\n } else {\n console.log(\" expected:\");\n console.log(\n colors.green +\n \" \" +\n JSON.stringify(expected, null, 2)\n .split(\"\\n\")\n .join(\"\\n \") +\n colors.reset\n );\n console.log(\" actual:\");\n console.log(\n colors.red +\n \" \" +\n JSON.stringify(actual, null, 2)\n .split(\"\\n\")\n .join(\"\\n \") +\n colors.reset\n );\n }\n const suggestions = suggestFixFromDiff(parsed);\n if (suggestions.length) {\n console.log(\n ` ${colors.bold}Suggested fix:${colors.reset}`\n );\n for (const s of suggestions) console.log(` • ${s}`);\n }\n } catch {\n console.log(` ${line}`);\n }\n }\n }\n } else {\n // Compact debug lines on success\n const info = result.logs.filter(\n l => l.startsWith(\"[INFO]\") || l.startsWith(\"[PASS]\")\n );\n for (const line of info)\n console.log(` ${colors.gray}${line}${colors.reset}`);\n }\n }\n }\n\n console.log(\"\\n------------------------------------\\n\");\n}\n","import { EvaluationResult } from \"../interfaces\";\n\nexport function jsonReporter(results: EvaluationResult[]): void {\n // Output the raw results array as a JSON string.\n // The 'error' object is converted to a string for serialization.\n const serializableResults = results.map(r => ({\n ...r,\n result: {\n ...r.result,\n error: r.result.error?.message,\n },\n }));\n console.log(JSON.stringify(serializableResults, null, 2));\n}\n","import { EvaluationResult, ReporterType } from \"../interfaces\";\nimport { consoleReporter } from \"./console\";\nimport { consoleDebugReporter } from \"./console.debug\";\nimport { jsonReporter } from \"./json\";\n\nexport const reporters: Record<\n ReporterType,\n (results: EvaluationResult[]) => void\n> = {\n console: consoleReporter,\n json: jsonReporter,\n \"console.debug\": consoleDebugReporter,\n};\n","import { LanguageModel } from \"ai\";\nimport {\n EvaluateOptions,\n EvaluationResult,\n LanguageModelV2Benchmark,\n} from \"./interfaces\";\nimport { reporters } from \"./reporters\";\n\nasync function runSingleBenchmark(\n model: LanguageModel,\n benchmark: LanguageModelV2Benchmark,\n modelKey?: string\n): Promise<EvaluationResult> {\n const modelId =\n typeof model === \"object\" &&\n model !== null &&\n \"modelId\" in model &&\n typeof model.modelId === \"string\"\n ? model.modelId\n : \"unknown-model\";\n\n try {\n console.log(\n `[${modelId}]${modelKey ? ` (${modelKey})` : \"\"} Running benchmark: ${benchmark.name}...`\n );\n const result = await benchmark.run(model);\n console.log(\n `[${modelId}]${modelKey ? ` (${modelKey})` : \"\"} Finished benchmark: ${benchmark.name}. Score: ${result.score}`\n );\n return {\n model: modelId,\n modelKey,\n benchmark: benchmark.name,\n result,\n };\n } catch (error) {\n console.error(\n `[${modelId}]${modelKey ? ` (${modelKey})` : \"\"} Error running benchmark: ${benchmark.name}`,\n error\n );\n return {\n model: modelId,\n modelKey,\n benchmark: benchmark.name,\n result: {\n score: 0,\n success: false,\n metrics: {},\n error: error instanceof Error ? error : new Error(String(error)),\n },\n };\n }\n}\n\nexport async function evaluate(\n options: EvaluateOptions\n): Promise<EvaluationResult[]> {\n const { models, benchmarks, reporter = \"console\" } = options;\n\n const modelEntries: Array<[string | undefined, LanguageModel]> = [];\n if (Array.isArray(models)) {\n for (const m of models) modelEntries.push([undefined, m]);\n } else if (\n typeof models === \"object\" &&\n models !== null &&\n \"modelId\" in (models as any)\n ) {\n modelEntries.push([undefined, models as LanguageModel]);\n } else {\n for (const [key, m] of Object.entries(\n models as Record<string, LanguageModel>\n )) {\n modelEntries.push([key, m]);\n }\n }\n const allResults: EvaluationResult[] = [];\n\n for (const [modelKey, model] of modelEntries) {\n for (const benchmark of benchmarks) {\n const evaluationResult = await runSingleBenchmark(\n model,\n benchmark,\n modelKey\n );\n allResults.push(evaluationResult);\n }\n }\n\n const report = reporters[reporter];\n if (report) {\n report(allResults);\n } else {\n console.warn(`Unknown reporter: '${reporter}'. Defaulting to console.`);\n reporters.console(allResults);\n }\n\n return allResults;\n}\n","import { LanguageModel, generateText } from \"ai\";\nimport Ajv, { AnySchema } from \"ajv\";\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\nimport { resolveDataDir } from \"../utils/paths\";\nimport { LanguageModelV2Benchmark, BenchmarkResult } from \"../interfaces\";\n\ntype Json = unknown;\n\ninterface SchemaTestCase {\n id: string;\n description: string;\n schema: AnySchema; // JSON Schema (draft 2020-12 subset supported by Ajv v8)\n promptFacts: string; // natural language facts to express desired values\n expected: Json; // subset of fields we expect to match exactly\n}\n\ninterface ExpectedRecord {\n id: string;\n expected: Json;\n}\n\nfunction extractFirstJsonBlock(text: string): Json | undefined {\n // 1) try direct parse\n try {\n return JSON.parse(text);\n } catch {\n // ignore parse errors\n }\n\n // 2) try code fence ```json ... ```\n const fenceMatch =\n text.match(/```json\\s*([\\s\\S]*?)```/i) ||\n text.match(/```\\s*([\\s\\S]*?)```/i);\n if (fenceMatch) {\n const inner = fenceMatch[1].trim();\n try {\n return JSON.parse(inner);\n } catch {\n // ignore parse errors\n }\n }\n\n // 3) bracket scanning for first object or array\n const startIdxObj = text.indexOf(\"{\");\n const startIdxArr = text.indexOf(\"[\");\n const start = [startIdxObj, startIdxArr]\n .filter(i => i >= 0)\n .sort((a, b) => a - b)[0];\n if (start === undefined) return undefined;\n\n const open = text[start] === \"{\" ? \"{\" : \"[\";\n const close = open === \"{\" ? \"}\" : \"]\";\n let depth = 0;\n for (let i = start; i < text.length; i++) {\n const ch = text[i];\n if (ch === open) depth++;\n else if (ch === close) depth--;\n if (depth === 0) {\n const candidate = text.slice(start, i + 1);\n try {\n return JSON.parse(candidate);\n } catch {\n // ignore parse errors\n }\n break;\n }\n }\n return undefined;\n}\n\nfunction subsetMatch(expected: Json, actual: Json): boolean {\n // primitives\n if (expected === null || typeof expected !== \"object\") {\n return expected === actual;\n }\n // arrays\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual)) return false;\n // Require at least that expected elements (by index) match if provided\n for (let i = 0; i < expected.length; i++) {\n if (!subsetMatch(expected[i], actual[i])) return false;\n }\n return true;\n }\n // object subset\n if (actual === null || typeof actual !== \"object\") return false;\n const eObj = expected as Record<string, unknown>;\n const aObj = actual as Record<string, unknown>;\n for (const key of Object.keys(eObj)) {\n if (!subsetMatch(eObj[key], aObj[key])) return false;\n }\n return true;\n}\n\n// Test cases will be loaded from data files at runtime\n\nexport const jsonGenerationBenchmark: LanguageModelV2Benchmark = {\n name: \"json-generation\",\n version: \"2.1.0\",\n description:\n \"Evaluates schema-compliant JSON generation from natural language using JSON Schema prompts.\",\n\n async run(model: LanguageModel): Promise<BenchmarkResult> {\n const logs: string[] = [];\n const ajv = new Ajv({ allErrors: true, strict: false });\n\n let schemaValidCount = 0;\n let valueMatchCount = 0;\n let correctCount = 0; // both schema + value subset\n\n // Load JSONL datasets (tests + expected) similar to BFCL\n let tests: Omit<SchemaTestCase, \"expected\">[] = [];\n const expectedMap = new Map<string, ExpectedRecord>();\n try {\n const dataDir = resolveDataDir();\n const testsJsonl = await fs.readFile(\n path.join(dataDir, \"json_generation_tests.jsonl\"),\n \"utf-8\"\n );\n const expectedJsonl = await fs.readFile(\n path.join(dataDir, \"json_generation_expected.jsonl\"),\n \"utf-8\"\n );\n\n tests = testsJsonl\n .split(/\\r?\\n/)\n .filter(line => line.trim().length > 0)\n .map(line => JSON.parse(line));\n const expecteds: ExpectedRecord[] = expectedJsonl\n .split(/\\r?\\n/)\n .filter(line => line.trim().length > 0)\n .map(line => JSON.parse(line));\n for (const r of expecteds) expectedMap.set(r.id, r);\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [`[FATAL] Failed to load json-generation datasets: ${msg}`],\n error: e as Error,\n };\n }\n\n for (const tc of tests) {\n try {\n const schemaStr = JSON.stringify(tc.schema, null, 2);\n const messages = [\n {\n role: \"system\" as const,\n content:\n \"You must output only a single JSON document that strictly conforms to the given JSON Schema. Do not include any extra text or code fences.\",\n },\n {\n role: \"user\" as const,\n content: [\n \"Generate a JSON object that reflects the following facts.\",\n \"JSON Schema:\",\n schemaStr,\n \"Facts:\",\n tc.promptFacts,\n \"Output must be a single JSON only, with no additional text.\",\n ].join(\"\\n\\n\"),\n },\n ];\n\n const { text } = await generateText({ model, messages });\n\n let parsed: Json | undefined;\n try {\n parsed = extractFirstJsonBlock(text);\n } catch {\n // ignore parse errors\n }\n\n if (parsed === undefined) {\n logs.push(`[FAIL] ${tc.id}: Unable to parse JSON from model output.`);\n continue;\n }\n\n const validate = ajv.compile(tc.schema);\n const valid = validate(parsed) as boolean;\n if (valid) schemaValidCount++;\n else\n logs.push(\n `[INFO] ${tc.id}: Schema validation errors: ${\n (validate.errors || [])\n .map(e => `${e.instancePath} ${e.message}`)\n .join(\", \") || \"unknown\"\n }`\n );\n\n const expectedRec = expectedMap.get(tc.id);\n if (!expectedRec) {\n logs.push(\n `[WARN] ${tc.id}: No expected record found. Skipping value match.`\n );\n }\n const valuesOk = expectedRec\n ? subsetMatch(expectedRec.expected, parsed)\n : false;\n if (valuesOk) valueMatchCount++;\n\n if (valid && valuesOk) {\n correctCount++;\n logs.push(`[PASS] ${tc.id}`);\n } else {\n logs.push(\n `[FAIL] ${tc.id}: schemaValid=${valid}, valuesOk=${valuesOk}. Output=${JSON.stringify(\n parsed\n )}`\n );\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n logs.push(`[ERROR] ${tc.id}: ${msg}`);\n }\n }\n\n const total = tests.length;\n const score = correctCount / total;\n return {\n score,\n success: score >= 0.8,\n metrics: {\n total_cases: total,\n correct_count: correctCount,\n schema_valid_count: schemaValidCount,\n value_match_count: valueMatchCount,\n accuracy: score,\n },\n logs,\n };\n },\n};\n\n// A schema-only variant that validates structure/format without value matching\ntype SchemaOnlyTestCase = Omit<SchemaTestCase, \"expected\">;\n\nexport const jsonGenerationSchemaOnlyBenchmark: LanguageModelV2Benchmark = {\n name: \"json-generation-schema-only\",\n version: \"1.0.1\",\n description:\n \"Evaluates whether model outputs strictly conform to the provided JSON Schema (structure only).\",\n\n async run(model: LanguageModel): Promise<BenchmarkResult> {\n const logs: string[] = [];\n const ajv = new Ajv({ allErrors: true, strict: false });\n\n // Load tests\n let tests: SchemaOnlyTestCase[] = [];\n try {\n const dataDir = resolveDataDir();\n const testsJsonl = await fs.readFile(\n path.join(dataDir, \"json_generation_tests.jsonl\"),\n \"utf-8\"\n );\n tests = testsJsonl\n .split(/\\r?\\n/)\n .filter(line => line.trim().length > 0)\n .map(line => JSON.parse(line));\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [`[FATAL] Failed to load schema-only tests: ${msg}`],\n error: e as Error,\n };\n }\n\n let schemaValidCount = 0;\n\n for (const tc of tests) {\n try {\n const schemaStr = JSON.stringify(tc.schema, null, 2);\n const messages = [\n {\n role: \"system\" as const,\n content:\n \"You must output only a single JSON document that strictly conforms to the given JSON Schema. Do not include any extra text or code fences.\",\n },\n {\n role: \"user\" as const,\n content: [\n \"Generate a JSON object that reflects the following facts.\",\n \"JSON Schema:\",\n schemaStr,\n \"Facts:\",\n tc.promptFacts,\n \"Output must be a single JSON only, with no additional text.\",\n ].join(\"\\n\\n\"),\n },\n ];\n\n const { text } = await generateText({ model, messages });\n\n let parsed: Json | undefined;\n try {\n parsed = extractFirstJsonBlock(text);\n } catch {\n // ignore\n }\n if (parsed === undefined) {\n logs.push(`[FAIL] ${tc.id}: Could not parse JSON from model output.`);\n continue;\n }\n\n const validate = ajv.compile(tc.schema);\n const valid = validate(parsed) as boolean;\n if (valid) {\n schemaValidCount++;\n logs.push(`[PASS] ${tc.id}`);\n } else {\n logs.push(\n `[FAIL] ${tc.id}: Schema validation errors: ${\n (validate.errors || [])\n .map(e => `${e.instancePath} ${e.message}`)\n .join(\", \") || \"unknown\"\n }`\n );\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n logs.push(`[ERROR] ${tc.id}: ${msg}`);\n }\n }\n\n const total = tests.length;\n const score = total > 0 ? schemaValidCount / total : 0;\n return {\n score,\n success: score >= 0.8,\n metrics: {\n total_cases: total,\n schema_valid_count: schemaValidCount,\n accuracy: score,\n },\n logs,\n };\n },\n};\n","import fs from \"fs\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { createRequire } from \"module\";\n\n/**\n * Resolve the directory that holds the eval datasets.\n * Order:\n * 1) BFCL_DATA_DIR env var override\n * 2) Resolve the installed package root via require.resolve(\"@ai-sdk-tool/eval\") and use its sibling 'data'\n * 3) Resolve the installed package root via require.resolve(\"@ai-sdk-tool/eval/package.json\") and use its sibling 'data'\n * 4) Walk up from current module location to find nearest sibling 'data' directory\n * 5) Fallback to package-root/data assuming dist/benchmarks depth or cwd\n * 3) Walk up from current module location to find nearest sibling 'data' directory\n * 4) Fallback to package-root/data assuming dist/benchmarks depth or cwd\n */\nexport function resolveDataDir(fromModuleUrl?: string): string {\n // 0) Use provided module URL when available; otherwise rely on require/cwd fallbacks (avoids import.meta in CJS)\n const moduleUrl = fromModuleUrl;\n\n // 1) Explicit override\n const override = process.env.BFCL_DATA_DIR;\n if (override && override.trim().length > 0) {\n return override;\n }\n\n // 2) Resolve via installed package location (works with pnpm workspaces and published package)\n try {\n // Prefer resolving the package main entry (exported by package.json) so we don't rely on exporting package.json\n const baseForRequireEntry =\n (typeof moduleUrl === \"string\" && moduleUrl) ||\n path.join(process.cwd(), \"package.json\");\n const requireFromEntry = createRequire(baseForRequireEntry);\n const entryPath = requireFromEntry.resolve(\"@ai-sdk-tool/eval\");\n const entryDir = path.dirname(entryPath);\n // If entry is in dist/, walk up to package root and locate 'data'\n const guessPkgRoot = fs.existsSync(path.join(entryDir, \"..\"))\n ? path.resolve(entryDir, \"..\")\n : entryDir;\n const dataAtRoot = path.join(guessPkgRoot, \"data\");\n if (fs.existsSync(dataAtRoot)) return dataAtRoot;\n } catch {\n // ignore and continue to other strategies\n }\n\n try {\n // In CJS builds, import.meta.url may be empty. Fallback to cwd package.json path for a valid base.\n const baseForRequire =\n (typeof moduleUrl === \"string\" && moduleUrl) ||\n path.join(process.cwd(), \"package.json\");\n const require = createRequire(baseForRequire);\n // Resolve this package's package.json location\n const pkgJsonPath = require.resolve(\"@ai-sdk-tool/eval/package.json\");\n const pkgDir = path.dirname(pkgJsonPath);\n const dataAtPkg = path.join(pkgDir, \"data\");\n if (fs.existsSync(dataAtPkg)) return dataAtPkg;\n } catch {\n // ignore if resolution fails (e.g., unusual environments)\n }\n\n // 3) Walk up a few levels to find a 'data' directory from the module URL\n let startDir: string;\n if (moduleUrl) {\n try {\n startDir = path.dirname(fileURLToPath(moduleUrl));\n } catch {\n // In case moduleUrl is invalid or unavailable, fall back to cwd\n startDir = process.cwd();\n }\n } else {\n startDir = process.cwd();\n }\n let dir = startDir;\n for (let i = 0; i < 6; i++) {\n const dataCandidate = path.join(dir, \"data\");\n if (fs.existsSync(dataCandidate)) return dataCandidate;\n const parent = path.resolve(dir, \"..\");\n if (parent === dir) break; // reached filesystem root\n dir = parent;\n }\n\n // 4) Fallback to packageRoot/data assuming dist/benchmarks -> dist -> packageRoot\n const pkgRoot = path.resolve(startDir, \"..\", \"..\");\n return path.join(pkgRoot, \"data\");\n}\n","import { LanguageModel, generateText, jsonSchema, tool } from \"ai\";\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\nimport { resolveDataDir } from \"../utils/paths\";\nimport { LanguageModelV2Benchmark, BenchmarkResult } from \"../interfaces\";\nimport {\n simpleFunctionChecker,\n parallelFunctionCheckerNoOrder,\n multipleFunctionChecker,\n} from \"./bfcl/ast-checker\";\n\n// Resolve data files relative to this module using ESM-safe utilities\n\n// --- Interfaces ---\ninterface TestCase {\n id: string;\n question: any;\n function: any;\n}\n\ninterface PossibleAnswer {\n id: string;\n ground_truth: any;\n}\n\n// --- Generic Checker Dispatcher ---\nfunction check(\n testCase: TestCase,\n modelOutput: any, // This is an array of tool_calls\n possibleAnswer: PossibleAnswer\n): { valid: boolean; error?: string; error_type?: string } {\n const category = testCase.id.split(\"_\")[0];\n\n try {\n if (category === \"simple\") {\n if (!modelOutput || modelOutput.length !== 1) {\n return {\n valid: false,\n error: `Expected 1 function call, but got ${modelOutput?.length ?? 0}.`,\n error_type: \"simple:wrong_count\",\n };\n }\n return simpleFunctionChecker(\n testCase.function[0],\n modelOutput[0],\n possibleAnswer.ground_truth[0]\n );\n } else if (category === \"parallel\") {\n return parallelFunctionCheckerNoOrder(\n testCase.function,\n modelOutput,\n possibleAnswer.ground_truth\n );\n } else if (category === \"multiple\") {\n return multipleFunctionChecker(\n testCase.function,\n modelOutput,\n possibleAnswer.ground_truth\n );\n } else if (category.includes(\"parallel-multiple\")) {\n // parallel-multiple is just a more complex parallel case\n return parallelFunctionCheckerNoOrder(\n testCase.function,\n modelOutput,\n possibleAnswer.ground_truth\n );\n }\n\n // Default for unimplemented categories (like multi_turn)\n // As per user request, we are deferring multi-turn.\n return { valid: true }; // Pass to not fail the whole benchmark\n } catch (e: any) {\n return {\n valid: false,\n error: `Checker Error: ${e.message}`,\n error_type: \"checker_error\",\n };\n }\n}\n\n// --- Generic Benchmark Runner Factory ---\nfunction createBfclBenchmark(\n name: string,\n description: string,\n testDataFile: string,\n answerDataFile: string\n): LanguageModelV2Benchmark {\n return {\n name,\n version: \"1.0.0\",\n description,\n async run(model: LanguageModel): Promise<BenchmarkResult> {\n const logs: string[] = [];\n let correctCount = 0;\n let testCases: TestCase[] = [];\n\n try {\n // Resolve data directory in a way that works both in monorepo and when installed as a dependency.\n const dataPath = resolveDataDir();\n logs.push(`[INFO] Using data dir: ${dataPath}`);\n const testCasesJson = await fs.readFile(\n path.join(dataPath, testDataFile),\n \"utf-8\"\n );\n const possibleAnswersJson = await fs.readFile(\n path.join(dataPath, answerDataFile),\n \"utf-8\"\n );\n\n // The BFCL datasets are in JSON Lines (NDJSON) format: one JSON object per line.\n // Parse them line-by-line instead of as a single JSON value.\n testCases = testCasesJson\n .split(/\\r?\\n/)\n .filter(line => line.trim().length > 0)\n .map(line => JSON.parse(line));\n const possibleAnswers: PossibleAnswer[] = possibleAnswersJson\n .split(/\\r?\\n/)\n .filter(line => line.trim().length > 0)\n .map(line => JSON.parse(line));\n const possibleAnswersMap = new Map(\n possibleAnswers.map(ans => [ans.id, ans])\n );\n\n // Optional: limit number of test cases via env for faster local runs\n const limitEnv = process.env.BFCL_LIMIT;\n const limit = limitEnv ? Number(limitEnv) : undefined;\n if (limit && Number.isFinite(limit) && limit > 0) {\n testCases = testCases.slice(0, limit);\n logs.push(\n `[INFO] Limiting test cases to ${limit} due to BFCL_LIMIT.`\n );\n }\n\n // Helper: fix BFCL JSON schema types to OpenAI-compatible JSON Schema\n const fixSchema = (schema: any): any => {\n if (!schema || typeof schema !== \"object\") return schema;\n const copy: any = Array.isArray(schema)\n ? schema.map(v => fixSchema(v))\n : { ...schema };\n if (copy.type) {\n if (copy.type === \"dict\") copy.type = \"object\";\n if (copy.type === \"integer\" || copy.type === \"float\")\n copy.type = \"number\";\n }\n if (copy.properties && typeof copy.properties === \"object\") {\n for (const k of Object.keys(copy.properties)) {\n copy.properties[k] = fixSchema(copy.properties[k]);\n }\n }\n if (copy.items) copy.items = fixSchema(copy.items);\n return copy;\n };\n\n // Concurrency control via env BFCL_CONCURRENCY (default 4)\n const concurrencyEnv = process.env.BFCL_CONCURRENCY;\n const concurrency =\n concurrencyEnv && Number.isFinite(Number(concurrencyEnv))\n ? Math.max(1, Number(concurrencyEnv))\n : 4;\n logs.push(\n `[INFO] Running ${testCases.length} test cases with concurrency=${concurrency}`\n );\n\n // Per-test runner that does not throw and returns its own logs\n const runSingleCase = async (\n testCase: TestCase\n ): Promise<{ valid: boolean; logs: string[] }> => {\n const caseLogs: string[] = [];\n const { function: tools, question: messages } = testCase;\n\n try {\n // Flatten BFCL message shape [[{role, content}], ...] to [{role, content}, ...]\n const flatMessages =\n Array.isArray(messages) &&\n messages.some((m: any) => Array.isArray(m))\n ? (messages as any[]).flat(1)\n : messages;\n\n // Build tools array (LanguageModelV2FunctionTool[]) for middleware compatibility\n // Keep a mapping sanitized -> original to restore before checking\n const nameMap = new Map<string, string>();\n const sanitizeName = (name: string) => {\n // OpenAI-compatible: letters, digits, underscores and dashes, max 64\n const s = name.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64);\n return s.length > 0 ? s : \"tool\";\n };\n\n const transformedTools = (tools as any[]).map((t: any) => {\n const fixed = fixSchema(t.parameters);\n // Ensure we always provide a valid JSON Schema object of type 'object'\n const inputSchema =\n fixed && typeof fixed === \"object\" && fixed.type === \"object\"\n ? fixed\n : { type: \"object\", properties: {} };\n\n const sanitized = sanitizeName(t.name);\n nameMap.set(sanitized, t.name);\n\n return {\n type: \"function\" as const,\n name: sanitized,\n description: t.description,\n inputSchema: inputSchema,\n };\n });\n\n // Convert to ToolSet expected by generateText\n const toolsMap = Object.fromEntries(\n transformedTools.map(t => [\n t.name,\n tool({\n description:\n typeof t.description === \"string\"\n ? t.description\n : undefined,\n inputSchema: jsonSchema(t.inputSchema),\n }),\n ])\n );\n\n // Debug: record first tool object and schema type\n try {\n const firstTool: any = (transformedTools as any)[0];\n const schemaType =\n firstTool?.inputSchema?.type ??\n firstTool?.inputSchema?.jsonSchema?.type;\n caseLogs.push(\n `[DEBUG] ${testCase.id}: firstTool=${JSON.stringify(firstTool)}, schemaType=${schemaType}`\n );\n } catch (e: any) {\n caseLogs.push(\n `[DEBUG] ${testCase.id}: failed to introspect tools: ${e.message}`\n );\n }\n\n const { toolCalls, text, finishReason } = await generateText({\n model,\n messages: flatMessages,\n tools: toolsMap,\n toolChoice: \"auto\",\n // Pass original schema information to middleware\n providerOptions: {\n toolCallMiddleware: {\n originalToolSchemas: Object.fromEntries(\n transformedTools.map(t => [t.name, t.inputSchema])\n ),\n },\n },\n });\n\n // Debug: raw toolCalls\n try {\n caseLogs.push(\n `[DEBUG] ${testCase.id}: rawToolCalls=${JSON.stringify(toolCalls)}, finishReason=${finishReason}, text=${JSON.stringify(text)}`\n );\n } catch {\n caseLogs.push(\n `[DEBUG] ${testCase.id}: failed to serialize toolCalls`\n );\n }\n\n const possibleAnswer = possibleAnswersMap.get(testCase.id);\n if (!possibleAnswer) {\n throw new Error(`No possible answer for id: ${testCase.id}`);\n }\n\n // Restore original tool names in toolCalls before checking\n const restoredCalls = (toolCalls || []).map((c: any) => {\n const rawName = c.toolName ?? c.name;\n // Some providers (e.g., response-format models) may encode tool name as a numeric index string\n const sanitizedFromIndex =\n typeof rawName === \"string\" && /^\\d+$/.test(rawName)\n ? ((transformedTools as any[])[Number(rawName)]?.name ??\n rawName)\n : rawName;\n const originalName =\n nameMap.get(sanitizedFromIndex) ?? sanitizedFromIndex;\n const extractedArgs =\n c.args ??\n c.arguments ??\n c.input ??\n c.params ??\n c.parameters ??\n undefined;\n let parsedArgs = extractedArgs;\n if (typeof parsedArgs === \"string\") {\n try {\n parsedArgs = JSON.parse(parsedArgs);\n } catch {\n // leave as string if not JSON\n }\n }\n return {\n ...c,\n toolName: originalName,\n name: originalName,\n args: parsedArgs ?? {},\n };\n });\n\n const checkerResult = check(\n testCase,\n restoredCalls,\n possibleAnswer\n );\n\n if (checkerResult.valid) {\n caseLogs.push(`[PASS] ${testCase.id}`);\n return { valid: true, logs: caseLogs };\n } else {\n caseLogs.push(`[FAIL] ${testCase.id}: ${checkerResult.error}`);\n try {\n // Build a compact expectation/actual summary and a human-friendly diff\n const category = testCase.id.split(\"_\")[0];\n const diff: string[] = [];\n const summarizeArgs = (args: any): any => {\n if (args == null) return args;\n if (typeof args !== \"object\") return args;\n // Sort object keys for stable output\n return Object.keys(args)\n .sort()\n .reduce((acc: any, k) => {\n acc[k] = args[k];\n return acc;\n }, {});\n };\n\n const expected: any = {};\n const actual: any = {};\n\n if (category === \"simple\") {\n const funcDesc: any = (tools as any[])[0];\n const gt: any = (possibleAnswer as any).ground_truth?.[0];\n const expectedFuncName = funcDesc?.name;\n const expectedParams = gt\n ? gt[Object.keys(gt)[0]]\n : undefined;\n const received = (restoredCalls as any[])[0];\n const receivedName = received?.toolName ?? received?.name;\n const receivedArgs = summarizeArgs(received?.args);\n\n expected.function = expectedFuncName;\n expected.params = expectedParams;\n actual.function = receivedName;\n actual.args = receivedArgs;\n\n if (expectedFuncName !== receivedName) {\n diff.push(`@@ function name`);\n diff.push(`- ${expectedFuncName}`);\n diff.push(`+ ${receivedName}`);\n }\n if (expectedParams && receivedArgs) {\n const required = (funcDesc?.parameters?.required ??\n []) as string[];\n // Missing required\n for (const req of required) {\n if (!(req in receivedArgs)) {\n diff.push(`- missing required param: ${req}`);\n }\n }\n // Unexpected\n for (const k of Object.keys(receivedArgs)) {\n if (\n !Object.prototype.hasOwnProperty.call(expectedParams, k)\n ) {\n diff.push(`+ unexpected param: ${k}`);\n }\n }\n // Invalid values\n for (const k of Object.keys(receivedArgs)) {\n if (\n Object.prototype.hasOwnProperty.call(expectedParams, k)\n ) {\n const allowed = expectedParams[k];\n const got = receivedArgs[k];\n const includes =\n Array.isArray(allowed) &&\n allowed.some((v: any) => {\n try {\n if (Array.isArray(got)) {\n return (\n JSON.stringify(\n got.map(x => String(x)).sort()\n ) ===\n JSON.stringify(\n (v as any[]).map(x => String(x)).sort()\n )\n );\n }\n } catch {\n void 0;\n }\n return (\n String(v).toLowerCase().replace(/\\s+/g, \"\") ===\n String(got).toLowerCase().replace(/\\s+/g, \"\")\n );\n });\n if (!includes) {\n diff.push(`@@ param ${k}`);\n diff.push(\n `- expected one of: ${JSON.stringify(allowed)}`\n );\n diff.push(`+ got: ${JSON.stringify(got)}`);\n }\n }\n }\n }\n } else {\n // Parallel / multiple: show function name sets and param-level diffs per matched function\n const gtArr: any[] =\n (possibleAnswer as any).ground_truth ?? [];\n const expectedNames = gtArr.map(g => Object.keys(g)[0]);\n const actualNames = (restoredCalls as any[]).map(\n c => c.toolName ?? c.name\n );\n expected.functions = expectedNames;\n actual.functions = actualNames;\n\n if (expectedNames.length !== actualNames.length) {\n diff.push(`@@ call count`);\n diff.push(`- expected ${expectedNames.length}`);\n diff.push(`+ got ${actualNames.length}`);\n }\n\n const missing = expectedNames.filter(\n n => !actualNames.includes(n)\n );\n const extra = actualNames.filter(\n n => !expectedNames.includes(n)\n );\n for (const m of missing)\n diff.push(`- missing function: ${m}`);\n for (const e of extra)\n diff.push(`+ unexpected function: ${e}`);\n\n // Attempt to compute param-level diffs for functions that exist in both expected and actual\n const usedActual = new Set<number>();\n for (const expectedObj of gtArr) {\n const fname = Object.keys(expectedObj)[0];\n // Find a matching actual call not yet used\n let matchedIndex = -1;\n for (let i = 0; i < (restoredCalls as any[]).length; i++) {\n if (usedActual.has(i)) continue;\n const rc = (restoredCalls as any[])[i];\n const rcName = rc?.toolName ?? rc?.name;\n if (rcName === fname) {\n matchedIndex = i;\n break;\n }\n }\n if (matchedIndex === -1) continue; // already reported as missing above\n usedActual.add(matchedIndex);\n\n const received = (restoredCalls as any[])[matchedIndex];\n const receivedArgs = summarizeArgs(received?.args);\n\n // expected parameters allowed values\n const expectedParamsAllowed = expectedObj[fname];\n const funcDesc: any = (tools as any[]).find(\n (t: any) => t.name === fname\n );\n const requiredParams = (funcDesc?.parameters?.required ??\n []) as string[];\n\n diff.push(`@@ function ${fname}`);\n\n if (expectedParamsAllowed && receivedArgs) {\n // Missing required\n for (const req of requiredParams) {\n if (!(req in receivedArgs)) {\n diff.push(`- missing required param: ${req}`);\n }\n }\n // Unexpected params\n for (const k of Object.keys(receivedArgs)) {\n if (\n !Object.prototype.hasOwnProperty.call(\n expectedParamsAllowed,\n k\n )\n ) {\n diff.push(`+ unexpected param: ${k}`);\n }\n }\n // Invalid values\n for (const k of Object.keys(receivedArgs)) {\n if (\n Object.prototype.hasOwnProperty.call(\n expectedParamsAllowed,\n k\n )\n ) {\n const allowed = expectedParamsAllowed[k];\n const got = receivedArgs[k];\n const includes =\n Array.isArray(allowed) &&\n allowed.some((v: any) => {\n try {\n if (Array.isArray(got)) {\n return (\n JSON.stringify(\n got.map(x => String(x)).sort()\n ) ===\n JSON.stringify(\n (v as any[]).map(x => String(x)).sort()\n )\n );\n }\n } catch {\n void 0;\n }\n return (\n String(v).toLowerCase().replace(/\\s+/g, \"\") ===\n String(got).toLowerCase().replace(/\\s+/g, \"\")\n );\n });\n if (!includes) {\n diff.push(`@@ param ${k}`);\n diff.push(\n `- expected one of: ${JSON.stringify(allowed)}`\n );\n diff.push(`+ got: ${JSON.stringify(got)}`);\n }\n }\n }\n }\n }\n }\n\n caseLogs.push(\n `[DEBUG-FAIL] ${JSON.stringify({\n id: testCase.id,\n message: checkerResult.error,\n error_type: checkerResult.error_type,\n expected,\n actual,\n diff,\n })}`\n );\n } catch {\n caseLogs.push(\n `[DEBUG] ${testCase.id}: failed to build debug diff`\n );\n }\n return { valid: false, logs: caseLogs };\n }\n } catch (e: any) {\n caseLogs.push(\n `[ERROR] ${testCase.id}: Model generation failed: ${e?.message}`\n );\n if (e?.stack) {\n caseLogs.push(`[STACK] ${testCase.id}: ${e.stack}`);\n }\n return { valid: false, logs: caseLogs };\n }\n };\n\n // Generic concurrency mapper\n const mapWithConcurrency = async <T, R>(\n items: T[],\n limit: number,\n mapper: (item: T, index: number) => Promise<R>\n ): Promise<R[]> => {\n const results = new Array<R>(items.length);\n let idx = 0;\n const workers = new Array(Math.min(limit, items.length))\n .fill(0)\n .map(async () => {\n while (true) {\n const current = idx++;\n if (current >= items.length) break;\n results[current] = await mapper(items[current], current);\n }\n });\n await Promise.all(workers);\n return results;\n };\n\n const resultsPerCase = await mapWithConcurrency(\n testCases,\n concurrency,\n async tc => runSingleCase(tc)\n );\n\n // Aggregate\n correctCount = resultsPerCase.reduce(\n (acc, r) => acc + (r.valid ? 1 : 0),\n 0\n );\n for (const r of resultsPerCase) logs.push(...r.logs);\n\n if (testCases.length === 0) {\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [\"No test cases found.\"],\n };\n }\n\n const score = correctCount / testCases.length;\n return {\n score,\n success: score > 0.95, // High success threshold as requested\n metrics: {\n correct_count: correctCount,\n total_cases: testCases.length,\n accuracy: score,\n },\n logs,\n };\n } catch (e: any) {\n return {\n score: 0,\n success: false,\n metrics: {},\n error: e,\n logs: [`[FATAL] Failed to run benchmark ${name}: ${e.message}`],\n };\n }\n },\n };\n}\n\n// --- Exported Benchmark Instances ---\nexport const bfclSimpleBenchmark = createBfclBenchmark(\n \"bfcl-simple\",\n \"BFCL Simple Function Calling\",\n \"BFCL_v3_simple.json\",\n \"BFCL_v3_simple_possible_answer.json\"\n);\n\nexport const bfclParallelBenchmark = createBfclBenchmark(\n \"bfcl-parallel\",\n \"BFCL Parallel Function Calling\",\n \"BFCL_v3_parallel.json\",\n \"BFCL_v3_parallel_possible_answer.json\"\n);\n\nexport const bfclMultipleBenchmark = createBfclBenchmark(\n \"bfcl-multiple\",\n \"BFCL Multiple Function Calling\",\n \"BFCL_v3_multiple.json\",\n \"BFCL_v3_multiple_possible_answer.json\"\n);\n\nexport const bfclParallelMultipleBenchmark = createBfclBenchmark(\n \"bfcl-parallel-multiple\",\n \"BFCL Parallel & Multiple Function Calling\",\n \"BFCL_v3_parallel_multiple.json\",\n \"BFCL_v3_parallel_multiple_possible_answer.json\"\n);\n","// Local ToolCall interface for type safety, as it's not exported from 'ai'.\nexport interface ToolCall {\n toolCallId: string;\n toolName: string;\n args: any;\n}\n\n// --- Type Definitions ---\ninterface FunctionDescription {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: {\n [key: string]: {\n type: string;\n description?: string;\n items?: { type: string };\n };\n };\n required: string[];\n };\n}\n\n/**\n * Standardizes a string for comparison.\n */\nfunction standardizeString(input: string): string {\n if (typeof input !== \"string\") return input;\n const regex = /[ ,./\\\\-_*^]/g;\n return input.replace(regex, \"\").toLowerCase().replace(/'/g, '\"');\n}\n\n/**\n * Checks a string value against possible answers.\n */\nfunction checkStringValue(\n param: string,\n modelValue: string,\n possibleAnswers: any[]\n): { valid: boolean; error?: string; error_type?: string } {\n const standardizedModelValue = standardizeString(modelValue);\n const standardizedPossibleAnswers = possibleAnswers.map(ans =>\n standardizeString(ans)\n );\n\n if (!standardizedPossibleAnswers.includes(standardizedModelValue)) {\n return {\n valid: false,\n error: `Invalid value for parameter '${param}': ${JSON.stringify(\n modelValue\n )}. Expected one of ${JSON.stringify(possibleAnswers)}.`,\n error_type: \"value_error:string\",\n };\n }\n return { valid: true };\n}\n\n/**\n * Main checker for a single function call.\n * Aligned with the `ai` package's `ToolCall` type.\n */\nexport function simpleFunctionChecker(\n funcDescription: FunctionDescription,\n modelToolCall: ToolCall,\n possibleAnswer: Record<string, any>\n): { valid: boolean; error?: string; error_type?: string } {\n const modelArgs = modelToolCall.args;\n const modelFuncName = modelToolCall.toolName;\n const expectedFuncName = funcDescription.name;\n const expectedParams = funcDescription.parameters.properties;\n const requiredParams = funcDescription.parameters.required;\n\n if (modelFuncName !== expectedFuncName) {\n return {\n valid: false,\n error: `Function name '${modelFuncName}' does not match expected '${expectedFuncName}'.`,\n error_type: \"simple_function_checker:wrong_func_name\",\n };\n }\n\n const possibleAnswerParams = possibleAnswer[Object.keys(possibleAnswer)[0]];\n\n for (const param of requiredParams) {\n if (!(param in modelArgs)) {\n return {\n valid: false,\n error: `Missing required parameter: '${param}'.`,\n error_type: \"simple_function_checker:missing_required\",\n };\n }\n }\n\n for (const paramName in modelArgs) {\n const modelValue = modelArgs[paramName];\n if (\n !(paramName in expectedParams) ||\n !(paramName in possibleAnswerParams)\n ) {\n return {\n valid: false,\n error: `Unexpected parameter: '${paramName}'.`,\n error_type: \"simple_function_checker:unexpected_param\",\n };\n }\n\n const possibleValues = possibleAnswerParams[paramName];\n\n if (typeof modelValue === \"string\") {\n const result = checkStringValue(paramName, modelValue, possibleValues);\n if (!result.valid) return result;\n } else if (Array.isArray(modelValue)) {\n const modelValueStr = JSON.stringify(\n modelValue.map(v => standardizeString(v.toString())).sort()\n );\n const hasMatch = possibleValues.some(\n (p: any) =>\n JSON.stringify(\n p.map((v: any) => standardizeString(v.toString())).sort()\n ) === modelValueStr\n );\n if (!hasMatch) {\n return {\n valid: false,\n error: `Invalid value for list parameter '${paramName}'. Got ${JSON.stringify(\n modelValue\n )}. Expected one of ${JSON.stringify(possibleValues)}.`,\n error_type: \"value_error:list\",\n };\n }\n } else {\n // Handle nested objects by comparing JSON representations\n const hasMatch = possibleValues.some((possibleValue: any) => {\n // Direct equality check first\n if (modelValue === possibleValue) return true;\n\n // For objects, perform deep comparison via JSON serialization\n if (\n typeof modelValue === \"object\" &&\n modelValue !== null &&\n typeof possibleValue === \"object\" &&\n possibleValue !== null\n ) {\n try {\n // Handle BFCL dataset quirk where object property values are wrapped in arrays\n // e.g. {\"min\": [300000], \"max\": [400000]} should match {\"min\": 300000, \"max\": 400000}\n const normalizeObject = (obj: any): any => {\n if (Array.isArray(obj)) {\n return obj.map(normalizeObject);\n }\n if (obj && typeof obj === \"object\") {\n const normalized: any = {};\n for (const [key, value] of Object.entries(obj)) {\n // If value is a single-element array, unwrap it\n if (\n Array.isArray(value) &&\n value.length === 1 &&\n (typeof value[0] !== \"object\" || value[0] === null)\n ) {\n normalized[key] = value[0];\n } else {\n normalized[key] = normalizeObject(value);\n }\n }\n return normalized;\n }\n return obj;\n };\n\n const normalizedModel = normalizeObject(modelValue);\n const normalizedPossible = normalizeObject(possibleValue);\n\n return (\n JSON.stringify(normalizedModel) ===\n JSON.stringify(normalizedPossible)\n );\n } catch {\n return false;\n }\n }\n\n // For numbers, handle string/number conversion\n if (\n typeof modelValue === \"number\" &&\n typeof possibleValue === \"string\"\n ) {\n return modelValue.toString() === possibleValue;\n }\n if (\n typeof modelValue === \"string\" &&\n typeof possibleValue === \"number\"\n ) {\n return modelValue === possibleValue.toString();\n }\n\n return false;\n });\n\n if (!hasMatch) {\n return {\n valid: false,\n error: `Invalid value for parameter '${paramName}'. Got ${JSON.stringify(\n modelValue\n )}. Expected one of ${JSON.stringify(possibleValues)}.`,\n error_type: \"value_error:other\",\n };\n }\n }\n }\n\n for (const paramName in possibleAnswerParams) {\n if (\n !(paramName in modelArgs) &&\n !possibleAnswerParams[paramName].includes(\"\")\n ) {\n return {\n valid: false,\n error: `Missing optional parameter '${paramName}' which was not marked as optional.`,\n error_type: \"simple_function_checker:missing_optional\",\n };\n }\n }\n\n return { valid: true };\n}\n\n/**\n * Checker for parallel function calls (order-agnostic).\n */\nexport function parallelFunctionCheckerNoOrder(\n funcDescriptions: FunctionDescription[],\n modelToolCalls: ToolCall[],\n possibleAnswers: Record<string, any>[]\n): { valid: boolean; error?: string; error_type?: string } {\n if (modelToolCalls.length !== possibleAnswers.length) {\n return {\n valid: false,\n error: `Wrong number of functions. Expected ${possibleAnswers.length}, got ${modelToolCalls.length}.`,\n error_type: \"parallel_function_checker_no_order:wrong_count\",\n };\n }\n\n const matchedModelCallIndices = new Set<number>();\n for (const possibleAnswer of possibleAnswers) {\n const expectedFuncName = Object.keys(possibleAnswer)[0];\n const funcDescription = funcDescriptions.find(\n f => f.name === expectedFuncName\n );\n\n if (!funcDescription) {\n return {\n valid: false,\n error: `Could not find function description for '${expectedFuncName}'.`,\n error_type: \"parallel_function_checker_no_order:missing_func_desc\",\n };\n }\n\n let foundMatch = false;\n for (let i = 0; i < modelToolCalls.length; i++) {\n if (matchedModelCallIndices.has(i)) continue;\n\n const checkerResult = simpleFunctionChecker(\n funcDescription,\n modelToolCalls[i],\n possibleAnswer\n );\n if (checkerResult.valid) {\n matchedModelCallIndices.add(i);\n foundMatch = true;\n break;\n }\n }\n\n if (!foundMatch) {\n return {\n valid: false,\n error: `Could not find a matching function call for '${expectedFuncName}'.`,\n error_type: \"parallel_function_checker_no_order:cannot_find_match\",\n };\n }\n }\n return { valid: true };\n}\n\n/**\n * Checker for multiple calls to the same function.\n */\nexport function multipleFunctionChecker(\n funcDescriptions: FunctionDescription[],\n modelToolCalls: ToolCall[],\n possibleAnswers: Record<string, any>[]\n): { valid: boolean; error?: string; error_type?: string } {\n if (modelToolCalls.length !== possibleAnswers.length) {\n return {\n valid: false,\n error: `Wrong number of functions. Expected ${possibleAnswers.length}, got ${modelToolCalls.length}.`,\n error_type: \"multiple_function_checker:wrong_count\",\n };\n }\n\n const expectedFuncName = Object.keys(possibleAnswers[0])[0];\n const funcDescription = funcDescriptions.find(\n f => f.name === expectedFuncName\n );\n\n if (!funcDescription) {\n return {\n valid: false,\n error: `Could not find function description for '${expectedFuncName}'.`,\n error_type: \"multiple_function_checker:missing_func_desc\",\n };\n }\n\n return simpleFunctionChecker(\n funcDescription,\n modelToolCalls[0],\n possibleAnswers[0]\n );\n}\n"],"mappings":"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","names":["colors","import_fs","import_path","path","fs","require","Ajv","fs","path","import_ai","import_fs","import_path","fs","path","name","limit"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/reporters/console.ts","../src/reporters/console.debug.ts","../src/reporters/json.ts","../src/reporters/index.ts","../src/evaluate.ts","../src/benchmarks/bfcl.ts","../src/utils/paths.ts","../src/benchmarks/bfcl/ast-checker.ts","../src/benchmarks/json-generation.ts"],"sourcesContent":["// Core evaluation function\nexport { evaluate } from \"./evaluate\";\n\n// Built-in benchmarks\nexport {\n bfclMultipleBenchmark,\n bfclParallelBenchmark,\n bfclParallelMultipleBenchmark,\n bfclSimpleBenchmark,\n} from \"./benchmarks/bfcl\";\nexport {\n jsonGenerationBenchmark,\n jsonGenerationSchemaOnlyBenchmark,\n} from \"./benchmarks/json-generation\";\n\n// Core interfaces for custom benchmarks\nexport type {\n BenchmarkResult,\n EvaluateOptions,\n LanguageModelV2Benchmark,\n ReporterType,\n} from \"./interfaces\";\n","import { EvaluationResult } from \"@/interfaces\";\n\n// Basic ANSI color codes for console output\nconst colors = {\n reset: \"\\x1b[0m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n magenta: \"\\x1b[35m\",\n gray: \"\\x1b[90m\",\n};\n\nfunction printResult(result: EvaluationResult) {\n const { model, modelKey, benchmark, result: benchmarkResult } = result;\n const status = benchmarkResult.success\n ? `${colors.green}✔ SUCCESS${colors.reset}`\n : `${colors.red}✖ FAILURE${colors.reset}`;\n\n console.log(\n `\\n ${colors.cyan}[${model}]${colors.reset}${modelKey ? ` ${colors.gray}(${modelKey})${colors.reset}` : \"\"} - ${colors.magenta}${benchmark}${colors.reset}`\n );\n console.log(\n ` └ ${status} | Score: ${colors.yellow}${benchmarkResult.score.toFixed(2)}${colors.reset}`\n );\n\n const metrics = Object.entries(benchmarkResult.metrics);\n if (metrics.length > 0) {\n console.log(\" Metrics:\");\n for (const [key, value] of metrics) {\n console.log(` - ${key}: ${value}`);\n }\n }\n\n if (benchmarkResult.error) {\n console.log(\n ` ${colors.red}Error: ${benchmarkResult.error.message}${colors.reset}`\n );\n }\n}\n\nexport function consoleReporter(results: EvaluationResult[]): void {\n console.log(\"\\n--- 📊 Evaluation Report ---\");\n for (const result of results) {\n printResult(result);\n }\n console.log(\"\\n---------------------------\\n\");\n}\n","import { EvaluationResult } from \"@/interfaces\";\n\nconst colors = {\n reset: \"\\x1b[0m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n cyan: \"\\x1b[36m\",\n magenta: \"\\x1b[35m\",\n gray: \"\\x1b[90m\",\n bold: \"\\x1b[1m\",\n underline: \"\\x1b[4m\",\n};\n\nfunction colorizeDiffLine(line: string): string {\n if (line.startsWith(\"+\")) return `${colors.green}${line}${colors.reset}`;\n if (line.startsWith(\"-\")) return `${colors.red}${line}${colors.reset}`;\n if (line.startsWith(\"@\"))\n return `${colors.cyan}${colors.bold}${line}${colors.reset}`;\n return line;\n}\n\nfunction uniqueLines(lines: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const l of lines) {\n if (seen.has(l)) continue;\n seen.add(l);\n out.push(l);\n }\n return out;\n}\n\nfunction suggestFixFromDiff(parsed: unknown): string[] {\n const suggestions: string[] = [];\n const { error_type, expected, actual, diff } =\n (parsed as Record<string, unknown>) ?? {};\n\n if (\n (Array.isArray(diff) &&\n diff.some((d: unknown) => String(d).includes(\"function name\"))) ||\n (Array.isArray(diff) &&\n diff.some((d: unknown) => String(d).includes(\"missing function:\")))\n ) {\n const expectedName = (expected as Record<string, unknown> | undefined)\n ?.function as string | undefined;\n const actualName = (actual as Record<string, unknown> | undefined)\n ?.function as string | undefined;\n if (expectedName && actualName && expectedName !== actualName) {\n suggestions.push(\n `Call the function '${expectedName}' instead of '${actualName}'.`\n );\n }\n if (Array.isArray((expected as Record<string, unknown>)?.functions)) {\n suggestions.push(\n `Ensure tool calls include: ${((expected as Record<string, unknown>).functions as string[]).join(\", \")}.`\n );\n }\n }\n\n if (\n Array.isArray(diff) &&\n diff.some((d: unknown) => String(d).startsWith(\"- missing required param:\"))\n ) {\n const missing = diff\n .filter((d: unknown) => String(d).startsWith(\"- missing required param:\"))\n .map((d: unknown) => String(d).replace(\"- missing required param: \", \"\"));\n if (missing.length) {\n suggestions.push(`Add required parameter(s): ${missing.join(\", \")}.`);\n }\n }\n\n if (\n Array.isArray(diff) &&\n diff.some((d: unknown) => String(d).startsWith(\"+ unexpected param:\"))\n ) {\n const extras = diff\n .filter((d: unknown) => String(d).startsWith(\"+ unexpected param:\"))\n .map((d: unknown) => String(d).replace(\"+ unexpected param: \", \"\"));\n if (extras.length) {\n suggestions.push(`Remove unexpected parameter(s): ${extras.join(\", \")}.`);\n }\n }\n\n if (\n Array.isArray(diff) &&\n diff.some((d: unknown) => String(d).startsWith(\"@@ param \"))\n ) {\n const targets = diff\n .filter((d: unknown) => String(d).startsWith(\"@@ param \"))\n .map((d: unknown) => String(d).replace(\"@@ param \", \"\"));\n for (const param of targets) {\n const allowedLine = (diff as unknown[]).find((d: unknown) =>\n String(d).startsWith(\"- expected one of:\")\n ) as string | undefined;\n if (allowedLine) {\n const allowed = allowedLine.replace(\"- expected one of: \", \"\");\n suggestions.push(`Set '${param}' to one of: ${allowed}.`);\n } else {\n suggestions.push(`Adjust '${param}' to an allowed value.`);\n }\n }\n }\n\n if (suggestions.length === 0 && typeof error_type === \"string\") {\n if (error_type.includes(\"missing_required\")) {\n suggestions.push(\n \"Add all required parameters defined by the tool schema.\"\n );\n } else if (error_type.includes(\"unexpected_param\")) {\n suggestions.push(\"Remove parameters not present in the tool schema.\");\n } else if (error_type.includes(\"wrong_count\")) {\n suggestions.push(\n \"Adjust the number of tool calls to match expected count.\"\n );\n } else if (error_type.includes(\"wrong_func_name\")) {\n suggestions.push(\"Use the exact expected function name from the schema.\");\n } else if (error_type.includes(\"value_error\")) {\n suggestions.push(\"Choose a value from the allowed options.\");\n }\n }\n\n return uniqueLines(suggestions);\n}\n\nexport function consoleDebugReporter(results: EvaluationResult[]): void {\n console.log(\"\\n--- 📊 Evaluation Report (debug) ---\");\n for (const r of results) {\n const { model, modelKey, benchmark, result } = r;\n const status = result.success\n ? `${colors.green}✔ SUCCESS${colors.reset}`\n : `${colors.red}✖ FAILURE${colors.reset}`;\n\n console.log(\n `\\n ${colors.cyan}[${model}]${colors.reset}${modelKey ? ` ${colors.gray}(${modelKey})${colors.reset}` : \"\"} - ${colors.magenta}${benchmark}${colors.reset}`\n );\n console.log(\n ` └ ${status} | Score: ${colors.yellow}${result.score.toFixed(2)}${colors.reset}`\n );\n\n const metrics = Object.entries(result.metrics);\n if (metrics.length > 0) {\n console.log(\" Metrics:\");\n for (const [k, v] of metrics) console.log(` - ${k}: ${v}`);\n }\n\n if (result.logs && result.logs.length) {\n // Print only failure-related logs prominently. Pass logs stay compact.\n const failLogs = result.logs.filter(\n l =>\n l.startsWith(\"[FAIL]\") ||\n l.startsWith(\"[ERROR]\") ||\n l.startsWith(\"[FATAL]\") ||\n l.startsWith(\"[STACK]\") ||\n l.startsWith(\"[DEBUG-FAIL]\")\n );\n const hasFails = failLogs.length > 0;\n if (hasFails) {\n console.log(` ${colors.bold}Failure details:${colors.reset}`);\n // Build set of IDs that have structured debug entries to prevent duplicate prints\n const debugIds = new Set<string>();\n for (const l of failLogs) {\n if (l.startsWith(\"[DEBUG-FAIL]\")) {\n try {\n const parsed = JSON.parse(l.replace(/^\\[DEBUG-FAIL\\] /, \"\"));\n if (parsed?.id) debugIds.add(String(parsed.id));\n } catch {\n // ignore JSON parse errors for debug lines\n }\n }\n }\n for (const line of failLogs) {\n // Highlight test id and reasons\n if (line.startsWith(\"[FAIL]\")) {\n // Skip duplicate [FAIL] if we also have a [DEBUG-FAIL] for same id\n const m = line.match(/^\\[FAIL\\]\\s+([^:]+):/);\n const failId = m?.[1];\n if (failId && debugIds.has(failId)) continue;\n console.log(` ${colors.red}${line}${colors.reset}`);\n } else if (line.startsWith(\"[ERROR]\") || line.startsWith(\"[FATAL]\")) {\n console.log(` ${colors.yellow}${line}${colors.reset}`);\n } else if (line.startsWith(\"[STACK]\")) {\n console.log(` ${colors.gray}${line}${colors.reset}`);\n } else if (line.startsWith(\"[DEBUG-FAIL]\")) {\n // Attempt to pretty print embedded diffs\n const payload = line.replace(/^\\[DEBUG-FAIL\\] /, \"\");\n try {\n const parsed = JSON.parse(payload);\n const { id, expected, actual, message, diff } = parsed;\n console.log(\n ` ${colors.underline}${id}${colors.reset} ${message ? \"- \" + message : \"\"}`\n );\n if (diff && Array.isArray(diff)) {\n for (const dLine of diff)\n console.log(\" \" + colorizeDiffLine(dLine));\n } else {\n console.log(\" expected:\");\n console.log(\n colors.green +\n \" \" +\n JSON.stringify(expected, null, 2)\n .split(\"\\n\")\n .join(\"\\n \") +\n colors.reset\n );\n console.log(\" actual:\");\n console.log(\n colors.red +\n \" \" +\n JSON.stringify(actual, null, 2)\n .split(\"\\n\")\n .join(\"\\n \") +\n colors.reset\n );\n }\n const suggestions = suggestFixFromDiff(parsed);\n if (suggestions.length) {\n console.log(\n ` ${colors.bold}Suggested fix:${colors.reset}`\n );\n for (const s of suggestions) console.log(` • ${s}`);\n }\n } catch {\n console.log(` ${line}`);\n }\n }\n }\n } else {\n // Compact debug lines on success\n const info = result.logs.filter(\n l => l.startsWith(\"[INFO]\") || l.startsWith(\"[PASS]\")\n );\n for (const line of info)\n console.log(` ${colors.gray}${line}${colors.reset}`);\n }\n }\n }\n\n console.log(\"\\n------------------------------------\\n\");\n}\n","import { EvaluationResult } from \"@/interfaces\";\n\nexport function jsonReporter(results: EvaluationResult[]): void {\n // Output the raw results array as a JSON string.\n // The 'error' object is converted to a string for serialization.\n const serializableResults = results.map(r => ({\n ...r,\n result: {\n ...r.result,\n error: r.result.error?.message,\n },\n }));\n console.log(JSON.stringify(serializableResults, null, 2));\n}\n","import { EvaluationResult, ReporterType } from \"@/interfaces\";\n\nimport { consoleReporter } from \"./console\";\nimport { consoleDebugReporter } from \"./console.debug\";\nimport { jsonReporter } from \"./json\";\n\nexport const reporters: Record<\n ReporterType,\n (results: EvaluationResult[]) => void\n> = {\n console: consoleReporter,\n json: jsonReporter,\n \"console.debug\": consoleDebugReporter,\n};\n","import { LanguageModel } from \"ai\";\n\nimport {\n EvaluateOptions,\n EvaluationResult,\n LanguageModelV2Benchmark,\n} from \"./interfaces\";\nimport { reporters } from \"./reporters\";\n\nasync function runSingleBenchmark(\n model: LanguageModel,\n benchmark: LanguageModelV2Benchmark,\n modelKey?: string,\n config?: Record<string, unknown>\n): Promise<EvaluationResult> {\n const modelId =\n typeof model === \"object\" &&\n model !== null &&\n \"modelId\" in model &&\n typeof model.modelId === \"string\"\n ? model.modelId\n : \"unknown-model\";\n\n try {\n console.log(\n `[${modelId}]${modelKey ? ` (${modelKey})` : \"\"} Running benchmark: ${benchmark.name}...`\n );\n const result = await benchmark.run(model, config);\n console.log(\n `[${modelId}]${modelKey ? ` (${modelKey})` : \"\"} Finished benchmark: ${benchmark.name}. Score: ${result.score}`\n );\n return {\n model: modelId,\n modelKey,\n benchmark: benchmark.name,\n result,\n };\n } catch (error) {\n console.error(\n `[${modelId}]${modelKey ? ` (${modelKey})` : \"\"} Error running benchmark: ${benchmark.name}`,\n error\n );\n return {\n model: modelId,\n modelKey,\n benchmark: benchmark.name,\n result: {\n score: 0,\n success: false,\n metrics: {},\n error: error instanceof Error ? error : new Error(String(error)),\n },\n };\n }\n}\n\nexport async function evaluate(\n options: EvaluateOptions\n): Promise<EvaluationResult[]> {\n const { models, benchmarks, reporter = \"console\", temperature } = options;\n\n const modelEntries: Array<[string | undefined, LanguageModel]> = [];\n if (Array.isArray(models)) {\n for (const m of models) modelEntries.push([undefined, m]);\n } else if (\n typeof models === \"object\" &&\n models !== null &&\n \"modelId\" in (models as Record<string, unknown>)\n ) {\n modelEntries.push([undefined, models as unknown as LanguageModel]);\n } else {\n for (const [key, m] of Object.entries(\n models as Record<string, LanguageModel>\n )) {\n modelEntries.push([key, m]);\n }\n }\n const allResults: EvaluationResult[] = [];\n\n for (const [modelKey, model] of modelEntries) {\n for (const benchmark of benchmarks) {\n const evaluationResult = await runSingleBenchmark(\n model,\n benchmark,\n modelKey,\n temperature !== undefined ? { temperature } : undefined\n );\n allResults.push(evaluationResult);\n }\n }\n\n const report = reporters[reporter];\n if (report) {\n report(allResults);\n } else {\n console.warn(`Unknown reporter: '${reporter}'. Defaulting to console.`);\n reporters.console(allResults);\n }\n\n return allResults;\n}\n","import { generateText, jsonSchema, LanguageModel, tool } from \"ai\";\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\n\nimport { BenchmarkResult, LanguageModelV2Benchmark } from \"@/interfaces\";\nimport { resolveDataDir } from \"@/utils/paths\";\n\nimport {\n FunctionDescription,\n multipleFunctionChecker,\n parallelFunctionCheckerNoOrder,\n simpleFunctionChecker,\n ToolCall,\n} from \"./bfcl/ast-checker\";\n\n// Resolve data files relative to this module using ESM-safe utilities\n\n// --- Interfaces ---\ninterface ToolSchemaObject {\n type: string;\n properties?: Record<string, unknown>;\n items?: unknown;\n required?: string[];\n [key: string]: unknown;\n}\n\ninterface ToolSpec {\n name: string;\n description?: string;\n parameters: ToolSchemaObject;\n}\n\ntype Message = { role: string; content: string };\n\ninterface TestCase {\n id: string;\n question: Message[] | Message[][];\n function: ToolSpec[];\n}\n\ninterface TransformedTool {\n type: \"function\";\n name: string;\n description?: string;\n inputSchema: ToolSchemaObject;\n}\n\ninterface PossibleAnswer {\n id: string;\n ground_truth: unknown;\n}\n\n// --- Generic Checker Dispatcher ---\nfunction check(\n testCase: TestCase,\n modelOutput: unknown, // This is an array of tool_calls\n possibleAnswer: PossibleAnswer\n): { valid: boolean; error?: string; error_type?: string } {\n const category = testCase.id.split(\"_\")[0];\n\n try {\n if (category === \"simple\") {\n if (!Array.isArray(modelOutput) || modelOutput.length !== 1) {\n return {\n valid: false,\n error: `Expected 1 function call, but got ${Array.isArray(modelOutput) ? modelOutput.length : 0}.`,\n error_type: \"simple:wrong_count\",\n };\n }\n return simpleFunctionChecker(\n testCase.function[0] as unknown as FunctionDescription,\n modelOutput[0] as ToolCall,\n (possibleAnswer.ground_truth as Array<Record<string, unknown>>)[0]\n );\n } else if (category === \"parallel\") {\n return parallelFunctionCheckerNoOrder(\n testCase.function as unknown as FunctionDescription[],\n modelOutput as ToolCall[],\n possibleAnswer.ground_truth as Array<Record<string, unknown>>\n );\n } else if (category === \"multiple\") {\n return multipleFunctionChecker(\n testCase.function as unknown as FunctionDescription[],\n modelOutput as ToolCall[],\n possibleAnswer.ground_truth as Array<Record<string, unknown>>\n );\n } else if (category.includes(\"parallel-multiple\")) {\n // parallel-multiple is just a more complex parallel case\n return parallelFunctionCheckerNoOrder(\n testCase.function as unknown as FunctionDescription[],\n modelOutput as ToolCall[],\n possibleAnswer.ground_truth as Array<Record<string, unknown>>\n );\n }\n\n // Default for unimplemented categories (like multi_turn)\n // As per user request, we are deferring multi-turn.\n return { valid: true }; // Pass to not fail the whole benchmark\n } catch (e: unknown) {\n return {\n valid: false,\n error: `Checker Error: ${(e as Error).message}`,\n error_type: \"checker_error\",\n };\n }\n}\n\n// --- Generic Benchmark Runner Factory ---\nfunction createBfclBenchmark(\n name: string,\n description: string,\n testDataFile: string,\n answerDataFile: string\n): LanguageModelV2Benchmark {\n return {\n name,\n version: \"1.0.0\",\n description,\n async run(\n model: LanguageModel,\n config?: Record<string, unknown>\n ): Promise<BenchmarkResult> {\n const logs: string[] = [];\n let correctCount = 0;\n let testCases: TestCase[] = [];\n\n try {\n // Resolve data directory in a way that works both in monorepo and when installed as a dependency.\n const dataPath = resolveDataDir();\n logs.push(`[INFO] Using data dir: ${dataPath}`);\n const testCasesJson = await fs.readFile(\n path.join(dataPath, testDataFile),\n \"utf-8\"\n );\n const possibleAnswersJson = await fs.readFile(\n path.join(dataPath, answerDataFile),\n \"utf-8\"\n );\n\n // The BFCL datasets are in JSON Lines (NDJSON) format: one JSON object per line.\n // Parse them line-by-line instead of as a single JSON value.\n testCases = testCasesJson\n .split(/\\r?\\n/)\n .filter(line => line.trim().length > 0)\n .map(line => JSON.parse(line));\n const possibleAnswers: PossibleAnswer[] = possibleAnswersJson\n .split(/\\r?\\n/)\n .filter(line => line.trim().length > 0)\n .map(line => JSON.parse(line));\n const possibleAnswersMap = new Map(\n possibleAnswers.map(ans => [ans.id, ans])\n );\n\n // Optional: limit number of test cases via env for faster local runs\n const limitEnv = process.env.BFCL_LIMIT;\n const limit = limitEnv ? Number(limitEnv) : undefined;\n if (limit && Number.isFinite(limit) && limit > 0) {\n testCases = testCases.slice(0, limit);\n logs.push(\n `[INFO] Limiting test cases to ${limit} due to BFCL_LIMIT.`\n );\n }\n\n // Helper: fix BFCL JSON schema types to OpenAI-compatible JSON Schema\n const fixSchema = (schema: unknown): unknown => {\n if (!schema || typeof schema !== \"object\")\n return { type: \"object\", properties: {} };\n const copy: ToolSchemaObject | unknown[] = Array.isArray(schema)\n ? (schema as unknown[]).map(v => fixSchema(v))\n : ({ ...(schema as Record<string, unknown>) } as ToolSchemaObject);\n if (!Array.isArray(copy)) {\n if (copy.type) {\n if (copy.type === \"dict\") copy.type = \"object\";\n if (copy.type === \"integer\" || copy.type === \"float\")\n copy.type = \"number\";\n }\n if (copy.properties && typeof copy.properties === \"object\") {\n for (const k of Object.keys(copy.properties)) {\n (copy.properties as Record<string, unknown>)[k] = fixSchema(\n (copy.properties as Record<string, unknown>)[k]\n );\n }\n }\n if (copy.items) copy.items = fixSchema(copy.items);\n return copy;\n }\n return copy;\n };\n\n // Concurrency control via env BFCL_CONCURRENCY (default 4)\n const concurrencyEnv = process.env.BFCL_CONCURRENCY;\n const concurrency =\n concurrencyEnv && Number.isFinite(Number(concurrencyEnv))\n ? Math.max(1, Number(concurrencyEnv))\n : 4;\n logs.push(\n `[INFO] Running ${testCases.length} test cases with concurrency=${concurrency}`\n );\n\n // Per-test runner that does not throw and returns its own logs\n const runSingleCase = async (\n testCase: TestCase\n ): Promise<{ valid: boolean; logs: string[] }> => {\n const caseLogs: string[] = [];\n const { function: tools, question: messages } = testCase;\n const temp = config?.temperature;\n const temperature = typeof temp === \"number\" ? temp : undefined;\n\n try {\n // Flatten BFCL message shape [[{role, content}], ...] to [{role, content}, ...]\n const flatMessages =\n Array.isArray(messages) &&\n (messages as unknown[]).some(m => Array.isArray(m))\n ? (messages as unknown[] as Message[][]).flat(1)\n : (messages as Message[]);\n\n // Build tools array (LanguageModelV2FunctionTool[]) for middleware compatibility\n // Keep a mapping sanitized -> original to restore before checking\n const nameMap = new Map<string, string>();\n const sanitizeName = (name: string) => {\n // OpenAI-compatible: letters, digits, underscores and dashes, max 64\n const s = name.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64);\n return s.length > 0 ? s : \"tool\";\n };\n\n const transformedTools: TransformedTool[] = (\n tools as ToolSpec[]\n ).map(t => {\n const fixed = fixSchema(t.parameters);\n // Ensure we always provide a valid JSON Schema object of type 'object'\n const isObjectSchema =\n fixed &&\n typeof fixed === \"object\" &&\n (fixed as ToolSchemaObject).type === \"object\";\n const inputSchema: ToolSchemaObject = isObjectSchema\n ? (fixed as ToolSchemaObject)\n : { type: \"object\", properties: {} };\n\n const sanitized = sanitizeName(t.name);\n nameMap.set(sanitized, t.name);\n\n return {\n type: \"function\" as const,\n name: sanitized,\n description: t.description,\n inputSchema: inputSchema,\n };\n });\n\n // Convert to ToolSet expected by generateText\n const toolsMap = Object.fromEntries(\n transformedTools.map(t => [\n t.name,\n tool({\n description:\n typeof t.description === \"string\"\n ? t.description\n : undefined,\n inputSchema: jsonSchema(t.inputSchema as unknown as any),\n }),\n ])\n );\n\n // Debug: record first tool object and schema type\n try {\n const firstTool = transformedTools[0];\n const schemaType =\n (firstTool as any)?.inputSchema?.type ??\n (firstTool as any)?.inputSchema?.jsonSchema?.type;\n caseLogs.push(\n `[DEBUG] ${testCase.id}: firstTool=${JSON.stringify(firstTool)}, schemaType=${schemaType}`\n );\n } catch (e: unknown) {\n caseLogs.push(\n `[DEBUG] ${testCase.id}: failed to introspect tools: ${(e as Error).message}`\n );\n }\n\n const { toolCalls, text, finishReason } = await generateText({\n model,\n messages: flatMessages as unknown as any,\n tools: toolsMap,\n toolChoice: \"auto\",\n ...(temperature !== undefined ? { temperature } : {}),\n // Pass original schema information to middleware\n providerOptions: {\n toolCallMiddleware: {\n originalToolSchemas: Object.fromEntries(\n transformedTools.map(t => [\n t.name,\n t.inputSchema as unknown as any,\n ])\n ),\n },\n },\n });\n\n // Debug: raw toolCalls\n try {\n caseLogs.push(\n `[DEBUG] ${testCase.id}: rawToolCalls=${JSON.stringify(toolCalls)}, finishReason=${finishReason}, text=${JSON.stringify(text)}`\n );\n } catch {\n caseLogs.push(\n `[DEBUG] ${testCase.id}: failed to serialize toolCalls`\n );\n }\n\n const possibleAnswer = possibleAnswersMap.get(testCase.id);\n if (!possibleAnswer) {\n throw new Error(`No possible answer for id: ${testCase.id}`);\n }\n\n // Restore original tool names in toolCalls before checking\n const restoredCalls = (toolCalls || []).map((c: any) => {\n const rawName = (c as any).toolName ?? (c as any).name;\n // Some providers (e.g., response-format models) may encode tool name as a numeric index string\n const sanitizedFromIndex =\n typeof rawName === \"string\" && /^\\d+$/.test(rawName)\n ? (transformedTools[Number(rawName)]?.name ?? rawName)\n : rawName;\n const originalName =\n nameMap.get(sanitizedFromIndex) ?? sanitizedFromIndex;\n const extractedArgs =\n (c as any).args ??\n (c as any).arguments ??\n (c as any).input ??\n (c as any).params ??\n (c as any).parameters ??\n undefined;\n let parsedArgs = extractedArgs;\n if (typeof parsedArgs === \"string\") {\n try {\n parsedArgs = JSON.parse(parsedArgs);\n } catch {\n // leave as string if not JSON\n }\n }\n return {\n ...c,\n toolName: originalName,\n name: originalName,\n args: parsedArgs ?? {},\n };\n });\n\n const checkerResult = check(\n testCase,\n restoredCalls,\n possibleAnswer\n );\n\n if (checkerResult.valid) {\n caseLogs.push(`[PASS] ${testCase.id}`);\n return { valid: true, logs: caseLogs };\n } else {\n caseLogs.push(`[FAIL] ${testCase.id}: ${checkerResult.error}`);\n try {\n // Build a compact expectation/actual summary and a human-friendly diff\n const category = testCase.id.split(\"_\")[0];\n const diff: string[] = [];\n const summarizeArgs = (args: unknown): unknown => {\n if (args == null) return args;\n if (typeof args !== \"object\") return args;\n // Sort object keys for stable output\n return Object.keys(args)\n .sort()\n .reduce(\n (acc: Record<string, unknown>, k) => {\n acc[k] = (args as Record<string, unknown>)[k];\n return acc;\n },\n {} as Record<string, unknown>\n );\n };\n\n const expected: Record<string, unknown> = {};\n const actual: Record<string, unknown> = {};\n\n if (category === \"simple\") {\n const funcDesc = (tools as ToolSpec[])[0];\n const gt = (possibleAnswer as { ground_truth?: unknown[] })\n .ground_truth?.[0] as Record<string, unknown> | undefined;\n const expectedFuncName = funcDesc?.name;\n const expectedParams = gt\n ? gt[Object.keys(gt)[0]]\n : undefined;\n const received = (restoredCalls as any[])[0];\n const receivedName = received?.toolName ?? received?.name;\n const receivedArgs = summarizeArgs(received?.args);\n\n expected.function = expectedFuncName;\n expected.params = expectedParams;\n actual.function = receivedName;\n actual.args = receivedArgs;\n\n if (expectedFuncName !== receivedName) {\n diff.push(`@@ function name`);\n diff.push(`- ${expectedFuncName}`);\n diff.push(`+ ${receivedName}`);\n }\n if (\n expectedParams &&\n receivedArgs &&\n typeof receivedArgs === \"object\" &&\n receivedArgs !== null\n ) {\n const required = (funcDesc?.parameters?.required ??\n []) as string[];\n // Missing required\n for (const req of required) {\n if (!(req in receivedArgs)) {\n diff.push(`- missing required param: ${req}`);\n }\n }\n // Unexpected\n for (const k of Object.keys(\n receivedArgs as Record<string, unknown>\n )) {\n if (\n !Object.prototype.hasOwnProperty.call(expectedParams, k)\n ) {\n diff.push(`+ unexpected param: ${k}`);\n }\n }\n // Invalid values\n for (const k of Object.keys(\n receivedArgs as Record<string, unknown>\n )) {\n if (\n Object.prototype.hasOwnProperty.call(expectedParams, k)\n ) {\n const allowed = (\n expectedParams as Record<string, unknown[]>\n )[k];\n const got = (receivedArgs as Record<string, unknown>)[\n k\n ];\n const includes =\n Array.isArray(allowed) &&\n allowed.some((v: unknown) => {\n try {\n if (Array.isArray(got)) {\n return (\n JSON.stringify(\n got.map(x => String(x)).sort()\n ) ===\n JSON.stringify(\n (v as unknown[]).map(x => String(x)).sort()\n )\n );\n }\n } catch {\n void 0;\n }\n return (\n String(v).toLowerCase().replace(/\\s+/g, \"\") ===\n String(got).toLowerCase().replace(/\\s+/g, \"\")\n );\n });\n if (!includes) {\n diff.push(`@@ param ${k}`);\n diff.push(\n `- expected one of: ${JSON.stringify(allowed)}`\n );\n diff.push(`+ got: ${JSON.stringify(got)}`);\n }\n }\n }\n }\n } else {\n // Parallel / multiple: show function name sets and param-level diffs per matched function\n const gtArr: Array<Record<string, unknown>> =\n (\n possibleAnswer as {\n ground_truth?: Array<Record<string, unknown>>;\n }\n ).ground_truth ?? [];\n const expectedNames = gtArr.map(g => Object.keys(g)[0]);\n const actualNames = (restoredCalls as any[]).map(\n c => c.toolName ?? c.name\n );\n expected.functions = expectedNames;\n actual.functions = actualNames;\n\n if (expectedNames.length !== actualNames.length) {\n diff.push(`@@ call count`);\n diff.push(`- expected ${expectedNames.length}`);\n diff.push(`+ got ${actualNames.length}`);\n }\n\n const missing = expectedNames.filter(\n n => !actualNames.includes(n)\n );\n const extra = actualNames.filter(\n n => !expectedNames.includes(n)\n );\n for (const m of missing)\n diff.push(`- missing function: ${m}`);\n for (const e of extra)\n diff.push(`+ unexpected function: ${e}`);\n\n // Attempt to compute param-level diffs for functions that exist in both expected and actual\n const usedActual = new Set<number>();\n for (const expectedObj of gtArr) {\n const fname = Object.keys(expectedObj)[0];\n // Find a matching actual call not yet used\n let matchedIndex = -1;\n for (let i = 0; i < (restoredCalls as any[]).length; i++) {\n if (usedActual.has(i)) continue;\n const rc = (restoredCalls as any[])[i];\n const rcName = rc?.toolName ?? rc?.name;\n if (rcName === fname) {\n matchedIndex = i;\n break;\n }\n }\n if (matchedIndex === -1) continue; // already reported as missing above\n usedActual.add(matchedIndex);\n\n const received = (restoredCalls as any[])[matchedIndex];\n const receivedArgs = summarizeArgs(received?.args);\n\n // expected parameters allowed values\n const expectedParamsAllowed = expectedObj[fname] as Record<\n string,\n unknown\n >;\n const funcDesc = (tools as ToolSpec[]).find(\n (t: ToolSpec) => t.name === fname\n );\n const requiredParams = (funcDesc?.parameters?.required ??\n []) as string[];\n\n diff.push(`@@ function ${fname}`);\n\n if (\n expectedParamsAllowed &&\n receivedArgs &&\n typeof receivedArgs === \"object\" &&\n receivedArgs !== null\n ) {\n // Missing required\n for (const req of requiredParams) {\n if (!(req in receivedArgs)) {\n diff.push(`- missing required param: ${req}`);\n }\n }\n // Unexpected params\n for (const k of Object.keys(\n receivedArgs as Record<string, unknown>\n )) {\n if (\n !Object.prototype.hasOwnProperty.call(\n expectedParamsAllowed,\n k\n )\n ) {\n diff.push(`+ unexpected param: ${k}`);\n }\n }\n // Invalid values\n for (const k of Object.keys(\n receivedArgs as Record<string, unknown>\n )) {\n if (\n Object.prototype.hasOwnProperty.call(\n expectedParamsAllowed,\n k\n )\n ) {\n const allowed = (\n expectedParamsAllowed as Record<string, unknown[]>\n )[k];\n const got = (receivedArgs as Record<string, unknown>)[\n k\n ];\n const includes =\n Array.isArray(allowed) &&\n allowed.some((v: unknown) => {\n try {\n if (Array.isArray(got)) {\n return (\n JSON.stringify(\n got.map(x => String(x)).sort()\n ) ===\n JSON.stringify(\n (v as unknown[])\n .map(x => String(x))\n .sort()\n )\n );\n }\n } catch {\n void 0;\n }\n return (\n String(v).toLowerCase().replace(/\\s+/g, \"\") ===\n String(got).toLowerCase().replace(/\\s+/g, \"\")\n );\n });\n if (!includes) {\n diff.push(`@@ param ${k}`);\n diff.push(\n `- expected one of: ${JSON.stringify(allowed)}`\n );\n diff.push(`+ got: ${JSON.stringify(got)}`);\n }\n }\n }\n }\n }\n }\n\n caseLogs.push(\n `[DEBUG-FAIL] ${JSON.stringify({\n id: testCase.id,\n message: checkerResult.error,\n error_type: checkerResult.error_type,\n expected,\n actual,\n diff,\n })}`\n );\n } catch {\n caseLogs.push(\n `[DEBUG] ${testCase.id}: failed to build debug diff`\n );\n }\n return { valid: false, logs: caseLogs };\n }\n } catch (e: any) {\n caseLogs.push(\n `[ERROR] ${testCase.id}: Model generation failed: ${e?.message}`\n );\n if (e?.stack) {\n caseLogs.push(`[STACK] ${testCase.id}: ${e.stack}`);\n }\n return { valid: false, logs: caseLogs };\n }\n };\n\n // Generic concurrency mapper\n const mapWithConcurrency = async <T, R>(\n items: T[],\n limit: number,\n mapper: (item: T, index: number) => Promise<R>\n ): Promise<R[]> => {\n const results = new Array<R>(items.length);\n let idx = 0;\n const workers = new Array(Math.min(limit, items.length))\n .fill(0)\n .map(async () => {\n while (true) {\n const current = idx++;\n if (current >= items.length) break;\n results[current] = await mapper(items[current], current);\n }\n });\n await Promise.all(workers);\n return results;\n };\n\n const resultsPerCase = await mapWithConcurrency(\n testCases,\n concurrency,\n async tc => runSingleCase(tc)\n );\n\n // Aggregate\n correctCount = resultsPerCase.reduce(\n (acc, r) => acc + (r.valid ? 1 : 0),\n 0\n );\n for (const r of resultsPerCase) logs.push(...r.logs);\n\n if (testCases.length === 0) {\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [\"No test cases found.\"],\n };\n }\n\n const score = correctCount / testCases.length;\n return {\n score,\n success: score > 0.95, // High success threshold as requested\n metrics: {\n correct_count: correctCount,\n total_cases: testCases.length,\n accuracy: score,\n },\n logs,\n };\n } catch (e: any) {\n return {\n score: 0,\n success: false,\n metrics: {},\n error: e,\n logs: [`[FATAL] Failed to run benchmark ${name}: ${e.message}`],\n };\n }\n },\n };\n}\n\n// --- Exported Benchmark Instances ---\nexport const bfclSimpleBenchmark = createBfclBenchmark(\n \"bfcl-simple\",\n \"BFCL Simple Function Calling\",\n \"BFCL_v3_simple.json\",\n \"BFCL_v3_simple_possible_answer.json\"\n);\n\nexport const bfclParallelBenchmark = createBfclBenchmark(\n \"bfcl-parallel\",\n \"BFCL Parallel Function Calling\",\n \"BFCL_v3_parallel.json\",\n \"BFCL_v3_parallel_possible_answer.json\"\n);\n\nexport const bfclMultipleBenchmark = createBfclBenchmark(\n \"bfcl-multiple\",\n \"BFCL Multiple Function Calling\",\n \"BFCL_v3_multiple.json\",\n \"BFCL_v3_multiple_possible_answer.json\"\n);\n\nexport const bfclParallelMultipleBenchmark = createBfclBenchmark(\n \"bfcl-parallel-multiple\",\n \"BFCL Parallel & Multiple Function Calling\",\n \"BFCL_v3_parallel_multiple.json\",\n \"BFCL_v3_parallel_multiple_possible_answer.json\"\n);\n","import fs from \"fs\";\nimport { createRequire } from \"module\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\n/**\n * Resolve the directory that holds the eval datasets.\n * Order:\n * 1) BFCL_DATA_DIR env var override\n * 2) Resolve the installed package root via require.resolve(\"@ai-sdk-tool/eval\") and use its sibling 'data'\n * 3) Resolve the installed package root via require.resolve(\"@ai-sdk-tool/eval/package.json\") and use its sibling 'data'\n * 4) Walk up from current module location to find nearest sibling 'data' directory\n * 5) Fallback to package-root/data assuming dist/benchmarks depth or cwd\n * 3) Walk up from current module location to find nearest sibling 'data' directory\n * 4) Fallback to package-root/data assuming dist/benchmarks depth or cwd\n */\nexport function resolveDataDir(fromModuleUrl?: string): string {\n // 0) Use provided module URL when available; otherwise rely on require/cwd fallbacks (avoids import.meta in CJS)\n const moduleUrl = fromModuleUrl;\n\n // 1) Explicit override\n const override = process.env.BFCL_DATA_DIR;\n if (override && override.trim().length > 0) {\n return override;\n }\n\n // 2) Resolve via installed package location (works with pnpm workspaces and published package)\n try {\n // Prefer resolving the package main entry (exported by package.json) so we don't rely on exporting package.json\n const baseForRequireEntry =\n (typeof moduleUrl === \"string\" && moduleUrl) ||\n path.join(process.cwd(), \"package.json\");\n const requireFromEntry = createRequire(baseForRequireEntry);\n const entryPath = requireFromEntry.resolve(\"@ai-sdk-tool/eval\");\n const entryDir = path.dirname(entryPath);\n // If entry is in dist/, walk up to package root and locate 'data'\n const guessPkgRoot = fs.existsSync(path.join(entryDir, \"..\"))\n ? path.resolve(entryDir, \"..\")\n : entryDir;\n const dataAtRoot = path.join(guessPkgRoot, \"data\");\n if (fs.existsSync(dataAtRoot)) return dataAtRoot;\n } catch {\n // ignore and continue to other strategies\n }\n\n try {\n // In CJS builds, import.meta.url may be empty. Fallback to cwd package.json path for a valid base.\n const baseForRequire =\n (typeof moduleUrl === \"string\" && moduleUrl) ||\n path.join(process.cwd(), \"package.json\");\n const require = createRequire(baseForRequire);\n // Resolve this package's package.json location\n const pkgJsonPath = require.resolve(\"@ai-sdk-tool/eval/package.json\");\n const pkgDir = path.dirname(pkgJsonPath);\n const dataAtPkg = path.join(pkgDir, \"data\");\n if (fs.existsSync(dataAtPkg)) return dataAtPkg;\n } catch {\n // ignore if resolution fails (e.g., unusual environments)\n }\n\n // 3) Walk up a few levels to find a 'data' directory from the module URL\n let startDir: string;\n if (moduleUrl) {\n try {\n startDir = path.dirname(fileURLToPath(moduleUrl));\n } catch {\n // In case moduleUrl is invalid or unavailable, fall back to cwd\n startDir = process.cwd();\n }\n } else {\n startDir = process.cwd();\n }\n let dir = startDir;\n for (let i = 0; i < 6; i++) {\n const dataCandidate = path.join(dir, \"data\");\n if (fs.existsSync(dataCandidate)) return dataCandidate;\n const parent = path.resolve(dir, \"..\");\n if (parent === dir) break; // reached filesystem root\n dir = parent;\n }\n\n // 4) Fallback to packageRoot/data assuming dist/benchmarks -> dist -> packageRoot\n const pkgRoot = path.resolve(startDir, \"..\", \"..\");\n return path.join(pkgRoot, \"data\");\n}\n","// Local ToolCall interface for type safety, as it's not exported from 'ai'.\nexport interface ToolCall {\n toolCallId: string;\n toolName: string;\n args: unknown;\n}\n\n// --- Type Definitions ---\nexport interface FunctionDescription {\n name: string;\n description?: string;\n parameters: {\n type: \"object\";\n properties: {\n [key: string]: {\n type: string;\n description?: string;\n items?: { type: string };\n };\n };\n required: string[];\n };\n}\n\n/**\n * Standardizes a string for comparison.\n */\nfunction standardizeString(input: string): string {\n if (typeof input !== \"string\") return input;\n const regex = /[ ,./\\\\-_*^]/g;\n return input.replace(regex, \"\").toLowerCase().replace(/'/g, '\"');\n}\n\n/**\n * Checks a string value against possible answers.\n */\nfunction checkStringValue(\n param: string,\n modelValue: string,\n possibleAnswers: unknown[]\n): { valid: boolean; error?: string; error_type?: string } {\n const standardizedModelValue = standardizeString(modelValue);\n const standardizedPossibleAnswers = possibleAnswers.map(ans =>\n standardizeString(String(ans))\n );\n\n if (!standardizedPossibleAnswers.includes(standardizedModelValue)) {\n return {\n valid: false,\n error: `Invalid value for parameter '${param}': ${JSON.stringify(\n modelValue\n )}. Expected one of ${JSON.stringify(possibleAnswers)}.`,\n error_type: \"value_error:string\",\n };\n }\n return { valid: true };\n}\n\n/**\n * Main checker for a single function call.\n * Aligned with the `ai` package's `ToolCall` type.\n */\nexport function simpleFunctionChecker(\n funcDescription: FunctionDescription,\n modelToolCall: ToolCall,\n possibleAnswer: Record<string, unknown>\n): { valid: boolean; error?: string; error_type?: string } {\n const modelArgs = modelToolCall.args;\n const modelFuncName = modelToolCall.toolName;\n const expectedFuncName = funcDescription.name;\n const expectedParams = funcDescription.parameters.properties;\n const requiredParams = funcDescription.parameters.required;\n\n if (modelFuncName !== expectedFuncName) {\n return {\n valid: false,\n error: `Function name '${modelFuncName}' does not match expected '${expectedFuncName}'.`,\n error_type: \"simple_function_checker:wrong_func_name\",\n };\n }\n\n const possibleAnswerParams = possibleAnswer[\n Object.keys(possibleAnswer)[0]\n ] as Record<string, unknown>;\n\n const argsObj: Record<string, unknown> =\n modelArgs && typeof modelArgs === \"object\"\n ? (modelArgs as Record<string, unknown>)\n : {};\n\n for (const param of requiredParams) {\n if (!(param in argsObj)) {\n return {\n valid: false,\n error: `Missing required parameter: '${param}'.`,\n error_type: \"simple_function_checker:missing_required\",\n };\n }\n }\n\n if (modelArgs && typeof modelArgs === \"object\") {\n for (const paramName of Object.keys(argsObj)) {\n const modelValue = argsObj[paramName];\n if (\n !(paramName in expectedParams) ||\n !(paramName in possibleAnswerParams)\n ) {\n return {\n valid: false,\n error: `Unexpected parameter: '${paramName}'.`,\n error_type: \"simple_function_checker:unexpected_param\",\n };\n }\n\n const possibleValues = possibleAnswerParams[paramName] as unknown;\n\n if (typeof modelValue === \"string\") {\n const result = checkStringValue(\n paramName,\n modelValue,\n (possibleValues as unknown[] | undefined) ?? []\n );\n if (!result.valid) return result;\n } else if (Array.isArray(modelValue)) {\n const modelValueStr = JSON.stringify(\n modelValue.map(v => standardizeString(String(v))).sort()\n );\n const hasMatch = Array.isArray(possibleValues)\n ? (possibleValues as unknown[]).some(p => {\n if (!Array.isArray(p)) return false;\n return (\n JSON.stringify(\n p.map(v => standardizeString(String(v))).sort()\n ) === modelValueStr\n );\n })\n : false;\n if (!hasMatch) {\n return {\n valid: false,\n error: `Invalid value for list parameter '${paramName}'. Got ${JSON.stringify(\n modelValue\n )}. Expected one of ${JSON.stringify(possibleValues)}.`,\n error_type: \"value_error:list\",\n };\n }\n } else {\n // Handle nested objects by comparing JSON representations\n const hasMatch = Array.isArray(possibleValues)\n ? (possibleValues as unknown[]).some(possibleValue => {\n // Direct equality check first\n if (modelValue === possibleValue) return true;\n\n // For objects, perform deep comparison via JSON serialization\n if (\n typeof modelValue === \"object\" &&\n modelValue !== null &&\n typeof possibleValue === \"object\" &&\n possibleValue !== null\n ) {\n try {\n // Handle BFCL dataset quirk where object property values are wrapped in arrays\n // e.g. {\"min\": [300000], \"max\": [400000]} should match {\"min\": 300000, \"max\": 400000}\n const normalizeObject = (obj: unknown): unknown => {\n if (Array.isArray(obj)) {\n return obj.map(normalizeObject);\n }\n if (obj && typeof obj === \"object\") {\n const normalized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(\n obj as Record<string, unknown>\n )) {\n // If value is a single-element array, unwrap it\n if (\n Array.isArray(value) &&\n value.length === 1 &&\n (typeof value[0] !== \"object\" || value[0] === null)\n ) {\n normalized[key] = value[0];\n } else {\n normalized[key] = normalizeObject(value);\n }\n }\n return normalized;\n }\n return obj;\n };\n\n const normalizedModel = normalizeObject(modelValue);\n const normalizedPossible = normalizeObject(possibleValue);\n\n return (\n JSON.stringify(normalizedModel) ===\n JSON.stringify(normalizedPossible)\n );\n } catch {\n return false;\n }\n }\n\n // For numbers, handle string/number conversion\n if (\n typeof modelValue === \"number\" &&\n typeof possibleValue === \"string\"\n ) {\n return modelValue.toString() === possibleValue;\n }\n if (\n typeof modelValue === \"string\" &&\n typeof possibleValue === \"number\"\n ) {\n return modelValue === possibleValue.toString();\n }\n\n return false;\n })\n : false;\n\n if (!hasMatch) {\n return {\n valid: false,\n error: `Invalid value for parameter '${paramName}'. Got ${JSON.stringify(\n modelValue\n )}. Expected one of ${JSON.stringify(possibleValues)}.`,\n error_type: \"value_error:other\",\n };\n }\n }\n }\n }\n\n for (const paramName in possibleAnswerParams) {\n const val = possibleAnswerParams[paramName] as unknown;\n const isOptional = Array.isArray(val) && val.includes(\"\");\n if (!(paramName in argsObj) && !isOptional) {\n return {\n valid: false,\n error: `Missing optional parameter '${paramName}' which was not marked as optional.`,\n error_type: \"simple_function_checker:missing_optional\",\n };\n }\n }\n\n return { valid: true };\n}\n\n/**\n * Checker for parallel function calls (order-agnostic).\n */\nexport function parallelFunctionCheckerNoOrder(\n funcDescriptions: FunctionDescription[],\n modelToolCalls: ToolCall[],\n possibleAnswers: Record<string, unknown>[]\n): { valid: boolean; error?: string; error_type?: string } {\n if (modelToolCalls.length !== possibleAnswers.length) {\n return {\n valid: false,\n error: `Wrong number of functions. Expected ${possibleAnswers.length}, got ${modelToolCalls.length}.`,\n error_type: \"parallel_function_checker_no_order:wrong_count\",\n };\n }\n\n const matchedModelCallIndices = new Set<number>();\n for (const possibleAnswer of possibleAnswers) {\n const expectedFuncName = Object.keys(possibleAnswer)[0];\n const funcDescription = funcDescriptions.find(\n f => f.name === expectedFuncName\n );\n\n if (!funcDescription) {\n return {\n valid: false,\n error: `Could not find function description for '${expectedFuncName}'.`,\n error_type: \"parallel_function_checker_no_order:missing_func_desc\",\n };\n }\n\n let foundMatch = false;\n for (let i = 0; i < modelToolCalls.length; i++) {\n if (matchedModelCallIndices.has(i)) continue;\n\n const checkerResult = simpleFunctionChecker(\n funcDescription,\n modelToolCalls[i],\n possibleAnswer\n );\n if (checkerResult.valid) {\n matchedModelCallIndices.add(i);\n foundMatch = true;\n break;\n }\n }\n\n if (!foundMatch) {\n return {\n valid: false,\n error: `Could not find a matching function call for '${expectedFuncName}'.`,\n error_type: \"parallel_function_checker_no_order:cannot_find_match\",\n };\n }\n }\n return { valid: true };\n}\n\n/**\n * Checker for multiple calls to the same function.\n */\nexport function multipleFunctionChecker(\n funcDescriptions: FunctionDescription[],\n modelToolCalls: ToolCall[],\n possibleAnswers: Record<string, unknown>[]\n): { valid: boolean; error?: string; error_type?: string } {\n if (modelToolCalls.length !== possibleAnswers.length) {\n return {\n valid: false,\n error: `Wrong number of functions. Expected ${possibleAnswers.length}, got ${modelToolCalls.length}.`,\n error_type: \"multiple_function_checker:wrong_count\",\n };\n }\n\n const expectedFuncName = Object.keys(possibleAnswers[0])[0];\n const funcDescription = funcDescriptions.find(\n f => f.name === expectedFuncName\n );\n\n if (!funcDescription) {\n return {\n valid: false,\n error: `Could not find function description for '${expectedFuncName}'.`,\n error_type: \"multiple_function_checker:missing_func_desc\",\n };\n }\n\n return simpleFunctionChecker(\n funcDescription,\n modelToolCalls[0],\n possibleAnswers[0]\n );\n}\n","import { generateText, LanguageModel } from \"ai\";\nimport Ajv, { AnySchema } from \"ajv\";\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\n\nimport { BenchmarkResult, LanguageModelV2Benchmark } from \"@/interfaces\";\nimport { resolveDataDir } from \"@/utils/paths\";\n\ntype Json = unknown;\n\ninterface SchemaTestCase {\n id: string;\n description: string;\n schema: AnySchema; // JSON Schema (draft 2020-12 subset supported by Ajv v8)\n promptFacts: string; // natural language facts to express desired values\n expected: Json; // subset of fields we expect to match exactly\n}\n\ninterface ExpectedRecord {\n id: string;\n expected: Json;\n}\n\nfunction extractFirstJsonBlock(text: string): Json | undefined {\n // 1) try direct parse\n try {\n return JSON.parse(text);\n } catch {\n // ignore parse errors\n }\n\n // 2) try code fence ```json ... ```\n const fenceMatch =\n text.match(/```json\\s*([\\s\\S]*?)```/i) ||\n text.match(/```\\s*([\\s\\S]*?)```/i);\n if (fenceMatch) {\n const inner = fenceMatch[1].trim();\n try {\n return JSON.parse(inner);\n } catch {\n // ignore parse errors\n }\n }\n\n // 3) bracket scanning for first object or array\n const startIdxObj = text.indexOf(\"{\");\n const startIdxArr = text.indexOf(\"[\");\n const start = [startIdxObj, startIdxArr]\n .filter(i => i >= 0)\n .sort((a, b) => a - b)[0];\n if (start === undefined) return undefined;\n\n const open = text[start] === \"{\" ? \"{\" : \"[\";\n const close = open === \"{\" ? \"}\" : \"]\";\n let depth = 0;\n for (let i = start; i < text.length; i++) {\n const ch = text[i];\n if (ch === open) depth++;\n else if (ch === close) depth--;\n if (depth === 0) {\n const candidate = text.slice(start, i + 1);\n try {\n return JSON.parse(candidate);\n } catch {\n // ignore parse errors\n }\n break;\n }\n }\n return undefined;\n}\n\nfunction subsetMatch(expected: Json, actual: Json): boolean {\n // primitives\n if (expected === null || typeof expected !== \"object\") {\n return expected === actual;\n }\n // arrays\n if (Array.isArray(expected)) {\n if (!Array.isArray(actual)) return false;\n // Require at least that expected elements (by index) match if provided\n for (let i = 0; i < expected.length; i++) {\n if (!subsetMatch(expected[i], actual[i])) return false;\n }\n return true;\n }\n // object subset\n if (actual === null || typeof actual !== \"object\") return false;\n const eObj = expected as Record<string, unknown>;\n const aObj = actual as Record<string, unknown>;\n for (const key of Object.keys(eObj)) {\n if (!subsetMatch(eObj[key], aObj[key])) return false;\n }\n return true;\n}\n\n// Test cases will be loaded from data files at runtime\n\nexport const jsonGenerationBenchmark: LanguageModelV2Benchmark = {\n name: \"json-generation\",\n version: \"2.1.0\",\n description:\n \"Evaluates schema-compliant JSON generation from natural language using JSON Schema prompts.\",\n\n async run(\n model: LanguageModel,\n config?: Record<string, unknown>\n ): Promise<BenchmarkResult> {\n const logs: string[] = [];\n const ajv = new Ajv({ allErrors: true, strict: false });\n\n let schemaValidCount = 0;\n let valueMatchCount = 0;\n let correctCount = 0; // both schema + value subset\n\n // Load JSONL datasets (tests + expected) similar to BFCL\n let tests: Omit<SchemaTestCase, \"expected\">[] = [];\n const expectedMap = new Map<string, ExpectedRecord>();\n try {\n const dataDir = resolveDataDir();\n const testsJsonl = await fs.readFile(\n path.join(dataDir, \"json_generation_tests.jsonl\"),\n \"utf-8\"\n );\n const expectedJsonl = await fs.readFile(\n path.join(dataDir, \"json_generation_expected.jsonl\"),\n \"utf-8\"\n );\n\n tests = testsJsonl\n .split(/\\r?\\n/)\n .filter(line => line.trim().length > 0)\n .map(line => JSON.parse(line));\n const expecteds: ExpectedRecord[] = expectedJsonl\n .split(/\\r?\\n/)\n .filter(line => line.trim().length > 0)\n .map(line => JSON.parse(line));\n for (const r of expecteds) expectedMap.set(r.id, r);\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [`[FATAL] Failed to load json-generation datasets: ${msg}`],\n error: e as Error,\n };\n }\n\n for (const tc of tests) {\n try {\n const schemaStr = JSON.stringify(tc.schema, null, 2);\n const messages = [\n {\n role: \"system\" as const,\n content:\n \"You must output only a single JSON document that strictly conforms to the given JSON Schema. Do not include any extra text or code fences.\",\n },\n {\n role: \"user\" as const,\n content: [\n \"Generate a JSON object that reflects the following facts.\",\n \"JSON Schema:\",\n schemaStr,\n \"Facts:\",\n tc.promptFacts,\n \"Output must be a single JSON only, with no additional text.\",\n ].join(\"\\n\\n\"),\n },\n ];\n\n const temp = config?.temperature;\n const temperature = typeof temp === \"number\" ? temp : undefined;\n const { text } = await generateText({\n model,\n messages,\n ...(temperature !== undefined ? { temperature } : {}),\n });\n\n let parsed: Json | undefined;\n try {\n parsed = extractFirstJsonBlock(text);\n } catch {\n // ignore parse errors\n }\n\n if (parsed === undefined) {\n logs.push(`[FAIL] ${tc.id}: Unable to parse JSON from model output.`);\n continue;\n }\n\n const validate = ajv.compile(tc.schema);\n const valid = validate(parsed) as boolean;\n if (valid) schemaValidCount++;\n else\n logs.push(\n `[INFO] ${tc.id}: Schema validation errors: ${\n (validate.errors || [])\n .map(e => `${e.instancePath} ${e.message}`)\n .join(\", \") || \"unknown\"\n }`\n );\n\n const expectedRec = expectedMap.get(tc.id);\n if (!expectedRec) {\n logs.push(\n `[WARN] ${tc.id}: No expected record found. Skipping value match.`\n );\n }\n const valuesOk = expectedRec\n ? subsetMatch(expectedRec.expected, parsed)\n : false;\n if (valuesOk) valueMatchCount++;\n\n if (valid && valuesOk) {\n correctCount++;\n logs.push(`[PASS] ${tc.id}`);\n } else {\n logs.push(\n `[FAIL] ${tc.id}: schemaValid=${valid}, valuesOk=${valuesOk}. Output=${JSON.stringify(\n parsed\n )}`\n );\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n logs.push(`[ERROR] ${tc.id}: ${msg}`);\n }\n }\n\n const total = tests.length;\n const score = correctCount / total;\n return {\n score,\n success: score >= 0.8,\n metrics: {\n total_cases: total,\n correct_count: correctCount,\n schema_valid_count: schemaValidCount,\n value_match_count: valueMatchCount,\n accuracy: score,\n },\n logs,\n };\n },\n};\n\n// A schema-only variant that validates structure/format without value matching\ntype SchemaOnlyTestCase = Omit<SchemaTestCase, \"expected\">;\n\nexport const jsonGenerationSchemaOnlyBenchmark: LanguageModelV2Benchmark = {\n name: \"json-generation-schema-only\",\n version: \"1.0.1\",\n description:\n \"Evaluates whether model outputs strictly conform to the provided JSON Schema (structure only).\",\n\n async run(\n model: LanguageModel,\n config?: Record<string, unknown>\n ): Promise<BenchmarkResult> {\n const logs: string[] = [];\n const ajv = new Ajv({ allErrors: true, strict: false });\n\n // Load tests\n let tests: SchemaOnlyTestCase[] = [];\n try {\n const dataDir = resolveDataDir();\n const testsJsonl = await fs.readFile(\n path.join(dataDir, \"json_generation_tests.jsonl\"),\n \"utf-8\"\n );\n tests = testsJsonl\n .split(/\\r?\\n/)\n .filter(line => line.trim().length > 0)\n .map(line => JSON.parse(line));\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [`[FATAL] Failed to load schema-only tests: ${msg}`],\n error: e as Error,\n };\n }\n\n let schemaValidCount = 0;\n\n for (const tc of tests) {\n try {\n const schemaStr = JSON.stringify(tc.schema, null, 2);\n const messages = [\n {\n role: \"system\" as const,\n content:\n \"You must output only a single JSON document that strictly conforms to the given JSON Schema. Do not include any extra text or code fences.\",\n },\n {\n role: \"user\" as const,\n content: [\n \"Generate a JSON object that reflects the following facts.\",\n \"JSON Schema:\",\n schemaStr,\n \"Facts:\",\n tc.promptFacts,\n \"Output must be a single JSON only, with no additional text.\",\n ].join(\"\\n\\n\"),\n },\n ];\n\n const temp = config?.temperature;\n const temperature = typeof temp === \"number\" ? temp : undefined;\n const { text } = await generateText({\n model,\n messages,\n ...(temperature !== undefined ? { temperature } : {}),\n });\n\n let parsed: Json | undefined;\n try {\n parsed = extractFirstJsonBlock(text);\n } catch {\n // ignore\n }\n if (parsed === undefined) {\n logs.push(`[FAIL] ${tc.id}: Could not parse JSON from model output.`);\n continue;\n }\n\n const validate = ajv.compile(tc.schema);\n const valid = validate(parsed) as boolean;\n if (valid) {\n schemaValidCount++;\n logs.push(`[PASS] ${tc.id}`);\n } else {\n logs.push(\n `[FAIL] ${tc.id}: Schema validation errors: ${\n (validate.errors || [])\n .map(e => `${e.instancePath} ${e.message}`)\n .join(\", \") || \"unknown\"\n }`\n );\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n logs.push(`[ERROR] ${tc.id}: ${msg}`);\n }\n }\n\n const total = tests.length;\n const score = total > 0 ? schemaValidCount / total : 0;\n return {\n score,\n success: score >= 0.8,\n metrics: {\n total_cases: total,\n schema_valid_count: schemaValidCount,\n accuracy: score,\n },\n logs,\n };\n },\n};\n"],"mappings":"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","names":["colors","import_fs","import_path","path","fs","require","fs","path","name","limit","import_ai","import_fs","import_path","Ajv","fs","path"]}
package/dist/index.d.cts CHANGED
@@ -50,7 +50,7 @@ interface LanguageModelV2Benchmark {
50
50
  * @param config - Optional configuration for the benchmark run.
51
51
  * @returns A promise that resolves to a BenchmarkResult.
52
52
  */
53
- run(model: LanguageModel, config?: Record<string, any>): Promise<BenchmarkResult>;
53
+ run(model: LanguageModel, config?: Record<string, unknown>): Promise<BenchmarkResult>;
54
54
  }
55
55
  /**
56
56
  * The supported reporter types.
@@ -84,16 +84,20 @@ interface EvaluateOptions {
84
84
  * Defaults to 'console'.
85
85
  */
86
86
  reporter?: ReporterType;
87
+ /**
88
+ * Optional temperature setting to pass to model generation during evaluation.
89
+ */
90
+ temperature?: number;
87
91
  }
88
92
 
89
93
  declare function evaluate(options: EvaluateOptions): Promise<EvaluationResult[]>;
90
94
 
91
- declare const jsonGenerationBenchmark: LanguageModelV2Benchmark;
92
- declare const jsonGenerationSchemaOnlyBenchmark: LanguageModelV2Benchmark;
93
-
94
95
  declare const bfclSimpleBenchmark: LanguageModelV2Benchmark;
95
96
  declare const bfclParallelBenchmark: LanguageModelV2Benchmark;
96
97
  declare const bfclMultipleBenchmark: LanguageModelV2Benchmark;
97
98
  declare const bfclParallelMultipleBenchmark: LanguageModelV2Benchmark;
98
99
 
100
+ declare const jsonGenerationBenchmark: LanguageModelV2Benchmark;
101
+ declare const jsonGenerationSchemaOnlyBenchmark: LanguageModelV2Benchmark;
102
+
99
103
  export { type BenchmarkResult, type EvaluateOptions, type LanguageModelV2Benchmark, type ReporterType, bfclMultipleBenchmark, bfclParallelBenchmark, bfclParallelMultipleBenchmark, bfclSimpleBenchmark, evaluate, jsonGenerationBenchmark, jsonGenerationSchemaOnlyBenchmark };
package/dist/index.d.ts CHANGED
@@ -50,7 +50,7 @@ interface LanguageModelV2Benchmark {
50
50
  * @param config - Optional configuration for the benchmark run.
51
51
  * @returns A promise that resolves to a BenchmarkResult.
52
52
  */
53
- run(model: LanguageModel, config?: Record<string, any>): Promise<BenchmarkResult>;
53
+ run(model: LanguageModel, config?: Record<string, unknown>): Promise<BenchmarkResult>;
54
54
  }
55
55
  /**
56
56
  * The supported reporter types.
@@ -84,16 +84,20 @@ interface EvaluateOptions {
84
84
  * Defaults to 'console'.
85
85
  */
86
86
  reporter?: ReporterType;
87
+ /**
88
+ * Optional temperature setting to pass to model generation during evaluation.
89
+ */
90
+ temperature?: number;
87
91
  }
88
92
 
89
93
  declare function evaluate(options: EvaluateOptions): Promise<EvaluationResult[]>;
90
94
 
91
- declare const jsonGenerationBenchmark: LanguageModelV2Benchmark;
92
- declare const jsonGenerationSchemaOnlyBenchmark: LanguageModelV2Benchmark;
93
-
94
95
  declare const bfclSimpleBenchmark: LanguageModelV2Benchmark;
95
96
  declare const bfclParallelBenchmark: LanguageModelV2Benchmark;
96
97
  declare const bfclMultipleBenchmark: LanguageModelV2Benchmark;
97
98
  declare const bfclParallelMultipleBenchmark: LanguageModelV2Benchmark;
98
99
 
100
+ declare const jsonGenerationBenchmark: LanguageModelV2Benchmark;
101
+ declare const jsonGenerationSchemaOnlyBenchmark: LanguageModelV2Benchmark;
102
+
99
103
  export { type BenchmarkResult, type EvaluateOptions, type LanguageModelV2Benchmark, type ReporterType, bfclMultipleBenchmark, bfclParallelBenchmark, bfclParallelMultipleBenchmark, bfclSimpleBenchmark, evaluate, jsonGenerationBenchmark, jsonGenerationSchemaOnlyBenchmark };