/** * ChatbotConfigSection Component * * Displays chatbot-specific configuration fields (connector, system prompt) * Only shown when featureCode is "chatbot" */ import React, { useEffect } from 'react'; import { TextField } from '../../components/UiComponents/TextField'; import { useBilling } from '../../hooks/useBilling'; import styles from './Admin.module.css'; import { useLanguage } from '../../providers/language/LanguageContext'; const PROVIDER_LABELS: Record = { anthropic: 'Anthropic (Claude)', openai: 'OpenAI (GPT)', perplexity: 'Perplexity', tavily: 'Tavily (Web Search)', privatellm: 'Private LLM', internal: 'Internal', }; export interface ChatbotConfig { connector: string; systemPrompt: string; } export interface ChatbotConfigSectionProps { connectors: string[]; // Array of selected connector types (database connectors only) systemPrompt: string; enableWebResearch: boolean; // Enable Tavily web research allowedProviders: string[]; // Selected LLM providers (empty = all allowed) onConnectorsChange: (connectors: string[]) => void; onSystemPromptChange: (prompt: string) => void; onEnableWebResearchChange: (enabled: boolean) => void; onAllowedProvidersChange: (providers: string[]) => void; } export const ChatbotConfigSection: React.FC = ({ connectors, systemPrompt, enableWebResearch, allowedProviders, onConnectorsChange, onSystemPromptChange, onEnableWebResearchChange, onAllowedProvidersChange, }) => { const { t } = useLanguage(); const { allowedProviders: availableProviders, loadAllowedProviders, loading: providersLoading } = useBilling(); useEffect(() => { if (availableProviders.length === 0 && !providersLoading) { loadAllowedProviders(); } }, []); const availableConnectors = [ { id: 'preprocessor', label: t('Althaus Preprocessor'), value: 'preprocessor' } ]; const handleConnectorToggle = (connectorValue: string) => { if (connectors.includes(connectorValue)) { onConnectorsChange(connectors.filter(c => c !== connectorValue)); } else { onConnectorsChange([...connectors, connectorValue]); } }; const handleProviderToggle = (provider: string) => { if (allowedProviders.includes(provider)) { onAllowedProvidersChange(allowedProviders.filter(p => p !== provider)); } else { onAllowedProvidersChange([...allowedProviders, provider]); } }; return (
{availableConnectors.map(connector => { const isSelected = connectors.includes(connector.value); return ( ); })}
{connectors.length === 0 && (

{t('Ohne Connector werden keine SQL-Abfragen unterstützt.')}

)}

{t('Wenn aktiviert, führt der Chatbot zusätzlich Web-Recherchen mit Tavily durch, um aktuelle Informationen aus dem Internet zu finden.')}

{providersLoading ? ( {t('Anbieter laden')} ) : ( availableProviders.map(provider => ( )) )}
{allowedProviders.length === 0 && !providersLoading && (

{t('Keine Einschränkung – alle verfügbaren Anbieter werden verwendet.')}

)}

{t('Dieser Prompt wird für Analyse und Antwort-Generierung verwendet (erforderlich).')}{' '} {t('Platzhalter')}: {'{userPrompt}'}, {'{context}'}, {'{db_results_part}'}, {'{web_results_part}'}

); };