Compare commits

...

4 Commits

Author SHA1 Message Date
31e346ecbb debug: add logging to verify conversation history capture
Added debug output to confirm:
- How many messages are in conversation_history
- How many assistant vs tool messages
- Preview of first assistant message content
- What the summarizer receives

This will verify that the full detailed reasoning (like portfolio
analysis, trade execution details) is being captured and passed
to the summarizer.

Output will show:
[DEBUG] Generating summary from N messages
[DEBUG] Assistant messages: X, Tool messages: Y
[DEBUG] First assistant message preview: ...
[DEBUG ReasoningSummarizer] Formatting N messages
[DEBUG ReasoningSummarizer] Breakdown: X assistant, Y tool
2025-11-05 00:46:30 -05:00
abb9cd0726 fix: capture tool messages in conversation history for summarizer
**Root Cause:**
The summarizer was not receiving tool execution results (buy/sell trades)
because they were never captured to conversation_history.

**What was captured:**
- User: 'Please analyze positions'
- Assistant: 'I will buy/sell...'
- Assistant: 'Done <FINISH_SIGNAL>'

**What was MISSING:**
- Tool: buy 14 NVDA at $185.24
- Tool: sell 1 GOOGL at $245.15

**Changes:**
- Added tool message capture in trading loop (line 649)
- Extract tool_name and tool_content from each tool message
- Capture to conversation_history before processing
- Changed message['tool_name'] to message['name'] for consistency

**Impact:**
Now the summarizer sees the actual tool results, not just the AI's
intentions. Combined with alpha.8's prompt improvements, summaries
will accurately reflect executed trades.

Fixes reasoning summaries that contradicted actual trades.
2025-11-05 00:44:24 -05:00
6d126db03c fix: improve reasoning summary to explicitly mention trades
The reasoning summary was not accurately reflecting actual trades.
For example, 2 sell trades were summarized as 'maintain core holdings'.

Changes:
- Updated prompt to require explicit mention of trades executed
- Added emphasis on buy/sell tool calls in formatted log
- Trades now highlighted at top of log with TRADES EXECUTED section
- Prompt instructs: state specific trades (symbols, quantities, action)

Example before: 'chose to maintain core holdings'
Example after: 'sold 1 GOOGL and 1 AMZN to reduce exposure'

This ensures reasoning field accurately describes what the AI actually did.
2025-11-05 00:41:59 -05:00
1e7bdb509b chore: remove debug logging from ContextInjector
Removed noisy debug print statements that were added during
troubleshooting. The context injection is now working correctly
and no longer needs diagnostic output.

Cleaned up:
- Entry point logging
- Before/after injection logging
- Tool name and args logging
2025-11-05 00:31:16 -05:00
3 changed files with 42 additions and 15 deletions

View File

@@ -419,7 +419,7 @@ class BaseAgent:
}
if tool_name:
message["tool_name"] = tool_name
message["name"] = tool_name # Use "name" not "tool_name" for consistency with summarizer
if tool_input:
message["tool_input"] = tool_input
@@ -643,6 +643,11 @@ Summary:"""
tool_msgs = extract_tool_messages(response)
for tool_msg in tool_msgs:
tool_name = getattr(tool_msg, 'name', None) or tool_msg.get('name') if isinstance(tool_msg, dict) else None
tool_content = getattr(tool_msg, 'content', '') or tool_msg.get('content', '') if isinstance(tool_msg, dict) else str(tool_msg)
# Capture tool message to conversation history
self._capture_message("tool", tool_content, tool_name=tool_name)
if tool_name in ['buy', 'sell']:
action_count += 1
@@ -665,6 +670,15 @@ Summary:"""
session_duration = time.time() - session_start
# 7. Generate reasoning summary
# Debug: Log conversation history size
print(f"\n[DEBUG] Generating summary from {len(self.conversation_history)} messages")
assistant_msgs = [m for m in self.conversation_history if m.get('role') == 'assistant']
tool_msgs = [m for m in self.conversation_history if m.get('role') == 'tool']
print(f"[DEBUG] Assistant messages: {len(assistant_msgs)}, Tool messages: {len(tool_msgs)}")
if assistant_msgs:
first_assistant = assistant_msgs[0]
print(f"[DEBUG] First assistant message preview: {first_assistant.get('content', '')[:200]}...")
summarizer = ReasoningSummarizer(model=self.model)
summary = await summarizer.generate_summary(self.conversation_history)

