Skip to content

Commit 8e3ab4a

Browse files
author
linyuan.yang
committed
claude 支持配置 think
1 parent 4c4d493 commit 8e3ab4a

3 files changed

Lines changed: 34 additions & 1 deletion

File tree

packages/admin/src/i18n/en.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,9 @@ export default {
210210
pick_empty: 'No models available',
211211
api_version: 'API Version',
212212
context_window: 'Context Window',
213+
thinking: 'Thinking',
214+
thinking_none: 'Default (off)',
215+
thinking_budget: 'Budget Tokens',
213216
},
214217
embeddings: {
215218
add: '+ Add Embedding',

packages/admin/src/i18n/zh.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,9 @@ export default {
210210
pick_empty: '未找到可用模型',
211211
api_version: 'API 版本',
212212
context_window: '上下文窗口',
213+
thinking: '思考模式',
214+
thinking_none: '默认(关闭)',
215+
thinking_budget: '思考 Token 预算',
213216
},
214217
embeddings: {
215218
add: '+ 添加向量模型',

packages/admin/src/views/ModelsView.vue

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,25 @@ const showModal = ref(false)
1919
const editingName = ref<string | null>(null)
2020
const showApiKey = ref(false)
2121
const 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
2525
const isOllama = computed(() => form.value.provider === ModelProvider.Ollama)
2626
const isAnthropic = computed(() => form.value.provider === ModelProvider.Anthropic)
2727
const 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
3143
const 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

Comments
 (0)