Skip to content

Commit 55a453d

Browse files
committed
Refactor chat settings model selection logic
1 parent 3e19571 commit 55a453d

File tree

8 files changed

+32
-61
lines changed

8 files changed

+32
-61
lines changed

src/components/Settings/Sections/ChatSettings.tsx

+3-8
Original file line numberDiff line numberDiff line change
@@ -126,18 +126,13 @@ const ChatSettings = () => {
126126
row={true}
127127
>
128128
<select
129-
value={chatSettings.model?.id || ''}
129+
value={chatSettings.model || ''}
130130
className="input cdx-w-44"
131-
onChange={(e) => {
132-
const selectedModel = models.find((m) => m.id === e.target.value)
133-
if (selectedModel) {
134-
setActiveChatModel(selectedModel)
135-
}
136-
}}
131+
onChange={(e) => setActiveChatModel(e.target.value)}
137132
>
138133
{models.map((model) => (
139134
<option key={model.id} value={model.id}>
140-
{model.name}
135+
{model.id}
141136
</option>
142137
))}
143138
</select>

src/components/Sidebar/auth/index.tsx

+4-12
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import React, { useEffect, useState } from 'react'
2+
import { useChatModels } from '../../../hooks/useChatModels'
23
import { useSettings } from '../../../hooks/useSettings'
34
import { validateApiKey } from '../../../lib/validApiKey'
4-
import { useChatModels } from '../../../hooks/useChatModels'
5-
import { ModelInfo } from '../../../config/settings'
65

76
const Auth = () => {
87
const [, setSettings] = useSettings()
@@ -13,9 +12,7 @@ const Auth = () => {
1312

1413
useEffect(() => {
1514
if (error) {
16-
setTimeout(() => {
17-
setError(null)
18-
}, 3000)
15+
setTimeout(() => setError(null), 3000)
1916
}
2017
}, [error])
2118

@@ -118,17 +115,12 @@ const Auth = () => {
118115
</label>
119116
<select
120117
id="model"
121-
onChange={(e) => {
122-
const selectedModel = models.find((m) => m.id === e.target.value)
123-
if (selectedModel) {
124-
setActiveChatModel(selectedModel)
125-
}
126-
}}
118+
onChange={(e) => setActiveChatModel(e.target.value)}
127119
className="cdx-text-center cdx-p-2 cdx-w-full cdx-rounded-md cdx-border dark:cdx-border-neutral-600 cdx-border-neutral-200 dark:cdx-bg-neutral-800/90 cdx-bg-neutral-200/90 focus:cdx-outline-none focus:cdx-ring-2 focus:cdx-ring-blue-900 focus:cdx-ring-opacity-50"
128120
>
129121
{models.map((model) => (
130122
<option key={model.id} value={model.id}>
131-
{model.name}
123+
{model.id}
132124
</option>
133125
))}
134126
</select>

src/components/Sidebar/chat/ChangeChatModel.tsx

+3-6
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,15 @@ const ChangeChatModel = () => {
77
<div className="cdx-flex cdx-items-center cdx-gap-1 cdx-text-neutral-500 dark:cdx-bg-neutral-900 cdx-bg-neutral-200 cdx-border cdx-rounded-md cdx-border-neutral-400/30 dark:cdx-border-neutral-500/30 cdx-py-1 cdx-px-3">
88
<BsRobot size={18} className="cdx-flex-shrink-0" />
99
<select
10-
value={activeChatModel?.id || ''}
10+
value={activeChatModel || ''}
1111
className="cdx-bg-transparent !m-0 !p-0 cdx-box-border cdx-w-min focus:cdx-outline-none focus:cdx-ring-1"
1212
onChange={(e) => {
13-
const selectedModel = models.find((m) => m.id === e.target.value)
14-
if (selectedModel) {
15-
setActiveChatModel(selectedModel)
16-
}
13+
setActiveChatModel(e.target.value)
1714
}}
1815
>
1916
{models.map((model) => (
2017
<option key={model.id} value={model.id}>
21-
{model.name}
18+
{model.id}
2219
</option>
2320
))}
2421
</select>

src/components/Sidebar/chat/index.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const Chat = ({ settings }: ChatProps) => {
5858
clearMessages={clearMessages}
5959
cancelRequest={cancelRequest}
6060
isWebpageContextOn={settings.general.webpageContext}
61-
isVisionModel={settings.chat.model?.capabilities.vision || false}
61+
isVisionModel={settings.chat.model?.includes('vision') || false}
6262
/>
6363
</>
6464
)

src/components/Sidebar/index.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ function Sidebar() {
1010
return (
1111
<div className="cdx-flex cdx-backdrop-blur-sm cdx-flex-col cdx-min-h-screen cdx-shadow-md cdx-border-l dark:!cdx-text-white dark:cdx-border-neutral-800 cdx-border-neutral-200 cdx-top-0 cdx-right-0 cdx-w-[400px] cdx-h-full dark:cdx-bg-neutral-800/90 cdx-bg-neutral-100/90">
1212
<Header />
13-
{settings.chat.openAIKey ? <Chat settings={settings} /> : <Auth />}
13+
{settings.chat.openAIKey && settings.chat.model ? (
14+
<Chat settings={settings} />
15+
) : (
16+
<Auth />
17+
)}
1418
</div>
1519
)
1620
}

src/config/settings/index.ts

+1-18
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,6 @@ export enum Mode {
1313
CREATIVE = 1.5,
1414
}
1515

16-
export type ModelCapabilities = {
17-
completion_chat: boolean
18-
function_calling: boolean
19-
vision: boolean
20-
fine_tuning: boolean
21-
completion_fim: boolean
22-
}
23-
24-
export type ModelInfo = {
25-
id: string
26-
name: string
27-
description: string
28-
capabilities: ModelCapabilities
29-
max_context_length: number
30-
owned_by: string
31-
}
32-
3316
export type Settings = {
3417
quickMenu: {
3518
enabled: boolean
@@ -38,7 +21,7 @@ export type Settings = {
3821
}
3922
chat: {
4023
openAIKey: string | null
41-
model: ModelInfo | null
24+
model: string | null
4225
mode: Mode
4326
openAiBaseUrl: string | null
4427
}

src/hooks/useChatCompletion.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ import {
66
SystemMessage,
77
} from '@langchain/core/messages'
88
import { useMemo, useState } from 'react'
9-
import type { Mode, ModelInfo } from '../config/settings'
9+
import type { Mode } from '../config/settings'
1010
import { getMatchedContent } from '../lib/getMatchedContent'
1111
import { ChatRole, useCurrentChat } from './useCurrentChat'
1212
import type { MessageDraft } from './useMessageDraft'
1313

1414
interface UseChatCompletionProps {
15-
model: ModelInfo
15+
model: string
1616
apiKey: string
1717
mode: Mode
1818
systemPrompt: string
@@ -43,12 +43,11 @@ export const useChatCompletion = ({
4343
return new ChatOpenAI({
4444
streaming: true,
4545
openAIApiKey: apiKey,
46-
modelName: model.id,
46+
modelName: model,
4747
configuration: {
4848
baseURL: baseURL,
4949
},
5050
temperature: Number(mode),
51-
maxTokens: model.max_context_length,
5251
})
5352
}, [apiKey, model, mode, baseURL])
5453

@@ -99,7 +98,7 @@ export const useChatCompletion = ({
9998
...previousMessages,
10099
new HumanMessage({
101100
content:
102-
message.files.length > 0 && model.capabilities.vision
101+
message.files.length > 0
103102
? [
104103
{ type: 'text', text: expandedQuery },
105104
...(message.files.length > 0

src/hooks/useChatModels.ts

+11-10
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
import { useCallback, useEffect, useState } from 'react'
22
import { useSettings } from './useSettings'
33
import axios from 'axios'
4-
import type { ModelInfo } from '../config/settings'
4+
5+
type OpenAIModel = {
6+
id: string
7+
object: string
8+
created: number
9+
owned_by: string
10+
}
511

612
export const useChatModels = () => {
713
const [settings, setSettings] = useSettings()
8-
const [models, setModels] = useState<ModelInfo[]>([])
14+
const [models, setModels] = useState<OpenAIModel[]>([])
915
const chatSettings = settings.chat
1016
const activeChatModel = chatSettings.model
1117

@@ -20,12 +26,7 @@ export const useChatModels = () => {
2026
},
2127
})
2228

23-
// Filter for chat-capable models
24-
const chatModels = data.data.filter(
25-
(model: ModelInfo) => model.capabilities?.completion_chat === true,
26-
)
27-
28-
setModels(chatModels)
29+
setModels(data.data)
2930
} catch (error) {
3031
console.log('Failed to fetch models:', error)
3132
setModels([])
@@ -37,12 +38,12 @@ export const useChatModels = () => {
3738
fetchAvailableModels()
3839
}, [fetchAvailableModels])
3940

40-
const setActiveChatModel = (model: ModelInfo) => {
41+
const setActiveChatModel = (modelId: string) => {
4142
setSettings({
4243
...settings,
4344
chat: {
4445
...chatSettings,
45-
model,
46+
model: modelId,
4647
},
4748
})
4849
}

0 commit comments

Comments
 (0)