Files
wehub-resource-sync e4dcfc49aa
Tests / Import Check (Python 3.13) (push) Has been cancelled
Tests / Import Check (Python 3.14) (push) Has been cancelled
Tests / Python Tests (Python 3.11) (push) Has been cancelled
Tests / Python Tests (Python 3.12) (push) Has been cancelled
Tests / Python Tests (Python 3.14) (push) Has been cancelled
Tests / Test Summary (push) Has been cancelled
Tests / Lint and Format (push) Has been cancelled
Tests / Web Node Tests (push) Has been cancelled
Tests / Import Check (Python 3.11) (push) Has been cancelled
Tests / Import Check (Python 3.12) (push) Has been cancelled
Tests / Python Tests (Python 3.13) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:00:43 +08:00

45 lines
1.3 KiB
TypeScript

import { apiFetch, apiUrl } from "@/lib/api";
import type { LLMSelection } from "@/lib/unified-ws";
export interface LLMOption extends LLMSelection {
profile_name: string;
model_name: string;
model: string;
provider: string;
/** Human-readable provider name from the registry ("OpenRouter"). */
provider_label?: string;
context_window?: number;
is_active_default: boolean;
}
export interface LLMOptionsResponse {
active: LLMSelection | null;
options: LLMOption[];
}
export function llmSelectionKey(selection: LLMSelection | null | undefined) {
if (!selection?.profile_id || !selection.model_id) return "";
return `${selection.profile_id}:${selection.model_id}`;
}
export function sameLLMSelection(
a: LLMSelection | null | undefined,
b: LLMSelection | null | undefined,
) {
return llmSelectionKey(a) === llmSelectionKey(b);
}
export async function listLLMOptions(): Promise<LLMOptionsResponse> {
const response = await apiFetch(apiUrl("/api/v1/settings/llm-options"), {
cache: "no-store",
});
if (!response.ok) {
throw new Error(`Failed to load LLM options: ${response.status}`);
}
const data = (await response.json()) as LLMOptionsResponse;
return {
active: data.active ?? null,
options: Array.isArray(data.options) ? data.options : [],
};
}