diff --git a/src/renderer/components/Header.tsx b/src/renderer/components/Header.tsx index c2463458..78451c06 100644 --- a/src/renderer/components/Header.tsx +++ b/src/renderer/components/Header.tsx @@ -5,12 +5,14 @@ import { useAtomValue, useSetAtom } from 'jotai' import * as sessionActions from '../stores/sessionActions' import Toolbar from './Toolbar' import { cn } from '@/lib/utils' +import { getModelDisplayName } from '../packages/models' interface Props { } export default function Header(props: Props) { const theme = useTheme() const currentSession = useAtomValue(atoms.currentSessionAtom) + const settings = useAtomValue(atoms.settingsAtom) const setChatConfigDialogSession = useSetAtom(atoms.chatConfigDialogAtom) useEffect(() => { @@ -52,11 +54,17 @@ export default function Header(props: Props) { editCurrentSession() }} > - { - - {currentSession.name} - - } + + {currentSession.name} + + + {getModelDisplayName({...settings, aiProvider: currentSession.aiProvider || settings.aiProvider}, currentSession.type || 'chat')} + diff --git a/src/renderer/pages/ChatConfigWindow.tsx b/src/renderer/pages/ChatConfigWindow.tsx index 32aca110..46c503ce 100644 --- a/src/renderer/pages/ChatConfigWindow.tsx +++ b/src/renderer/pages/ChatConfigWindow.tsx @@ -7,16 +7,19 @@ import { DialogTitle, DialogContentText, TextField, + Box, } from '@mui/material' import { Session, createMessage, + ModelSettings, } from '../../shared/types' import { useTranslation } from 'react-i18next' import * as sessionActions from '../stores/sessionActions' import * as atoms from '../stores/atoms' import { useAtom } from 'jotai' import { trackingEvent } from '@/packages/event' +import AIProviderSelect from '../components/AIProviderSelect' interface Props { } @@ -24,6 +27,7 @@ interface Props { export default function ChatConfigWindow(props: Props) { const { t } = useTranslation() const [chatConfigDialogSession, setChatConfigDialogSession] = useAtom(atoms.chatConfigDialogAtom) + const [settings] = useAtom(atoms.settingsAtom) const [editingData, setEditingData] = React.useState(chatConfigDialogSession) useEffect(() => { @@ -78,9 +82,23 @@ export default function ChatConfigWindow(props: Props) { setChatConfigDialogSession(null) } + // Create a merged settings object that uses the session provider if set + const effectiveSettings = React.useMemo(() => ({ + ...settings, + aiProvider: editingData?.aiProvider || settings.aiProvider, + }), [settings, editingData?.aiProvider]) + if (!chatConfigDialogSession || !editingData) { return null } + + const handleProviderChange = (newSettings: ModelSettings) => { + setEditingData({ + ...editingData, + aiProvider: newSettings.aiProvider, + }) + } + return ( {t('Conversation Settings')} @@ -95,7 +113,13 @@ export default function ChatConfigWindow(props: Props) { value={editingData.name} onChange={(e) => setEditingData({ ...editingData, name: e.target.value })} /> -
+ + + +
m.id === targetMsg.id) try { - const model = getModel(settings, configs) + const model = getModel(effectiveSettings, configs) switch (session.type) { case 'chat': case undefined: @@ -237,7 +243,7 @@ export async function generate(sessionId: string, targetMsg: Message) { errorCode, error: `${err.message}`, errorExtra: { - aiProvider: settings.aiProvider, + aiProvider: effectiveAIProvider, host: err['host'], }, } @@ -254,7 +260,9 @@ async function _generateName(sessionId: string, modifyName: (sessionId: string, } const configs = await platform.getConfig() try { - const model = getModel(settings, configs) + const effectiveAIProvider: ModelProvider = session.aiProvider || settings.aiProvider + const effectiveSettings = { ...settings, aiProvider: effectiveAIProvider } + const model = getModel(effectiveSettings, configs) let name = await model.chat(promptFormat.nameConversation( session.messages .filter(m => m.role !== 'system') diff --git a/src/shared/types.ts b/src/shared/types.ts index fe07c9f6..59367f46 100644 --- a/src/shared/types.ts +++ b/src/shared/types.ts @@ -49,6 +49,7 @@ export interface Session { type?: SessionType name: string picUrl?: string + aiProvider?: ModelProvider messages: Message[] copilotId?: string } @@ -69,6 +70,7 @@ export enum ModelProvider { Ollama = 'ollama', SiliconFlow = 'silicon-flow', LMStudio = 'lm-studio', + PPIO = 'ppio', } export interface ModelSettings { @@ -115,6 +117,11 @@ export interface ModelSettings { siliconCloudKey: string siliconCloudModel: siliconflow.Model | 'custom-model' + // ppio + ppioHost: string + ppioKey: string + ppioModel: string + temperature: number topP: number openaiMaxContextMessageCount: number