diff --git a/apps/web/src/app/(authenticated)/settings/providers/page.tsx b/apps/web/src/app/(authenticated)/settings/providers/page.tsx index c59931a..c2045d3 100644 --- a/apps/web/src/app/(authenticated)/settings/providers/page.tsx +++ b/apps/web/src/app/(authenticated)/settings/providers/page.tsx @@ -85,12 +85,16 @@ const INITIAL_FORM: ProviderFormState = { isActive: true, }; -function mapProviderTypeToApi(type: string): "ollama" | "openai" | "claude" { - if (type === "ollama" || type === "claude") { - return type; - } +function buildProviderName(displayName: string, type: string): string { + const slug = displayName + .trim() + .toLowerCase() + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-+/, "") + .replace(/-+$/, ""); - return "openai"; + const candidate = `${type}-${slug.length > 0 ? slug : "provider"}`; + return candidate.slice(0, 100); } function getErrorMessage(error: unknown, fallback: string): string { @@ -299,27 +303,24 @@ export default function ProvidersSettingsPage(): ReactElement { await updateFleetProvider(editingProvider.id, updatePayload); setSuccessMessage(`Updated provider "${displayName}".`); } else { - const config: CreateFleetProviderRequest["config"] = {}; + const createPayload: CreateFleetProviderRequest = { + name: buildProviderName(displayName, form.type), + displayName, + type: form.type, + }; if (baseUrl.length > 0) { - config.endpoint = baseUrl; + createPayload.baseUrl = baseUrl; } if (apiKey.length > 0) { - config.apiKey = apiKey; + createPayload.apiKey = apiKey; } - if (models.length > 0) { - config.models = models; + if (providerModels.length > 0) { + createPayload.models = providerModels; } - const createPayload: CreateFleetProviderRequest = { - displayName, - providerType: mapProviderTypeToApi(form.type), - config, - isEnabled: form.isActive, - }; - await createFleetProvider(createPayload); setSuccessMessage(`Added provider "${displayName}".`); } diff --git a/apps/web/src/lib/api/fleet-settings.test.ts b/apps/web/src/lib/api/fleet-settings.test.ts index 52833ca..afca55f 100644 --- a/apps/web/src/lib/api/fleet-settings.test.ts +++ b/apps/web/src/lib/api/fleet-settings.test.ts @@ -34,25 +34,27 @@ describe("createFleetProvider", (): void => { vi.mocked(client.apiPost).mockResolvedValueOnce({ id: "provider-1" } as never); await createFleetProvider({ - providerType: "openai", + name: "openai-main", displayName: "OpenAI Main", - config: { - endpoint: "https://api.openai.com/v1", - apiKey: "sk-test", - models: ["gpt-4.1-mini", "gpt-4o-mini"], - }, - isEnabled: true, + type: "openai", + baseUrl: "https://api.openai.com/v1", + apiKey: "sk-test", + models: [ + { id: "gpt-4.1-mini", name: "gpt-4.1-mini" }, + { id: "gpt-4o-mini", name: "gpt-4o-mini" }, + ], }); expect(client.apiPost).toHaveBeenCalledWith("/api/fleet-settings/providers", { - providerType: "openai", + name: "openai-main", displayName: "OpenAI Main", - config: { - endpoint: "https://api.openai.com/v1", - apiKey: "sk-test", - models: ["gpt-4.1-mini", "gpt-4o-mini"], - }, - isEnabled: true, + type: "openai", + baseUrl: "https://api.openai.com/v1", + apiKey: "sk-test", + models: [ + { id: "gpt-4.1-mini", name: "gpt-4.1-mini" }, + { id: "gpt-4o-mini", name: "gpt-4o-mini" }, + ], }); }); }); diff --git a/apps/web/src/lib/api/fleet-settings.ts b/apps/web/src/lib/api/fleet-settings.ts index a3561fe..82184c8 100644 --- a/apps/web/src/lib/api/fleet-settings.ts +++ b/apps/web/src/lib/api/fleet-settings.ts @@ -16,16 +16,13 @@ export interface FleetProvider { } export interface CreateFleetProviderRequest { - providerType: "ollama" | "openai" | "claude"; + name: string; displayName: string; - config: { - endpoint?: string; - apiKey?: string; - models?: string[]; - timeout?: number; - }; - isDefault?: boolean; - isEnabled?: boolean; + type: string; + baseUrl?: string; + apiKey?: string; + apiType?: string; + models?: FleetProviderModel[]; } export interface UpdateFleetProviderRequest {