import type { TextLlmClient } from "./textLlm.js";
/**
 * GAIA capability scoring helper (deterministic, synchronous).
 *
 * Conservative rules:
 * - Case/whitespace normalization for all answers
 * - For integer-only expected answers: leading integer extraction + number words
 */
export declare function answersMatch(expectedRaw: string, actualRaw: string): boolean;
export type AnswerJudgeResult = {
    /** Deterministic tier matched (no LLM call needed) */
    deterministicMatch: boolean;
    /** LLM judge was invoked */
    judgeInvoked: boolean;
    /** Which judge provider was used */
    judgeProvider?: string;
    /** Final verdict: match or no match */
    match: boolean;
    /** Judge reasoning (only if LLM was invoked) */
    reason?: string;
};
/**
 * Auto-discover the best available judge client.
 *
 * Priority:
 *   1. OpenRouter free model ($0, just needs OPENROUTER_API_KEY)
 *   2. Provided paid LLM client (Gemini/OpenAI/Anthropic)
 *   3. null (deterministic-only fallback)
 */
export declare function autoDiscoverJudge(paidFallback?: TextLlmClient | null): Promise<TextLlmClient | null>;
/**
 * Tiered answer matching: deterministic first, LLM judge fallback.
 *
 * Tier 0 (instant, free): `answersMatch()` — normalization + integer fuzzy
 * Tier 1 (async, free):   OpenRouter free model judge — semantic equivalence
 * Tier 2 (async, paid):   Provided LLM client — semantic equivalence
 * Tier 3 (instant, free): No API key → deterministic only
 *
 * If no `judge` client is provided, auto-discovers via `autoDiscoverJudge()`.
 */
export declare function answersMatchWithJudge(expectedRaw: string, actualRaw: string, judge?: TextLlmClient | null): Promise<AnswerJudgeResult>;
