Feat/agent thinking switch (#15446)

### What problem does this PR solve?

This PR adds an Agent LLM setting to control thinking mode for official
providers that expose a thinking switch.

Related to #12842.  
Closes #15445.

Some providers expose thinking controls through provider-specific
request fields, but Agent LLM settings did not have a unified option for
users to enable or disable thinking mode.

This PR adds a `Thinking` selector with:

- System default
- Enabled
- Disabled
<img width="452" height="278" alt="8566b0b4-0546-4c8a-913d-f9bbd38319f6"
src="https://github.com/user-attachments/assets/25b497f7-1ba0-4bfe-940d-6fe79287d6ab"
/>
<img width="471" height="971" alt="8a0a6bee-f45f-48d5-bd83-17af260de3db"
src="https://github.com/user-attachments/assets/41ad43c1-5087-48f1-bf37-f2ca14c2be2f"
/>
Initial support is limited to the verified official providers:

- Qwen / DashScope: `enable_thinking`
- Kimi / Moonshot: `thinking.type`
- GLM / ZHIPU-AI: `thinking.type`

For LiteLLM-based providers, provider-specific fields are forwarded
through `extra_body` before `drop_params` filtering so the request
parameters are preserved.



### Type of change

- [x] New Feature (non-breaking change which adds functionality)

---------

Co-authored-by: jiashi <jiashi19@outlook.com>
Co-authored-by: Zhichang Yu <yuzhichang@gmail.com>
This commit is contained in:
jiashi19
2026-06-28 12:02:55 +08:00
committed by yzc
parent 6a4de82a80
commit 0d7ad0ed0c
9 changed files with 367 additions and 29 deletions

View File

@@ -38,6 +38,7 @@ interface LlmSettingFieldItemsProps {
| 'presence_penalty'
| 'frequency_penalty'
| 'max_tokens'
| 'thinking'
>;
showCollapse?: boolean;
}
@@ -61,6 +62,7 @@ export const LlmSettingFieldSchema = {
frequency_penalty: z.coerce.number().optional(),
max_tokens: z.number().optional(),
parameter: z.string().optional(),
thinking: z.enum(['default', 'enabled', 'disabled']).optional(),
};
export const LlmSettingSchema = {
@@ -80,6 +82,7 @@ export function LlmSettingFieldItems({
'presence_penalty',
'frequency_penalty',
'max_tokens',
'thinking',
],
llmId,
showCollapse = false,
@@ -249,6 +252,41 @@ export function LlmSettingFieldItems({
}}
></SliderInputSwitchFormField>
)}
{showFields.some((item) => item === 'thinking') && (
<FormField
control={form.control}
name={getFieldWithPrefix('thinking')}
render={({ field }) => (
<FormItem className="flex justify-between items-center">
<FormLabel className="flex-1" tooltip={t('thinkingTip')}>
{t('thinking')}
</FormLabel>
<FormControl>
<Select
value={field.value ?? 'default'}
onValueChange={field.onChange}
>
<SelectTrigger className="flex-1 !m-0">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="default">
{t('thinkingDefault')}
</SelectItem>
<SelectItem value="enabled">
{t('thinkingEnabled')}
</SelectItem>
<SelectItem value="disabled">
{t('thinkingDisabled')}
</SelectItem>
</SelectContent>
</Select>
</FormControl>
<FormMessage />
</FormItem>
)}
/>
)}
</section>
</CollapseComponent>
</div>