@ai-sdk-tool/eval 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/reporters/console.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":["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};\n\nfunction printResult(result: EvaluationResult) {\n const { model, 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} - ${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\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 { jsonReporter } from \"./json\";\n\nexport const reporters: Record<\n ReporterType,\n (results: EvaluationResult[]) => void\n> = {\n console: consoleReporter,\n json: jsonReporter,\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): 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(`[${modelId}] Running benchmark: ${benchmark.name}...`);\n const result = await benchmark.run(model);\n console.log(\n `[${modelId}] Finished benchmark: ${benchmark.name}. Score: ${result.score}`\n );\n return {\n model: modelId,\n benchmark: benchmark.name,\n result,\n };\n } catch (error) {\n console.error(\n `[${modelId}] Error running benchmark: ${benchmark.name}`,\n error\n );\n return {\n model: modelId,\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 modelsArray = Array.isArray(models) ? models : [models];\n const allResults: EvaluationResult[] = [];\n\n for (const model of modelsArray) {\n for (const benchmark of benchmarks) {\n const evaluationResult = await runSingleBenchmark(model, benchmark);\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 } 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 } {\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 };\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 { valid: false, error: `Checker Error: ${e.message}` };\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 for (const testCase of testCases) {\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 // Mark as JSON schema explicitly to prevent Zod parsing\n inputSchema: jsonSchema(inputSchema as any) as any,\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 logs.push(\n `[DEBUG] ${testCase.id}: firstTool=${JSON.stringify(firstTool)}, schemaType=${schemaType}`\n );\n } catch (e: any) {\n logs.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: transformedTools as any,\n toolChoice: \"required\",\n });\n\n // Debug: raw toolCalls\n try {\n logs.push(\n `[DEBUG] ${testCase.id}: rawToolCalls=${JSON.stringify(toolCalls)}, finishReason=${finishReason}, text=${JSON.stringify(text)}`\n );\n } catch {\n logs.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 correctCount++;\n logs.push(`[PASS] ${testCase.id}`);\n } else {\n logs.push(`[FAIL] ${testCase.id}: ${checkerResult.error}`);\n }\n } catch (e: any) {\n logs.push(\n `[ERROR] ${testCase.id}: Model generation failed: ${e?.message}`\n );\n if (e?.stack) {\n logs.push(`[STACK] ${testCase.id}: ${e.stack}`);\n }\n }\n }\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}': '${modelValue}'. Expected one of ${possibleAnswers.join(\", \")}.`,\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}'.`,\n error_type: \"value_error:list\",\n };\n }\n } else {\n if (!possibleValues.includes(modelValue)) {\n return {\n valid: false,\n error: `Invalid value for parameter '${paramName}': got '${modelValue}', expected one of '${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":["fs","path","require","fs","path","generateText","fs","path","fs","path","name","generateText"]}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@ai-sdk-tool/eval",
3
+ "version": "0.1.1",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "publishConfig": {
8
+ "access": "public"
9
+ },
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs",
15
+ "default": "./dist/index.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "data"
21
+ ],
22
+ "dependencies": {
23
+ "ajv": "^8.17.1",
24
+ "zod": "^4.1.1"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^24.3.0",
28
+ "tsup": "^8.5.0",
29
+ "typescript": "^5.9.2"
30
+ },
31
+ "peerDependencies": {
32
+ "ai": ">=3.0.0"
33
+ },
34
+ "scripts": {
35
+ "dev": "tsup --watch",
36
+ "build": "tsup --clean",
37
+ "check-types": "tsc --noEmit",
38
+ "test:e2e": "tsup src/run-test.ts --format esm --clean --out-dir dist --no-config && node dist/run-test.js",
39
+ "test": "pnpm run test:e2e"
40
+ }
41
+ }