import { createAnthropicClient } from "./direct-model/anthropic"; import { createOpenAIClient } from "./direct-model/openai"; import type { DirectModelProviderName } from "./direct-model/types"; import type { DecisionRequest, DecisionResponse } from "./types"; export type { DirectModelProviderName } from "./direct-model/types"; export interface DecisionProvider { readonly name: string; decide(req: DecisionRequest): Promise; healthCheck(): Promise; } export interface DirectModelProviderOptions { /** Identifier for this provider instance. plan §5.5 * DecisionProvider.name. */ readonly name: string; /** Returns API key for the given (provider, model). Caller decides * the source (env / keychain / file per plan §5.7 layer 2). Must be * synchronous so the factory itself stays sync. Returning an empty * string causes `decide()` to throw a fatal_unsupported error and * `healthCheck()` to return false. */ readonly apiKeyResolver: (provider: DirectModelProviderName, model: string) => string; /** Override for the direct-model client factories (testing). When * omitted, defaults to the M1-11 `createAnthropicClient` / * `createOpenAIClient`. */ readonly clientFactory?: { readonly anthropic?: typeof createAnthropicClient; readonly openai?: typeof createOpenAIClient; }; /** Default 2. Total LLM calls = 1 + retryBudget. */ readonly retryBudget?: number; /** Default 500. Max chars of raw LLM output threaded into the * corrective re-prompt. */ readonly parseRetryHintCharCap?: number; /** Override for transport. Passed through to the client factory. */ readonly fetchImpl?: typeof fetch; /** Explicit healthCheck target. When omitted, `healthCheck()` * returns false (catch-all consistent with the * `Promise` contract). M1-14 rev3 锁:无 profile → false。 */ readonly healthCheckProfile?: { readonly provider: DirectModelProviderName; readonly model: string; }; } export type DecisionProviderErrorKind = "fatal_http" | "fatal_aborted" | "fatal_unsupported" | "fatal_caller_bug"; export declare class DecisionProviderError extends Error { readonly name = "DecisionProviderError"; readonly kind: DecisionProviderErrorKind; readonly cause: unknown; constructor(kind: DecisionProviderErrorKind, message: string, cause?: unknown); } export declare function createDirectModelProvider(opts: DirectModelProviderOptions): DecisionProvider;