import { Card, CardItem } from '@/containers/Card' import HeaderPage from '@/containers/HeaderPage' import ProvidersMenu from '@/containers/ProvidersMenu' import { useModelProvider } from '@/hooks/useModelProvider' import { cn, getProviderTitle } from '@/lib/utils' import { Switch } from '@/components/ui/switch' import { createFileRoute, Link, useNavigate, useParams, useSearch, } from '@tanstack/react-router' import { t } from 'i18next' import Capabilities from '@/containers/Capabilities' import { DynamicControllerSetting } from '@/containers/dynamicControllerSetting' import { RenderMarkdown } from '@/containers/RenderMarkdown' import { DialogEditModel } from '@/containers/dialogs/EditModel' import { DialogAddModel } from '@/containers/dialogs/AddModel' import { ModelSetting } from '@/containers/ModelSetting' import { DialoDeleteModel } from '@/containers/dialogs/DeleteModel' import Joyride, { CallBackProps, STATUS } from 'react-joyride' import { CustomTooltipJoyRide } from '@/containers/CustomeTooltipJoyRide' import { route } from '@/constants/routes' // as route.threadsDetail export const Route = createFileRoute('/settings/providers/$providerName')({ component: ProviderDetail, validateSearch: (search: Record): { step?: string } => { // validate and parse the search params into a typed state return { step: String(search?.step), } }, }) const steps = [ { target: '.first-step-setup-remote-provider', title: 'Choose a Provider', disableBeacon: true, content: 'Pick the provider you want to use, make sure you have access to an API key for it.', }, { target: '.second-step-setup-remote-provider', title: 'Get Your API Key', disableBeacon: true, content: 'Log into the provider’s dashboard to find or generate your API key.', }, { target: '.third-step-setup-remote-provider', title: 'Insert Your API Key', disableBeacon: true, content: 'Paste your API key here to connect and activate the provider.', }, ] function ProviderDetail() { const { step } = useSearch({ from: Route.id }) const { providerName } = useParams({ from: Route.id }) const { getProviderByName, updateProvider } = useModelProvider() const provider = getProviderByName(providerName) const isSetup = step === 'setup_remote_provider' const navigate = useNavigate() const handleJoyrideCallback = (data: CallBackProps) => { const { status } = data if (status === STATUS.FINISHED) { navigate({ to: route.home, }) } } return ( <>

{t('common.settings')}

{getProviderTitle(providerName)}

{ if (provider) { updateProvider(providerName, { ...provider, active: e }) } }} />
{/* Settings */} {provider?.settings.map((setting, settingIndex) => { // Use the DynamicController component const actionComponent = (
{ if (provider) { const newSettings = [...provider.settings] // Handle different value types by forcing the type // Use type assertion to bypass type checking ;( newSettings[settingIndex].controller_props as { value: string | boolean | number } ).value = newValue // Create update object with updated settings const updateObj: Partial = { settings: newSettings, } // Check if this is an API key or base URL setting and update the corresponding top-level field const settingKey = setting.key if ( settingKey === 'api-key' && typeof newValue === 'string' ) { updateObj.api_key = newValue } else if ( settingKey === 'base-url' && typeof newValue === 'string' ) { updateObj.base_url = newValue } updateProvider(providerName, { ...provider, ...updateObj, }) } }} />
) return ( { return ( ) }, p: ({ ...props }) => (

), }} /> } actions={actionComponent} /> ) })} {/* Models */}

Models

{provider && }
} > {provider?.models.length ? ( provider?.models.map((model, modelIndex) => { const capabilities = model.capabilities || [] return (

{model.id}

} actions={
{model.settings && ( )}
} /> ) }) ) : (
No model found

Available models will be listed here. If you don’t have any models yet, visit the  Hub  to download.

)}
) }