From 5963e787a9a63bacd6533e90d3fe1ece4c7e07ed Mon Sep 17 00:00:00 2001 From: Acbox Date: Tue, 24 Mar 2026 19:45:40 +0800 Subject: [PATCH] fix(agent): preserve inline tags in message history Stop stripping , , and tags from assistant messages so the LLM retains full context across turns. --- internal/agent/agent.go | 4 ---- internal/agent/types.go | 24 ------------------------ 2 files changed, 28 deletions(-) diff --git a/internal/agent/agent.go b/internal/agent/agent.go index ad0a33b7..4e4ecf18 100644 --- a/internal/agent/agent.go +++ b/internal/agent/agent.go @@ -242,8 +242,6 @@ func (a *Agent) runStream(ctx context.Context, cfg RunConfig, ch chan<- StreamEv if readMediaState != nil { finalMessages = readMediaState.mergeMessages(streamResult.Steps, finalMessages) } - finalMessages = StripTagsFromMessages(finalMessages) - var totalUsage sdk.Usage for _, step := range streamResult.Steps { totalUsage.InputTokens += step.Usage.InputTokens @@ -350,8 +348,6 @@ func (a *Agent) runGenerate(ctx context.Context, cfg RunConfig) (*GenerateResult if readMediaState != nil { finalMessages = readMediaState.mergeMessages(genResult.Steps, finalMessages) } - finalMessages = StripTagsFromMessages(finalMessages) - return &GenerateResult{ Messages: finalMessages, Text: cleanedText, diff --git a/internal/agent/types.go b/internal/agent/types.go index dc69d457..6afcc4dc 100644 --- a/internal/agent/types.go +++ b/internal/agent/types.go @@ -115,29 +115,5 @@ func mustMarshal(v any) json.RawMessage { return data } -// StripTagsFromMessages strips attachment/reaction/speech tags from assistant messages. -func StripTagsFromMessages(msgs []sdk.Message) []sdk.Message { - resolvers := DefaultTagResolvers() - result := make([]sdk.Message, 0, len(msgs)) - for _, msg := range msgs { - if msg.Role != sdk.MessageRoleAssistant { - result = append(result, msg) - continue - } - cleaned := make([]sdk.MessagePart, 0, len(msg.Content)) - for _, part := range msg.Content { - if tp, ok := part.(sdk.TextPart); ok { - text, _ := ExtractTagsFromText(tp.Text, resolvers) - cleaned = append(cleaned, sdk.TextPart{Text: text}) - } else { - cleaned = append(cleaned, part) - } - } - msg.Content = cleaned - result = append(result, msg) - } - return result -} - // TimeNow is a hook for testing. Defaults to time.Now. var TimeNow = time.Now