@ai-sdk-tool/eval 1.0.0-canary.0 → 1.0.0-canary.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/ComplexFuncBench.jsonl +1000 -0
- package/data/ComplexFuncBench_possible_answer.jsonl +1000 -0
- package/dist/index.cjs +587 -91
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +29 -9
- package/dist/index.d.ts +29 -9
- package/dist/index.js +591 -92
- package/dist/index.js.map +1 -1
- package/package.json +17 -11
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/benchmarks/bfcl.ts","../src/utils/paths.ts","../src/benchmarks/bfcl/ast-checker.ts","../src/benchmarks/json-generation.ts","../src/reporters/console.ts","../src/reporters/console.debug.ts","../src/reporters/json.ts","../src/reporters/index.ts","../src/evaluate.ts"],"sourcesContent":["import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n type CoreMessage,\n generateText,\n jsonSchema,\n type LanguageModel,\n tool,\n} from \"ai\";\n\nimport type { BenchmarkResult, LanguageModelV3Benchmark } from \"@/interfaces\";\nimport { resolveDataDir } from \"@/utils/paths\";\n\nimport {\n type FunctionDescription,\n multipleFunctionChecker,\n parallelFunctionCheckerNoOrder,\n simpleFunctionChecker,\n type ToolCall,\n} from \"./bfcl/ast-checker\";\n\n// Resolve data files relative to this module using ESM-safe utilities\n\n// Regex constants for performance\nconst LINE_SPLIT_REGEX = /\\r?\\n/;\nconst NUMERIC_STRING_REGEX = /^\\d+$/;\n\n// --- Interfaces ---\ntype ToolSchemaObject = {\n type: string;\n properties?: Record<string, unknown>;\n items?: unknown;\n required?: string[];\n [key: string]: unknown;\n};\n\ntype ToolSpec = {\n name: string;\n description?: string;\n parameters: ToolSchemaObject;\n};\n\ntype Message = { role: string; content: string };\n\ntype TestCase = {\n id: string;\n question: Message[] | Message[][];\n function: ToolSpec[];\n};\n\ntype TransformedTool = {\n type: \"function\";\n name: string;\n description?: string;\n inputSchema: ToolSchemaObject;\n};\n\ntype 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 Record<string, unknown>[])[0]\n );\n }\n if (category === \"parallel\") {\n return parallelFunctionCheckerNoOrder(\n testCase.function as unknown as FunctionDescription[],\n modelOutput as ToolCall[],\n possibleAnswer.ground_truth as Record<string, unknown>[]\n );\n }\n if (category === \"multiple\") {\n return multipleFunctionChecker(\n testCase.function as unknown as FunctionDescription[],\n modelOutput as ToolCall[],\n possibleAnswer.ground_truth as Record<string, unknown>[]\n );\n }\n 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 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): LanguageModelV3Benchmark {\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(LINE_SPLIT_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n const possibleAnswers: PossibleAnswer[] = possibleAnswersJson\n .split(LINE_SPLIT_REGEX)\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 type field\n const fixSchemaType = (copy: ToolSchemaObject): void => {\n if (!copy.type) {\n return;\n }\n if (copy.type === \"dict\") {\n copy.type = \"object\";\n }\n if (copy.type === \"tuple\") {\n copy.type = \"array\";\n }\n if (copy.type === \"integer\" || copy.type === \"float\") {\n copy.type = \"number\";\n }\n };\n\n // Helper: fix BFCL JSON schema properties recursively\n const fixSchemaProperties = (\n copy: ToolSchemaObject,\n fixSchemaFn: (schema: unknown) => unknown\n ): void => {\n if (!copy.properties || typeof copy.properties !== \"object\") {\n return;\n }\n for (const k of Object.keys(copy.properties)) {\n (copy.properties as Record<string, unknown>)[k] = fixSchemaFn(\n (copy.properties as Record<string, unknown>)[k]\n );\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 }\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 fixSchemaType(copy);\n fixSchemaProperties(copy, fixSchema);\n if (copy.items) {\n copy.items = fixSchema(copy.items);\n }\n return copy;\n }\n return copy;\n };\n\n // Helper: Flatten BFCL message shape\n const flattenMessages = (\n messages: Message[] | Message[][]\n ): Message[] =>\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 // Helper: Sanitize tool name for OpenAI compatibility\n const sanitizeName = (toolName: string): string => {\n const s = toolName.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64);\n return s.length > 0 ? s : \"tool\";\n };\n\n // Helper: Build transformed tools and name mapping\n const buildTransformedTools = (\n tools: ToolSpec[],\n fixSchemaFn: (schema: unknown) => unknown\n ): {\n transformedTools: TransformedTool[];\n nameMap: Map<string, string>;\n } => {\n const nameMap = new Map<string, string>();\n const transformedTools: TransformedTool[] = tools.map((t) => {\n const fixed = fixSchemaFn(t.parameters);\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,\n };\n });\n return { transformedTools, nameMap };\n };\n\n // Helper: Parse middleware debug tool calls\n const parseDebugToolCalls = (\n raw: string | undefined\n ): Array<{ toolName?: string; input?: unknown }> => {\n if (!raw) {\n return [];\n }\n try {\n const arr = JSON.parse(raw);\n return Array.isArray(arr) ? arr : [];\n } catch {\n return [];\n }\n };\n\n // Helper: Get sanitized name from index or raw name\n const getSanitizedName = (\n rawName: unknown,\n transformedTools: TransformedTool[]\n ): unknown => {\n if (\n typeof rawName === \"string\" &&\n NUMERIC_STRING_REGEX.test(rawName)\n ) {\n return transformedTools[Number(rawName)]?.name ?? rawName;\n }\n return rawName;\n };\n\n // Helper: Parse arguments from various formats\n const parseToolArgs = (extractedArgs: unknown): unknown => {\n if (typeof extractedArgs !== \"string\") {\n return extractedArgs;\n }\n try {\n return JSON.parse(extractedArgs);\n } catch {\n // leave as string if not JSON\n return extractedArgs;\n }\n };\n\n // Helper: Restore original tool names in tool calls\n const restoreToolCalls = (\n toolCalls: unknown[],\n nameMap: Map<string, string>,\n transformedTools: TransformedTool[]\n ): unknown[] =>\n (toolCalls || []).map((c: unknown) => {\n const call = c as Record<string, unknown>;\n const rawName = call.toolName ?? call.name;\n const sanitizedFromIndex = getSanitizedName(\n rawName,\n transformedTools\n );\n const originalName =\n nameMap.get(sanitizedFromIndex as string) ?? sanitizedFromIndex;\n const extractedArgs =\n call.args ??\n call.arguments ??\n call.input ??\n call.params ??\n call.parameters;\n const parsedArgs = parseToolArgs(extractedArgs);\n return {\n ...call,\n toolName: originalName,\n name: originalName,\n args: parsedArgs ?? {},\n };\n });\n\n // Helper: Summarize args for stable output\n const summarizeArgs = (args: unknown): unknown => {\n if (args == null) {\n return args;\n }\n if (typeof args !== \"object\") {\n return args;\n }\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 // Helper: Generate parameter mismatch diff\n const generateParamMismatchDiff = (\n paramName: string,\n allowed: unknown,\n got: unknown\n ): string[] => {\n const diffLines: string[] = [];\n diffLines.push(`@@ param ${paramName}`);\n const allowedArray = Array.isArray(allowed)\n ? (allowed as unknown[])\n : [allowed as unknown];\n const expectedLine = (() => {\n if (allowedArray.length === 1) {\n return `- expected: ${JSON.stringify(allowedArray[0])}`;\n }\n const formatted = allowedArray\n .map((v) =>\n Array.isArray(v) || (typeof v === \"object\" && v !== null)\n ? JSON.stringify(v)\n : String(v)\n )\n .join(\", \");\n return `- expected one of: ${formatted}`;\n })();\n diffLines.push(expectedLine);\n diffLines.push(`+ got: ${JSON.stringify(got)}`);\n return diffLines;\n };\n\n // Helper: Check if param value matches allowed values\n const paramValueMatches = (allowed: unknown, got: unknown): boolean => {\n if (!Array.isArray(allowed)) {\n return false;\n }\n return allowed.some((v: unknown) => {\n try {\n if (Array.isArray(got)) {\n return (\n JSON.stringify(got.map((x) => String(x)).sort()) ===\n JSON.stringify((v as unknown[]).map((x) => String(x)).sort())\n );\n }\n } catch {\n // Ignore parse errors\n }\n return (\n String(v).toLowerCase().replace(/\\s+/g, \"\") ===\n String(got).toLowerCase().replace(/\\s+/g, \"\")\n );\n });\n };\n\n // Helper: Check function name mismatch\n const checkFunctionNameMismatch = (\n expectedName: unknown,\n receivedName: unknown,\n diff: string[]\n ): void => {\n if (expectedName !== receivedName) {\n diff.push(\"@@ function name\");\n diff.push(`- ${expectedName}`);\n diff.push(`+ ${receivedName}`);\n }\n };\n\n // Helper: Check missing required params\n const checkMissingParams = (\n required: string[],\n receivedArgs: Record<string, unknown>,\n diff: string[]\n ): void => {\n for (const req of required) {\n if (!(req in receivedArgs)) {\n diff.push(`- missing required param: ${req}`);\n }\n }\n };\n\n // Helper: Check unexpected params\n const checkUnexpectedParams = (\n expectedParams: Record<string, unknown>,\n receivedArgs: Record<string, unknown>,\n diff: string[]\n ): void => {\n for (const k of Object.keys(receivedArgs)) {\n if (!(k in expectedParams)) {\n diff.push(`+ unexpected param: ${k}`);\n }\n }\n };\n\n // Helper: Check param value mismatches\n const checkParamValueMismatches = (\n expectedParams: Record<string, unknown>,\n receivedArgs: Record<string, unknown>,\n diff: string[]\n ): void => {\n for (const k of Object.keys(receivedArgs)) {\n if (k in expectedParams) {\n const allowed = (expectedParams as Record<string, unknown[]>)[k];\n const got = receivedArgs[k];\n if (!paramValueMatches(allowed, got)) {\n diff.push(...generateParamMismatchDiff(k, allowed, got));\n }\n }\n }\n };\n\n // Helper: Build diff for simple test case\n const buildSimpleDiff = (\n tools: ToolSpec[],\n possibleAnswer: PossibleAnswer,\n restoredCalls: unknown[]\n ): {\n expected: Record<string, unknown>;\n actual: Record<string, unknown>;\n diff: string[];\n } => {\n const funcDesc = tools[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 ? gt[Object.keys(gt)[0]] : undefined;\n const received = (restoredCalls as Record<string, unknown>[])[0];\n const receivedName = received?.toolName ?? received?.name;\n const receivedArgs = summarizeArgs(received?.args);\n\n const expected: Record<string, unknown> = {\n function: expectedFuncName,\n params: expectedParams,\n };\n const actual: Record<string, unknown> = {\n function: receivedName,\n args: receivedArgs,\n };\n const diff: string[] = [];\n\n checkFunctionNameMismatch(expectedFuncName, receivedName, diff);\n\n if (\n expectedParams &&\n receivedArgs &&\n typeof receivedArgs === \"object\" &&\n receivedArgs !== null\n ) {\n const required = (funcDesc?.parameters?.required ?? []) as string[];\n checkMissingParams(\n required,\n receivedArgs as Record<string, unknown>,\n diff\n );\n checkUnexpectedParams(\n expectedParams as Record<string, unknown>,\n receivedArgs as Record<string, unknown>,\n diff\n );\n checkParamValueMismatches(\n expectedParams as Record<string, unknown>,\n receivedArgs as Record<string, unknown>,\n diff\n );\n }\n\n return { expected, actual, diff };\n };\n\n // Helper: Check call count mismatch\n const checkCallCountMismatch = (\n expectedCount: number,\n actualCount: number,\n diff: string[]\n ): void => {\n if (expectedCount !== actualCount) {\n diff.push(\"@@ call count\");\n diff.push(`- expected ${expectedCount}`);\n diff.push(`+ got ${actualCount}`);\n }\n };\n\n // Helper: Add missing and extra functions to diff\n const addMissingAndExtraFunctions = (\n expectedNames: unknown[],\n actualNames: unknown[],\n diff: string[]\n ): void => {\n const missing = expectedNames.filter((n) => !actualNames.includes(n));\n const extra = actualNames.filter((n) => !expectedNames.includes(n));\n for (const m of missing) {\n diff.push(`- missing function: ${m}`);\n }\n for (const e of extra) {\n diff.push(`+ unexpected function: ${e}`);\n }\n };\n\n // Helper: Find matching call index\n const findMatchingCallIndex = (\n fname: string,\n restoredCalls: Record<string, unknown>[],\n usedActual: Set<number>\n ): number => {\n for (let i = 0; i < restoredCalls.length; i += 1) {\n if (usedActual.has(i)) {\n continue;\n }\n const rc = restoredCalls[i];\n const rcName = rc?.toolName ?? rc?.name;\n if (rcName === fname) {\n return i;\n }\n }\n return -1;\n };\n\n // Helper: Validate function parameters\n const validateFunctionParams = (options: {\n receivedArgs: Record<string, unknown>;\n expectedParamsAllowed: Record<string, unknown>;\n requiredParams: string[];\n diff: string[];\n }): void => {\n const { receivedArgs, expectedParamsAllowed, requiredParams, diff } =\n options;\n checkMissingParams(requiredParams, receivedArgs, diff);\n checkUnexpectedParams(expectedParamsAllowed, receivedArgs, diff);\n checkParamValueMismatches(expectedParamsAllowed, receivedArgs, diff);\n };\n\n // Helper: Process single expected function call\n const processExpectedCall = (options: {\n expectedObj: Record<string, unknown>;\n restoredCalls: Record<string, unknown>[];\n tools: ToolSpec[];\n usedActual: Set<number>;\n diff: string[];\n }): void => {\n const { expectedObj, restoredCalls, tools, usedActual, diff } =\n options;\n const fname = Object.keys(expectedObj)[0];\n const matchedIndex = findMatchingCallIndex(\n fname,\n restoredCalls,\n usedActual\n );\n\n if (matchedIndex === -1) {\n return;\n }\n\n usedActual.add(matchedIndex);\n const received = restoredCalls[matchedIndex];\n const receivedArgs = summarizeArgs(received?.args);\n const expectedParamsAllowed = expectedObj[fname] as Record<\n string,\n unknown\n >;\n const funcDesc = tools.find((t: ToolSpec) => t.name === fname);\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 validateFunctionParams({\n receivedArgs: receivedArgs as Record<string, unknown>,\n expectedParamsAllowed,\n requiredParams,\n diff,\n });\n }\n };\n\n // Helper: Build diff for parallel/multiple test case\n const buildParallelDiff = (\n tools: ToolSpec[],\n possibleAnswer: PossibleAnswer,\n restoredCalls: unknown[]\n ): {\n expected: Record<string, unknown>;\n actual: Record<string, unknown>;\n diff: string[];\n } => {\n const gtArr: Record<string, unknown>[] =\n (\n possibleAnswer as {\n ground_truth?: Record<string, unknown>[];\n }\n ).ground_truth ?? [];\n const expectedNames = gtArr.map((g) => Object.keys(g)[0]);\n const actualNames = (restoredCalls as Record<string, unknown>[]).map(\n (c) => c.toolName ?? c.name\n );\n\n const expected: Record<string, unknown> = {\n functions: expectedNames,\n };\n const actual: Record<string, unknown> = { functions: actualNames };\n const diff: string[] = [];\n\n checkCallCountMismatch(\n expectedNames.length,\n actualNames.length,\n diff\n );\n addMissingAndExtraFunctions(expectedNames, actualNames, diff);\n\n const usedActual = new Set<number>();\n for (const expectedObj of gtArr) {\n processExpectedCall({\n expectedObj,\n restoredCalls: restoredCalls as Record<string, unknown>[],\n tools,\n usedActual,\n diff,\n });\n }\n\n return { expected, actual, diff };\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 // Helper: Log first tool debug info\n const logFirstToolDebug = (\n transformedTools: TransformedTool[],\n testCaseId: string,\n caseLogs: string[]\n ): void => {\n try {\n const firstTool = transformedTools[0];\n const schemaType =\n firstTool?.inputSchema?.type ??\n (\n (firstTool?.inputSchema as Record<string, unknown> | undefined)\n ?.jsonSchema as Record<string, unknown> | undefined\n )?.type;\n caseLogs.push(\n `[DEBUG] ${testCaseId}: firstTool=${JSON.stringify(firstTool)}, schemaType=${schemaType}`\n );\n } catch (e: unknown) {\n caseLogs.push(\n `[DEBUG] ${testCaseId}: failed to introspect tools: ${(e as Error).message}`\n );\n }\n };\n\n // Helper: Log raw tool calls\n const logRawToolCalls = (options: {\n toolCalls: unknown;\n finishReason: unknown;\n text: unknown;\n testCaseId: string;\n caseLogs: string[];\n }): void => {\n const { toolCalls, finishReason, text, testCaseId, caseLogs } =\n options;\n try {\n caseLogs.push(\n `[DEBUG] ${testCaseId}: rawToolCalls=${JSON.stringify(toolCalls)}, finishReason=${finishReason}, text=${JSON.stringify(text)}`\n );\n } catch {\n caseLogs.push(\n `[DEBUG] ${testCaseId}: failed to serialize toolCalls`\n );\n }\n };\n\n // Helper: Build failure context payload\n const buildFailureContext = (options: {\n testCase: TestCase;\n tools: ToolSpec[];\n flatMessages: Message[];\n mwOriginalText: string | undefined;\n text: unknown;\n finishReason: unknown;\n mwParsedToolCalls: Array<{ toolName?: string; input?: unknown }>;\n restoredCalls: unknown[];\n possibleAnswer: PossibleAnswer;\n }): Record<string, unknown> => {\n const {\n testCase,\n tools,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n restoredCalls,\n possibleAnswer,\n } = options;\n\n const lastUser = (() => {\n const reversed = [...flatMessages].reverse();\n const found = reversed.find(\n (m) => (m as Message).role === \"user\"\n ) as Message | undefined;\n return found?.content ?? undefined;\n })();\n\n const rawModelText = (() => {\n if (mwOriginalText && mwOriginalText.length > 0) {\n return mwOriginalText;\n }\n if (typeof text === \"string\") {\n return text;\n }\n return \"\";\n })();\n\n return {\n id: testCase.id,\n tool_schema: tools,\n last_user_query: lastUser,\n raw_model_text: rawModelText,\n finish_reason: finishReason,\n parsed_tool_calls: mwParsedToolCalls.length\n ? mwParsedToolCalls\n : restoredCalls,\n ground_truth: (possibleAnswer as { ground_truth?: unknown })\n .ground_truth,\n };\n };\n\n // Helper: Log failure details\n const logFailureDetails = (options: {\n testCase: TestCase;\n tools: ToolSpec[];\n possibleAnswer: PossibleAnswer;\n restoredCalls: unknown[];\n checkerResult: {\n valid: boolean;\n error?: string;\n error_type?: string;\n };\n flatMessages: Message[];\n mwOriginalText: string | undefined;\n text: unknown;\n finishReason: unknown;\n mwParsedToolCalls: Array<{ toolName?: string; input?: unknown }>;\n caseLogs: string[];\n }): void => {\n const {\n testCase,\n tools,\n possibleAnswer,\n restoredCalls,\n checkerResult,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n caseLogs,\n } = options;\n\n try {\n const category = testCase.id.split(\"_\")[0];\n const { expected, actual, diff } =\n category === \"simple\"\n ? buildSimpleDiff(\n tools as ToolSpec[],\n possibleAnswer,\n restoredCalls\n )\n : buildParallelDiff(\n tools as ToolSpec[],\n possibleAnswer,\n restoredCalls\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\n try {\n const contextPayload = buildFailureContext({\n testCase,\n tools,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n restoredCalls,\n possibleAnswer,\n });\n caseLogs.push(\n `[DEBUG-FAIL-CONTEXT] ${JSON.stringify(contextPayload)}`\n );\n } catch {\n // ignore context build failures\n }\n } catch {\n caseLogs.push(`[DEBUG] ${testCase.id}: failed to build debug diff`);\n }\n };\n\n // Helper: Build tools map for AI SDK\n const buildToolsMap = (\n transformedTools: TransformedTool[]\n ): Record<string, ReturnType<typeof tool>> =>\n Object.fromEntries(\n transformedTools.map((t) => [\n t.name,\n tool({\n description:\n typeof t.description === \"string\" ? t.description : undefined,\n inputSchema: jsonSchema(\n t.inputSchema as Record<string, unknown>\n ),\n }),\n ])\n );\n\n // Helper: Execute model generation\n const executeModelGeneration = async (options: {\n model: LanguageModel;\n flatMessages: Message[];\n toolsMap: Record<string, ReturnType<typeof tool>>;\n temperature: number | undefined;\n maxTokens: number | undefined;\n }): Promise<{\n toolCalls: unknown;\n text: unknown;\n finishReason: unknown;\n debugSummaryRef: { originalText?: string; toolCalls?: string };\n }> => {\n const {\n model: modelInstance,\n flatMessages,\n toolsMap,\n temperature,\n maxTokens,\n } = options;\n\n type ProviderOptionsWithMiddleware = {\n toolCallMiddleware?: {\n debugSummary?: {\n originalText?: string;\n toolCalls?: string;\n };\n };\n };\n const debugSummaryRef: {\n originalText?: string;\n toolCalls?: string;\n } = {};\n const providerOptions: ProviderOptionsWithMiddleware = {\n toolCallMiddleware: {\n debugSummary: debugSummaryRef,\n },\n };\n const { toolCalls, text, finishReason } = await generateText({\n model: modelInstance,\n messages: flatMessages as unknown as CoreMessage[],\n tools: toolsMap,\n toolChoice: \"auto\",\n providerOptions,\n ...(temperature !== undefined ? { temperature } : {}),\n ...(maxTokens !== undefined ? { maxOutputTokens: maxTokens } : {}),\n });\n\n return { toolCalls, text, finishReason, debugSummaryRef };\n };\n\n // Helper: Process validation result\n const processValidationResult = (options: {\n checkerResult: {\n valid: boolean;\n error?: string;\n error_type?: string;\n };\n testCase: TestCase;\n tools: ToolSpec[];\n possibleAnswer: PossibleAnswer;\n restoredCalls: unknown[];\n flatMessages: Message[];\n mwOriginalText: string | undefined;\n text: unknown;\n finishReason: unknown;\n mwParsedToolCalls: Array<{ toolName?: string; input?: unknown }>;\n caseLogs: string[];\n }): { valid: boolean; logs: string[] } => {\n const {\n checkerResult,\n testCase,\n tools,\n possibleAnswer,\n restoredCalls,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n caseLogs,\n } = options;\n\n if (checkerResult.valid) {\n caseLogs.push(`[PASS] ${testCase.id}`);\n return { valid: true, logs: caseLogs };\n }\n\n caseLogs.push(`[FAIL] ${testCase.id}: ${checkerResult.error}`);\n logFailureDetails({\n testCase,\n tools,\n possibleAnswer,\n restoredCalls,\n checkerResult,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n caseLogs,\n });\n return { valid: false, logs: caseLogs };\n };\n\n // Helper: Prepare test case data\n const prepareTestCaseData = (\n testCase: TestCase\n ): {\n flatMessages: Message[];\n transformedTools: TransformedTool[];\n nameMap: Map<string, string>;\n toolsMap: Record<string, ReturnType<typeof tool>>;\n } => {\n const { function: tools, question: messages } = testCase;\n const flatMessages = flattenMessages(messages);\n const { transformedTools, nameMap } = buildTransformedTools(\n tools as ToolSpec[],\n fixSchema\n );\n const toolsMap = buildToolsMap(transformedTools);\n return { flatMessages, transformedTools, nameMap, toolsMap };\n };\n\n // Helper: Process model response\n const processModelResponse = (options: {\n testCase: TestCase;\n toolCalls: unknown;\n text: unknown;\n finishReason: unknown;\n debugSummaryRef: { originalText?: string; toolCalls?: string };\n nameMap: Map<string, string>;\n transformedTools: TransformedTool[];\n flatMessages: Message[];\n tools: ToolSpec[];\n caseLogs: string[];\n }): { valid: boolean; logs: string[] } => {\n const {\n testCase,\n toolCalls,\n text,\n finishReason,\n debugSummaryRef,\n nameMap,\n transformedTools,\n flatMessages,\n tools,\n caseLogs,\n } = options;\n\n const mwOriginalText: string | undefined =\n debugSummaryRef.originalText;\n const mwParsedToolCalls = parseDebugToolCalls(\n debugSummaryRef.toolCalls\n );\n\n logRawToolCalls({\n toolCalls,\n finishReason,\n text,\n testCaseId: testCase.id,\n caseLogs,\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 const restoredCalls = restoreToolCalls(\n (toolCalls as unknown[]) || [],\n nameMap,\n transformedTools\n );\n\n const checkerResult = check(testCase, restoredCalls, possibleAnswer);\n\n return processValidationResult({\n checkerResult,\n testCase,\n tools,\n possibleAnswer,\n restoredCalls,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n caseLogs,\n });\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 } = testCase;\n const temp = config?.temperature;\n const temperature = typeof temp === \"number\" ? temp : undefined;\n const maxTok = config?.maxTokens;\n const maxTokens = typeof maxTok === \"number\" ? maxTok : undefined;\n\n try {\n const { flatMessages, transformedTools, nameMap, toolsMap } =\n prepareTestCaseData(testCase);\n\n logFirstToolDebug(transformedTools, testCase.id, caseLogs);\n\n const { toolCalls, text, finishReason, debugSummaryRef } =\n await executeModelGeneration({\n model,\n flatMessages,\n toolsMap,\n temperature,\n maxTokens,\n });\n\n return processModelResponse({\n testCase,\n toolCalls,\n text,\n finishReason,\n debugSummaryRef,\n nameMap,\n transformedTools,\n flatMessages,\n tools: tools as ToolSpec[],\n caseLogs,\n });\n } catch (e: unknown) {\n caseLogs.push(\n `[ERROR] ${testCase.id}: Model generation failed: ${(e as Error)?.message}`\n );\n if ((e as Error)?.stack) {\n caseLogs.push(`[STACK] ${testCase.id}: ${(e as Error).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 concurrencyLimit: 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(concurrencyLimit, items.length))\n .fill(0)\n .map(async () => {\n while (true) {\n const current = idx;\n idx += 1;\n if (current >= items.length) {\n break;\n }\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) {\n logs.push(...r.logs);\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: unknown) {\n return {\n score: 0,\n success: false,\n metrics: {},\n error: e as Error,\n logs: [\n `[FATAL] Failed to run benchmark ${name}: ${(e as Error).message}`,\n ],\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.jsonl\",\n \"BFCL_v3_simple_possible_answer.jsonl\"\n);\n\nexport const bfclParallelBenchmark = createBfclBenchmark(\n \"bfcl-parallel\",\n \"BFCL Parallel Function Calling\",\n \"BFCL_v3_parallel.jsonl\",\n \"BFCL_v3_parallel_possible_answer.jsonl\"\n);\n\nexport const bfclMultipleBenchmark = createBfclBenchmark(\n \"bfcl-multiple\",\n \"BFCL Multiple Function Calling\",\n \"BFCL_v3_multiple.jsonl\",\n \"BFCL_v3_multiple_possible_answer.jsonl\"\n);\n\nexport const bfclParallelMultipleBenchmark = createBfclBenchmark(\n \"bfcl-parallel-multiple\",\n \"BFCL Parallel & Multiple Function Calling\",\n \"BFCL_v3_parallel_multiple.jsonl\",\n \"BFCL_v3_parallel_multiple_possible_answer.jsonl\"\n);\n","import fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Try to resolve data directory via package entry point\n */\nfunction tryResolveViaPackageEntry(moduleUrl?: string): string | null {\n try {\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 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)) {\n return dataAtRoot;\n }\n } catch {\n // ignore and continue to other strategies\n }\n return null;\n}\n\n/**\n * Try to resolve data directory via package.json\n */\nfunction tryResolveViaPackageJson(moduleUrl?: string): string | null {\n try {\n const baseForRequire =\n (typeof moduleUrl === \"string\" && moduleUrl) ||\n path.join(process.cwd(), \"package.json\");\n const require = createRequire(baseForRequire);\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)) {\n return dataAtPkg;\n }\n } catch {\n // ignore if resolution fails\n }\n return null;\n}\n\n/**\n * Determine starting directory from module URL\n */\nfunction getStartDir(moduleUrl?: string): string {\n if (moduleUrl) {\n try {\n return path.dirname(fileURLToPath(moduleUrl));\n } catch {\n return process.cwd();\n }\n }\n return process.cwd();\n}\n\n/**\n * Walk up directory tree to find data directory\n */\nfunction findDataDirByTraversal(startDir: string): string | null {\n let dir = startDir;\n const MAX_PARENT_TRAVERSAL_DEPTH = 6;\n for (let i = 0; i < MAX_PARENT_TRAVERSAL_DEPTH; i += 1) {\n const dataCandidate = path.join(dir, \"data\");\n if (fs.existsSync(dataCandidate)) {\n return dataCandidate;\n }\n const parent = path.resolve(dir, \"..\");\n if (parent === dir) {\n break; // reached filesystem root\n }\n dir = parent;\n }\n return null;\n}\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 */\nexport function resolveDataDir(fromModuleUrl?: string): string {\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) Try resolving via package entry point\n const viaEntry = tryResolveViaPackageEntry(fromModuleUrl);\n if (viaEntry) {\n return viaEntry;\n }\n\n // 3) Try resolving via package.json\n const viaPackageJson = tryResolveViaPackageJson(fromModuleUrl);\n if (viaPackageJson) {\n return viaPackageJson;\n }\n\n // 4) Walk up directory tree to find data directory\n const startDir = getStartDir(fromModuleUrl);\n const viaTraversal = findDataDirByTraversal(startDir);\n if (viaTraversal) {\n return viaTraversal;\n }\n\n // 5) 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 type ToolCall = {\n toolCallId: string;\n toolName: string;\n args: unknown;\n};\n\n// --- Type Definitions ---\nexport type 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\") {\n return input;\n }\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 * Normalizes objects by unwrapping single-element arrays (BFCL dataset quirk)\n */\nfunction 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(obj as Record<string, unknown>)) {\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/**\n * Checks if two values match, handling objects, numbers, and strings\n */\nfunction valuesMatch(modelValue: unknown, possibleValue: unknown): boolean {\n // Direct equality check first\n if (modelValue === possibleValue) {\n return true;\n }\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 const normalizedModel = normalizeObject(modelValue);\n const normalizedPossible = normalizeObject(possibleValue);\n return (\n JSON.stringify(normalizedModel) === JSON.stringify(normalizedPossible)\n );\n } catch {\n return false;\n }\n }\n\n // For numbers, handle string/number conversion\n if (typeof modelValue === \"number\" && typeof possibleValue === \"string\") {\n return modelValue.toString() === possibleValue;\n }\n if (typeof modelValue === \"string\" && typeof possibleValue === \"number\") {\n return modelValue === possibleValue.toString();\n }\n\n return false;\n}\n\n/**\n * Checks array parameter values\n */\nfunction checkArrayValue(\n paramName: string,\n modelValue: unknown[],\n possibleValues: unknown\n): { valid: boolean; error?: string; error_type?: string } {\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)) {\n return false;\n }\n return (\n JSON.stringify(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 return { valid: true };\n}\n\n/**\n * Checks object/other parameter values\n */\nfunction checkObjectValue(\n paramName: string,\n modelValue: unknown,\n possibleValues: unknown\n): { valid: boolean; error?: string; error_type?: string } {\n const hasMatch = Array.isArray(possibleValues)\n ? (possibleValues as unknown[]).some((possibleValue) =>\n valuesMatch(modelValue, possibleValue)\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 return { valid: true };\n}\n\ntype CheckerResult = { valid: boolean; error?: string; error_type?: string };\n\ntype CheckerContext = {\n funcDescription: FunctionDescription;\n modelToolCall: ToolCall;\n possibleAnswerParams: Record<string, unknown>;\n expectedParams: Record<\n string,\n { type: string; description?: string; items?: { type: string } }\n >;\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): CheckerResult {\n const funcNameCheck = checkFunctionName(\n funcDescription.name,\n modelToolCall.toolName\n );\n if (!funcNameCheck.valid) {\n return funcNameCheck;\n }\n\n const possibleAnswerParams = possibleAnswer[\n Object.keys(possibleAnswer)[0]\n ] as Record<string, unknown>;\n\n const argsObj: Record<string, unknown> =\n modelToolCall.args && typeof modelToolCall.args === \"object\"\n ? (modelToolCall.args as Record<string, unknown>)\n : {};\n\n const context: CheckerContext = {\n funcDescription,\n modelToolCall,\n possibleAnswerParams,\n expectedParams: funcDescription.parameters.properties,\n };\n\n const requiredCheck = checkRequiredParams(\n funcDescription.parameters.required,\n argsObj\n );\n if (!requiredCheck.valid) {\n return requiredCheck;\n }\n\n const paramsCheck = checkAllParameters(argsObj, context);\n if (!paramsCheck.valid) {\n return paramsCheck;\n }\n\n const optionalCheck = checkOptionalParams(argsObj, possibleAnswerParams);\n if (!optionalCheck.valid) {\n return optionalCheck;\n }\n\n return { valid: true };\n}\n\nfunction checkFunctionName(expected: string, actual: string): CheckerResult {\n if (actual !== expected) {\n return {\n valid: false,\n error: `Function name '${actual}' does not match expected '${expected}'.`,\n error_type: \"simple_function_checker:wrong_func_name\",\n };\n }\n return { valid: true };\n}\n\nfunction checkRequiredParams(\n requiredParams: string[],\n argsObj: Record<string, unknown>\n): CheckerResult {\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 return { valid: true };\n}\n\nfunction checkAllParameters(\n argsObj: Record<string, unknown>,\n context: CheckerContext\n): CheckerResult {\n for (const paramName of Object.keys(argsObj)) {\n const paramCheck = checkSingleParameter(\n paramName,\n argsObj[paramName],\n context\n );\n if (!paramCheck.valid) {\n return paramCheck;\n }\n }\n return { valid: true };\n}\n\nfunction checkSingleParameter(\n paramName: string,\n modelValue: unknown,\n context: CheckerContext\n): CheckerResult {\n if (\n !(\n paramName in context.expectedParams &&\n paramName in context.possibleAnswerParams\n )\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 = context.possibleAnswerParams[paramName] as unknown;\n\n if (typeof modelValue === \"string\") {\n return checkStringValue(\n paramName,\n modelValue,\n (possibleValues as unknown[] | undefined) ?? []\n );\n }\n\n if (Array.isArray(modelValue)) {\n return checkArrayValue(paramName, modelValue, possibleValues);\n }\n\n return checkObjectValue(paramName, modelValue, possibleValues);\n}\n\nfunction checkOptionalParams(\n argsObj: Record<string, unknown>,\n possibleAnswerParams: Record<string, unknown>\n): CheckerResult {\n for (const paramName in possibleAnswerParams) {\n if (Object.hasOwn(possibleAnswerParams, paramName)) {\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 += 1) {\n if (matchedModelCallIndices.has(i)) {\n continue;\n }\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 { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { generateText, type LanguageModel } from \"ai\";\nimport Ajv, { type AnySchema } from \"ajv\";\n\nimport type { BenchmarkResult, LanguageModelV3Benchmark } from \"@/interfaces\";\nimport { resolveDataDir } from \"@/utils/paths\";\n\ntype Json = unknown;\n\n// Regex patterns used for JSON extraction\nconst JSON_FENCE_REGEX = /```json\\s*([\\s\\S]*?)```/i;\nconst CODE_FENCE_REGEX = /```\\s*([\\s\\S]*?)```/i;\nconst NEWLINE_REGEX = /\\r?\\n/;\nconst LINE_SPLIT_REGEX = /\\r?\\n/;\n\ntype 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\ntype ExpectedRecord = {\n id: string;\n expected: Json;\n};\n\nfunction tryDirectParse(text: string): Json | undefined {\n try {\n return JSON.parse(text);\n } catch {\n return;\n }\n}\n\nfunction tryCodeFenceParse(text: string): Json | undefined {\n const fenceMatch =\n text.match(JSON_FENCE_REGEX) || text.match(CODE_FENCE_REGEX);\n if (!fenceMatch) {\n return;\n }\n\n const inner = fenceMatch[1].trim();\n try {\n return JSON.parse(inner);\n } catch {\n return;\n }\n}\n\nfunction tryBracketScan(text: string): Json | undefined {\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\n if (start === undefined) {\n return;\n }\n\n const open = text[start] === \"{\" ? \"{\" : \"[\";\n const close = open === \"{\" ? \"}\" : \"]\";\n let depth = 0;\n\n for (let i = start; i < text.length; i += 1) {\n const ch = text[i];\n if (ch === open) {\n depth += 1;\n } else if (ch === close) {\n depth -= 1;\n }\n\n if (depth === 0) {\n const candidate = text.slice(start, i + 1);\n try {\n return JSON.parse(candidate);\n } catch {\n return;\n }\n }\n }\n\n return;\n}\n\nfunction extractFirstJsonBlock(text: string): Json | undefined {\n // 1) try direct parse\n const directResult = tryDirectParse(text);\n if (directResult !== undefined) {\n return directResult;\n }\n\n // 2) try code fence ```json ... ```\n const fenceResult = tryCodeFenceParse(text);\n if (fenceResult !== undefined) {\n return fenceResult;\n }\n\n // 3) bracket scanning for first object or array\n return tryBracketScan(text);\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)) {\n return false;\n }\n // Require at least that expected elements (by index) match if provided\n for (let i = 0; i < expected.length; i += 1) {\n if (!subsetMatch(expected[i], actual[i])) {\n return false;\n }\n }\n return true;\n }\n // object subset\n if (actual === null || typeof actual !== \"object\") {\n return false;\n }\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])) {\n return false;\n }\n }\n return true;\n}\n\n// Test cases will be loaded from data files at runtime\n\ntype DatasetLoadResult = {\n tests: Omit<SchemaTestCase, \"expected\">[];\n expectedMap: Map<string, ExpectedRecord>;\n error?: Error;\n};\n\nasync function loadDatasets(): Promise<DatasetLoadResult> {\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 const tests = testsJsonl\n .split(NEWLINE_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n\n const expecteds: ExpectedRecord[] = expectedJsonl\n .split(NEWLINE_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n\n const expectedMap = new Map<string, ExpectedRecord>();\n for (const r of expecteds) {\n expectedMap.set(r.id, r);\n }\n\n return { tests, expectedMap };\n } catch (e: unknown) {\n return {\n tests: [],\n expectedMap: new Map(),\n error: e as Error,\n };\n }\n}\n\nfunction buildMessages(tc: Omit<SchemaTestCase, \"expected\">) {\n const schemaStr = JSON.stringify(tc.schema, null, 2);\n return [\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\ntype ValidationResult = {\n valid: boolean;\n valuesOk: boolean;\n parsed: Json;\n};\n\ntype ValidationContext = {\n expectedMap: Map<string, ExpectedRecord>;\n ajv: Ajv;\n logs: string[];\n};\n\nfunction validateTestCase(\n tc: Omit<SchemaTestCase, \"expected\">,\n parsed: Json,\n context: ValidationContext\n): ValidationResult {\n const validate = context.ajv.compile(tc.schema);\n const valid = validate(parsed) as boolean;\n\n if (!valid) {\n context.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\n const expectedRec = context.expectedMap.get(tc.id);\n if (!expectedRec) {\n context.logs.push(\n `[WARN] ${tc.id}: No expected record found. Skipping value match.`\n );\n }\n\n const valuesOk = expectedRec\n ? subsetMatch(expectedRec.expected, parsed)\n : false;\n\n return { valid, valuesOk, parsed };\n}\n\ntype ProcessContext = {\n model: LanguageModel;\n config: Record<string, unknown> | undefined;\n validation: ValidationContext;\n};\n\nasync function processTestCase(\n tc: Omit<SchemaTestCase, \"expected\">,\n context: ProcessContext\n): Promise<{ schemaValid: boolean; valueMatch: boolean; correct: boolean }> {\n const messages = buildMessages(tc);\n\n const temp = context.config?.temperature;\n const temperature = typeof temp === \"number\" ? temp : undefined;\n const { text } = await generateText({\n model: context.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 context.validation.logs.push(\n `[FAIL] ${tc.id}: Unable to parse JSON from model output.`\n );\n return { schemaValid: false, valueMatch: false, correct: false };\n }\n\n const {\n valid,\n valuesOk,\n parsed: validatedParsed,\n } = validateTestCase(tc, parsed, context.validation);\n\n const correct = valid && valuesOk;\n if (correct) {\n context.validation.logs.push(`[PASS] ${tc.id}`);\n } else {\n context.validation.logs.push(\n `[FAIL] ${tc.id}: schemaValid=${valid}, valuesOk=${valuesOk}. Output=${JSON.stringify(\n validatedParsed\n )}`\n );\n }\n\n return { schemaValid: valid, valueMatch: valuesOk, correct };\n}\n\nexport const jsonGenerationBenchmark: LanguageModelV3Benchmark = {\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 // Load datasets\n const { tests, expectedMap, error } = await loadDatasets();\n if (error) {\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [\n `[FATAL] Failed to load json-generation datasets: ${error.message}`,\n ],\n error,\n };\n }\n\n const context: ProcessContext = {\n model,\n config,\n validation: { expectedMap, ajv, logs },\n };\n\n const counts = await processAllTests(tests, context);\n return buildBenchmarkResult(tests.length, counts, logs);\n },\n};\n\nasync function processAllTests(\n tests: Omit<SchemaTestCase, \"expected\">[],\n context: ProcessContext\n): Promise<{\n schemaValidCount: number;\n valueMatchCount: number;\n correctCount: number;\n}> {\n let schemaValidCount = 0;\n let valueMatchCount = 0;\n let correctCount = 0;\n\n for (const tc of tests) {\n try {\n const result = await processTestCase(tc, context);\n if (result.schemaValid) {\n schemaValidCount += 1;\n }\n if (result.valueMatch) {\n valueMatchCount += 1;\n }\n if (result.correct) {\n correctCount += 1;\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n context.validation.logs.push(`[ERROR] ${tc.id}: ${msg}`);\n }\n }\n\n return { schemaValidCount, valueMatchCount, correctCount };\n}\n\nfunction buildBenchmarkResult(\n total: number,\n counts: {\n schemaValidCount: number;\n valueMatchCount: number;\n correctCount: number;\n },\n logs: string[]\n): BenchmarkResult {\n const score = counts.correctCount / total;\n return {\n score,\n success: score >= 0.8,\n metrics: {\n total_cases: total,\n correct_count: counts.correctCount,\n schema_valid_count: counts.schemaValidCount,\n value_match_count: counts.valueMatchCount,\n accuracy: score,\n },\n logs,\n };\n}\n\n// A schema-only variant that validates structure/format without value matching\ntype SchemaOnlyTestCase = Omit<SchemaTestCase, \"expected\">;\n\ntype SchemaOnlyContext = {\n model: LanguageModel;\n config: Record<string, unknown> | undefined;\n ajv: Ajv;\n logs: string[];\n};\n\nasync function loadSchemaOnlyTests(): Promise<{\n tests: SchemaOnlyTestCase[];\n error?: Error;\n}> {\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 tests = testsJsonl\n .split(LINE_SPLIT_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n return { tests };\n } catch (e: unknown) {\n return { tests: [], error: e as Error };\n }\n}\n\nasync function processSchemaOnlyTestCase(\n tc: SchemaOnlyTestCase,\n context: SchemaOnlyContext\n): Promise<boolean> {\n const messages = buildMessages(tc);\n\n const temp = context.config?.temperature;\n const temperature = typeof temp === \"number\" ? temp : undefined;\n const { text } = await generateText({\n model: context.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 context.logs.push(\n `[FAIL] ${tc.id}: Could not parse JSON from model output.`\n );\n return false;\n }\n\n const validate = context.ajv.compile(tc.schema);\n const valid = validate(parsed) as boolean;\n if (valid) {\n context.logs.push(`[PASS] ${tc.id}`);\n return true;\n }\n\n context.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 return false;\n}\n\nasync function runSchemaOnlyTests(\n tests: SchemaOnlyTestCase[],\n context: SchemaOnlyContext\n): Promise<number> {\n let schemaValidCount = 0;\n\n for (const tc of tests) {\n try {\n const isValid = await processSchemaOnlyTestCase(tc, context);\n if (isValid) {\n schemaValidCount += 1;\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n context.logs.push(`[ERROR] ${tc.id}: ${msg}`);\n }\n }\n\n return schemaValidCount;\n}\n\nexport const jsonGenerationSchemaOnlyBenchmark: LanguageModelV3Benchmark = {\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 const { tests, error } = await loadSchemaOnlyTests();\n if (error) {\n const msg = error.message;\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [`[FATAL] Failed to load schema-only tests: ${msg}`],\n error,\n };\n }\n\n const context: SchemaOnlyContext = { model, config, ajv, logs };\n const schemaValidCount = await runSchemaOnlyTests(tests, context);\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 type { 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 type { EvaluationResult } from \"@/interfaces\";\n\n// Regex patterns at module level for performance\nconst FAIL_ID_REGEX = /^\\[FAIL\\]\\s+([^:]+):/;\nconst DEBUG_FAIL_PREFIX_REGEX = /^\\[DEBUG-FAIL\\] /;\nconst DEBUG_FAIL_CONTEXT_PREFIX_REGEX = /^\\[DEBUG-FAIL-CONTEXT\\] /;\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(\"+\")) {\n return `${colors.green}${line}${colors.reset}`;\n }\n if (line.startsWith(\"-\")) {\n return `${colors.red}${line}${colors.reset}`;\n }\n if (line.startsWith(\"@\")) {\n return `${colors.cyan}${colors.bold}${line}${colors.reset}`;\n }\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)) {\n continue;\n }\n seen.add(l);\n out.push(l);\n }\n return out;\n}\n\n// Helper function to check if diff contains function name issues\nfunction hasFunctionNameIssue(diff: unknown[]): boolean {\n return diff.some(\n (d: unknown) =>\n String(d).includes(\"function name\") ||\n String(d).includes(\"missing function:\")\n );\n}\n\n// Helper function to suggest function name fixes\nfunction suggestFunctionNameFix(\n expected: unknown,\n actual: unknown,\n suggestions: string[]\n): void {\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// Helper function to suggest missing parameter fixes\nfunction suggestMissingParamFix(diff: unknown[], suggestions: string[]): void {\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// Helper function to suggest unexpected parameter fixes\nfunction suggestUnexpectedParamFix(\n diff: unknown[],\n suggestions: string[]\n): void {\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// Helper function to suggest parameter value fixes\nfunction suggestParamValueFix(diff: unknown[], suggestions: string[]): void {\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 allowedOneOfLine = (diff as unknown[]).find((d: unknown) =>\n String(d).startsWith(\"- expected one of:\")\n ) as string | undefined;\n const allowedSingleLine = (diff as unknown[]).find((d: unknown) =>\n String(d).startsWith(\"- expected:\")\n ) as string | undefined;\n if (allowedSingleLine) {\n const value = allowedSingleLine.replace(\"- expected: \", \"\");\n suggestions.push(`Set '${param}' to: ${value}.`);\n } else if (allowedOneOfLine) {\n const allowed = allowedOneOfLine.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// Helper function to suggest fixes based on error type\nfunction suggestFromErrorType(error_type: string, suggestions: string[]): void {\n if (error_type.includes(\"missing_required\")) {\n suggestions.push(\"Add all required parameters defined by the tool schema.\");\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\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 (!Array.isArray(diff)) {\n if (suggestions.length === 0 && typeof error_type === \"string\") {\n suggestFromErrorType(error_type, suggestions);\n }\n return uniqueLines(suggestions);\n }\n\n if (hasFunctionNameIssue(diff)) {\n suggestFunctionNameFix(expected, actual, suggestions);\n }\n\n if (\n diff.some((d: unknown) => String(d).startsWith(\"- missing required param:\"))\n ) {\n suggestMissingParamFix(diff, suggestions);\n }\n\n if (diff.some((d: unknown) => String(d).startsWith(\"+ unexpected param:\"))) {\n suggestUnexpectedParamFix(diff, suggestions);\n }\n\n if (diff.some((d: unknown) => String(d).startsWith(\"@@ param \"))) {\n suggestParamValueFix(diff, suggestions);\n }\n\n if (suggestions.length === 0 && typeof error_type === \"string\") {\n suggestFromErrorType(error_type, suggestions);\n }\n\n return uniqueLines(suggestions);\n}\n\n// Helper function to extract test ID from a log line\nfunction getTestIdFromLogLine(line: string): string | undefined {\n if (line.startsWith(\"[FAIL]\")) {\n const m = line.match(FAIL_ID_REGEX);\n return m?.[1];\n }\n if (line.startsWith(\"[DEBUG-FAIL]\")) {\n try {\n const parsed = JSON.parse(line.replace(DEBUG_FAIL_PREFIX_REGEX, \"\"));\n return String(parsed?.id ?? \"\");\n } catch {\n // Intentionally ignore: malformed [DEBUG-FAIL] payloads are expected when\n // earlier steps fail to JSON-stringify complex values (circular/BigInt/etc.).\n // We only use parsed IDs for de-duplication, so a parse miss is safe.\n }\n }\n if (line.startsWith(\"[DEBUG-FAIL-CONTEXT]\")) {\n try {\n const parsed = JSON.parse(\n line.replace(DEBUG_FAIL_CONTEXT_PREFIX_REGEX, \"\")\n );\n return String(parsed?.id ?? \"\");\n } catch {\n /* intentionally ignored */\n }\n }\n return;\n}\n\n// Helper function to group logs by test ID\nfunction groupLogsByTestId(failLogs: string[]): Map<string, string[]> {\n const byId = new Map<string, string[]>();\n for (const line of failLogs) {\n const id = getTestIdFromLogLine(line);\n const key = id ?? \"__general__\";\n const arr = byId.get(key) ?? [];\n arr.push(line);\n byId.set(key, arr);\n }\n return byId;\n}\n\n// Helper function to collect debug IDs from lines\nfunction collectDebugIds(lines: string[]): Set<string> {\n const debugIds = new Set<string>();\n for (const l of lines) {\n if (l.startsWith(\"[DEBUG-FAIL]\")) {\n try {\n const parsed = JSON.parse(l.replace(DEBUG_FAIL_PREFIX_REGEX, \"\"));\n if (parsed?.id) {\n debugIds.add(String(parsed.id));\n }\n } catch {\n /* intentionally ignored */\n }\n }\n }\n return debugIds;\n}\n\n// Helper function to print formatted JSON with indentation\nfunction printIndentedJson(prefix: string, data: unknown, color: string): void {\n console.log(\n color +\n prefix +\n JSON.stringify(data, null, 2).split(\"\\n\").join(\"\\n \") +\n colors.reset\n );\n}\n\n// Helper function to handle DEBUG-FAIL line display\nfunction displayDebugFailLine(line: string): void {\n const payload = line.replace(DEBUG_FAIL_PREFIX_REGEX, \"\");\n try {\n const parsed = JSON.parse(payload);\n const { message, diff, expected, actual } = parsed;\n if (message) {\n console.log(` ${colors.bold}${message}${colors.reset}`);\n }\n if (diff && Array.isArray(diff)) {\n for (const dLine of diff) {\n console.log(` ${colorizeDiffLine(dLine)}`);\n }\n } else {\n console.log(\" expected:\");\n printIndentedJson(\" \", expected, colors.green);\n console.log(\" actual:\");\n printIndentedJson(\" \", actual, colors.red);\n }\n const suggestions = suggestFixFromDiff(parsed);\n if (suggestions.length) {\n console.log(` ${colors.bold}Suggested fix:${colors.reset}`);\n for (const s of suggestions) {\n console.log(` • ${s}`);\n }\n }\n } catch {\n console.log(` ${line}`);\n }\n}\n\n// Helper function to display context information\nfunction displayContextInfo(ctx: Record<string, unknown>): void {\n if (ctx.tool_schema) {\n printIndentedJson(\" tool schema: \", ctx.tool_schema, colors.gray);\n }\n if (ctx.last_user_query) {\n console.log(\n colors.gray +\n \" last user: \" +\n JSON.stringify(ctx.last_user_query) +\n colors.reset\n );\n }\n if (ctx.raw_model_text) {\n console.log(\n colors.gray +\n \" raw model text (middleware parsed):\\n \" +\n String(ctx.raw_model_text).split(\"\\n\").join(\"\\n \") +\n colors.reset\n );\n }\n if (ctx.parsed_tool_calls) {\n printIndentedJson(\n \" parsed tool calls: \",\n ctx.parsed_tool_calls,\n colors.gray\n );\n }\n if (ctx.ground_truth) {\n printIndentedJson(\n \" ground truth: \",\n ctx.ground_truth,\n colors.gray\n );\n }\n if (ctx.finish_reason) {\n console.log(\n colors.gray +\n \" finish reason: \" +\n JSON.stringify(ctx.finish_reason) +\n colors.reset\n );\n }\n}\n\n// Helper function to handle DEBUG-FAIL-CONTEXT line display\nfunction displayDebugFailContextLine(line: string): void {\n const payload = line.replace(DEBUG_FAIL_CONTEXT_PREFIX_REGEX, \"\");\n try {\n const ctx = JSON.parse(payload) as Record<string, unknown>;\n console.log(` ${colors.gray}context:${colors.reset}`);\n displayContextInfo(ctx);\n } catch {\n console.log(` ${line}`);\n }\n}\n\n// Helper function to display a single log line\nfunction displayLogLine(line: string, debugIds: Set<string>): void {\n if (line.startsWith(\"[FAIL]\")) {\n const m = line.match(FAIL_ID_REGEX);\n const failId = m?.[1];\n if (failId && debugIds.has(failId)) {\n return;\n }\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 displayDebugFailLine(line);\n } else if (line.startsWith(\"[DEBUG-FAIL-CONTEXT]\")) {\n displayDebugFailContextLine(line);\n }\n}\n\n// Helper function to display grouped failure logs\nfunction displayGroupedFailures(byId: Map<string, string[]>): void {\n console.log(` ${colors.bold}Failure details (grouped):${colors.reset}`);\n for (const [groupId, lines] of byId) {\n if (groupId !== \"__general__\") {\n console.log(` ${colors.underline}${groupId}${colors.reset}`);\n }\n const debugIds = collectDebugIds(lines);\n for (const line of lines) {\n displayLogLine(line, debugIds);\n }\n }\n}\n\n// Helper function to display success logs\nfunction displaySuccessLogs(logs: string[]): void {\n const info = 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// Helper function to filter failure-related logs\nfunction filterFailureLogs(logs: string[]): string[] {\n return 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 l.startsWith(\"[DEBUG-FAIL-CONTEXT]\")\n );\n}\n\n// Helper function to display logs for a result\nfunction displayResultLogs(logs: string[]): void {\n const failLogs = filterFailureLogs(logs);\n const hasFails = failLogs.length > 0;\n if (hasFails) {\n const byId = groupLogsByTestId(failLogs);\n displayGroupedFailures(byId);\n } else {\n displaySuccessLogs(logs);\n }\n}\n\n// Helper function to display metrics\nfunction displayMetrics(metrics: [string, unknown][]): void {\n if (metrics.length > 0) {\n console.log(\" Metrics:\");\n for (const [k, v] of metrics) {\n console.log(` - ${k}: ${v}`);\n }\n }\n}\n\n// Helper function to display result header\nfunction displayResultHeader(r: EvaluationResult): void {\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\nexport function consoleDebugReporter(results: EvaluationResult[]): void {\n console.log(\"\\n--- 📊 Evaluation Report (debug) ---\");\n for (const r of results) {\n displayResultHeader(r);\n displayMetrics(Object.entries(r.result.metrics));\n if (r.result.logs?.length) {\n displayResultLogs(r.result.logs);\n }\n }\n console.log(\"\\n------------------------------------\\n\");\n}\n","import type { 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 type { 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 type { LanguageModel } from \"ai\";\n\nimport type {\n EvaluateOptions,\n EvaluationResult,\n LanguageModelV3Benchmark,\n ReporterType,\n} from \"./interfaces\";\nimport { reporters } from \"./reporters\";\n\nasync function runSingleBenchmark(\n model: LanguageModel,\n benchmark: LanguageModelV3Benchmark,\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\n/**\n * Normalize models input to array of [key, model] entries\n */\nfunction normalizeModels(\n models: LanguageModel | LanguageModel[] | Record<string, LanguageModel>\n): [string | undefined, LanguageModel][] {\n const modelEntries: [string | undefined, LanguageModel][] = [];\n\n if (Array.isArray(models)) {\n for (const m of models) {\n modelEntries.push([undefined, m]);\n }\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\n return modelEntries;\n}\n\n/**\n * Build config object from optional parameters\n */\nfunction buildConfig(\n temperature?: number,\n maxTokens?: number\n): Record<string, unknown> | undefined {\n const config: Record<string, unknown> = {};\n if (temperature !== undefined) {\n config.temperature = temperature;\n }\n if (maxTokens !== undefined) {\n config.maxTokens = maxTokens;\n }\n return Object.keys(config).length > 0 ? config : undefined;\n}\n\n/**\n * Execute reporter with results\n */\nfunction executeReporter(\n reporter: ReporterType,\n results: EvaluationResult[]\n): void {\n const report = reporters[reporter];\n if (report) {\n report(results);\n } else {\n console.warn(`Unknown reporter: '${reporter}'. Defaulting to console.`);\n reporters.console(results);\n }\n}\n\nexport async function evaluate(\n options: EvaluateOptions\n): Promise<EvaluationResult[]> {\n const {\n models,\n benchmarks,\n reporter = \"console\",\n temperature,\n maxTokens,\n } = options;\n\n const modelEntries = normalizeModels(models);\n const config = buildConfig(temperature, maxTokens);\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 config\n );\n allResults.push(evaluationResult);\n }\n }\n\n executeReporter(reporter, allResults);\n return allResults;\n}\n"],"mappings":"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","names":["fs","path","require","fs","path","fs","path","generateText","LINE_SPLIT_REGEX","fs","path","generateText","colors"]}
|
|
1
|
+
{"version":3,"sources":["../src/benchmarks/bfcl.ts","../src/utils/paths.ts","../src/benchmarks/bfcl/ast-checker.ts","../src/benchmarks/complex-func-bench.ts","../src/benchmarks/json-generation.ts","../src/reporters/console.ts","../src/reporters/console.debug.ts","../src/reporters/json.ts","../src/reporters/index.ts","../src/evaluate.ts"],"sourcesContent":["import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport type { JSONObject } from \"@ai-sdk/provider\";\nimport {\n generateText,\n jsonSchema,\n type LanguageModel,\n type ModelMessage,\n tool,\n} from \"ai\";\n\nimport type { BenchmarkResult, LanguageModelV3Benchmark } from \"../interfaces\";\nimport { resolveDataDir } from \"../utils/paths\";\nimport {\n type FunctionDescription,\n multipleFunctionChecker,\n parallelFunctionCheckerNoOrder,\n simpleFunctionChecker,\n type ToolCall,\n} from \"./bfcl/ast-checker\";\n\n// Resolve data files relative to this module using ESM-safe utilities\n\n// Regex constants for performance\nconst LINE_SPLIT_REGEX = /\\r?\\n/;\nconst NUMERIC_STRING_REGEX = /^\\d+$/;\n\n// Helper function to convert ground truth to morphXML format\nfunction convertGroundTruthToXML(call: Record<string, unknown>): string {\n const keys = Object.keys(call);\n if (keys.length === 0) {\n return \"<empty_call />\";\n }\n const funcName = keys[0];\n if (!funcName) {\n return \"<undefined_function />\";\n }\n const params = call[funcName] as Record<string, unknown>;\n if (!params || typeof params !== \"object\") {\n return `<${funcName} />`;\n }\n let xml = `<${funcName}>\\n`;\n for (const [key, value] of Object.entries(params)) {\n // Value is typically an array [value, ...alternatives]\n const displayValue = Array.isArray(value) ? value[0] : value;\n let valueStr: string;\n if (typeof displayValue === \"string\") {\n valueStr = displayValue;\n } else if (displayValue === null || displayValue === undefined) {\n valueStr = \"\";\n } else {\n valueStr = JSON.stringify(displayValue);\n }\n xml += ` <${key}>${valueStr}</${key}>\\n`;\n }\n xml += `</${funcName}>`;\n return xml;\n}\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\ninterface Message {\n role: string;\n content: string;\n}\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 Record<string, unknown>[])[0]\n );\n }\n if (category === \"parallel\") {\n return parallelFunctionCheckerNoOrder(\n testCase.function as unknown as FunctionDescription[],\n modelOutput as ToolCall[],\n possibleAnswer.ground_truth as Record<string, unknown>[]\n );\n }\n if (category === \"multiple\") {\n return multipleFunctionChecker(\n testCase.function as unknown as FunctionDescription[],\n modelOutput as ToolCall[],\n possibleAnswer.ground_truth as Record<string, unknown>[]\n );\n }\n 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 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): LanguageModelV3Benchmark {\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(LINE_SPLIT_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n const possibleAnswers: PossibleAnswer[] = possibleAnswersJson\n .split(LINE_SPLIT_REGEX)\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 type field\n const fixSchemaType = (copy: ToolSchemaObject): void => {\n if (!copy.type) {\n return;\n }\n if (copy.type === \"dict\") {\n copy.type = \"object\";\n }\n if (copy.type === \"tuple\") {\n copy.type = \"array\";\n }\n if (copy.type === \"integer\" || copy.type === \"float\") {\n copy.type = \"number\";\n }\n };\n\n // Helper: fix BFCL JSON schema properties recursively\n const fixSchemaProperties = (\n copy: ToolSchemaObject,\n fixSchemaFn: (schema: unknown) => unknown\n ): void => {\n if (!copy.properties || typeof copy.properties !== \"object\") {\n return;\n }\n for (const k of Object.keys(copy.properties)) {\n (copy.properties as Record<string, unknown>)[k] = fixSchemaFn(\n (copy.properties as Record<string, unknown>)[k]\n );\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 }\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 fixSchemaType(copy);\n fixSchemaProperties(copy, fixSchema);\n if (copy.items) {\n copy.items = fixSchema(copy.items);\n }\n return copy;\n }\n return copy;\n };\n\n // Helper: Flatten BFCL message shape\n const flattenMessages = (\n messages: Message[] | Message[][]\n ): Message[] =>\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 // Helper: Sanitize tool name for OpenAI compatibility\n const sanitizeName = (toolName: string): string => {\n const s = toolName.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64);\n return s.length > 0 ? s : \"tool\";\n };\n\n // Helper: Build transformed tools and name mapping\n const buildTransformedTools = (\n tools: ToolSpec[],\n fixSchemaFn: (schema: unknown) => unknown\n ): {\n transformedTools: TransformedTool[];\n nameMap: Map<string, string>;\n } => {\n const nameMap = new Map<string, string>();\n const transformedTools: TransformedTool[] = tools.map((t) => {\n const fixed = fixSchemaFn(t.parameters);\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,\n };\n });\n return { transformedTools, nameMap };\n };\n\n // Helper: Parse middleware debug tool calls\n const parseDebugToolCalls = (\n raw: string | undefined\n ): Array<{ toolName?: string; input?: unknown }> => {\n if (!raw) {\n return [];\n }\n try {\n const arr = JSON.parse(raw);\n return Array.isArray(arr) ? arr : [];\n } catch {\n return [];\n }\n };\n\n // Helper: Get sanitized name from index or raw name\n const getSanitizedName = (\n rawName: unknown,\n transformedTools: TransformedTool[]\n ): unknown => {\n if (\n typeof rawName === \"string\" &&\n NUMERIC_STRING_REGEX.test(rawName)\n ) {\n return transformedTools[Number(rawName)]?.name ?? rawName;\n }\n return rawName;\n };\n\n // Helper: Parse arguments from various formats\n const parseToolArgs = (extractedArgs: unknown): unknown => {\n if (typeof extractedArgs !== \"string\") {\n return extractedArgs;\n }\n try {\n return JSON.parse(extractedArgs);\n } catch {\n // leave as string if not JSON\n return extractedArgs;\n }\n };\n\n // Helper: Restore original tool names in tool calls\n const restoreToolCalls = (\n toolCalls: unknown[],\n nameMap: Map<string, string>,\n transformedTools: TransformedTool[]\n ): unknown[] =>\n (toolCalls || []).map((c: unknown) => {\n const call = c as Record<string, unknown>;\n const rawName = call.toolName ?? call.name;\n const sanitizedFromIndex = getSanitizedName(\n rawName,\n transformedTools\n );\n const originalName =\n nameMap.get(sanitizedFromIndex as string) ?? sanitizedFromIndex;\n const extractedArgs =\n call.args ??\n call.arguments ??\n call.input ??\n call.params ??\n call.parameters;\n const parsedArgs = parseToolArgs(extractedArgs);\n return {\n ...call,\n toolName: originalName,\n name: originalName,\n args: parsedArgs ?? {},\n };\n });\n\n // Helper: Summarize args for stable output\n const summarizeArgs = (args: unknown): unknown => {\n if (args == null) {\n return args;\n }\n if (typeof args !== \"object\") {\n return args;\n }\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 // Helper: Generate parameter mismatch diff\n const generateParamMismatchDiff = (\n paramName: string,\n allowed: unknown,\n got: unknown\n ): string[] => {\n const diffLines: string[] = [];\n diffLines.push(`@@ param ${paramName}`);\n const allowedArray = Array.isArray(allowed)\n ? (allowed as unknown[])\n : [allowed as unknown];\n const expectedLine = (() => {\n if (allowedArray.length === 1) {\n return `- expected: ${JSON.stringify(allowedArray[0])}`;\n }\n const formatted = allowedArray\n .map((v) =>\n Array.isArray(v) || (typeof v === \"object\" && v !== null)\n ? JSON.stringify(v)\n : String(v)\n )\n .join(\", \");\n return `- expected one of: ${formatted}`;\n })();\n diffLines.push(expectedLine);\n diffLines.push(`+ got: ${JSON.stringify(got)}`);\n return diffLines;\n };\n\n // Helper: Check if param value matches allowed values\n const paramValueMatches = (allowed: unknown, got: unknown): boolean => {\n if (!Array.isArray(allowed)) {\n return false;\n }\n return allowed.some((v: unknown) => {\n try {\n if (Array.isArray(got)) {\n return (\n JSON.stringify(got.map((x) => String(x)).sort()) ===\n JSON.stringify((v as unknown[]).map((x) => String(x)).sort())\n );\n }\n } catch {\n // Ignore parse errors\n }\n return (\n String(v).toLowerCase().replace(/\\s+/g, \"\") ===\n String(got).toLowerCase().replace(/\\s+/g, \"\")\n );\n });\n };\n\n // Helper: Check function name mismatch\n const checkFunctionNameMismatch = (\n expectedName: unknown,\n receivedName: unknown,\n diff: string[]\n ): void => {\n if (expectedName !== receivedName) {\n diff.push(\"@@ function name\");\n diff.push(`- ${expectedName}`);\n diff.push(`+ ${receivedName}`);\n }\n };\n\n // Helper: Check missing required params\n const checkMissingParams = (\n required: string[],\n receivedArgs: Record<string, unknown>,\n diff: string[]\n ): void => {\n for (const req of required) {\n if (!(req in receivedArgs)) {\n diff.push(`- missing required param: ${req}`);\n }\n }\n };\n\n // Helper: Check unexpected params\n const checkUnexpectedParams = (\n expectedParams: Record<string, unknown>,\n receivedArgs: Record<string, unknown>,\n diff: string[]\n ): void => {\n for (const k of Object.keys(receivedArgs)) {\n if (!(k in expectedParams)) {\n diff.push(`+ unexpected param: ${k}`);\n }\n }\n };\n\n // Helper: Check param value mismatches\n const checkParamValueMismatches = (\n expectedParams: Record<string, unknown>,\n receivedArgs: Record<string, unknown>,\n diff: string[]\n ): void => {\n for (const k of Object.keys(receivedArgs)) {\n if (k in expectedParams) {\n const allowed = (expectedParams as Record<string, unknown[]>)[k];\n const got = receivedArgs[k];\n if (!paramValueMatches(allowed, got)) {\n diff.push(...generateParamMismatchDiff(k, allowed, got));\n }\n }\n }\n };\n\n // Helper: Build diff for simple test case\n const buildSimpleDiff = (\n tools: ToolSpec[],\n possibleAnswer: PossibleAnswer,\n restoredCalls: unknown[]\n ): {\n expected: Record<string, unknown>;\n actual: Record<string, unknown>;\n diff: string[];\n } => {\n const funcDesc = tools[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 ? gt[Object.keys(gt)[0]] : undefined;\n const received = (restoredCalls as Record<string, unknown>[])[0];\n const receivedName = received?.toolName ?? received?.name;\n const receivedArgs = summarizeArgs(received?.args);\n\n const expected: Record<string, unknown> = {\n function: expectedFuncName,\n params: expectedParams,\n };\n const actual: Record<string, unknown> = {\n function: receivedName,\n args: receivedArgs,\n };\n const diff: string[] = [];\n\n checkFunctionNameMismatch(expectedFuncName, receivedName, diff);\n\n if (\n expectedParams &&\n receivedArgs &&\n typeof receivedArgs === \"object\" &&\n receivedArgs !== null\n ) {\n const required = (funcDesc?.parameters?.required ?? []) as string[];\n checkMissingParams(\n required,\n receivedArgs as Record<string, unknown>,\n diff\n );\n checkUnexpectedParams(\n expectedParams as Record<string, unknown>,\n receivedArgs as Record<string, unknown>,\n diff\n );\n checkParamValueMismatches(\n expectedParams as Record<string, unknown>,\n receivedArgs as Record<string, unknown>,\n diff\n );\n }\n\n return { expected, actual, diff };\n };\n\n // Helper: Check call count mismatch\n const checkCallCountMismatch = (\n expectedCount: number,\n actualCount: number,\n diff: string[]\n ): void => {\n if (expectedCount !== actualCount) {\n diff.push(\"@@ call count\");\n diff.push(`- expected ${expectedCount}`);\n diff.push(`+ got ${actualCount}`);\n }\n };\n\n // Helper: Add missing and extra functions to diff\n const addMissingAndExtraFunctions = (\n expectedNames: unknown[],\n actualNames: unknown[],\n diff: string[]\n ): void => {\n const missing = expectedNames.filter((n) => !actualNames.includes(n));\n const extra = actualNames.filter((n) => !expectedNames.includes(n));\n for (const m of missing) {\n diff.push(`- missing function: ${m}`);\n }\n for (const e of extra) {\n diff.push(`+ unexpected function: ${e}`);\n }\n };\n\n // Helper: Find matching call index\n const findMatchingCallIndex = (\n fname: string,\n restoredCalls: Record<string, unknown>[],\n usedActual: Set<number>\n ): number => {\n for (let i = 0; i < restoredCalls.length; i += 1) {\n if (usedActual.has(i)) {\n continue;\n }\n const rc = restoredCalls[i];\n const rcName = rc?.toolName ?? rc?.name;\n if (rcName === fname) {\n return i;\n }\n }\n return -1;\n };\n\n // Helper: Validate function parameters\n const validateFunctionParams = (options: {\n receivedArgs: Record<string, unknown>;\n expectedParamsAllowed: Record<string, unknown>;\n requiredParams: string[];\n diff: string[];\n }): void => {\n const { receivedArgs, expectedParamsAllowed, requiredParams, diff } =\n options;\n checkMissingParams(requiredParams, receivedArgs, diff);\n checkUnexpectedParams(expectedParamsAllowed, receivedArgs, diff);\n checkParamValueMismatches(expectedParamsAllowed, receivedArgs, diff);\n };\n\n // Helper: Process single expected function call\n const processExpectedCall = (options: {\n expectedObj: Record<string, unknown>;\n restoredCalls: Record<string, unknown>[];\n tools: ToolSpec[];\n usedActual: Set<number>;\n diff: string[];\n }): void => {\n const { expectedObj, restoredCalls, tools, usedActual, diff } =\n options;\n const fname = Object.keys(expectedObj)[0];\n const matchedIndex = findMatchingCallIndex(\n fname,\n restoredCalls,\n usedActual\n );\n\n if (matchedIndex === -1) {\n return;\n }\n\n usedActual.add(matchedIndex);\n const received = restoredCalls[matchedIndex];\n const receivedArgs = summarizeArgs(received?.args);\n const expectedParamsAllowed = expectedObj[fname] as Record<\n string,\n unknown\n >;\n const funcDesc = tools.find((t: ToolSpec) => t.name === fname);\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 validateFunctionParams({\n receivedArgs: receivedArgs as Record<string, unknown>,\n expectedParamsAllowed,\n requiredParams,\n diff,\n });\n }\n };\n\n // Helper: Build diff for parallel/multiple test case\n const buildParallelDiff = (\n tools: ToolSpec[],\n possibleAnswer: PossibleAnswer,\n restoredCalls: unknown[]\n ): {\n expected: Record<string, unknown>;\n actual: Record<string, unknown>;\n diff: string[];\n } => {\n const gtArr: Record<string, unknown>[] =\n (\n possibleAnswer as {\n ground_truth?: Record<string, unknown>[];\n }\n ).ground_truth ?? [];\n const expectedNames = gtArr.map((g) => Object.keys(g)[0]);\n const actualNames = (restoredCalls as Record<string, unknown>[]).map(\n (c) => c.toolName ?? c.name\n );\n\n const expected: Record<string, unknown> = {\n functions: expectedNames,\n };\n const actual: Record<string, unknown> = { functions: actualNames };\n const diff: string[] = [];\n\n checkCallCountMismatch(\n expectedNames.length,\n actualNames.length,\n diff\n );\n addMissingAndExtraFunctions(expectedNames, actualNames, diff);\n\n const usedActual = new Set<number>();\n for (const expectedObj of gtArr) {\n processExpectedCall({\n expectedObj,\n restoredCalls: restoredCalls as Record<string, unknown>[],\n tools,\n usedActual,\n diff,\n });\n }\n\n return { expected, actual, diff };\n };\n\n // Concurrency control via env BFCL_CONCURRENCY (default 16)\n const concurrencyEnv = process.env.BFCL_CONCURRENCY;\n const concurrency =\n concurrencyEnv && Number.isFinite(Number(concurrencyEnv))\n ? Math.max(1, Number(concurrencyEnv))\n : 16;\n logs.push(\n `[INFO] Running ${testCases.length} test cases with concurrency=${concurrency}`\n );\n\n // Helper: Log first tool debug info\n const logFirstToolDebug = (\n transformedTools: TransformedTool[],\n testCaseId: string,\n caseLogs: string[]\n ): void => {\n try {\n const firstTool = transformedTools[0];\n const schemaType =\n firstTool?.inputSchema?.type ??\n (\n (firstTool?.inputSchema as Record<string, unknown> | undefined)\n ?.jsonSchema as Record<string, unknown> | undefined\n )?.type;\n caseLogs.push(\n `[DEBUG] ${testCaseId}: firstTool=${JSON.stringify(firstTool)}, schemaType=${schemaType}`\n );\n } catch (e: unknown) {\n caseLogs.push(\n `[DEBUG] ${testCaseId}: failed to introspect tools: ${(e as Error).message}`\n );\n }\n };\n\n // Helper: Log raw tool calls\n const logRawToolCalls = (options: {\n toolCalls: unknown;\n finishReason: unknown;\n text: unknown;\n testCaseId: string;\n caseLogs: string[];\n }): void => {\n const { toolCalls, finishReason, text, testCaseId, caseLogs } =\n options;\n try {\n caseLogs.push(\n `[DEBUG] ${testCaseId}: rawToolCalls=${JSON.stringify(toolCalls)}, finishReason=${finishReason}, text=${JSON.stringify(text)}`\n );\n } catch {\n caseLogs.push(\n `[DEBUG] ${testCaseId}: failed to serialize toolCalls`\n );\n }\n };\n\n // Helper: Build failure context payload\n const buildFailureContext = (options: {\n testCase: TestCase;\n tools: ToolSpec[];\n flatMessages: Message[];\n mwOriginalText: string | undefined;\n text: unknown;\n finishReason: unknown;\n mwParsedToolCalls: Array<{ toolName?: string; input?: unknown }>;\n restoredCalls: unknown[];\n possibleAnswer: PossibleAnswer;\n }): Record<string, unknown> => {\n const {\n testCase,\n tools,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n restoredCalls,\n possibleAnswer,\n } = options;\n\n const lastUser = (() => {\n const reversed = [...flatMessages].reverse();\n const found = reversed.find(\n (m) => (m as Message).role === \"user\"\n ) as Message | undefined;\n return found?.content ?? undefined;\n })();\n\n const rawModelText = (() => {\n if (mwOriginalText && mwOriginalText.length > 0) {\n return mwOriginalText;\n }\n if (typeof text === \"string\") {\n return text;\n }\n return \"\";\n })();\n\n return {\n id: testCase.id,\n tool_schema: tools,\n last_user_query: lastUser,\n raw_model_text: rawModelText,\n finish_reason: finishReason,\n parsed_tool_calls: mwParsedToolCalls.length\n ? mwParsedToolCalls\n : restoredCalls,\n ground_truth: (possibleAnswer as { ground_truth?: unknown })\n .ground_truth,\n };\n };\n\n // Helper: Log failure details\n const logFailureDetails = (options: {\n testCase: TestCase;\n tools: ToolSpec[];\n possibleAnswer: PossibleAnswer;\n restoredCalls: unknown[];\n checkerResult: {\n valid: boolean;\n error?: string;\n error_type?: string;\n };\n flatMessages: Message[];\n mwOriginalText: string | undefined;\n text: unknown;\n finishReason: unknown;\n mwParsedToolCalls: Array<{ toolName?: string; input?: unknown }>;\n caseLogs: string[];\n }): void => {\n const {\n testCase,\n tools,\n possibleAnswer,\n restoredCalls,\n checkerResult,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n caseLogs,\n } = options;\n\n try {\n const category = testCase.id.split(\"_\")[0];\n const { expected, actual, diff } =\n category === \"simple\"\n ? buildSimpleDiff(\n tools as ToolSpec[],\n possibleAnswer,\n restoredCalls\n )\n : buildParallelDiff(\n tools as ToolSpec[],\n possibleAnswer,\n restoredCalls\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\n try {\n const contextPayload = buildFailureContext({\n testCase,\n tools,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n restoredCalls,\n possibleAnswer,\n });\n caseLogs.push(\n `[DEBUG-FAIL-CONTEXT] ${JSON.stringify(contextPayload)}`\n );\n } catch {\n // ignore context build failures\n }\n } catch {\n caseLogs.push(`[DEBUG] ${testCase.id}: failed to build debug diff`);\n }\n };\n\n // Helper: Build tools map for AI SDK\n const buildToolsMap = (\n transformedTools: TransformedTool[]\n ): Record<string, ReturnType<typeof tool>> =>\n Object.fromEntries(\n transformedTools.map((t) => [\n t.name,\n tool({\n description:\n typeof t.description === \"string\" ? t.description : undefined,\n inputSchema: jsonSchema(\n t.inputSchema as Record<string, unknown>\n ),\n }),\n ])\n );\n\n // Helper: Execute model generation\n const executeModelGeneration = async (options: {\n model: LanguageModel;\n flatMessages: Message[];\n toolsMap: Record<string, ReturnType<typeof tool>>;\n temperature: number | undefined;\n maxTokens: number | undefined;\n }): Promise<{\n toolCalls: unknown;\n text: unknown;\n finishReason: unknown;\n debugSummaryRef: { originalText?: string; toolCalls?: string };\n }> => {\n const {\n model: modelInstance,\n flatMessages,\n toolsMap,\n temperature,\n maxTokens,\n } = options;\n\n const debugSummaryRef: {\n originalText?: string;\n toolCalls?: string;\n } = {};\n const providerOptions: Record<string, JSONObject> = {\n toolCallMiddleware: {\n debugSummary: debugSummaryRef,\n },\n };\n const { toolCalls, text, finishReason } = await generateText({\n model: modelInstance,\n messages: flatMessages as unknown as ModelMessage[],\n tools: toolsMap,\n toolChoice: \"auto\",\n providerOptions,\n ...(temperature !== undefined ? { temperature } : {}),\n ...(maxTokens !== undefined ? { maxOutputTokens: maxTokens } : {}),\n });\n\n return { toolCalls, text, finishReason, debugSummaryRef };\n };\n\n // Helper: Process validation result\n const processValidationResult = (options: {\n checkerResult: {\n valid: boolean;\n error?: string;\n error_type?: string;\n };\n testCase: TestCase;\n tools: ToolSpec[];\n possibleAnswer: PossibleAnswer;\n restoredCalls: unknown[];\n flatMessages: Message[];\n mwOriginalText: string | undefined;\n text: unknown;\n finishReason: unknown;\n mwParsedToolCalls: Array<{ toolName?: string; input?: unknown }>;\n caseLogs: string[];\n }): { valid: boolean; logs: string[] } => {\n const {\n checkerResult,\n testCase,\n tools,\n possibleAnswer,\n restoredCalls,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n caseLogs,\n } = options;\n\n if (checkerResult.valid) {\n caseLogs.push(`[PASS] ${testCase.id}`);\n return { valid: true, logs: caseLogs };\n }\n\n caseLogs.push(`[FAIL] ${testCase.id}: ${checkerResult.error}`);\n logFailureDetails({\n testCase,\n tools,\n possibleAnswer,\n restoredCalls,\n checkerResult,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n caseLogs,\n });\n return { valid: false, logs: caseLogs };\n };\n\n // Helper: Prepare test case data\n const prepareTestCaseData = (\n testCase: TestCase\n ): {\n flatMessages: Message[];\n transformedTools: TransformedTool[];\n nameMap: Map<string, string>;\n toolsMap: Record<string, ReturnType<typeof tool>>;\n } => {\n const { function: tools, question: messages } = testCase;\n const flatMessages = flattenMessages(messages);\n const { transformedTools, nameMap } = buildTransformedTools(\n tools as ToolSpec[],\n fixSchema\n );\n const toolsMap = buildToolsMap(transformedTools);\n return { flatMessages, transformedTools, nameMap, toolsMap };\n };\n\n // Helper: Process model response\n const processModelResponse = (options: {\n testCase: TestCase;\n toolCalls: unknown;\n text: unknown;\n finishReason: unknown;\n debugSummaryRef: { originalText?: string; toolCalls?: string };\n nameMap: Map<string, string>;\n transformedTools: TransformedTool[];\n flatMessages: Message[];\n tools: ToolSpec[];\n caseLogs: string[];\n }): { valid: boolean; logs: string[] } => {\n const {\n testCase,\n toolCalls,\n text,\n finishReason,\n debugSummaryRef,\n nameMap,\n transformedTools,\n flatMessages,\n tools,\n caseLogs,\n } = options;\n\n const mwOriginalText: string | undefined =\n debugSummaryRef.originalText;\n const mwParsedToolCalls = parseDebugToolCalls(\n debugSummaryRef.toolCalls\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 // Enhanced debug logging: compare expected vs actual\n if (process.env.DEBUG_PARSER_OUTPUT === \"true\") {\n // Render expected output in morphXML format\n const groundTruth = possibleAnswer.ground_truth as Record<\n string,\n unknown\n >[];\n const expectedXML = groundTruth\n .map((call) => convertGroundTruthToXML(call))\n .join(\"\\n\\n\");\n\n console.log(\"\\n========== BFCL CASE DEBUG ==========\");\n console.log(`Test Case: ${testCase.id}`);\n console.log(`Expected count: ${groundTruth.length} call(s)`);\n console.log(\"\\n--- EXPECTED OUTPUT (morphXML format) ---\");\n console.log(expectedXML);\n console.log(\"\\n--- ACTUAL MODEL OUTPUT (raw, with whitespace) ---\");\n console.log(mwOriginalText || text || \"(empty)\");\n console.log(\n \"\\n--- PARSED TOOL CALLS (count: \" +\n (Array.isArray(toolCalls) ? toolCalls.length : 0) +\n \") ---\"\n );\n console.log(JSON.stringify(toolCalls, null, 2));\n console.log(\"======================================\\n\");\n }\n\n logRawToolCalls({\n toolCalls,\n finishReason,\n text,\n testCaseId: testCase.id,\n caseLogs,\n });\n\n const restoredCalls = restoreToolCalls(\n (toolCalls as unknown[]) || [],\n nameMap,\n transformedTools\n );\n\n const checkerResult = check(testCase, restoredCalls, possibleAnswer);\n\n return processValidationResult({\n checkerResult,\n testCase,\n tools,\n possibleAnswer,\n restoredCalls,\n flatMessages,\n mwOriginalText,\n text,\n finishReason,\n mwParsedToolCalls,\n caseLogs,\n });\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 } = testCase;\n const temp = config?.temperature;\n const temperature = typeof temp === \"number\" ? temp : undefined;\n const maxTok = config?.maxTokens;\n const maxTokens = typeof maxTok === \"number\" ? maxTok : undefined;\n\n try {\n const { flatMessages, transformedTools, nameMap, toolsMap } =\n prepareTestCaseData(testCase);\n\n logFirstToolDebug(transformedTools, testCase.id, caseLogs);\n\n const { toolCalls, text, finishReason, debugSummaryRef } =\n await executeModelGeneration({\n model,\n flatMessages,\n toolsMap,\n temperature,\n maxTokens,\n });\n\n return processModelResponse({\n testCase,\n toolCalls,\n text,\n finishReason,\n debugSummaryRef,\n nameMap,\n transformedTools,\n flatMessages,\n tools: tools as ToolSpec[],\n caseLogs,\n });\n } catch (e: unknown) {\n caseLogs.push(\n `[ERROR] ${testCase.id}: Model generation failed: ${(e as Error)?.message}`\n );\n if ((e as Error)?.stack) {\n caseLogs.push(`[STACK] ${testCase.id}: ${(e as Error).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 concurrencyLimit: 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(concurrencyLimit, items.length))\n .fill(0)\n .map(async () => {\n while (true) {\n const current = idx;\n idx += 1;\n if (current >= items.length) {\n break;\n }\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) {\n logs.push(...r.logs);\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: unknown) {\n return {\n score: 0,\n success: false,\n metrics: {},\n error: e as Error,\n logs: [\n `[FATAL] Failed to run benchmark ${name}: ${(e as Error).message}`,\n ],\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.jsonl\",\n \"BFCL_v3_simple_possible_answer.jsonl\"\n);\n\nexport const bfclParallelBenchmark = createBfclBenchmark(\n \"bfcl-parallel\",\n \"BFCL Parallel Function Calling\",\n \"BFCL_v3_parallel.jsonl\",\n \"BFCL_v3_parallel_possible_answer.jsonl\"\n);\n\nexport const bfclMultipleBenchmark = createBfclBenchmark(\n \"bfcl-multiple\",\n \"BFCL Multiple Function Calling\",\n \"BFCL_v3_multiple.jsonl\",\n \"BFCL_v3_multiple_possible_answer.jsonl\"\n);\n\nexport const bfclParallelMultipleBenchmark = createBfclBenchmark(\n \"bfcl-parallel-multiple\",\n \"BFCL Parallel & Multiple Function Calling\",\n \"BFCL_v3_parallel_multiple.jsonl\",\n \"BFCL_v3_parallel_multiple_possible_answer.jsonl\"\n);\n","import fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Try to resolve data directory via package entry point\n */\nfunction tryResolveViaPackageEntry(moduleUrl?: string): string | null {\n try {\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 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)) {\n return dataAtRoot;\n }\n } catch {\n // ignore and continue to other strategies\n }\n return null;\n}\n\n/**\n * Try to resolve data directory via package.json\n */\nfunction tryResolveViaPackageJson(moduleUrl?: string): string | null {\n try {\n const baseForRequire =\n (typeof moduleUrl === \"string\" && moduleUrl) ||\n path.join(process.cwd(), \"package.json\");\n const require = createRequire(baseForRequire);\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)) {\n return dataAtPkg;\n }\n } catch {\n // ignore if resolution fails\n }\n return null;\n}\n\n/**\n * Determine starting directory from module URL\n */\nfunction getStartDir(moduleUrl?: string): string {\n if (moduleUrl) {\n try {\n return path.dirname(fileURLToPath(moduleUrl));\n } catch {\n return process.cwd();\n }\n }\n return process.cwd();\n}\n\n/**\n * Walk up directory tree to find data directory\n */\nfunction findDataDirByTraversal(startDir: string): string | null {\n let dir = startDir;\n const MAX_PARENT_TRAVERSAL_DEPTH = 6;\n for (let i = 0; i < MAX_PARENT_TRAVERSAL_DEPTH; i += 1) {\n const dataCandidate = path.join(dir, \"data\");\n if (fs.existsSync(dataCandidate)) {\n return dataCandidate;\n }\n const parent = path.resolve(dir, \"..\");\n if (parent === dir) {\n break; // reached filesystem root\n }\n dir = parent;\n }\n return null;\n}\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 */\nexport function resolveDataDir(fromModuleUrl?: string): string {\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) Try resolving via package entry point\n const viaEntry = tryResolveViaPackageEntry(fromModuleUrl);\n if (viaEntry) {\n return viaEntry;\n }\n\n // 3) Try resolving via package.json\n const viaPackageJson = tryResolveViaPackageJson(fromModuleUrl);\n if (viaPackageJson) {\n return viaPackageJson;\n }\n\n // 4) Walk up directory tree to find data directory\n const startDir = getStartDir(fromModuleUrl);\n const viaTraversal = findDataDirByTraversal(startDir);\n if (viaTraversal) {\n return viaTraversal;\n }\n\n // 5) 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\") {\n return input;\n }\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 * Normalizes objects by unwrapping single-element arrays (BFCL dataset quirk)\n */\nfunction 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(obj as Record<string, unknown>)) {\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/**\n * Checks if two values match, handling objects, numbers, and strings\n */\nfunction valuesMatch(modelValue: unknown, possibleValue: unknown): boolean {\n // Direct equality check first\n if (modelValue === possibleValue) {\n return true;\n }\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 const normalizedModel = normalizeObject(modelValue);\n const normalizedPossible = normalizeObject(possibleValue);\n return (\n JSON.stringify(normalizedModel) === JSON.stringify(normalizedPossible)\n );\n } catch {\n return false;\n }\n }\n\n // For numbers, handle string/number conversion\n if (typeof modelValue === \"number\" && typeof possibleValue === \"string\") {\n return modelValue.toString() === possibleValue;\n }\n if (typeof modelValue === \"string\" && typeof possibleValue === \"number\") {\n return modelValue === possibleValue.toString();\n }\n\n return false;\n}\n\n/**\n * Checks array parameter values\n */\nfunction checkArrayValue(\n paramName: string,\n modelValue: unknown[],\n possibleValues: unknown\n): { valid: boolean; error?: string; error_type?: string } {\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)) {\n return false;\n }\n return (\n JSON.stringify(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 return { valid: true };\n}\n\n/**\n * Checks object/other parameter values\n */\nfunction checkObjectValue(\n paramName: string,\n modelValue: unknown,\n possibleValues: unknown\n): { valid: boolean; error?: string; error_type?: string } {\n const hasMatch = Array.isArray(possibleValues)\n ? (possibleValues as unknown[]).some((possibleValue) =>\n valuesMatch(modelValue, possibleValue)\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 return { valid: true };\n}\n\ninterface CheckerResult {\n valid: boolean;\n error?: string;\n error_type?: string;\n}\n\ninterface CheckerContext {\n funcDescription: FunctionDescription;\n modelToolCall: ToolCall;\n possibleAnswerParams: Record<string, unknown>;\n expectedParams: Record<\n string,\n { type: string; description?: string; items?: { type: string } }\n >;\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): CheckerResult {\n const funcNameCheck = checkFunctionName(\n funcDescription.name,\n modelToolCall.toolName\n );\n if (!funcNameCheck.valid) {\n return funcNameCheck;\n }\n\n const possibleAnswerParams = possibleAnswer[\n Object.keys(possibleAnswer)[0]\n ] as Record<string, unknown>;\n\n const argsObj: Record<string, unknown> =\n modelToolCall.args && typeof modelToolCall.args === \"object\"\n ? (modelToolCall.args as Record<string, unknown>)\n : {};\n\n const context: CheckerContext = {\n funcDescription,\n modelToolCall,\n possibleAnswerParams,\n expectedParams: funcDescription.parameters.properties,\n };\n\n const requiredCheck = checkRequiredParams(\n funcDescription.parameters.required,\n argsObj\n );\n if (!requiredCheck.valid) {\n return requiredCheck;\n }\n\n const paramsCheck = checkAllParameters(argsObj, context);\n if (!paramsCheck.valid) {\n return paramsCheck;\n }\n\n const optionalCheck = checkOptionalParams(argsObj, possibleAnswerParams);\n if (!optionalCheck.valid) {\n return optionalCheck;\n }\n\n return { valid: true };\n}\n\nfunction checkFunctionName(expected: string, actual: string): CheckerResult {\n if (actual !== expected) {\n return {\n valid: false,\n error: `Function name '${actual}' does not match expected '${expected}'.`,\n error_type: \"simple_function_checker:wrong_func_name\",\n };\n }\n return { valid: true };\n}\n\nfunction checkRequiredParams(\n requiredParams: string[],\n argsObj: Record<string, unknown>\n): CheckerResult {\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 return { valid: true };\n}\n\nfunction checkAllParameters(\n argsObj: Record<string, unknown>,\n context: CheckerContext\n): CheckerResult {\n for (const paramName of Object.keys(argsObj)) {\n const paramCheck = checkSingleParameter(\n paramName,\n argsObj[paramName],\n context\n );\n if (!paramCheck.valid) {\n return paramCheck;\n }\n }\n return { valid: true };\n}\n\nfunction checkSingleParameter(\n paramName: string,\n modelValue: unknown,\n context: CheckerContext\n): CheckerResult {\n if (\n !(\n paramName in context.expectedParams &&\n paramName in context.possibleAnswerParams\n )\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 = context.possibleAnswerParams[paramName] as unknown;\n\n if (typeof modelValue === \"string\") {\n return checkStringValue(\n paramName,\n modelValue,\n (possibleValues as unknown[] | undefined) ?? []\n );\n }\n\n if (Array.isArray(modelValue)) {\n return checkArrayValue(paramName, modelValue, possibleValues);\n }\n\n return checkObjectValue(paramName, modelValue, possibleValues);\n}\n\nfunction checkOptionalParams(\n argsObj: Record<string, unknown>,\n possibleAnswerParams: Record<string, unknown>\n): CheckerResult {\n for (const paramName in possibleAnswerParams) {\n if (Object.hasOwn(possibleAnswerParams, paramName)) {\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 += 1) {\n if (matchedModelCallIndices.has(i)) {\n continue;\n }\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","/**\n * ComplexFuncBench - Complex Function Calling Benchmark\n *\n * This benchmark evaluates models on complex function calling scenarios including:\n * - Multi-step function calls in a single turn\n * - Function calling with constraints\n * - Parameter value reasoning from implicit information\n * - Long parameter values (500+ tokens)\n * - Parallel function calls\n *\n * Dataset: https://huggingface.co/datasets/THUDM/ComplexFuncBench\n * Paper: https://arxiv.org/abs/2501.10132\n */\n\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport type { JSONObject } from \"@ai-sdk/provider\";\nimport {\n generateText,\n jsonSchema,\n type LanguageModel,\n type ModelMessage,\n tool,\n} from \"ai\";\n\nimport type { BenchmarkResult, LanguageModelV3Benchmark } from \"../interfaces\";\nimport { resolveDataDir } from \"../utils/paths\";\n\n// Regex constants for performance\nconst LINE_SPLIT_REGEX = /\\r?\\n/;\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\ninterface Message {\n role: string;\n content: string;\n}\n\ninterface TestCase {\n id: string;\n question: 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: Record<string, unknown>[];\n}\n\ninterface ToolCall {\n toolName?: string;\n name?: string;\n args?: unknown;\n}\n\n// --- Helper Functions ---\n\n/**\n * Standardizes a string for comparison.\n */\nfunction standardizeString(input: string): string {\n if (typeof input !== \"string\") {\n return input;\n }\n return input.toLowerCase().trim();\n}\n\n/**\n * Checks if two values match with tolerance for ComplexFuncBench\n */\nfunction valuesMatch(modelValue: unknown, expectedValue: unknown): boolean {\n if (modelValue === expectedValue) {\n return true;\n }\n\n if (typeof modelValue === \"string\" && typeof expectedValue === \"string\") {\n return standardizeString(modelValue) === standardizeString(expectedValue);\n }\n\n if (typeof modelValue === \"number\" && typeof expectedValue === \"string\") {\n return (\n modelValue.toString() === expectedValue ||\n modelValue === Number(expectedValue)\n );\n }\n if (typeof modelValue === \"string\" && typeof expectedValue === \"number\") {\n return (\n modelValue === expectedValue.toString() ||\n Number(modelValue) === expectedValue\n );\n }\n\n if (\n typeof modelValue === \"object\" &&\n modelValue !== null &&\n typeof expectedValue === \"object\" &&\n expectedValue !== null\n ) {\n try {\n return JSON.stringify(modelValue) === JSON.stringify(expectedValue);\n } catch {\n return false;\n }\n }\n\n return false;\n}\n\n/**\n * Validate function name match\n */\nfunction validateFunctionName(\n modelFuncName: string | undefined,\n expectedFuncName: string\n): { valid: boolean; error?: string; error_type?: string } {\n if (modelFuncName !== expectedFuncName) {\n return {\n valid: false,\n error: `Function name mismatch: expected '${expectedFuncName}', got '${modelFuncName}'`,\n error_type: \"function_name_mismatch\",\n };\n }\n return { valid: true };\n}\n\n/**\n * Validate required parameters are present\n */\nfunction validateRequiredParams(\n requiredParams: string[],\n modelArgs: Record<string, unknown>,\n expectedArgs: Record<string, unknown>\n): { valid: boolean; error?: string; error_type?: string } {\n for (const param of requiredParams) {\n if (!(param in modelArgs) && param in expectedArgs) {\n return {\n valid: false,\n error: `Missing required parameter: '${param}'`,\n error_type: \"missing_required_param\",\n };\n }\n }\n return { valid: true };\n}\n\n/**\n * Validate parameter values match\n */\nfunction validateParamValues(\n expectedArgs: Record<string, unknown>,\n modelArgs: Record<string, unknown>,\n requiredParams: string[]\n): { valid: boolean; error?: string; error_type?: string } {\n for (const [paramName, expectedValue] of Object.entries(expectedArgs)) {\n if (!(paramName in modelArgs)) {\n if (!requiredParams.includes(paramName)) {\n continue;\n }\n return {\n valid: false,\n error: `Missing parameter: '${paramName}'`,\n error_type: \"missing_param\",\n };\n }\n\n const modelValue = modelArgs[paramName];\n if (!valuesMatch(modelValue, expectedValue)) {\n return {\n valid: false,\n error: `Parameter '${paramName}' value mismatch: expected ${JSON.stringify(expectedValue)}, got ${JSON.stringify(modelValue)}`,\n error_type: \"value_mismatch\",\n };\n }\n }\n return { valid: true };\n}\n\n/**\n * Check a single function call against expected\n */\nfunction checkFunctionCall(\n modelCall: ToolCall,\n expected: Record<string, unknown>,\n toolSpecs: ToolSpec[]\n): { valid: boolean; error?: string; error_type?: string } {\n const expectedFuncName = Object.keys(expected)[0];\n const expectedArgs = expected[expectedFuncName] as Record<string, unknown>;\n const modelFuncName = modelCall.toolName ?? modelCall.name;\n const modelArgs = (modelCall.args ?? {}) as Record<string, unknown>;\n\n const nameResult = validateFunctionName(modelFuncName, expectedFuncName);\n if (!nameResult.valid) {\n return nameResult;\n }\n\n const toolSpec = toolSpecs.find((t) => t.name === expectedFuncName);\n const requiredParams = toolSpec?.parameters?.required ?? [];\n\n const requiredResult = validateRequiredParams(\n requiredParams,\n modelArgs,\n expectedArgs\n );\n if (!requiredResult.valid) {\n return requiredResult;\n }\n\n return validateParamValues(expectedArgs, modelArgs, requiredParams);\n}\n\n/**\n * Check all function calls (parallel/single)\n */\nfunction checkAllFunctionCalls(\n modelCalls: ToolCall[],\n expectedCalls: Record<string, unknown>[],\n toolSpecs: ToolSpec[]\n): { valid: boolean; error?: string; error_type?: string } {\n if (modelCalls.length !== expectedCalls.length) {\n return {\n valid: false,\n error: `Wrong number of function calls: expected ${expectedCalls.length}, got ${modelCalls.length}`,\n error_type: \"wrong_call_count\",\n };\n }\n\n if (expectedCalls.length === 1) {\n return checkFunctionCall(modelCalls[0], expectedCalls[0], toolSpecs);\n }\n\n const matchedIndices = new Set<number>();\n for (const expected of expectedCalls) {\n let foundMatch = false;\n for (let i = 0; i < modelCalls.length; i++) {\n if (matchedIndices.has(i)) {\n continue;\n }\n\n const result = checkFunctionCall(modelCalls[i], expected, toolSpecs);\n if (result.valid) {\n matchedIndices.add(i);\n foundMatch = true;\n break;\n }\n }\n\n if (!foundMatch) {\n const expectedFuncName = Object.keys(expected)[0];\n return {\n valid: false,\n error: `Could not find matching call for function '${expectedFuncName}'`,\n error_type: \"no_matching_call\",\n };\n }\n }\n\n return { valid: true };\n}\n\n// --- Schema Fixers ---\nconst fixSchemaType = (copy: ToolSchemaObject): void => {\n if (!copy.type) {\n return;\n }\n if (copy.type === \"dict\") {\n copy.type = \"object\";\n }\n if (copy.type === \"tuple\") {\n copy.type = \"array\";\n }\n if (copy.type === \"integer\" || copy.type === \"float\") {\n copy.type = \"number\";\n }\n};\n\nconst fixSchema = (schema: unknown): unknown => {\n if (!schema || typeof schema !== \"object\") {\n return { type: \"object\", properties: {} };\n }\n const copy = Array.isArray(schema)\n ? schema.map((v) => fixSchema(v))\n : ({ ...(schema as Record<string, unknown>) } as ToolSchemaObject);\n\n if (!Array.isArray(copy)) {\n fixSchemaType(copy);\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) {\n copy.items = fixSchema(copy.items);\n }\n }\n return copy;\n};\n\n// --- Tool Builder ---\nfunction buildTools(tools: ToolSpec[]) {\n const nameMap = new Map<string, string>();\n const transformedTools: TransformedTool[] = tools.map((t) => {\n const fixed = fixSchema(t.parameters) as ToolSchemaObject;\n const inputSchema =\n fixed &&\n typeof fixed === \"object\" &&\n (fixed as ToolSchemaObject).type === \"object\"\n ? (fixed as ToolSchemaObject)\n : { type: \"object\", properties: {} };\n\n const sanitized =\n t.name.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64) || \"tool\";\n nameMap.set(sanitized, t.name);\n\n return {\n type: \"function\" as const,\n name: sanitized,\n description: t.description,\n inputSchema,\n };\n });\n\n const toolsMap = Object.fromEntries(\n transformedTools.map((t) => [\n t.name,\n tool({\n description:\n typeof t.description === \"string\" ? t.description : undefined,\n inputSchema: jsonSchema(t.inputSchema as Record<string, unknown>),\n }),\n ])\n );\n\n return { nameMap, toolsMap };\n}\n\n// --- Concurrency Mapper ---\nasync function mapWithConcurrency<T, R>(\n items: T[],\n concurrencyLimit: number,\n mapper: (item: T) => Promise<R>\n): Promise<R[]> {\n const results = new Array<R>(items.length);\n let idx = 0;\n const workers = new Array(Math.min(concurrencyLimit, items.length))\n .fill(0)\n .map(async () => {\n while (true) {\n const current = idx;\n idx += 1;\n if (current >= items.length) {\n break;\n }\n results[current] = await mapper(items[current]);\n }\n });\n await Promise.all(workers);\n return results;\n}\n\n// --- Test Case Runner ---\nasync function runSingleCase(\n testCase: TestCase,\n model: LanguageModel,\n possibleAnswersMap: Map<string, PossibleAnswer>,\n temperature: number | undefined,\n maxTokens: number | undefined\n): Promise<{ valid: boolean; logs: string[] }> {\n const caseLogs: string[] = [];\n const { function: tools, question: messages } = testCase;\n\n try {\n const { nameMap, toolsMap } = buildTools(tools);\n\n const debugSummaryRef: { originalText?: string; toolCalls?: string } = {};\n const providerOptions: Record<string, JSONObject> = {\n toolCallMiddleware: { debugSummary: debugSummaryRef },\n };\n\n const { toolCalls, finishReason } = await generateText({\n model,\n messages: messages as unknown as ModelMessage[],\n tools: toolsMap,\n toolChoice: \"auto\",\n providerOptions,\n ...(temperature !== undefined ? { temperature } : {}),\n ...(maxTokens !== undefined ? { maxOutputTokens: maxTokens } : {}),\n });\n\n const restoredCalls = (toolCalls ?? []).map((c) => {\n const rawName =\n (c as Record<string, unknown>).toolName ??\n (c as Record<string, unknown>).name;\n const originalName = nameMap.get(rawName as string) ?? rawName;\n return {\n toolName: originalName,\n name: originalName,\n args:\n (c as Record<string, unknown>).input ??\n (c as Record<string, unknown>).args ??\n {},\n };\n });\n\n caseLogs.push(\n `[DEBUG] ${testCase.id}: toolCalls=${JSON.stringify(restoredCalls)}, finishReason=${finishReason}`\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 const checkerResult = checkAllFunctionCalls(\n restoredCalls as ToolCall[],\n possibleAnswer.ground_truth,\n tools as ToolSpec[]\n );\n\n if (checkerResult.valid) {\n caseLogs.push(`[PASS] ${testCase.id}`);\n return { valid: true, logs: caseLogs };\n }\n\n caseLogs.push(`[FAIL] ${testCase.id}: ${checkerResult.error}`);\n return { valid: false, logs: caseLogs };\n } catch (e: unknown) {\n caseLogs.push(`[ERROR] ${testCase.id}: ${(e as Error)?.message}`);\n return { valid: false, logs: caseLogs };\n }\n}\n\n// --- Data Loading ---\nasync function loadTestData(dataPath: string, testDataFile: string) {\n const testCasesJson = await fs.readFile(\n path.join(dataPath, testDataFile),\n \"utf-8\"\n );\n return testCasesJson\n .split(LINE_SPLIT_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line) as TestCase);\n}\n\nasync function loadAnswerData(dataPath: string, answerDataFile: string) {\n const answersJson = await fs.readFile(\n path.join(dataPath, answerDataFile),\n \"utf-8\"\n );\n const answers: PossibleAnswer[] = answersJson\n .split(LINE_SPLIT_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n return new Map(answers.map((ans) => [ans.id, ans]));\n}\n\nfunction getConfigValues(config?: Record<string, unknown>) {\n const limitEnv = process.env.COMPLEXFUNCBENCH_LIMIT;\n const limit = limitEnv ? Number(limitEnv) : undefined;\n\n const concurrencyEnv = process.env.COMPLEXFUNCBENCH_CONCURRENCY;\n const concurrency =\n concurrencyEnv && Number.isFinite(Number(concurrencyEnv))\n ? Math.max(1, Number(concurrencyEnv))\n : 4;\n\n const temperature =\n typeof config?.temperature === \"number\" ? config.temperature : undefined;\n const maxTokens =\n typeof config?.maxTokens === \"number\" ? config.maxTokens : undefined;\n\n return { limit, concurrency, temperature, maxTokens };\n}\n\nfunction aggregateResults(\n resultsPerCase: { valid: boolean; logs: string[] }[],\n testCases: TestCase[]\n): BenchmarkResult {\n const logs: string[] = [];\n const correctCount = resultsPerCase.reduce(\n (acc, r) => acc + (r.valid ? 1 : 0),\n 0\n );\n\n for (const r of resultsPerCase) {\n logs.push(...r.logs);\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.5,\n metrics: {\n correct_count: correctCount,\n total_cases: testCases.length,\n accuracy: score,\n },\n logs,\n };\n}\n\n// --- Benchmark Factory ---\nfunction createComplexFuncBenchBenchmark(\n name: string,\n description: string,\n testDataFile: string,\n answerDataFile: string\n): LanguageModelV3Benchmark {\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\n try {\n const dataPath = resolveDataDir();\n logs.push(`[INFO] Using data dir: ${dataPath}`);\n\n let testCases = await loadTestData(dataPath, testDataFile);\n const possibleAnswersMap = await loadAnswerData(\n dataPath,\n answerDataFile\n );\n\n const { limit, concurrency, temperature, maxTokens } =\n getConfigValues(config);\n\n if (limit && Number.isFinite(limit) && limit > 0) {\n testCases = testCases.slice(0, limit);\n logs.push(`[INFO] Limiting test cases to ${limit}`);\n }\n\n logs.push(\n `[INFO] Running ${testCases.length} test cases with concurrency=${concurrency}`\n );\n\n const resultsPerCase = await mapWithConcurrency(\n testCases,\n concurrency,\n (tc) =>\n runSingleCase(tc, model, possibleAnswersMap, temperature, maxTokens)\n );\n\n const result = aggregateResults(resultsPerCase, testCases);\n result.logs = [...logs, ...(result.logs ?? [])];\n return result;\n } catch (e: unknown) {\n return {\n score: 0,\n success: false,\n metrics: {},\n error: e as Error,\n logs: [\n `[FATAL] Failed to run benchmark ${name}: ${(e as Error).message}`,\n ],\n };\n }\n },\n };\n}\n\n// --- Exported Benchmark Instances ---\n\n/**\n * ComplexFuncBench benchmark - tests complex function calling scenarios\n * including multi-step calls, constraints, parameter reasoning, and long parameters.\n */\nexport const complexFuncBenchBenchmark = createComplexFuncBenchBenchmark(\n \"complex-func-bench\",\n \"ComplexFuncBench - Complex Function Calling (multi-step, constraints, long params)\",\n \"ComplexFuncBench.jsonl\",\n \"ComplexFuncBench_possible_answer.jsonl\"\n);\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { generateText, type LanguageModel } from \"ai\";\nimport Ajv, { type AnySchema } from \"ajv\";\n\nimport type { BenchmarkResult, LanguageModelV3Benchmark } from \"../interfaces\";\nimport { resolveDataDir } from \"../utils/paths\";\n\ntype Json = unknown;\n\n// Regex patterns used for JSON extraction\nconst JSON_FENCE_REGEX = /```json\\s*([\\s\\S]*?)```/i;\nconst CODE_FENCE_REGEX = /```\\s*([\\s\\S]*?)```/i;\nconst NEWLINE_REGEX = /\\r?\\n/;\nconst LINE_SPLIT_REGEX = /\\r?\\n/;\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 tryDirectParse(text: string): Json | undefined {\n try {\n return JSON.parse(text);\n } catch {\n return;\n }\n}\n\nfunction tryCodeFenceParse(text: string): Json | undefined {\n const fenceMatch =\n text.match(JSON_FENCE_REGEX) || text.match(CODE_FENCE_REGEX);\n if (!fenceMatch) {\n return;\n }\n\n const inner = fenceMatch[1].trim();\n try {\n return JSON.parse(inner);\n } catch {\n return;\n }\n}\n\nfunction tryBracketScan(text: string): Json | undefined {\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\n if (start === undefined) {\n return;\n }\n\n const open = text[start] === \"{\" ? \"{\" : \"[\";\n const close = open === \"{\" ? \"}\" : \"]\";\n let depth = 0;\n\n for (let i = start; i < text.length; i += 1) {\n const ch = text[i];\n if (ch === open) {\n depth += 1;\n } else if (ch === close) {\n depth -= 1;\n }\n\n if (depth === 0) {\n const candidate = text.slice(start, i + 1);\n try {\n return JSON.parse(candidate);\n } catch {\n return;\n }\n }\n }\n\n return;\n}\n\nfunction extractFirstJsonBlock(text: string): Json | undefined {\n // 1) try direct parse\n const directResult = tryDirectParse(text);\n if (directResult !== undefined) {\n return directResult;\n }\n\n // 2) try code fence ```json ... ```\n const fenceResult = tryCodeFenceParse(text);\n if (fenceResult !== undefined) {\n return fenceResult;\n }\n\n // 3) bracket scanning for first object or array\n return tryBracketScan(text);\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)) {\n return false;\n }\n // Require at least that expected elements (by index) match if provided\n for (let i = 0; i < expected.length; i += 1) {\n if (!subsetMatch(expected[i], actual[i])) {\n return false;\n }\n }\n return true;\n }\n // object subset\n if (actual === null || typeof actual !== \"object\") {\n return false;\n }\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])) {\n return false;\n }\n }\n return true;\n}\n\n// Test cases will be loaded from data files at runtime\n\ninterface DatasetLoadResult {\n tests: Omit<SchemaTestCase, \"expected\">[];\n expectedMap: Map<string, ExpectedRecord>;\n error?: Error;\n}\n\nasync function loadDatasets(): Promise<DatasetLoadResult> {\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 const tests = testsJsonl\n .split(NEWLINE_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n\n const expecteds: ExpectedRecord[] = expectedJsonl\n .split(NEWLINE_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n\n const expectedMap = new Map<string, ExpectedRecord>();\n for (const r of expecteds) {\n expectedMap.set(r.id, r);\n }\n\n return { tests, expectedMap };\n } catch (e: unknown) {\n return {\n tests: [],\n expectedMap: new Map(),\n error: e as Error,\n };\n }\n}\n\nfunction buildMessages(tc: Omit<SchemaTestCase, \"expected\">) {\n const schemaStr = JSON.stringify(tc.schema, null, 2);\n return [\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\ninterface ValidationResult {\n valid: boolean;\n valuesOk: boolean;\n parsed: Json;\n}\n\ninterface ValidationContext {\n expectedMap: Map<string, ExpectedRecord>;\n ajv: Ajv;\n logs: string[];\n}\n\nfunction validateTestCase(\n tc: Omit<SchemaTestCase, \"expected\">,\n parsed: Json,\n context: ValidationContext\n): ValidationResult {\n const validate = context.ajv.compile(tc.schema);\n const valid = validate(parsed) as boolean;\n\n if (!valid) {\n context.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\n const expectedRec = context.expectedMap.get(tc.id);\n if (!expectedRec) {\n context.logs.push(\n `[WARN] ${tc.id}: No expected record found. Skipping value match.`\n );\n }\n\n const valuesOk = expectedRec\n ? subsetMatch(expectedRec.expected, parsed)\n : false;\n\n return { valid, valuesOk, parsed };\n}\n\ninterface ProcessContext {\n model: LanguageModel;\n config: Record<string, unknown> | undefined;\n validation: ValidationContext;\n}\n\nasync function processTestCase(\n tc: Omit<SchemaTestCase, \"expected\">,\n context: ProcessContext\n): Promise<{ schemaValid: boolean; valueMatch: boolean; correct: boolean }> {\n const messages = buildMessages(tc);\n\n const temp = context.config?.temperature;\n const temperature = typeof temp === \"number\" ? temp : undefined;\n const { text } = await generateText({\n model: context.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 context.validation.logs.push(\n `[FAIL] ${tc.id}: Unable to parse JSON from model output.`\n );\n return { schemaValid: false, valueMatch: false, correct: false };\n }\n\n const {\n valid,\n valuesOk,\n parsed: validatedParsed,\n } = validateTestCase(tc, parsed, context.validation);\n\n const correct = valid && valuesOk;\n if (correct) {\n context.validation.logs.push(`[PASS] ${tc.id}`);\n } else {\n context.validation.logs.push(\n `[FAIL] ${tc.id}: schemaValid=${valid}, valuesOk=${valuesOk}. Output=${JSON.stringify(\n validatedParsed\n )}`\n );\n }\n\n return { schemaValid: valid, valueMatch: valuesOk, correct };\n}\n\nexport const jsonGenerationBenchmark: LanguageModelV3Benchmark = {\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 // Load datasets\n const { tests, expectedMap, error } = await loadDatasets();\n if (error) {\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [\n `[FATAL] Failed to load json-generation datasets: ${error.message}`,\n ],\n error,\n };\n }\n\n const context: ProcessContext = {\n model,\n config,\n validation: { expectedMap, ajv, logs },\n };\n\n const counts = await processAllTests(tests, context);\n return buildBenchmarkResult(tests.length, counts, logs);\n },\n};\n\nasync function processAllTests(\n tests: Omit<SchemaTestCase, \"expected\">[],\n context: ProcessContext\n): Promise<{\n schemaValidCount: number;\n valueMatchCount: number;\n correctCount: number;\n}> {\n let schemaValidCount = 0;\n let valueMatchCount = 0;\n let correctCount = 0;\n\n for (const tc of tests) {\n try {\n const result = await processTestCase(tc, context);\n if (result.schemaValid) {\n schemaValidCount += 1;\n }\n if (result.valueMatch) {\n valueMatchCount += 1;\n }\n if (result.correct) {\n correctCount += 1;\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n context.validation.logs.push(`[ERROR] ${tc.id}: ${msg}`);\n }\n }\n\n return { schemaValidCount, valueMatchCount, correctCount };\n}\n\nfunction buildBenchmarkResult(\n total: number,\n counts: {\n schemaValidCount: number;\n valueMatchCount: number;\n correctCount: number;\n },\n logs: string[]\n): BenchmarkResult {\n const score = counts.correctCount / total;\n return {\n score,\n success: score >= 0.8,\n metrics: {\n total_cases: total,\n correct_count: counts.correctCount,\n schema_valid_count: counts.schemaValidCount,\n value_match_count: counts.valueMatchCount,\n accuracy: score,\n },\n logs,\n };\n}\n\n// A schema-only variant that validates structure/format without value matching\ntype SchemaOnlyTestCase = Omit<SchemaTestCase, \"expected\">;\n\ninterface SchemaOnlyContext {\n model: LanguageModel;\n config: Record<string, unknown> | undefined;\n ajv: Ajv;\n logs: string[];\n}\n\nasync function loadSchemaOnlyTests(): Promise<{\n tests: SchemaOnlyTestCase[];\n error?: Error;\n}> {\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 tests = testsJsonl\n .split(LINE_SPLIT_REGEX)\n .filter((line) => line.trim().length > 0)\n .map((line) => JSON.parse(line));\n return { tests };\n } catch (e: unknown) {\n return { tests: [], error: e as Error };\n }\n}\n\nasync function processSchemaOnlyTestCase(\n tc: SchemaOnlyTestCase,\n context: SchemaOnlyContext\n): Promise<boolean> {\n const messages = buildMessages(tc);\n\n const temp = context.config?.temperature;\n const temperature = typeof temp === \"number\" ? temp : undefined;\n const { text } = await generateText({\n model: context.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 context.logs.push(\n `[FAIL] ${tc.id}: Could not parse JSON from model output.`\n );\n return false;\n }\n\n const validate = context.ajv.compile(tc.schema);\n const valid = validate(parsed) as boolean;\n if (valid) {\n context.logs.push(`[PASS] ${tc.id}`);\n return true;\n }\n\n context.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 return false;\n}\n\nasync function runSchemaOnlyTests(\n tests: SchemaOnlyTestCase[],\n context: SchemaOnlyContext\n): Promise<number> {\n let schemaValidCount = 0;\n\n for (const tc of tests) {\n try {\n const isValid = await processSchemaOnlyTestCase(tc, context);\n if (isValid) {\n schemaValidCount += 1;\n }\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n context.logs.push(`[ERROR] ${tc.id}: ${msg}`);\n }\n }\n\n return schemaValidCount;\n}\n\nexport const jsonGenerationSchemaOnlyBenchmark: LanguageModelV3Benchmark = {\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 const { tests, error } = await loadSchemaOnlyTests();\n if (error) {\n const msg = error.message;\n return {\n score: 0,\n success: false,\n metrics: {},\n logs: [`[FATAL] Failed to load schema-only tests: ${msg}`],\n error,\n };\n }\n\n const context: SchemaOnlyContext = { model, config, ajv, logs };\n const schemaValidCount = await runSchemaOnlyTests(tests, context);\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 type { 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 white: \"\\x1b[37m\",\n bgRed: \"\\x1b[41m\",\n};\n\nfunction formatDiff(diff: string[]): string {\n if (!diff || diff.length === 0) {\n return \"\";\n }\n\n return diff\n .map((line) => {\n if (line.startsWith(\"-\")) {\n return `${colors.red}${line}${colors.reset}`;\n }\n if (line.startsWith(\"+\")) {\n return `${colors.green}${line}${colors.reset}`;\n }\n if (line.startsWith(\"@@\")) {\n return `${colors.cyan}${line}${colors.reset}`;\n }\n return line;\n })\n .join(\"\\n \");\n}\n\nfunction printFailLogs(logs: string[]) {\n const failLogs = logs.filter((l) => l.startsWith(\"[DEBUG-FAIL]\"));\n\n for (const log of failLogs) {\n try {\n const jsonStr = log.replace(\"[DEBUG-FAIL] \", \"\");\n const data = JSON.parse(jsonStr);\n\n console.log(`\\n ${colors.red}FAILED CASE: ${data.id}${colors.reset}`);\n console.log(\n ` Error Type: ${colors.yellow}${data.error_type || \"unknown\"}${colors.reset}`\n );\n console.log(` Message: ${data.message}`);\n\n if (data.diff && Array.isArray(data.diff)) {\n console.log(` Diff:\\n ${formatDiff(data.diff)}`);\n }\n\n // Expected vs Actual summary if diff is too complex or just to show quick view\n if (data.expected && data.actual) {\n // Simple one-line summary if possible\n const expStr = JSON.stringify(data.expected);\n const actStr = JSON.stringify(data.actual);\n if (expStr.length < 100 && actStr.length < 100) {\n console.log(` Expected: ${colors.gray}${expStr}${colors.reset}`);\n console.log(` Actual: ${colors.gray}${actStr}${colors.reset}`);\n }\n }\n } catch (_e) {\n console.log(` Raw Log: ${log}`);\n }\n }\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 // Print failure details if any\n if (!benchmarkResult.success && benchmarkResult.logs) {\n printFailLogs(benchmarkResult.logs);\n\n // Fallback: if printFailLogs found nothing, dump raw logs\n const failLogs = benchmarkResult.logs.filter((l) =>\n l.startsWith(\"[DEBUG-FAIL]\")\n );\n if (failLogs.length === 0 && benchmarkResult.logs.length > 0) {\n console.log(\" Raw Logs (Sample):\");\n for (const l of benchmarkResult.logs.slice(0, 10)) {\n console.log(` ${l}`);\n }\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 type { EvaluationResult } from \"../interfaces\";\n\n// Regex patterns at module level for performance\nconst FAIL_ID_REGEX = /^\\[FAIL\\]\\s+([^:]+):/;\nconst DEBUG_FAIL_PREFIX_REGEX = /^\\[DEBUG-FAIL\\] /;\nconst DEBUG_FAIL_CONTEXT_PREFIX_REGEX = /^\\[DEBUG-FAIL-CONTEXT\\] /;\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(\"+\")) {\n return `${colors.green}${line}${colors.reset}`;\n }\n if (line.startsWith(\"-\")) {\n return `${colors.red}${line}${colors.reset}`;\n }\n if (line.startsWith(\"@\")) {\n return `${colors.cyan}${colors.bold}${line}${colors.reset}`;\n }\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)) {\n continue;\n }\n seen.add(l);\n out.push(l);\n }\n return out;\n}\n\n// Helper function to check if diff contains function name issues\nfunction hasFunctionNameIssue(diff: unknown[]): boolean {\n return diff.some(\n (d: unknown) =>\n String(d).includes(\"function name\") ||\n String(d).includes(\"missing function:\")\n );\n}\n\n// Helper function to suggest function name fixes\nfunction suggestFunctionNameFix(\n expected: unknown,\n actual: unknown,\n suggestions: string[]\n): void {\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// Helper function to suggest missing parameter fixes\nfunction suggestMissingParamFix(diff: unknown[], suggestions: string[]): void {\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// Helper function to suggest unexpected parameter fixes\nfunction suggestUnexpectedParamFix(\n diff: unknown[],\n suggestions: string[]\n): void {\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// Helper function to suggest parameter value fixes\nfunction suggestParamValueFix(diff: unknown[], suggestions: string[]): void {\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 allowedOneOfLine = (diff as unknown[]).find((d: unknown) =>\n String(d).startsWith(\"- expected one of:\")\n ) as string | undefined;\n const allowedSingleLine = (diff as unknown[]).find((d: unknown) =>\n String(d).startsWith(\"- expected:\")\n ) as string | undefined;\n if (allowedSingleLine) {\n const value = allowedSingleLine.replace(\"- expected: \", \"\");\n suggestions.push(`Set '${param}' to: ${value}.`);\n } else if (allowedOneOfLine) {\n const allowed = allowedOneOfLine.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// Helper function to suggest fixes based on error type\nfunction suggestFromErrorType(error_type: string, suggestions: string[]): void {\n if (error_type.includes(\"missing_required\")) {\n suggestions.push(\"Add all required parameters defined by the tool schema.\");\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\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 (!Array.isArray(diff)) {\n if (suggestions.length === 0 && typeof error_type === \"string\") {\n suggestFromErrorType(error_type, suggestions);\n }\n return uniqueLines(suggestions);\n }\n\n if (hasFunctionNameIssue(diff)) {\n suggestFunctionNameFix(expected, actual, suggestions);\n }\n\n if (\n diff.some((d: unknown) => String(d).startsWith(\"- missing required param:\"))\n ) {\n suggestMissingParamFix(diff, suggestions);\n }\n\n if (diff.some((d: unknown) => String(d).startsWith(\"+ unexpected param:\"))) {\n suggestUnexpectedParamFix(diff, suggestions);\n }\n\n if (diff.some((d: unknown) => String(d).startsWith(\"@@ param \"))) {\n suggestParamValueFix(diff, suggestions);\n }\n\n if (suggestions.length === 0 && typeof error_type === \"string\") {\n suggestFromErrorType(error_type, suggestions);\n }\n\n return uniqueLines(suggestions);\n}\n\n// Helper function to extract test ID from a log line\nfunction getTestIdFromLogLine(line: string): string | undefined {\n if (line.startsWith(\"[FAIL]\")) {\n const m = line.match(FAIL_ID_REGEX);\n return m?.[1];\n }\n if (line.startsWith(\"[DEBUG-FAIL]\")) {\n try {\n const parsed = JSON.parse(line.replace(DEBUG_FAIL_PREFIX_REGEX, \"\"));\n return String(parsed?.id ?? \"\");\n } catch {\n // Intentionally ignore: malformed [DEBUG-FAIL] payloads are expected when\n // earlier steps fail to JSON-stringify complex values (circular/BigInt/etc.).\n // We only use parsed IDs for de-duplication, so a parse miss is safe.\n }\n }\n if (line.startsWith(\"[DEBUG-FAIL-CONTEXT]\")) {\n try {\n const parsed = JSON.parse(\n line.replace(DEBUG_FAIL_CONTEXT_PREFIX_REGEX, \"\")\n );\n return String(parsed?.id ?? \"\");\n } catch {\n /* intentionally ignored */\n }\n }\n return;\n}\n\n// Helper function to group logs by test ID\nfunction groupLogsByTestId(failLogs: string[]): Map<string, string[]> {\n const byId = new Map<string, string[]>();\n for (const line of failLogs) {\n const id = getTestIdFromLogLine(line);\n const key = id ?? \"__general__\";\n const arr = byId.get(key) ?? [];\n arr.push(line);\n byId.set(key, arr);\n }\n return byId;\n}\n\n// Helper function to collect debug IDs from lines\nfunction collectDebugIds(lines: string[]): Set<string> {\n const debugIds = new Set<string>();\n for (const l of lines) {\n if (l.startsWith(\"[DEBUG-FAIL]\")) {\n try {\n const parsed = JSON.parse(l.replace(DEBUG_FAIL_PREFIX_REGEX, \"\"));\n if (parsed?.id) {\n debugIds.add(String(parsed.id));\n }\n } catch {\n /* intentionally ignored */\n }\n }\n }\n return debugIds;\n}\n\n// Helper function to print formatted JSON with indentation\nfunction printIndentedJson(prefix: string, data: unknown, color: string): void {\n console.log(\n color +\n prefix +\n JSON.stringify(data, null, 2).split(\"\\n\").join(\"\\n \") +\n colors.reset\n );\n}\n\n// Helper function to handle DEBUG-FAIL line display\nfunction displayDebugFailLine(line: string): void {\n const payload = line.replace(DEBUG_FAIL_PREFIX_REGEX, \"\");\n try {\n const parsed = JSON.parse(payload);\n const { message, diff, expected, actual } = parsed;\n if (message) {\n console.log(` ${colors.bold}${message}${colors.reset}`);\n }\n if (diff && Array.isArray(diff)) {\n for (const dLine of diff) {\n console.log(` ${colorizeDiffLine(dLine)}`);\n }\n } else {\n console.log(\" expected:\");\n printIndentedJson(\" \", expected, colors.green);\n console.log(\" actual:\");\n printIndentedJson(\" \", actual, colors.red);\n }\n const suggestions = suggestFixFromDiff(parsed);\n if (suggestions.length) {\n console.log(` ${colors.bold}Suggested fix:${colors.reset}`);\n for (const s of suggestions) {\n console.log(` • ${s}`);\n }\n }\n } catch {\n console.log(` ${line}`);\n }\n}\n\n// Helper function to display context information\nfunction displayContextInfo(ctx: Record<string, unknown>): void {\n if (ctx.tool_schema) {\n printIndentedJson(\" tool schema: \", ctx.tool_schema, colors.gray);\n }\n if (ctx.last_user_query) {\n console.log(\n colors.gray +\n \" last user: \" +\n JSON.stringify(ctx.last_user_query) +\n colors.reset\n );\n }\n if (ctx.raw_model_text) {\n console.log(\n colors.gray +\n \" raw model text (middleware parsed):\\n \" +\n String(ctx.raw_model_text).split(\"\\n\").join(\"\\n \") +\n colors.reset\n );\n }\n if (ctx.parsed_tool_calls) {\n printIndentedJson(\n \" parsed tool calls: \",\n ctx.parsed_tool_calls,\n colors.gray\n );\n }\n if (ctx.ground_truth) {\n printIndentedJson(\n \" ground truth: \",\n ctx.ground_truth,\n colors.gray\n );\n }\n if (ctx.finish_reason) {\n console.log(\n colors.gray +\n \" finish reason: \" +\n JSON.stringify(ctx.finish_reason) +\n colors.reset\n );\n }\n}\n\n// Helper function to handle DEBUG-FAIL-CONTEXT line display\nfunction displayDebugFailContextLine(line: string): void {\n const payload = line.replace(DEBUG_FAIL_CONTEXT_PREFIX_REGEX, \"\");\n try {\n const ctx = JSON.parse(payload) as Record<string, unknown>;\n console.log(` ${colors.gray}context:${colors.reset}`);\n displayContextInfo(ctx);\n } catch {\n console.log(` ${line}`);\n }\n}\n\n// Helper function to display a single log line\nfunction displayLogLine(line: string, debugIds: Set<string>): void {\n if (line.startsWith(\"[FAIL]\")) {\n const m = line.match(FAIL_ID_REGEX);\n const failId = m?.[1];\n if (failId && debugIds.has(failId)) {\n return;\n }\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 displayDebugFailLine(line);\n } else if (line.startsWith(\"[DEBUG-FAIL-CONTEXT]\")) {\n displayDebugFailContextLine(line);\n }\n}\n\n// Helper function to display grouped failure logs\nfunction displayGroupedFailures(byId: Map<string, string[]>): void {\n console.log(` ${colors.bold}Failure details (grouped):${colors.reset}`);\n for (const [groupId, lines] of byId) {\n if (groupId !== \"__general__\") {\n console.log(` ${colors.underline}${groupId}${colors.reset}`);\n }\n const debugIds = collectDebugIds(lines);\n for (const line of lines) {\n displayLogLine(line, debugIds);\n }\n }\n}\n\n// Helper function to display success logs\nfunction displaySuccessLogs(logs: string[]): void {\n const info = 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// Helper function to filter failure-related logs\nfunction filterFailureLogs(logs: string[]): string[] {\n return 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 l.startsWith(\"[DEBUG-FAIL-CONTEXT]\")\n );\n}\n\n// Helper function to display logs for a result\nfunction displayResultLogs(logs: string[]): void {\n const failLogs = filterFailureLogs(logs);\n const hasFails = failLogs.length > 0;\n if (hasFails) {\n const byId = groupLogsByTestId(failLogs);\n displayGroupedFailures(byId);\n } else {\n displaySuccessLogs(logs);\n }\n}\n\n// Helper function to display metrics\nfunction displayMetrics(metrics: [string, unknown][]): void {\n if (metrics.length > 0) {\n console.log(\" Metrics:\");\n for (const [k, v] of metrics) {\n console.log(` - ${k}: ${v}`);\n }\n }\n}\n\n// Helper function to display result header\nfunction displayResultHeader(r: EvaluationResult): void {\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\nexport function consoleDebugReporter(results: EvaluationResult[]): void {\n console.log(\"\\n--- 📊 Evaluation Report (debug) ---\");\n for (const r of results) {\n displayResultHeader(r);\n displayMetrics(Object.entries(r.result.metrics));\n if (r.result.logs?.length) {\n displayResultLogs(r.result.logs);\n }\n }\n console.log(\"\\n------------------------------------\\n\");\n}\n","import type { 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 type { 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 type { LanguageModel } from \"ai\";\n\nimport type {\n EvaluateOptions,\n EvaluationResult,\n LanguageModelV3Benchmark,\n ReporterType,\n} from \"./interfaces\";\nimport { reporters } from \"./reporters\";\n\nasync function runSingleBenchmark(\n model: LanguageModel,\n benchmark: LanguageModelV3Benchmark,\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\n/**\n * Normalize models input to array of [key, model] entries\n */\nfunction normalizeModels(\n models: LanguageModel | LanguageModel[] | Record<string, LanguageModel>\n): [string | undefined, LanguageModel][] {\n const modelEntries: [string | undefined, LanguageModel][] = [];\n\n if (Array.isArray(models)) {\n for (const m of models) {\n modelEntries.push([undefined, m]);\n }\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\n return modelEntries;\n}\n\n/**\n * Build config object from optional parameters\n */\nfunction buildConfig(\n temperature?: number,\n maxTokens?: number\n): Record<string, unknown> | undefined {\n const config: Record<string, unknown> = {};\n if (temperature !== undefined) {\n config.temperature = temperature;\n }\n if (maxTokens !== undefined) {\n config.maxTokens = maxTokens;\n }\n return Object.keys(config).length > 0 ? config : undefined;\n}\n\n/**\n * Execute reporter with results\n */\nfunction executeReporter(\n reporter: ReporterType,\n results: EvaluationResult[]\n): void {\n const report = reporters[reporter];\n if (report) {\n report(results);\n } else {\n console.warn(`Unknown reporter: '${reporter}'. Defaulting to console.`);\n reporters.console(results);\n }\n}\n\nexport async function evaluate(\n options: EvaluateOptions\n): Promise<EvaluationResult[]> {\n const {\n models,\n benchmarks,\n reporter = \"console\",\n temperature,\n maxTokens,\n } = options;\n\n const modelEntries = normalizeModels(models);\n const config = buildConfig(temperature, maxTokens);\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 config\n );\n allResults.push(evaluationResult);\n }\n }\n\n executeReporter(reporter, allResults);\n return allResults;\n}\n"],"mappings":"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","names":["fs","path","require","fs","path","fixSchemaType","fixSchema","_a","runSingleCase","mapWithConcurrency","fs","path","generateText","jsonSchema","tool","LINE_SPLIT_REGEX","standardizeString","valuesMatch","tool","jsonSchema","generateText","fs","path","fs","path","generateText","LINE_SPLIT_REGEX","fs","path","generateText","colors"]}
|