TradingAgents/examples/validate_agent_output.py

198 lines
6.3 KiB
Python

"""
Example: Using Output Validators for Agent Quality Checks
This example demonstrates how to use the output validation utilities
to check agent output quality and extract trading signals.
"""
from spektiv.utils.output_validator import (
validate_report_completeness,
validate_decision_quality,
validate_debate_state,
validate_agent_state,
)
def example_validate_report():
"""Example: Validate a market report."""
print("=" * 60)
print("Example 1: Validate Report Completeness")
print("=" * 60)
report = """
# Market Analysis for AAPL
## Technical Indicators
Strong bullish momentum with RSI at 55 and MACD showing positive divergence.
## Volume Analysis
Above-average volume on recent upward moves indicates strong buyer interest.
""" + "Additional detailed analysis. " * 40
result = validate_report_completeness(
report,
min_length=500,
require_markdown_tables=False,
require_sections=True
)
print(f"Valid: {result.is_valid}")
print(f"Length: {result.metrics['length']} chars")
print(f"Section Headers: {result.metrics['section_headers']}")
print(f"Errors: {result.errors}")
print(f"Warnings: {result.warnings}")
print()
def example_extract_signal():
"""Example: Extract trading signal from decision."""
print("=" * 60)
print("Example 2: Extract Trading Signal")
print("=" * 60)
decisions = [
"BUY: Strong fundamentals and positive momentum",
"SELL: Overvalued with deteriorating metrics",
"HOLD: Mixed signals, awaiting clarity",
"buy the stock now", # Case-insensitive
]
for decision in decisions:
result = validate_decision_quality(decision)
signal = result.metrics.get("signal", "UNKNOWN")
has_reasoning = result.metrics.get("has_reasoning", False)
print(f"Decision: {decision[:40]:<40} -> Signal: {signal:4} | Reasoning: {has_reasoning}")
print()
def example_validate_debate():
"""Example: Validate debate state."""
print("=" * 60)
print("Example 3: Validate Debate State")
print("=" * 60)
debate_state = {
"history": "Round 1: Bull presents case...\nRound 2: Bear counters...\nRound 3: Judge decides...",
"count": 3,
"judge_decision": "BUY: Bulls made compelling case",
"bull_history": "Strong fundamentals",
"bear_history": "Some valuation concerns",
}
result = validate_debate_state(debate_state, debate_type="invest")
print(f"Valid: {result.is_valid}")
print(f"Debate Rounds: {result.metrics.get('count', 0)}")
print(f"Judge Signal: {result.metrics.get('judge_signal', 'N/A')}")
print(f"History Length: {result.metrics.get('history_length', 0)} chars")
print(f"Errors: {result.errors}")
print(f"Warnings: {result.warnings}")
print()
def example_validate_complete_state():
"""Example: Validate complete agent state."""
print("=" * 60)
print("Example 4: Validate Complete Agent State")
print("=" * 60)
# Minimal state (will have warnings)
state = {
"company_of_interest": "AAPL",
"trade_date": "2024-01-15",
"market_report": "Market analysis. " * 100,
"final_trade_decision": "BUY: Strong fundamentals and positive momentum",
}
result = validate_agent_state(state)
print(f"Valid: {result.is_valid}")
print(f"Company: {result.metrics.get('company_of_interest', 'N/A')}")
print(f"Reports Present: {result.metrics.get('reports_present', 0)}/4")
print(f"Final Signal: {result.metrics.get('final_signal', 'N/A')}")
print(f"Errors: {result.errors}")
print(f"Warnings: {result.warnings}")
print()
def example_quality_check_workflow():
"""Example: Complete quality check workflow."""
print("=" * 60)
print("Example 5: Complete Quality Check Workflow")
print("=" * 60)
# Simulate agent output
state = {
"company_of_interest": "TSLA",
"trade_date": "2024-01-20",
"market_report": "# Market Report\n\n" + "Detailed analysis. " * 100,
"sentiment_report": "# Sentiment\n\n" + "Social sentiment. " * 100,
"news_report": "# News\n\n" + "Latest news. " * 100,
"fundamentals_report": "# Fundamentals\n\n" + "Financial data. " * 100,
"investment_debate_state": {
"history": "Debate history...",
"count": 2,
"judge_decision": "SELL: Bears made stronger case",
},
"risk_debate_state": {
"history": "Risk assessment...",
"count": 1,
"judge_decision": "SELL: Exit to preserve capital",
},
"final_trade_decision": "SELL: Consensus to exit position",
}
# Validate complete state
result = validate_agent_state(state)
print(f"Overall Quality Check: {'PASS' if result.is_valid else 'FAIL'}")
print()
# Extract key metrics
print("Key Metrics:")
print(f" Company: {result.metrics.get('company_of_interest')}")
print(f" Trade Date: {result.metrics.get('trade_date')}")
print(f" Reports: {result.metrics.get('reports_present')}/4 present")
print(f" Investment Debate: {'Valid' if result.metrics.get('investment_debate_valid') else 'Invalid'}")
print(f" Risk Debate: {'Valid' if result.metrics.get('risk_debate_valid') else 'Invalid'}")
print(f" Final Signal: {result.metrics.get('final_signal')}")
print()
# Show issues
if result.errors:
print("Errors (must fix):")
for error in result.errors:
print(f" - {error}")
print()
if result.warnings:
print("Warnings (should review):")
for warning in result.warnings:
print(f" - {warning}")
print()
# Decision logic
if result.is_valid:
signal = result.metrics.get('final_signal')
if signal:
print(f"Recommendation: Proceed with {signal} decision")
else:
print("Recommendation: Review - no clear signal extracted")
else:
print("Recommendation: Fix errors before proceeding")
print()
if __name__ == "__main__":
# Run all examples
example_validate_report()
example_extract_signal()
example_validate_debate()
example_validate_complete_state()
example_quality_check_workflow()
print("=" * 60)
print("All examples completed!")
print("=" * 60)