diff --git a/src/lang/en.ts b/src/lang/en.ts index c48644b8..ae7c9ab6 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -1057,4 +1057,5 @@ export const languageEnglish = { paste: "Paste", depth: "Depth", returnCSSError: "Return CSS Error", + thinkingTokens: "Thinking Tokens", } diff --git a/src/lib/Setting/Pages/BotSettings.svelte b/src/lib/Setting/Pages/BotSettings.svelte index 8033679f..86527e00 100644 --- a/src/lib/Setting/Pages/BotSettings.svelte +++ b/src/lib/Setting/Pages/BotSettings.svelte @@ -288,9 +288,15 @@ {#if DBState.db.aiModel.startsWith('gpt') || DBState.db.aiModel === 'reverse_proxy' || DBState.db.aiModel === 'openrouter'} - {language.seed} + {language.seed} + + + {/if} + + {#if modelInfo.parameters.includes('thinking_tokens')} + {language.thinkingTokens} + - {/if} {language.temperature} @@ -315,7 +321,6 @@ {#if modelInfo.parameters.includes('reasoning_effort')} Reasoning Effort - {/if} {#if DBState.db.aiModel === 'textgen_webui' || DBState.db.aiModel === 'mancer' || DBState.db.aiModel.startsWith('local_') || DBState.db.aiModel.startsWith('hf:::')} Repetition Penalty @@ -485,6 +490,8 @@ Presence Penalty + {language.thinkingTokens} + {/each} diff --git a/src/ts/model/modellist.ts b/src/ts/model/modellist.ts index 284ab75a..5dd21248 100644 --- a/src/ts/model/modellist.ts +++ b/src/ts/model/modellist.ts @@ -22,7 +22,8 @@ export enum LLMFlags{ deepSeekPrefix, deepSeekThinkingInput, deepSeekThinkingOutput, - noCivilIntegrity + noCivilIntegrity, + claudeThinking, } export enum LLMProvider{ @@ -522,6 +523,23 @@ export const LLMModels: LLMModel[] = [ parameters: ClaudeParameters, tokenizer: LLMTokenizer.Claude }, + { + name: "Claude 3.7 Sonnet", + id: 'claude-3-7-sonnet-latest', + shortName: "3.7 Sonnet", + provider: LLMProvider.Anthropic, + format: LLMFormat.Anthropic, + flags: [ + LLMFlags.hasPrefill, + LLMFlags.hasImageInput, + LLMFlags.hasFirstSystemPrompt, + LLMFlags.hasStreaming, + LLMFlags.claudeThinking + ], + recommended: true, + parameters: [...ClaudeParameters, 'thinking_tokens'], + tokenizer: LLMTokenizer.Claude + }, { name: "Claude 3.5 Haiku", id: 'claude-3-5-haiku-latest', @@ -598,6 +616,22 @@ export const LLMModels: LLMModel[] = [ parameters: ClaudeParameters, tokenizer: LLMTokenizer.Claude }, + { + name: "Claude 3.7 Sonnet (20250219)", + id: 'claude-3-7-sonnet-20250219', + shortName: "3.7 Sonnet", + provider: LLMProvider.Anthropic, + format: LLMFormat.Anthropic, + flags: [ + LLMFlags.hasPrefill, + LLMFlags.hasImageInput, + LLMFlags.hasFirstSystemPrompt, + LLMFlags.hasStreaming, + LLMFlags.claudeThinking + ], + parameters: [...ClaudeParameters, 'thinking_tokens'], + tokenizer: LLMTokenizer.Claude + }, { name: 'Claude 3 Opus (20240229)', id: 'claude-3-opus-20240229', diff --git a/src/ts/process/request.ts b/src/ts/process/request.ts index c83241a2..10575bf2 100644 --- a/src/ts/process/request.ts +++ b/src/ts/process/request.ts @@ -92,12 +92,28 @@ interface OaiFunctions { } -export type Parameter = 'temperature'|'top_k'|'repetition_penalty'|'min_p'|'top_a'|'top_p'|'frequency_penalty'|'presence_penalty'|'reasoning_effort' +export type Parameter = 'temperature'|'top_k'|'repetition_penalty'|'min_p'|'top_a'|'top_p'|'frequency_penalty'|'presence_penalty'|'reasoning_effort'|'thinking_tokens' export type ModelModeExtended = 'model'|'submodel'|'memory'|'emotion'|'otherAx'|'translate' type ParameterMap = { [key in Parameter]?: string; }; +function setObjectValue(obj: T, key: string, value: any): T { + + const splitKey = key.split('.'); + if(splitKey.length > 1){ + const firstKey = splitKey.shift() + if(!obj[firstKey]){ + obj[firstKey] = {}; + } + obj[firstKey] = setObjectValue(obj[firstKey], splitKey.join('.'), value); + return obj; + } + + obj[key] = value; + return obj; +} + function applyParameters(data: { [key: string]: any }, parameters: Parameter[], rename: ParameterMap, ModelMode:ModelModeExtended, arg:{ ignoreTopKIfZero?:boolean } = {}): { [key: string]: any } { @@ -157,6 +173,10 @@ function applyParameters(data: { [key: string]: any }, parameters: Parameter[], value = db.seperateParameters[ModelMode].top_p break } + case 'thinking_tokens':{ + value = db.seperateParameters[ModelMode].thinking_tokens + break + } case 'frequency_penalty':{ value = db.seperateParameters[ModelMode].frequency_penalty === -1000 ? -1000 : (db.seperateParameters[ModelMode].frequency_penalty / 100) break @@ -175,7 +195,7 @@ function applyParameters(data: { [key: string]: any }, parameters: Parameter[], continue } - data[rename[parameter] ?? parameter] = value + data = setObjectValue(data, rename[parameter] ?? parameter, value) } return data } @@ -223,13 +243,17 @@ function applyParameters(data: { [key: string]: any }, parameters: Parameter[], value = db.PresensePenalty === -1000 ? -1000 : (db.PresensePenalty / 100) break } + case 'thinking_tokens':{ + value = db.thinkingTokens + break + } } if(value === -1000){ continue } - data[rename[parameter] ?? parameter] = value + data = setObjectValue(data, rename[parameter] ?? parameter, value) } return data } @@ -2530,14 +2554,23 @@ async function requestClaude(arg:RequestDataArgumentExtended):Promise 0){ + body.thinking.type = 'enabled' + } if(systemPrompt === ''){ delete body.system @@ -2634,8 +2667,18 @@ async function requestClaude(arg:RequestDataArgumentExtended):Promise 8192){ + betas.push('output-128k-2025-02-19') + } + + if(betas.length > 0){ + headers['anthropic-beta'] = betas.join(',') } if(db.usePlainFetch){ @@ -2659,7 +2702,7 @@ async function requestClaude(arg:RequestDataArgumentExtended):Promise({ async start(controller){ @@ -2672,10 +2715,39 @@ async function requestClaude(arg:RequestDataArgumentExtended):Promise