Add reasoning effort

This commit is contained in:
Kwaroran
2025-02-01 09:05:07 +09:00
parent e6f98cd6f8
commit 25aa83877b
4 changed files with 46 additions and 10 deletions

View File

@@ -311,6 +311,11 @@
<span class="text-textcolor">Repetition penalty</span> <span class="text-textcolor">Repetition penalty</span>
<SliderInput min={0} max={2} marginBottom step={0.01} fixed={2} bind:value={DBState.db.repetition_penalty} disableable/> <SliderInput min={0} max={2} marginBottom step={0.01} fixed={2} bind:value={DBState.db.repetition_penalty} disableable/>
{/if}
{#if modelInfo.parameters.includes('reasoning_effort')}
<span class="text-textcolor">Reasoning Effort</span>
<SliderInput min={0} max={2} marginBottom step={1} fixed={0} bind:value={DBState.db.reasoningEffort} disableable/>
{/if} {/if}
{#if DBState.db.aiModel === 'textgen_webui' || DBState.db.aiModel === 'mancer' || DBState.db.aiModel.startsWith('local_') || DBState.db.aiModel.startsWith('hf:::')} {#if DBState.db.aiModel === 'textgen_webui' || DBState.db.aiModel === 'mancer' || DBState.db.aiModel.startsWith('local_') || DBState.db.aiModel.startsWith('hf:::')}
<span class="text-textcolor">Repetition Penalty</span> <span class="text-textcolor">Repetition Penalty</span>
@@ -631,6 +636,10 @@
{@render CustomFlagButton('DeveloperRole', 14)} {@render CustomFlagButton('DeveloperRole', 14)}
{@render CustomFlagButton('geminiThinking', 15)} {@render CustomFlagButton('geminiThinking', 15)}
{@render CustomFlagButton('geminiBlockOff', 16)} {@render CustomFlagButton('geminiBlockOff', 16)}
{@render CustomFlagButton('deepSeekPrefix', 17)}
{@render CustomFlagButton('deepSeekThinkingInput', 18)}
{@render CustomFlagButton('deepSeekThinkingOutput', 19)}
{/if} {/if}
</Arcodion> </Arcodion>

View File

@@ -501,7 +501,7 @@ export const LLMModels: LLMModel[] = [
LLMFlags.hasImageInput, LLMFlags.hasImageInput,
LLMFlags.DeveloperRole LLMFlags.DeveloperRole
], ],
parameters: OpenAIParameters, parameters: ['reasoning_effort'],
tokenizer: LLMTokenizer.tiktokenO200Base tokenizer: LLMTokenizer.tiktokenO200Base
}, },

View File

