/**
 * Claude-Compatible Proxy Routes
 *
 * Exposes Anthropic-compatible /v1/messages, /v1/models, and /v1/messages/count_tokens
 * endpoints. ALL requests are routed through ctx.neurolink.generate() / ctx.neurolink.stream()
 * -- no direct HTTP calls to Anthropic.
 *
 * An optional ModelRouter can remap incoming model names to different
 * provider/model pairs (e.g. "claude-sonnet-4-20250514" -> vertex/gemini-2.5-pro).
 * Without a router, models are passed through to the Anthropic provider.
 */
import type { ModelRouter } from "../../proxy/modelRouter.js";
import type { ParsedClaudeError, ParsedClaudeRequest, ProxyPassthroughAccount, RouteGroup, RuntimeAccountState } from "../../types/index.js";
/** Resolve the configured primary's stable key to its current index in the
 *  request's enabledAccounts list. Returns 0 (insertion-order fallback) when
 *  no key is configured or the key cannot be matched (account disabled/
 *  removed). The resolution is per-request because enabledAccounts membership
 *  can shift between requests. */
declare function resolveHomeIndex(enabledAccounts: ProxyPassthroughAccount[]): number;
/** If the configured home primary is no longer cooling, reset
 *  primaryAccountIndex back to its index so traffic returns to the preferred
 *  account once its rate limit window expires. Called at the start of each
 *  request. Home is resolved fresh per call via resolveHomeIndex. */
declare function maybeResetPrimaryToHome(enabledAccounts: ProxyPassthroughAccount[]): void;
/**
 * Create Claude-compatible proxy routes.
 *
 * Every request flows through ctx.neurolink.generate() or ctx.neurolink.stream().
 * No direct fetch() calls to api.anthropic.com.
 *
 * @param modelRouter - Optional model router for remapping model names.
 * @param basePath    - Base path prefix (default: "" since Claude API uses /v1/...).
 * @returns RouteGroup with Claude-compatible endpoints.
 */
export declare function createClaudeProxyRoutes(modelRouter?: ModelRouter, basePath?: string, accountStrategy?: "round-robin" | "fill-first", passthroughMode?: boolean, primaryAccountKey?: string): RouteGroup;
export declare function getTransientSameAccountRetryDelayMs(retryNumber: number): number;
/**
 * Parse a Claude error payload when available.
 */
export declare function parseClaudeErrorBody(errBody: string): ParsedClaudeError;
/**
 * Detect malformed request errors that should not trigger account/provider failover.
 */
export declare function isInvalidRequestError(status: number, errBody: string): boolean;
export declare function buildProxyFallbackOptions(parsed: ParsedClaudeRequest, overrides?: {
    provider?: string;
    model?: string;
}): Record<string, unknown>;
/**
 * Detect transient upstream failures that should trigger account/provider failover.
 *
 * Includes Cloudflare 52x statuses and Anthropic 400/api_error wrappers that
 * carry transient HTML responses (e.g. 520 pages) inside `error.message`.
 */
export declare function isTransientHttpFailure(status: number, errBody: string): boolean;
export declare const __testHooks: {
    resolveHomeIndex: typeof resolveHomeIndex;
    maybeResetPrimaryToHome: typeof maybeResetPrimaryToHome;
    setConfiguredPrimaryAccountKey: (key: string | undefined) => void;
    getConfiguredPrimaryAccountKey: () => string | undefined;
    setPrimaryAccountIndex: (index: number) => void;
    getPrimaryAccountIndex: () => number;
    setAccountRuntimeState: (key: string, state: Partial<RuntimeAccountState>) => void;
    resetAllRuntimeState: () => void;
};
export {};
