import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { useState } from 'react' import { api } from '../../api/client' import { ProviderForm } from './ProviderForm' import type { Provider } from '../../api/types' export function ProvidersPage() { const client = useQueryClient() const providers = useQuery({ queryKey: ['providers'], queryFn: api.providers }) const [discoveries, setDiscoveries] = useState>({}) const [editing, setEditing] = useState() const create = useMutation({ mutationFn: api.createProvider, onSuccess: () => client.invalidateQueries({ queryKey: ['providers'] }), }) const update = useMutation({ mutationFn: ({ id, value }: { id: number; value: Parameters[1] }) => api.updateProvider(id, value), onSuccess: () => { setEditing(undefined); client.invalidateQueries({ queryKey: ['providers'] }) }, }) const remove = useMutation({ mutationFn: api.deleteProvider, onSuccess: () => client.invalidateQueries({ queryKey: ['providers'] }), }) const discover = useMutation({ mutationFn: api.discoverModels, onSuccess: (result, id) => setDiscoveries((current) => ({ ...current, [id]: result.models })), }) const save = useMutation({ mutationFn: ({ id, model }: { id: number; model: string }) => api.saveModels(id, [{ model_id: model, display_name: model, enabled: true, sort_order: 0, reasoning_enabled: false, extra_params: {}, }]), onSuccess: () => client.invalidateQueries({ queryKey: ['models'] }), }) return (

Provider

配置端点并从 Provider 拉取可用模型。

editing ? update.mutate({ id: editing.provider_id, value }) : create.mutate(value)} busy={create.isPending || update.isPending} />
{providers.data?.map((provider) => (

{provider.name}

{provider.provider_type} · {provider.base_url}

{discoveries[provider.provider_id] && (
{discoveries[provider.provider_id].map((model) => (
{model}
))}
)}
))}
) }