From 25cc0e144c36284b084ec97a3bbcef89d72e68fa Mon Sep 17 00:00:00 2001 From: octo-patch Date: Thu, 23 Apr 2026 13:16:32 +0800 Subject: [PATCH] fix: strip trailing newlines from past_memory_str and gate thesis instruction Addresses gemini-code-assist review feedback: - All five files (portfolio_manager, research_manager, bear/bull researchers, trader) now call .strip() on past_memory_str before injecting it into prompts, removing the trailing '\n\n' artifacts from the construction loop. - portfolio_manager now also makes the 'past reflections' phrasing in the Investment Thesis instruction conditional on past_memories being non-empty, so an empty memory section can't trigger hallucinated past reflections. --- tradingagents/agents/managers/portfolio_manager.py | 9 +++++++-- tradingagents/agents/managers/research_manager.py | 2 +- tradingagents/agents/researchers/bear_researcher.py | 2 +- tradingagents/agents/researchers/bull_researcher.py | 2 +- tradingagents/agents/trader/trader.py | 2 +- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/tradingagents/agents/managers/portfolio_manager.py b/tradingagents/agents/managers/portfolio_manager.py index 0506cde6..5d4631b8 100644 --- a/tradingagents/agents/managers/portfolio_manager.py +++ b/tradingagents/agents/managers/portfolio_manager.py @@ -23,10 +23,15 @@ def create_portfolio_manager(llm, memory): past_memory_str += rec["recommendation"] + "\n\n" lessons_line = ( - f"- Lessons from past decisions: **{past_memory_str}**\n" + f"- Lessons from past decisions: **{past_memory_str.strip()}**\n" if past_memories else "" ) + thesis_instruction = ( + "3. **Investment Thesis**: Detailed reasoning anchored in the analysts' debate and past reflections." + if past_memories + else "3. **Investment Thesis**: Detailed reasoning anchored in the analysts' debate." + ) prompt = f"""As the Portfolio Manager, synthesize the risk analysts' debate and deliver the final trading decision. @@ -48,7 +53,7 @@ def create_portfolio_manager(llm, memory): **Required Output Structure:** 1. **Rating**: State one of Buy / Overweight / Hold / Underweight / Sell. 2. **Executive Summary**: A concise action plan covering entry strategy, position sizing, key risk levels, and time horizon. -3. **Investment Thesis**: Detailed reasoning anchored in the analysts' debate and past reflections. +{thesis_instruction} --- diff --git a/tradingagents/agents/managers/research_manager.py b/tradingagents/agents/managers/research_manager.py index a2483c98..03e32e49 100644 --- a/tradingagents/agents/managers/research_manager.py +++ b/tradingagents/agents/managers/research_manager.py @@ -21,7 +21,7 @@ def create_research_manager(llm, memory): past_memory_str += rec["recommendation"] + "\n\n" past_memory_block = ( - f'Take into account your past mistakes on similar situations. Use these insights to refine your decision-making and ensure you are learning and improving. Present your analysis conversationally, as if speaking naturally, without special formatting. \n\nHere are your past reflections on mistakes:\n"{past_memory_str}"\n\n' + f'Take into account your past mistakes on similar situations. Use these insights to refine your decision-making and ensure you are learning and improving. Present your analysis conversationally, as if speaking naturally, without special formatting. \n\nHere are your past reflections on mistakes:\n"{past_memory_str.strip()}"\n\n' if past_memories else "" ) diff --git a/tradingagents/agents/researchers/bear_researcher.py b/tradingagents/agents/researchers/bear_researcher.py index c9312d3e..e3922e8c 100644 --- a/tradingagents/agents/researchers/bear_researcher.py +++ b/tradingagents/agents/researchers/bear_researcher.py @@ -20,7 +20,7 @@ def create_bear_researcher(llm, memory): past_memory_str += rec["recommendation"] + "\n\n" memory_section = ( - f"Reflections from similar situations and lessons learned: {past_memory_str}\n" + f"Reflections from similar situations and lessons learned: {past_memory_str.strip()}\n" if past_memories else "" ) diff --git a/tradingagents/agents/researchers/bull_researcher.py b/tradingagents/agents/researchers/bull_researcher.py index f015f9eb..9724415d 100644 --- a/tradingagents/agents/researchers/bull_researcher.py +++ b/tradingagents/agents/researchers/bull_researcher.py @@ -20,7 +20,7 @@ def create_bull_researcher(llm, memory): past_memory_str += rec["recommendation"] + "\n\n" memory_section = ( - f"Reflections from similar situations and lessons learned: {past_memory_str}\n" + f"Reflections from similar situations and lessons learned: {past_memory_str.strip()}\n" if past_memories else "" ) diff --git a/tradingagents/agents/trader/trader.py b/tradingagents/agents/trader/trader.py index 5e091a53..96473346 100644 --- a/tradingagents/agents/trader/trader.py +++ b/tradingagents/agents/trader/trader.py @@ -22,7 +22,7 @@ def create_trader(llm, memory): past_memory_str += rec["recommendation"] + "\n\n" memory_instruction = ( - f" Apply lessons from past decisions to strengthen your analysis. Here are reflections from similar situations you traded in and the lessons learned: {past_memory_str}" + f" Apply lessons from past decisions to strengthen your analysis. Here are reflections from similar situations you traded in and the lessons learned: {past_memory_str.strip()}" if past_memories else "" )