feat: add option to strip thinking from output (#100)

Signed-off-by: mudler <mudler@localai.io>
This commit is contained in:
Ettore Di Giacinto
2025-04-30 11:05:39 +02:00
committed by GitHub
parent bd1b06f326
commit 1109b0a533
4 changed files with 44 additions and 3 deletions

View File

@@ -5,6 +5,8 @@ import (
"errors" "errors"
"fmt" "fmt"
"os" "os"
"regexp"
"strings"
"sync" "sync"
"time" "time"
@@ -182,7 +184,7 @@ func (a *Agent) Execute(j *types.Job) *types.JobResult {
if j.Obs != nil { if j.Obs != nil {
if len(j.ConversationHistory) > 0 { if len(j.ConversationHistory) > 0 {
m := j.ConversationHistory[len(j.ConversationHistory)-1] m := j.ConversationHistory[len(j.ConversationHistory)-1]
j.Obs.Creation = &types.Creation{ ChatCompletionMessage: &m } j.Obs.Creation = &types.Creation{ChatCompletionMessage: &m}
a.observer.Update(*j.Obs) a.observer.Update(*j.Obs)
} }
@@ -788,6 +790,24 @@ func (a *Agent) consumeJob(job *types.Job, role string) {
a.reply(job, role, conv, actionParams, chosenAction, reasoning) a.reply(job, role, conv, actionParams, chosenAction, reasoning)
} }
func stripThinkingTags(content string) string {
// Remove content between <thinking> and </thinking>
content = regexp.MustCompile(`<thinking>.*?</thinking>`).ReplaceAllString(content, "")
// Remove content between <think> and </think>
content = regexp.MustCompile(`<think>.*?</think>`).ReplaceAllString(content, "")
// Clean up any extra whitespace
content = strings.TrimSpace(content)
return content
}
func (a *Agent) processPrompt(content string) string {
if a.options.stripThinkingTags {
content = stripThinkingTags(content)
}
// Future post-processing options can be added here
return content
}
func (a *Agent) reply(job *types.Job, role string, conv Messages, actionParams types.ActionParams, chosenAction types.Action, reasoning string) { func (a *Agent) reply(job *types.Job, role string, conv Messages, actionParams types.ActionParams, chosenAction types.Action, reasoning string) {
job.Result.Conversation = conv job.Result.Conversation = conv
@@ -854,7 +874,7 @@ func (a *Agent) reply(job *types.Job, role string, conv Messages, actionParams t
msg := openai.ChatCompletionMessage{ msg := openai.ChatCompletionMessage{
Role: "assistant", Role: "assistant",
Content: replyResponse.Message, Content: a.processPrompt(replyResponse.Message),
} }
conv = append(conv, msg) conv = append(conv, msg)
@@ -883,8 +903,10 @@ func (a *Agent) reply(job *types.Job, role string, conv Messages, actionParams t
msg = openai.ChatCompletionMessage{ msg = openai.ChatCompletionMessage{
Role: "assistant", Role: "assistant",
Content: replyResponse.Message, Content: a.processPrompt(replyResponse.Message),
} }
} else {
msg.Content = a.processPrompt(msg.Content)
} }
conv = append(conv, msg) conv = append(conv, msg)

View File

@@ -25,6 +25,7 @@ type options struct {
randomIdentity bool randomIdentity bool
userActions types.Actions userActions types.Actions
enableHUD, standaloneJob, showCharacter, enableKB, enableSummaryMemory, enableLongTermMemory bool enableHUD, standaloneJob, showCharacter, enableKB, enableSummaryMemory, enableLongTermMemory bool
stripThinkingTags bool
canStopItself bool canStopItself bool
initiateConversations bool initiateConversations bool
@@ -377,3 +378,8 @@ func WithObserver(observer Observer) Option {
return nil return nil
} }
} }
var EnableStripThinkingTags = func(o *options) error {
o.stripThinkingTags = true
return nil
}

View File

@@ -67,6 +67,7 @@ type AgentConfig struct {
LongTermMemory bool `json:"long_term_memory" form:"long_term_memory"` LongTermMemory bool `json:"long_term_memory" form:"long_term_memory"`
SummaryLongTermMemory bool `json:"summary_long_term_memory" form:"summary_long_term_memory"` SummaryLongTermMemory bool `json:"summary_long_term_memory" form:"summary_long_term_memory"`
ParallelJobs int `json:"parallel_jobs" form:"parallel_jobs"` ParallelJobs int `json:"parallel_jobs" form:"parallel_jobs"`
StripThinkingTags bool `json:"strip_thinking_tags" form:"strip_thinking_tags"`
} }
type AgentConfigMeta struct { type AgentConfigMeta struct {
@@ -292,6 +293,14 @@ func NewAgentConfigMeta(
HelpText: "Script to prepare the MCP box", HelpText: "Script to prepare the MCP box",
Tags: config.Tags{Section: "AdvancedSettings"}, Tags: config.Tags{Section: "AdvancedSettings"},
}, },
{
Name: "strip_thinking_tags",
Label: "Strip Thinking Tags",
Type: "checkbox",
DefaultValue: false,
HelpText: "Remove content between <thinking></thinking> and <think></think> tags from agent responses",
Tags: config.Tags{Section: "ModelSettings"},
},
}, },
MCPServers: []config.Field{ MCPServers: []config.Field{
{ {

View File

@@ -526,6 +526,10 @@ func (a *AgentPool) startAgentWithConfig(name string, config *AgentConfig, obs O
opts = append(opts, EnableForceReasoning) opts = append(opts, EnableForceReasoning)
} }
if config.StripThinkingTags {
opts = append(opts, EnableStripThinkingTags)
}
if config.KnowledgeBaseResults > 0 { if config.KnowledgeBaseResults > 0 {
opts = append(opts, EnableKnowledgeBaseWithResults(config.KnowledgeBaseResults)) opts = append(opts, EnableKnowledgeBaseWithResults(config.KnowledgeBaseResults))
} }