198 lines
6.3 KiB
Python
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)
|