/**
 * LLM client factory — hoisted from packages/eval/src/composition-root.ts
 * so packages/api can build a DiagnosisRunner without importing eval (D-01).
 *
 * Adapter CLASSES stay in packages/eval/src/adapters/llm/. Only the factory
 * function lives here. Adapter constructors are injected via `LLMClientAdapters`
 * so core never static-imports vendor SDK code (D0051 invariant / T-05-01-01).
 *
 * @see docs/decisions/D0051-llm-client-port.md
 * @see packages/eval/src/composition-root.ts — call site (updated to use this)
 */
import type { LLMClient } from "../ports/llm-client.js";
import type { Logger } from "../ports/logger.js";
/**
 * Narrow config slice consumed by the LLM client factory.
 * Does NOT depend on `ResolvedConfig` from packages/eval — only the
 * llmProvider field is needed here.
 */
export interface LLMClientFactoryConfig {
    readonly llmProvider?: "anthropic" | "openai";
}
/**
 * Typed key bag passed to `createLLMClient`. The composition root reads
 * env once and supplies values here; the factory stays pure so tests don't
 * have to mutate `process.env`.
 */
export interface LLMClientKeys {
    readonly anthropicApiKey?: string;
    readonly openaiApiKey?: string;
}
/**
 * Constructor callbacks for adapter classes that live in packages/eval.
 * The eval composition root passes real constructors; tests pass spies.
 *
 * This pattern satisfies T-05-01-01: core never static-imports
 * openai / @anthropic-ai/sdk. The vendor code stays in eval.
 */
export interface LLMClientAdapters {
    readonly newAnthropicClient: (opts: {
        apiKey: string;
        logger: Logger;
    }) => LLMClient;
    readonly newOpenAIClient: (opts: {
        apiKey: string;
        logger: Logger;
    }) => LLMClient;
}
/**
 * Select the LLMClient adapter based on `config.llmProvider` and the
 * supplied API keys. Returns `undefined` when no usable credential is
 * present — `AppContext.llmClient` stays unset and consumers handle that
 * explicitly.
 *
 * Adapters never read `process.env` themselves (per
 * `.claude/rules/typescript.md`); env mapping happens at the call site
 * (typically `createAppContext`).
 *
 * Adapter classes stay in packages/eval; they are passed in via `deps.adapters`
 * so this factory has zero eval imports (D-01 / T-05-01-01).
 */
export declare function createLLMClient(config: LLMClientFactoryConfig, keys: LLMClientKeys, deps: {
    logger: Logger;
    adapters: LLMClientAdapters;
}): LLMClient | undefined;
