Files
temetro/frontend/lib/ai-settings.ts
T
Khalid Abdi ff37b555b0 frontend: Settings → AI panel (modes, providers, Veil)
New per-user AI settings section (visible to every clinician, not just admins):
- Inference mode: cloud API key vs local Ollama.
- Provider + key (OpenAI / Anthropic / Gemini) via a select; the key field is
  write-only and shows a "key set" indicator from the backend's apiKeySet,
  never echoing the stored secret. Default model + effort per provider.
- Local Ollama: base URL + model name with a "Test connection" probe.
- Veil: de-identification level (full / names / off) with mode-aware copy.

Talks to the new /api/ai/config + /api/ai/test endpoints via lib/ai-settings.ts.
The old mock clinical selects (specialty/facility/time range/access/response)
are dropped entirely rather than relocated — they were placeholder knobs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 18:38:38 +03:00

53 lines
1.5 KiB
TypeScript

import { apiFetch } from "@/lib/api-client";
import type { Effort } from "@/lib/ai-models";
// Mirrors backend/src/types/ai.ts. Per-user AI configuration fetched from and
// saved to /api/ai/config. Provider API keys are write-only: they are never
// returned, only `apiKeySet` reports which providers have a stored key.
export type AiMode = "api" | "local";
export type ApiProvider = "openai" | "anthropic" | "gemini";
export type VeilLevel = "off" | "names" | "full";
export type AiConfig = {
mode: AiMode;
provider: ApiProvider;
ollamaBaseUrl: string;
ollamaModel: string;
defaultModel: string;
defaultEffort: Effort;
veilLevel: VeilLevel;
apiKeySet: Record<ApiProvider, boolean>;
};
export type AiConfigPatch = Partial<
Omit<AiConfig, "apiKeySet">
> & {
// Plaintext key for the currently selected provider; "" clears it.
apiKey?: string;
};
export async function getAiConfig(): Promise<AiConfig> {
const res = await apiFetch<{ config: AiConfig }>("/api/ai/config");
return res.config;
}
export async function saveAiConfig(patch: AiConfigPatch): Promise<AiConfig> {
const res = await apiFetch<{ config: AiConfig }>("/api/ai/config", {
method: "PUT",
body: JSON.stringify(patch),
});
return res.config;
}
export async function testAiConnection(input: {
mode: AiMode;
provider?: ApiProvider;
ollamaBaseUrl?: string;
}): Promise<{ ok: boolean; message: string }> {
return apiFetch<{ ok: boolean; message: string }>("/api/ai/test", {
method: "POST",
body: JSON.stringify(input),
});
}