import { type AnyModel, type Api, type AssistantMessageEventStream, type ClassifierApi, type ClassifierModel, type ImageApi, type Model, type OAuthCredentials, type OAuthLoginCallbacks, type Provider, type ProviderClassifier, type ProviderHeaders, type ProviderImages, type RefreshModelsContext, type SimpleStreamOptions, type TranscriptContext } from "@earendil-works/pi-ai"; import type { ModelConfig, ModelsJsonProvider } from "./model-config.ts"; import { clearConfigValueCache } from "./resolve-config-value.ts"; export interface ExtensionOAuthConfig { name: string; /** Whether access through this auth method is backed by a provider subscription. */ isSubscription?: boolean; /** @deprecated Retained for extension source compatibility; ignored by canonical auth flows. */ usesCallbackServer?: boolean; login(callbacks: OAuthLoginCallbacks): Promise; refreshToken(credentials: OAuthCredentials, signal: AbortSignal): Promise; getApiKey(credentials: OAuthCredentials): string; modifyModels?(models: Model[], credentials: OAuthCredentials): Model[]; } interface ProviderModelConfigBase { id: string; name: string; api?: string; baseUrl?: string; input: ("text" | "image")[]; inputLimits?: AnyModel["inputLimits"]; cost: AnyModel["cost"]; headers?: Record; } export interface ProviderChatModelConfig extends ProviderModelConfigBase { type?: "chat"; api?: Api; reasoning: boolean; thinkingLevelMap?: Model["thinkingLevelMap"]; promptCache?: Model["promptCache"]; contextWindow: number; maxTokens: number; samplingParams?: Model["samplingParams"]; samplingParamsByThinkingLevel?: Model["samplingParamsByThinkingLevel"]; compat?: Model["compat"]; } export interface ProviderImageModelConfig extends ProviderModelConfigBase { type: "image"; api?: ImageApi; output: ("text" | "image")[]; } export interface ProviderClassifierModelConfig extends ProviderModelConfigBase { type: "classifier"; api?: ClassifierApi; contextWindow: number; compat?: ClassifierModel["compat"]; } export type ProviderModelConfig = ProviderChatModelConfig | ProviderImageModelConfig | ProviderClassifierModelConfig; /** Input type for the extension registerProvider API. */ export interface ProviderConfigInput { name?: string; baseUrl?: string; apiKey?: string; api?: Api; /** * Declarative custom-provider streaming handler. The context is a normalized transcript: * read the prompt and tools from its system messages. Invoke `options.onPayload` before * sending and `options.onResponse` after receiving the response. */ streamSimple?: (model: Model, context: TranscriptContext, options?: SimpleStreamOptions) => AssistantMessageEventStream; images?: Partial>; classifiers?: Partial>; headers?: Record; authHeader?: boolean; oauth?: ExtensionOAuthConfig; models?: ProviderModelConfig[]; refreshModels?(context: RefreshModelsContext): Promise; } export type AuthStatus = { configured: boolean; source?: "stored" | "runtime" | "environment" | "fallback" | "models_json_key" | "models_json_command"; label?: string; }; export declare const clearApiKeyCache: typeof clearConfigValueCache; export declare function validateExtensionProvider(providerId: string, base: Provider | undefined, modelsConfig: ModelsJsonProvider | undefined, extension: ProviderConfigInput): void; /** Compose built-in, models.json, and extension layers without reading credentials. */ export declare function composeModelProvider(providerId: string, base: Provider | undefined, modelConfig: ModelConfig, extension: ProviderConfigInput | undefined): Provider; export declare function resolveConfiguredModelHeaders(model: AnyModel, config: ModelsJsonProvider | undefined, extension: ProviderConfigInput | undefined, env?: Record): Record | undefined; export interface CompatibilityRequestConfig { headers?: ProviderHeaders; authHeader: boolean; } export declare function resolveCompatibilityRequestConfig(model: AnyModel, config: ModelsJsonProvider | undefined, extension: ProviderConfigInput | undefined): CompatibilityRequestConfig; export declare function configuredRequestAuthStatus(config: ModelsJsonProvider | undefined, extension: ProviderConfigInput | undefined): AuthStatus | undefined; export {};