import AddIcon from '@mui/icons-material/Add'; import DeleteIcon from '@mui/icons-material/Delete'; import { Box, Button, Chip, FormControlLabel, Switch, Typography } from '@mui/material'; import { AIProviderConfig, ModelFeature, ModelInfo } from '@services/externalAPI/interface'; import React from 'react'; import { useTranslation } from 'react-i18next'; import { TextField } from '../../../PreferenceComponents'; interface ProviderPanelProps { provider: AIProviderConfig; formState: { apiKey: string; baseURL: string; models: ModelInfo[]; newModel?: { name: string; caption: string; features: ModelFeature[]; }; }; onFormChange: (field: string, value: string) => void; onEnabledChange: (enabled: boolean) => void; onRemoveModel: (modelName: string) => void; onEditModel?: (modelName: string) => void; onOpenAddModelDialog: () => void; onDeleteProvider?: () => void; } export function ProviderPanel({ provider, formState, onFormChange, onEnabledChange, onRemoveModel, onEditModel, onOpenAddModelDialog, onDeleteProvider, }: ProviderPanelProps) { const { t } = useTranslation('agent'); const isEnabled = provider.enabled !== false; const shouldShowBaseURL = provider.showBaseURLField || provider.providerClass === 'openAICompatible'; return ( <> {t('Preference.ConfigureProvider', { provider: provider.provider })} {provider.isPreset && ( ({t('Preference.PresetProvider')}) )} { onEnabledChange(event.target.checked); }} name='providerEnabled' color='primary' /> } label={t('Preference.EnableProvider')} /> {/* Delete Provider Button - show when delete handler provided (allow deleting presets) */} {onDeleteProvider && ( )} {!isEnabled && ( {t('Preference.DisabledProviderInfo')} )} { onFormChange('apiKey', event.target.value); }} fullWidth margin='normal' disabled={provider.providerClass === 'ollama'} // Ollama doesn't require API key slotProps={{ htmlInput: { 'data-testid': 'provider-api-key-input' } }} /> {/* Show baseURL field (if needed) */} {shouldShowBaseURL && ( { onFormChange('baseURL', event.target.value); }} fullWidth margin='normal' placeholder={provider.providerClass === 'ollama' ? 'http://localhost:11434' : 'https://api.example.com/v1'} slotProps={{ htmlInput: { 'data-testid': 'provider-base-url-input' } }} /> )} {/* Models section */} {t('Preference.Models')} {formState.models.map((model) => ( { onEditModel?.(model.name); }} onDelete={() => { onRemoveModel(model.name); }} sx={{ mb: 1, cursor: 'pointer' }} data-testid={`model-chip-${model.name}`} /> ))} ); }