import apiClient from './apiClient' import type { ApiModelInfo, ApiProviderConfig, ApiProviderPreset, ModelCapability, ModelInfo, OperationResponse, ProviderConfig, ProviderPreset, ProviderUpdateRequest } from '@/contracts' function capabilityMap(capabilities: string[]): Partial { return Object.fromEntries(capabilities.map((capability) => [capability, true])) as Partial } function toProvider(provider: ApiProviderConfig): ProviderConfig { return { provider_id: provider.provider_id, version: provider.version, request_overrides: provider.request_overrides || [], provider_type: provider.provider_type, name: provider.name, base_url: provider.base_url ?? undefined, default_model: provider.default_model ?? '', enabled: provider.enabled, capabilities: capabilityMap(provider.capabilities), credential_id: provider.credential_id ?? undefined, has_credential: Boolean(provider.credential_id), } } function toModel(model: ApiModelInfo): ModelInfo { return { model_id: model.model, name: model.display_name, capabilities: capabilityMap(model.capabilities) } } export async function listProviders(): Promise { const response = await apiClient.get<{ items: ApiProviderConfig[] }>('/api/providers') return response.items.filter(provider => provider.provider_type !== 'mock').map(toProvider) } export async function getProvider(providerId: string): Promise { return toProvider(await apiClient.get(`/api/providers/${providerId}`)) } export async function createProvider(data: Omit): Promise { const response = await apiClient.post('/api/providers', { provider_type: data.provider_type, request_overrides: data.request_overrides, name: data.name, base_url: data.base_url, default_model: data.default_model || null, credential_id: data.credential_id, enabled: data.enabled, }) return toProvider(response) } export async function listProviderPresets(): Promise { const response = await apiClient.get<{ items: ApiProviderPreset[] }>('/api/providers/presets') return response.items } export async function getCredentialStatus(credentialId: string): Promise { const response = await apiClient.get<{ credential_id: string; configured: boolean }>(`/api/credentials/${encodeURIComponent(credentialId)}`) return response.configured } export async function putCredential(credentialId: string, apiKey: string): Promise { await apiClient.put<{ credential_id: string; configured: boolean }>( `/api/credentials/${encodeURIComponent(credentialId)}`, { api_key: apiKey }, ) } export async function updateProvider(providerId: string, data: ProviderUpdateRequest): Promise { const response = await apiClient.patch(`/api/providers/${providerId}`, { provider_type: data.provider_type, version: data.version, request_overrides: data.request_overrides, name: data.name, base_url: data.base_url, default_model: data.default_model, credential_id: data.credential_id, enabled: data.enabled, }) return toProvider(response) } export async function deleteProvider(providerId: string): Promise { return apiClient.delete(`/api/providers/${providerId}`) } export async function listModels(providerId: string): Promise { const response = await apiClient.get<{ provider_id: string; items: ApiModelInfo[] }>(`/api/providers/${providerId}/models`) return response.items.map(toModel) } export interface TestResult { success: boolean latency_ms?: number error_code?: string error_message?: string } export async function testProvider(providerId: string): Promise { try { const result = await apiClient.post<{ success: boolean; latency_ms?: number | null; message: string }>('/api/providers/test', { provider_id: providerId }) return { success: result.success, latency_ms: result.latency_ms ?? undefined, error_message: result.success ? undefined : result.message } } catch (e: any) { return { success: false, error_code: e.code || 'TEST_FAILED', error_message: e.message } } }