CRITICAL FIX: Blind Logs

This commit is contained in:
swj.premkumar 2026-01-10 04:41:21 -06:00
parent 66c9807ed8
commit af82fd9601
3 changed files with 39 additions and 2 deletions

View File

@ -22,6 +22,9 @@ All notable changes to the **TradingAgents** project will be documented in this
- **Payload Size Error**: Implemented input truncation (max 9000 chars) in `memory.py`.
- **Display Layer De-Anonymization**: Added `deanonymize_text` to `TickerAnonymizer` and patched `cli/main.py` to reverse-map "ASSET_XXX" to real company names in the final report, effectively resolving "[Company Name]" placeholders for the user while keeping the internal system blind.
- **Alpaca Integration**: Added `tradingagents/dataflows/alpaca.py` to support `get_stock_data` via Alpaca Data API v2. Registered as a vendor option in `interface.py` and `default_config.py`. Requires `ALPACA_API_KEY` and `ALPACA_API_SECRET` in `.env`.
- **CRITICAL FIX: Memory Leak**: Implemented `FinancialSituationMemory.clear()` and `TradingAgentsGraph.reset_memory()` to wipe agent context between runs. This prevents hallucinations from bleeding across days in long simulations.
- **CRITICAL FIX: Blind Logs**: Updated `_log_state` to explicitly capture `market_regime` and `regime_metrics`, ensuring we can audit decision logic relative to market conditions.
- **CRITICAL FIX: Crash Prevention**: Added guard logic in `propagate()` to handle "Dead State" (Rejected Trades) gracefully, preventing crashes when `process_signal` tries to read non-existent buy prices.

View File

@ -95,6 +95,14 @@ class FinancialSituationMemory:
return matched_results
def clear(self):
"""Clear the memory by deleting and recreating the collection."""
try:
self.chroma_client.delete_collection(self.situation_collection.name)
self.situation_collection = self.chroma_client.create_collection(name=self.situation_collection.name)
except Exception as e:
print(f"Warning: Failed to clear memory {self.situation_collection.name}: {e}")
if __name__ == "__main__":
# Example usage
matcher = FinancialSituationMemory()

View File

@ -165,8 +165,18 @@ class TradingAgentsGraph:
),
}
def reset_memory(self):
"""Clear all agent memories to prevent context bleeding between runs."""
self.bull_memory.clear()
self.bear_memory.clear()
self.trader_memory.clear()
self.invest_judge_memory.clear()
self.risk_manager_memory.clear()
def propagate(self, company_name, trade_date):
"""Run the trading agents graph for a company on a specific date."""
# 1. FIX MEMORY LEAK
self.reset_memory()
self.ticker = company_name
@ -197,14 +207,30 @@ class TradingAgentsGraph:
# Log state
self._log_state(trade_date, final_state)
# Return decision and processed signal
return final_state, self.process_signal(final_state["final_trade_decision"])
# 3. FIX CRASH RISK: Handle Dead State gracefully
trade_decision = final_state["final_trade_decision"]
# If trade was rejected by a Gate (Fact Check or Risk), return raw decision
if trade_decision.get("action") == "HOLD" and "REJECTED" in trade_decision.get("reasoning", ""):
processed_signal = {
"action": "HOLD",
"quantity": 0,
"reason": trade_decision["reasoning"]
}
else:
# Only process if it's a valid attempt
processed_signal = self.process_signal(trade_decision)
return final_state, processed_signal
def _log_state(self, trade_date, final_state):
"""Log the final state to a JSON file."""
self.log_states_dict[str(trade_date)] = {
"company_of_interest": final_state["company_of_interest"],
"trade_date": final_state["trade_date"],
# 2. FIX BLIND SPOT: Log the Math
"market_regime": final_state.get("market_regime", "UNKNOWN"),
"regime_metrics": final_state.get("regime_metrics", {}),
"market_report": final_state["market_report"],
"sentiment_report": final_state["sentiment_report"],
"news_report": final_state["news_report"],