Files
browser/platform_web/contracts/aiProviders.ts
T

87 lines
2.3 KiB
TypeScript

import type { AiProviderKind, AiProviderResponse, AiProviderStatus, AiRelayMode } from "../api/types";
export type AiProviderFilter = AiProviderStatus | "all";
export type AiProviderListState = "loading" | "ready" | "error";
export type AiProviderViewState = "api" | "local-development" | "saving" | "error";
export interface AiProviderFormState {
id: string;
name: string;
kind: AiProviderKind;
baseUrl: string;
apiKeyRef: string;
modelsText: string;
defaultModel: string;
relayMode: AiRelayMode;
timeoutMs: string;
redactionPolicy: string;
}
export interface AiProviderMetrics {
total: number;
active: number;
disabled: number;
models: number;
}
export interface AiProviderActionState {
providerId: string;
label: string;
success: boolean;
message: string;
}
export interface AiProviderPageInitialState {
providers?: AiProviderResponse[];
selectedId?: string;
listState?: AiProviderListState;
listError?: string;
source?: AiProviderViewState;
action?: AiProviderActionState | null;
}
export function emptyAiProviderForm(): AiProviderFormState {
return {
id: "",
name: "",
kind: "openai-compatible",
baseUrl: "",
apiKeyRef: "secret://providers/",
modelsText: "",
defaultModel: "",
relayMode: "relay",
timeoutMs: "30000",
redactionPolicy: "default"
};
}
export function aiProviderToForm(provider?: AiProviderResponse): AiProviderFormState {
if (!provider) {
return emptyAiProviderForm();
}
return {
id: provider.id,
name: provider.name,
kind: provider.kind,
baseUrl: provider.baseUrl,
apiKeyRef: provider.apiKeyRef,
modelsText: provider.models.join(", "),
defaultModel: provider.defaultModel ?? "",
relayMode: provider.relayMode,
timeoutMs: String(provider.timeoutMs),
redactionPolicy: provider.redactionPolicy
};
}
export function summarizeAiProviders(providers: AiProviderResponse[]): AiProviderMetrics {
return providers.reduce<AiProviderMetrics>(
(metrics, provider) => ({
total: metrics.total + 1,
active: metrics.active + (provider.status === "active" ? 1 : 0),
disabled: metrics.disabled + (provider.status === "disabled" ? 1 : 0),
models: metrics.models + provider.models.length
}),
{ total: 0, active: 0, disabled: 0, models: 0 }
);
}