@@ -91,7 +91,7 @@ interface OaiFunctions {
} }
export type Parameter = 'temperature'|'top_k'|'repetition_penalty'|'min_p'|'top_a'|'top_p'|'frequency_penalty'|'presence_penalty' export type Parameter = 'temperature'|'top_k'|'repetition_penalty'|'min_p'|'top_a'|'top_p'|'frequency_penalty'|'presence_penalty'|'reasoning_effort'
export type ModelModeExtended = 'model'|'submodel'|'memory'|'emotion'|'otherAx'|'translate' export type ModelModeExtended = 'model'|'submodel'|'memory'|'emotion'|'otherAx'|'translate'
type ParameterMap = { type ParameterMap = {
[key in Parameter]?: string; [key in Parameter]?: string;
@@ -101,6 +101,24 @@ function applyParameters(data: { [key: string]: any }, parameters: Parameter[],
ignoreTopKIfZero?:boolean ignoreTopKIfZero?:boolean
} = {}): { [key: string]: any } { } = {}): { [key: string]: any } {
const db = getDatabase() const db = getDatabase()
function getEffort(effort:number){
switch(effort){
case 0:{
return 'low'
}
case 1:{
return 'medium'
}
case 2:{
return 'high'
}
default:{
return 'medium'
}
}
}
if(db.seperateParametersEnabled && ModelMode !== 'model'){ if(db.seperateParametersEnabled && ModelMode !== 'model'){
if(ModelMode === 'submodel'){ if(ModelMode === 'submodel'){
ModelMode = 'otherAx' ModelMode = 'otherAx'
@@ -108,7 +126,7 @@ function applyParameters(data: { [key: string]: any }, parameters: Parameter[],
for(const parameter of parameters){ for(const parameter of parameters){
let value = 0 let value:number|string = 0
if(parameter === 'top_k' && arg.ignoreTopKIfZero && db.seperateParameters[ModelMode][parameter] === 0){ if(parameter === 'top_k' && arg.ignoreTopKIfZero && db.seperateParameters[ModelMode][parameter] === 0){
continue continue
} }
@@ -146,6 +164,10 @@ function applyParameters(data: { [key: string]: any }, parameters: Parameter[],
value = db.seperateParameters[ModelMode].presence_penalty === -1000 ? -1000 : (db.seperateParameters[ModelMode].presence_penalty / 100) value = db.seperateParameters[ModelMode].presence_penalty === -1000 ? -1000 : (db.seperateParameters[ModelMode].presence_penalty / 100)
break break
} }
case 'reasoning_effort':{
value = getEffort(db.seperateParameters[ModelMode].reasoning_effort)
break
}
} }
if(value === -1000 || value === undefined){ if(value === -1000 || value === undefined){
@@ -159,7 +181,7 @@ function applyParameters(data: { [key: string]: any }, parameters: Parameter[],
for(const parameter of parameters){ for(const parameter of parameters){
let value = 0 let value:number|string = 0
if(parameter === 'top_k' && arg.ignoreTopKIfZero && db.top_k === 0){ if(parameter === 'top_k' && arg.ignoreTopKIfZero && db.top_k === 0){
continue continue
} }
@@ -188,6 +210,10 @@ function applyParameters(data: { [key: string]: any }, parameters: Parameter[],
value = db.top_p value = db.top_p
break break
} }
case 'reasoning_effort':{
value = getEffort(db.reasoningEffort)
break
}
case 'frequency_penalty':{ case 'frequency_penalty':{
value = db.frequencyPenalty === -1000 ? -1000 : (db.frequencyPenalty / 100) value = db.frequencyPenalty === -1000 ? -1000 : (db.frequencyPenalty / 100)
break break
@@ -769,7 +795,7 @@ async function requestOpenAI(arg:RequestDataArgumentExtended):Promise<requestDat
body = applyParameters( body = applyParameters(
body, body,
aiModel === 'openrouter' ? ['temperature', 'top_p', 'frequency_penalty', 'presence_penalty', 'repetition_penalty', 'min_p', 'top_a', 'top_k'] : ['temperature', 'top_p', 'frequency_penalty', 'presence_penalty'], arg.modelInfo.parameters,
{}, {},
arg.mode arg.mode
) )

View File

@@ -471,6 +471,7 @@ export function setDatabase(data:Database){
data.showPromptComparison ??= false data.showPromptComparison ??= false
data.checkCorruption ??= true data.checkCorruption ??= true
data.OaiCompAPIKeys ??= {} data.OaiCompAPIKeys ??= {}
data.reasoningEffort ??= 0
data.hypaV3Settings = { data.hypaV3Settings = {
memoryTokensRatio: data.hypaV3Settings?.memoryTokensRatio ?? 0.2, memoryTokensRatio: data.hypaV3Settings?.memoryTokensRatio ?? 0.2,
extraSummarizationRatio: data.hypaV3Settings?.extraSummarizationRatio ?? 0.2, extraSummarizationRatio: data.hypaV3Settings?.extraSummarizationRatio ?? 0.2,
@@ -896,6 +897,7 @@ export interface Database{
}, },
OaiCompAPIKeys: {[key:string]:string} OaiCompAPIKeys: {[key:string]:string}
inlayErrorResponse:boolean inlayErrorResponse:boolean
reasoningEffort:number
} }
interface SeparateParameters{ interface SeparateParameters{
@@ -907,6 +909,7 @@ interface SeparateParameters{
top_p?:number top_p?:number
frequency_penalty?:number frequency_penalty?:number
presence_penalty?:number presence_penalty?:number
reasoning_effort?:number
} }
export interface customscript{ export interface customscript{
@@ -1219,6 +1222,7 @@ export interface botPreset{
customFlags?: LLMFlags[] customFlags?: LLMFlags[]
image?:string image?:string
regex?:customscript[] regex?:customscript[]
reasonEffort?:number
} }
@@ -1524,6 +1528,7 @@ export function saveCurrentPreset(){
enableCustomFlags: db.enableCustomFlags, enableCustomFlags: db.enableCustomFlags,
regex: db.presetRegex, regex: db.presetRegex,
image: pres?.[db.botPresetsId]?.image ?? '', image: pres?.[db.botPresetsId]?.image ?? '',
reasonEffort: db.reasoningEffort ?? 0,
} }
db.botPresets = pres db.botPresets = pres
setDatabase(db) setDatabase(db)
@@ -1633,6 +1638,7 @@ export function setPreset(db:Database, newPres: botPreset){
db.customFlags = safeStructuredClone(newPres.customFlags) ?? [] db.customFlags = safeStructuredClone(newPres.customFlags) ?? []
db.enableCustomFlags = newPres.enableCustomFlags ?? false db.enableCustomFlags = newPres.enableCustomFlags ?? false
db.presetRegex = newPres.regex ?? [] db.presetRegex = newPres.regex ?? []
db.reasoningEffort = newPres.reasonEffort ?? 0
return db return db
} }
@@ -1660,11 +1666,6 @@ export async function downloadPreset(id:number, type:'json'|'risupreset'|'return
pres.textgenWebUIStreamURL= '' pres.textgenWebUIStreamURL= ''
pres.textgenWebUIBlockingURL= '' pres.textgenWebUIBlockingURL= ''
if((pres.image || pres.regex?.length > 0) && type !== 'return'){
alertError("Preset with image or regexes cannot be exported for now. use RisuRealm to share the preset.")
return
}
if(type === 'json'){ if(type === 'json'){
downloadFile(pres.name + "_preset.json", Buffer.from(JSON.stringify(pres, null, 2))) downloadFile(pres.name + "_preset.json", Buffer.from(JSON.stringify(pres, null, 2)))
} }