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 && (
}
onClick={onDeleteProvider}
sx={{ fontSize: '0.75rem', minWidth: 'auto' }}
data-testid='delete-provider-button'
>
{t('Preference.DeleteProvider')}
)}
{!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}`}
/>
))}
}
onClick={onOpenAddModelDialog}
fullWidth
data-testid='add-new-model-button'
>
{t('Preference.AddNewModel')}
>
);
}