File size: 3,150 Bytes
9b71fd0 e8f2acc 9b71fd0 e8f2acc 9b71fd0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | import type {
AdminConfig,
ApplyResult,
ConnectedAccountStatus,
LocalStatusResult,
ModelOptionsResult,
PoolKeysResult,
ProviderTestResult,
UsageResult,
ValidationResult,
} from "./types"
export class ApiError extends Error {}
async function api<T>(path: string, options: RequestInit = {}): Promise<T> {
const response = await fetch(path, {
headers: { "Content-Type": "application/json", ...(options.headers || {}) },
...options,
cache: "no-store",
})
if (!response.ok) {
let detail = ""
try {
const payload = await response.json()
detail = typeof payload.detail === "string" ? payload.detail : ""
} catch {
// The status remains useful when an upstream proxy returns a non-JSON page.
}
throw new ApiError(detail || `${response.status} ${response.statusText}`)
}
return response.json() as Promise<T>
}
export function fetchAdminConfig(): Promise<AdminConfig> {
return api<AdminConfig>("/admin/api/config")
}
export function validateConfig(values: Record<string, string>): Promise<ValidationResult> {
return api<ValidationResult>("/admin/api/config/validate", {
method: "POST",
body: JSON.stringify({ values }),
})
}
export function applyConfig(values: Record<string, string>): Promise<ApplyResult> {
return api<ApplyResult>("/admin/api/config/apply", {
method: "POST",
body: JSON.stringify({ values }),
})
}
export async function fetchLocalStatus(): Promise<LocalStatusResult> {
return api<LocalStatusResult>("/admin/api/providers/local-status")
}
export function testProvider(providerId: string): Promise<ProviderTestResult> {
return api<ProviderTestResult>(`/admin/api/providers/${providerId}/test`, {
method: "POST",
body: "{}",
})
}
export function fetchConnectedAccount(providerId: string): Promise<ConnectedAccountStatus> {
return api<ConnectedAccountStatus>(`/admin/api/providers/${providerId}/auth`)
}
export function startConnectedAccountLogin(
providerId: string,
mode: "browser" | "device",
): Promise<ConnectedAccountStatus> {
return api<ConnectedAccountStatus>(`/admin/api/providers/${providerId}/auth/login`, {
method: "POST",
body: JSON.stringify({ mode }),
})
}
export function cancelConnectedAccountLogin(providerId: string): Promise<ConnectedAccountStatus> {
return api<ConnectedAccountStatus>(`/admin/api/providers/${providerId}/auth/cancel`, {
method: "POST",
})
}
export function disconnectConnectedAccount(providerId: string): Promise<ConnectedAccountStatus> {
return api<ConnectedAccountStatus>(`/admin/api/providers/${providerId}/auth`, {
method: "DELETE",
})
}
export function fetchModelOptions(refresh = false): Promise<ModelOptionsResult> {
const path = refresh ? "/admin/api/models/refresh" : "/admin/api/models"
return api<ModelOptionsResult>(path, { method: refresh ? "POST" : "GET" })
}
export function fetchPoolKeys(fieldKey: string): Promise<PoolKeysResult> {
return api<PoolKeysResult>(`/admin/api/pools/${encodeURIComponent(fieldKey)}`)
}
export function fetchUsageStats(): Promise<UsageResult> {
return api<UsageResult>("/admin/api/usage")
} |