diff --git a/src/renderer/src/components/Avatar/ModelAvatar.tsx b/src/renderer/src/components/Avatar/ModelAvatar.tsx index d1a6f98be9..22fafcd98f 100644 --- a/src/renderer/src/components/Avatar/ModelAvatar.tsx +++ b/src/renderer/src/components/Avatar/ModelAvatar.tsx @@ -5,7 +5,7 @@ import { first } from 'lodash' import { FC } from 'react' interface Props { - model: Model + model?: Model size: number props?: AvatarProps className?: string diff --git a/src/renderer/src/components/Selector.tsx b/src/renderer/src/components/Selector.tsx index d18c76dbff..bffe2b2eaf 100644 --- a/src/renderer/src/components/Selector.tsx +++ b/src/renderer/src/components/Selector.tsx @@ -34,7 +34,7 @@ interface MultipleSelectorProps extends BaseSelectorProps { onChange: (value: V[]) => void } -type SelectorProps = SingleSelectorProps | MultipleSelectorProps +export type SelectorProps = SingleSelectorProps | MultipleSelectorProps const Selector = ({ options, diff --git a/src/renderer/src/hooks/agents/useModels.ts b/src/renderer/src/hooks/agents/useModels.ts index 1834ed819d..442f42d4c4 100644 --- a/src/renderer/src/hooks/agents/useModels.ts +++ b/src/renderer/src/hooks/agents/useModels.ts @@ -12,7 +12,7 @@ export const useModels = (filter?: ApiModelsFilter) => { }, [client, filter]) const { data, error, isLoading } = useSWR(path, fetcher) return { - models: data?.data, + models: data?.data ?? [], error, isLoading } diff --git a/src/renderer/src/pages/settings/AgentSettings/AgentEssentialSettings.tsx b/src/renderer/src/pages/settings/AgentSettings/AgentEssentialSettings.tsx index ba18763d7c..e22dfa7931 100644 --- a/src/renderer/src/pages/settings/AgentSettings/AgentEssentialSettings.tsx +++ b/src/renderer/src/pages/settings/AgentSettings/AgentEssentialSettings.tsx @@ -1,11 +1,12 @@ -import { HStack } from '@renderer/components/Layout' +import { useModels } from '@renderer/hooks/agents/useModels' import { useUpdateAgent } from '@renderer/hooks/agents/useUpdateAgent' import { AgentEntity, UpdateAgentForm } from '@renderer/types' -import { Input } from 'antd' -import { FC, useState } from 'react' +import { Input, Select } from 'antd' +import { DefaultOptionType } from 'antd/es/select' +import { FC, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' -import { AgentLabel, SettingsContainer, SettingsItem, SettingsTitle } from './shared' +import { AgentLabel, ModelLabel, SettingsContainer, SettingsItem, SettingsTitle } from './shared' interface AgentEssentialSettingsProps { agent: AgentEntity | undefined | null @@ -15,6 +16,7 @@ interface AgentEssentialSettingsProps { const AgentEssentialSettings: FC = ({ agent, update }) => { const { t } = useTranslation() const [name, setName] = useState((agent?.name ?? '').trim()) + const { models } = useModels({ providerType: 'anthropic' }) const onUpdate = () => { if (!agent) return @@ -22,6 +24,13 @@ const AgentEssentialSettings: FC = ({ agent, update update(_agent) } + const modelOptions = useMemo(() => { + return models.map((model) => ({ + value: model.id, + label: + })) satisfies DefaultOptionType[] + }, [models]) + if (!agent) return null return ( @@ -30,21 +39,27 @@ const AgentEssentialSettings: FC = ({ agent, update {t('agent.type.label')} - + {t('common.name')} - - setName(e.target.value)} - onBlur={() => { - if (name !== agent.name) { - onUpdate() - } - }} - style={{ flex: 1 }} - /> - + setName(e.target.value)} + onBlur={() => { + if (name !== agent.name) { + onUpdate() + } + }} + className="max-w-80 flex-1" + /> + + + {t('common.model')} +