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"
"fmt"
"os"
"regexp"
"strings"
"sync"
"time"
@@ -182,7 +184,7 @@ func (a *Agent) Execute(j *types.Job) *types.JobResult {
if j.Obs != nil {
if len(j.ConversationHistory) > 0 {
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)
}
@@ -788,6 +790,24 @@ func (a *Agent) consumeJob(job *types.Job, role string) {
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) {
job.Result.Conversation = conv
@@ -854,7 +874,7 @@ func (a *Agent) reply(job *types.Job, role string, conv Messages, actionParams t
msg := openai.ChatCompletionMessage{
Role: "assistant",
Content: replyResponse.Message,
Content: a.processPrompt(replyResponse.Message),
}
conv = append(conv, msg)
@@ -883,8 +903,10 @@ func (a *Agent) reply(job *types.Job, role string, conv Messages, actionParams t
msg = openai.ChatCompletionMessage{
Role: "assistant",
Content: replyResponse.Message,
Content: a.processPrompt(replyResponse.Message),
}
} else {
msg.Content = a.processPrompt(msg.Content)
}
conv = append(conv, msg)

View File

@@ -25,6 +25,7 @@ type options struct {
randomIdentity bool
userActions types.Actions
enableHUD, standaloneJob, showCharacter, enableKB, enableSummaryMemory, enableLongTermMemory bool
stripThinkingTags bool
canStopItself bool
initiateConversations bool
@@ -377,3 +378,8 @@ func WithObserver(observer Observer) Option {
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"`
SummaryLongTermMemory bool `json:"summary_long_term_memory" form:"summary_long_term_memory"`
ParallelJobs int `json:"parallel_jobs" form:"parallel_jobs"`
StripThinkingTags bool `json:"strip_thinking_tags" form:"strip_thinking_tags"`
}
type AgentConfigMeta struct {
@@ -292,6 +293,14 @@ func NewAgentConfigMeta(
HelpText: "Script to prepare the MCP box",
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{
{

View File

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