import { useTranslation } from 'react-i18next'; import { asError } from '@/utils/errorTypes'; import React, { useState, useEffect } from 'react'; import { Tabs } from '@/components/shared/Tabs'; import { fetchProviders, createProvider, updateProvider, deleteProvider, fetchPresets, createPreset, updatePreset, deletePreset, fetchAgents, createAgent, updateAgent, deleteAgent, fetchTools, type AIProvider, type AIPreset, type AIAgent, type AITool, } from '@/api/ai'; // ─── Provider Tab ─── function ProviderTab() { const { t } = useTranslation(); const [providers, setProviders] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [showForm, setShowForm] = useState(false); const [editId, setEditId] = useState(null); const [form, setForm] = useState({ name: '', provider_type: 'openai', api_key: '', base_url: '', is_default: false }); const load = async () => { try { setProviders(await fetchProviders()); } catch (e: unknown) { const errObj = asError(e); setError(errObj?.message || null); } finally { setLoading(false); } }; useEffect(() => { load(); }, []); const handleSave = async () => { try { if (editId) { await updateProvider(editId, form); } else { await createProvider(form); } setShowForm(false); setEditId(null); setForm({ name: '', provider_type: 'openai', api_key: '', base_url: '', is_default: false }); await load(); } catch (e: unknown) { const errObj = asError(e); setError(errObj?.message || null); } }; const handleEdit = (p: AIProvider) => { setEditId(p.id); setForm({ name: p.name, provider_type: p.provider_type, api_key: '', base_url: p.base_url, is_default: p.is_default }); setShowForm(true); }; const handleDelete = async (id: string) => { if (!confirm(t('aiSettings.confirmDeleteProvider'))) return; try { await deleteProvider(id); await load(); } catch (e: unknown) { const errObj = asError(e); setError(errObj?.message || null); } }; if (loading) return
{t('common.loading')}
; return (

{t('aiSettings.providers.title')}

{error &&
{typeof error === "string" ? error : (error as any)?.message || "t('common.errorOccurred')"}
} {showForm && (
setForm({ ...form, name: e.target.value })} className="border rounded-lg px-3 py-2 text-sm" /> setForm({ ...form, api_key: e.target.value })} className="border rounded-lg px-3 py-2 text-sm" /> setForm({ ...form, base_url: e.target.value })} className="border rounded-lg px-3 py-2 text-sm" />
)}
{providers.map((p) => (
{p.name} {p.is_default && {t('aiSettings.defaultTag')}}
{p.provider_type} · {p.api_key}
))}
); } // ─── Presets Tab ─── function PresetTab() { const { t } = useTranslation(); const [presets, setPresets] = useState([]); const [providers, setProviders] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [showForm, setShowForm] = useState(false); const [editId, setEditId] = useState(null); const [form, setForm] = useState({ name: '', model_id: '', provider_id: '', temperature: 0.7, max_tokens: 2048, top_p: 1.0, system_prompt: '' }); const load = async () => { try { setPresets(await fetchPresets()); setProviders(await fetchProviders()); } catch (e: unknown) { const errObj = asError(e); setError(errObj?.message || null); } finally { setLoading(false); } }; useEffect(() => { load(); }, []); const handleSave = async () => { try { const data = { ...form, provider_id: form.provider_id || undefined }; if (editId) { await updatePreset(editId, data); } else { await createPreset(data); } setShowForm(false); setEditId(null); setForm({ name: '', model_id: '', provider_id: '', temperature: 0.7, max_tokens: 2048, top_p: 1.0, system_prompt: '' }); await load(); } catch (e: unknown) { const errObj = asError(e); setError(errObj?.message || null); } }; const handleEdit = (p: AIPreset) => { setEditId(p.id); setForm({ name: p.name, model_id: p.model_id, provider_id: p.provider_id || '', temperature: p.temperature, max_tokens: p.max_tokens, top_p: p.top_p, system_prompt: p.system_prompt }); setShowForm(true); }; const handleDelete = async (id: string) => { if (!confirm('Preset löschen?')) return; try { await deletePreset(id); await load(); } catch (e: unknown) { const errObj = asError(e); setError(errObj?.message || null); } }; if (loading) return
{t('common.loading')}
; return (

Modelle & Presets

{error &&
{typeof error === "string" ? error : (error as any)?.message || "t('common.errorOccurred')"}
} {showForm && (
setForm({ ...form, name: e.target.value })} className="border rounded-lg px-3 py-2 text-sm" /> setForm({ ...form, model_id: e.target.value })} className="border rounded-lg px-3 py-2 text-sm" /> setForm({ ...form, temperature: parseFloat(e.target.value) })} className="border rounded-lg px-3 py-2 text-sm" /> setForm({ ...form, max_tokens: parseInt(e.target.value) })} className="border rounded-lg px-3 py-2 text-sm" /> setForm({ ...form, top_p: parseFloat(e.target.value) })} className="border rounded-lg px-3 py-2 text-sm" />