From ff012ab8a08e65433761ce53ad8f3fffb4d8ee1a Mon Sep 17 00:00:00 2001 From: MackDing Date: Fri, 1 May 2026 16:51:23 +0800 Subject: [PATCH] fix: preserve reasoning in short-term memory replay --- src/core/agent-reasoning-memory.test.ts | 63 +++++++++++++++++++++++++ src/core/agent.ts | 11 +++++ 2 files changed, 74 insertions(+) create mode 100644 src/core/agent-reasoning-memory.test.ts diff --git a/src/core/agent-reasoning-memory.test.ts b/src/core/agent-reasoning-memory.test.ts new file mode 100644 index 00000000..13bd8f0f --- /dev/null +++ b/src/core/agent-reasoning-memory.test.ts @@ -0,0 +1,63 @@ +import { describe, expect, it } from 'vitest'; + +type MemoryEntry = { + role: 'user' | 'assistant' | 'system'; + content: string; + reasoning?: string; +}; + +function toModelMessages(recentMemory: MemoryEntry[]) { + const messages: any[] = []; + + if (recentMemory.length > 0) { + for (const m of recentMemory) { + if (m.role === 'assistant' && m.reasoning) { + messages.push({ + role: 'assistant', + content: [ + { type: 'reasoning', text: m.reasoning }, + { type: 'text', text: m.content }, + ], + }); + continue; + } + + messages.push({ + role: m.role === 'user' ? 'user' : 'assistant', + content: m.content, + }); + } + } + + return messages; +} + +describe('assistant reasoning is preserved in replayed short-term memory', () => { + it('replays assistant reasoning alongside assistant text when available', () => { + const messages = toModelMessages([ + { role: 'user', content: 'hello' }, + { role: 'assistant', content: 'world', reasoning: 'think-step' }, + ]); + + expect(messages).toEqual([ + { role: 'user', content: 'hello' }, + { + role: 'assistant', + content: [ + { type: 'reasoning', text: 'think-step' }, + { type: 'text', text: 'world' }, + ], + }, + ]); + }); + + it('keeps assistant messages as plain text when no reasoning exists', () => { + const messages = toModelMessages([ + { role: 'assistant', content: 'plain reply' }, + ]); + + expect(messages).toEqual([ + { role: 'assistant', content: 'plain reply' }, + ]); + }); +}); diff --git a/src/core/agent.ts b/src/core/agent.ts index 70a93608..84802f32 100644 --- a/src/core/agent.ts +++ b/src/core/agent.ts @@ -479,6 +479,17 @@ export class Agent { if (recentMemory.length > 0) { for (const m of recentMemory) { + if (m.role === 'assistant' && m.reasoning) { + messages.push({ + role: 'assistant', + content: [ + { type: 'reasoning', text: m.reasoning }, + { type: 'text', text: m.content }, + ], + }); + continue; + } + messages.push({ role: m.role === 'user' ? 'user' : 'assistant', content: m.content,