@@ -19,13 +19,25 @@ const showModal = ref(false)
1919const editingName = ref <string | null >(null )
2020const showApiKey = ref (false )
2121const form = ref <ModelConfig >({
22- name: ' ' , provider: ModelProvider .OpenAI , baseURL: ' ' , apiKey: ' ' , model: ' ' , apiVersion: undefined , temperature: undefined , maxTokens: undefined , contextWindow: undefined ,
22+ name: ' ' , provider: ModelProvider .OpenAI , baseURL: ' ' , apiKey: ' ' , model: ' ' , apiVersion: undefined , temperature: undefined , maxTokens: undefined , contextWindow: undefined , thinking: undefined ,
2323})
2424
2525const isOllama = computed (() => form .value .provider === ModelProvider .Ollama )
2626const isAnthropic = computed (() => form .value .provider === ModelProvider .Anthropic )
2727const isGemini = computed (() => form .value .provider === ModelProvider .Gemini || form .value .provider === ModelProvider .GeminiImage )
2828
29+ const thinkingType = computed ({
30+ get : () => form .value .thinking ?.type ?? ' ' ,
31+ set : (v : string ) => {
32+ if (! v ) { form .value .thinking = undefined ; return }
33+ form .value .thinking = { type: v as any , ... (v === ' enabled' ? { budgetTokens: form .value .thinking ?.budgetTokens ?? 8192 } : {}) }
34+ },
35+ })
36+ const thinkingBudget = computed ({
37+ get : () => form .value .thinking ?.budgetTokens ,
38+ set : (v : number | undefined ) => { if (form .value .thinking ) form .value .thinking .budgetTokens = v },
39+ })
40+
2941
3042// Model picker
3143const showPicker = ref (false )
@@ -97,6 +109,8 @@ async function save() {
97109 if (body .maxTokens === undefined || body .maxTokens === null ) delete body .maxTokens
98110 if (body .contextWindow === undefined || body .contextWindow === null ) delete body .contextWindow
99111 if (! body .apiVersion ) delete body .apiVersion
112+ if (! body .thinking ) delete body .thinking
113+ else if (body .thinking .type !== ' enabled' ) delete body .thinking .budgetTokens
100114 const id = editingName .value
101115 const res = id
102116 ? await apiFetch (` /api/settings/models/${encodeURIComponent (id )} ` , ' PUT' , body )
@@ -257,6 +271,19 @@ async function refresh() {
257271 <label >{{ t('models.max_tokens') }}</label >
258272 <input v-model.number =" form.maxTokens" type =" number" step =" 1" :placeholder =" t('models.no_limit')" />
259273 </div >
274+ <div v-if =" isAnthropic" class =" form-group" >
275+ <label >{{ t('models.thinking') }}</label >
276+ <select v-model =" thinkingType" >
277+ <option value =" " >{{ t('models.thinking_none') }}</option >
278+ <option value =" adaptive" >adaptive</option >
279+ <option value =" enabled" >enabled</option >
280+ <option value =" disabled" >disabled</option >
281+ </select >
282+ </div >
283+ <div v-if =" isAnthropic && thinkingType === 'enabled'" class =" form-group" >
284+ <label >{{ t('models.thinking_budget') }}</label >
285+ <input v-model.number =" thinkingBudget" type =" number" step =" 1024" placeholder =" 8192" />
286+ </div >
260287 </div >
261288 <div class =" modal-footer" >
262289 <button class =" btn-outline" @click =" showModal = false" >{{ t('common.cancel') }}</button >
0 commit comments