"use client" import { useEffect, useState } from "react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { useLLMSettings, useUpdateLLMSettings, } from "@/lib/api/hooks/use-contact-discovery" import type { ApiLLMSettings } from "@/lib/contacts/discovery-types" import { LLMModelSuggestInput } from "@/components/gmail/settings/automation/llm-model-suggest-input" import { AutomationTabMasonry } from "@/components/gmail/settings/automation/automation-tab-masonry" import { LlmProvidersEditor } from "@/components/llm/llm-providers-editor" import { TechBrandSelectLabel } from "@/components/admin/settings/tech-brand-select-label" import { inferLlmProviderType, llmCatalogEntry, normalizeLlmProvider } from "@/lib/llm/llm-provider-catalog" import { CONTACTS_MUTED_TEXT, CONTACTS_PRIMARY_BTN_CLASS, } from "@/lib/contacts-chrome-classes" import { cn } from "@/lib/utils" export function LLMProvidersPanel() { const { data: remote, isLoading } = useLLMSettings() const updateSettings = useUpdateLLMSettings() const [draft, setDraft] = useState({ default_provider_id: "", providers: [], }) const [saved, setSaved] = useState(false) useEffect(() => { if (remote) { setDraft({ ...remote, providers: (remote.providers ?? []).map(normalizeLlmProvider), }) } }, [remote]) async function handleSave() { await updateSettings.mutateAsync(draft) setSaved(true) setTimeout(() => setSaved(false), 2000) } if (isLoading) { return

Chargement…

} return (

Fournisseurs LLM

API OpenAI-compatibles pour l'enrichissement des contacts et le tri par règles.

setDraft((prev) => ({ ...prev, providers }))} onDefaultProviderIdChange={(default_provider_id) => setDraft((prev) => ({ ...prev, default_provider_id })) } renderDefaultModelInput={({ provider, onChange }) => ( )} />

Découverte de contacts

setDraft((p) => ({ ...p, contact_discovery_model: e.target.value })) } placeholder="Laisser vide pour utiliser le modèle par défaut du fournisseur" />
) }