Lines 355-395javascript
355 process.stderr.write(`[omk] semantic_similarity judge returned non-JSON: ${result.output.slice(0, 100)}\n`);
359 process.stderr.write(`[omk] semantic_similarity judge parse error: ${getErrorMessage(parseErr)}\n`);
363 else if (assertion.type === 'faithfulness' ||
364 assertion.type === 'answer_relevancy' ||
365 assertion.type === 'context_recall') {
366 const ragResult = await runRagJudge(assertion, output, sample, executor, judgeModel);
367 asyncCostUSD += ragResult.costUSD;
368 if (ragResult.costReportedByExecutor === false)
369 anyCostUnreported = true;
370 passed = ragResult.passed;
371 message = ragResult.message;
373 else if (assertion.type === 'custom') {
375 const fnPath = resolve(samplesDir, assertion.fn);
376 const mod = await import(fnPath);
377 const fn = mod.default || mod.check;
MediumDynamic Require
Package source references dynamic require/import behavior.
dist/grading/assertions.jsView on unpkg · L375 379 throw new Error('custom assertion module must export default or check');
380 const result = await Promise.race([
381 fn(output, { sample, assertion }),
382 new Promise((_, reject) => setTimeout(() => reject(new Error(`custom assertion timed out (${CUSTOM_ASSERTION_TIMEOUT_MS / 1000}s)`)), CUSTOM_ASSERTION_TIMEOUT_MS)),
384 passed = Boolean(result.pass);
385 message = result.message || '';
389 message = `custom assertion error: ${getErrorMessage(err)}`;
393 type: assertion.type,
394 value: assertion.reference || assertion.fn || '',