View File

@@ -52,10 +52,6 @@ class ContextInjector:
"""
# Inject context parameters for trade tools
if request.name in ["buy", "sell"]:
# Debug: Log self attributes BEFORE injection
print(f"[ContextInjector.__call__] ENTRY: id={id(self)}, self.signature={self.signature}, self.today_date={self.today_date}, self.job_id={self.job_id}, self.session_id={self.session_id}, self.trading_day_id={self.trading_day_id}")
print(f"[ContextInjector.__call__] Args BEFORE injection: {request.args}")
# ALWAYS inject/override context parameters (don't trust AI-provided values)
request.args["signature"] = self.signature
request.args["today_date"] = self.today_date
@@ -66,8 +62,5 @@ class ContextInjector:
if self.trading_day_id:
request.args["trading_day_id"] = self.trading_day_id
# Debug logging
print(f"[ContextInjector] Tool: {request.name}, Args after injection: {request.args}")
# Call the actual tool handler
return await handler(request)

View File

@@ -36,15 +36,17 @@ class ReasoningSummarizer:
summary_prompt = f"""You are reviewing your own trading decisions for the day.
Summarize your trading strategy and key decisions in 2-3 sentences.
IMPORTANT: Explicitly state what trades you executed (e.g., "sold 2 GOOGL shares" or "bought 10 NVDA shares"). If you made no trades, state that clearly.
Focus on:
- What you analyzed
- Why you made the trades you did
- What specific trades you executed (buy/sell, symbols, quantities)
- Why you made those trades
- Your overall strategy for the day
Trading session log:
{log_text}
Provide a concise summary:"""
Provide a concise summary that includes the actual trades executed:"""
response = await self.model.ainvoke([
{"role": "user", "content": summary_prompt}
@@ -67,21 +69,39 @@ Provide a concise summary:"""
reasoning_log: List of message dicts
Returns:
Formatted text representation
Formatted text representation with emphasis on trades
"""
# Debug: Log what we're formatting
print(f"[DEBUG ReasoningSummarizer] Formatting {len(reasoning_log)} messages")
assistant_count = sum(1 for m in reasoning_log if m.get('role') == 'assistant')
tool_count = sum(1 for m in reasoning_log if m.get('role') == 'tool')
print(f"[DEBUG ReasoningSummarizer] Breakdown: {assistant_count} assistant, {tool_count} tool")
formatted_parts = []
trades_executed = []
for msg in reasoning_log:
role = msg.get("role", "")
content = msg.get("content", "")
tool_name = msg.get("name", "")
if role == "assistant":
# AI's thoughts
formatted_parts.append(f"AI: {content[:200]}")
elif role == "tool":
# Tool results
tool_name = msg.get("name", "tool")
formatted_parts.append(f"{tool_name}: {content[:100]}")
# Highlight trade tool calls
if tool_name in ["buy", "sell"]:
trades_executed.append(f"{tool_name.upper()}: {content[:150]}")
formatted_parts.append(f"TRADE - {tool_name.upper()}: {content[:150]}")
else:
# Other tool results (search, price, etc.)
formatted_parts.append(f"{tool_name}: {content[:100]}")
# Add summary of trades at the top
if trades_executed:
trade_summary = f"TRADES EXECUTED ({len(trades_executed)}):\n" + "\n".join(trades_executed)
formatted_parts.insert(0, trade_summary)
formatted_parts.insert(1, "\n--- FULL LOG ---")
return "\n".join(formatted_parts)