TradingAgents/verify_new_features.py

316 lines
9.5 KiB
Python

#!/usr/bin/env python3
"""
Verification script for new TradingAgents features.
This script tests:
1. Multi-LLM provider support
2. Broker integration (basic)
3. Web interface components
4. Docker files exist
Run this to verify all new features are properly installed.
"""
import os
import sys
from pathlib import Path
def test_llm_factory():
"""Test LLM factory implementation."""
print("\n" + "="*70)
print("TEST 1: Multi-LLM Provider Support")
print("="*70)
try:
from tradingagents.llm_factory import LLMFactory
# Test supported providers
providers = LLMFactory.SUPPORTED_PROVIDERS
print(f"✓ Supported providers: {', '.join(providers)}")
# Test recommendations
for provider in providers:
models = LLMFactory.get_recommended_models(provider)
print(f"{provider.capitalize()} recommended models: {len(models)} options")
# Test validation (without actual API keys)
print("✓ Validation methods available")
print("\n✓ LLM Factory: PASS")
return True
except Exception as e:
print(f"\n✗ LLM Factory: FAIL - {e}")
return False
def test_broker_integration():
"""Test broker integration."""
print("\n" + "="*70)
print("TEST 2: Broker Integration")
print("="*70)
try:
from tradingagents.brokers import BaseBroker, AlpacaBroker
from tradingagents.brokers.base import (
BrokerOrder, BrokerPosition, BrokerAccount,
OrderSide, OrderType, OrderStatus
)
from decimal import Decimal
print("✓ Base broker interface imported")
print("✓ Alpaca broker imported")
print("✓ Order types available")
# Test creating order (without submitting)
order = BrokerOrder(
symbol="AAPL",
side=OrderSide.BUY,
quantity=Decimal("10"),
order_type=OrderType.MARKET
)
print(f"✓ Created order: {order.symbol} {order.side.value} {order.quantity}")
# Test broker creation (without connecting)
try:
broker = AlpacaBroker(paper_trading=True)
print("✓ Alpaca broker instantiated (connection not tested)")
except ValueError as e:
# Expected if no API keys
print("✓ Alpaca broker requires API keys (as expected)")
print("\n✓ Broker Integration: PASS")
return True
except Exception as e:
print(f"\n✗ Broker Integration: FAIL - {e}")
import traceback
traceback.print_exc()
return False
def test_web_interface():
"""Test web interface components."""
print("\n" + "="*70)
print("TEST 3: Web Interface")
print("="*70)
try:
# Check web_app.py exists
web_app = Path("/home/user/TradingAgents/web_app.py")
if web_app.exists():
print("✓ web_app.py exists")
else:
print("✗ web_app.py not found")
return False
# Check chainlit config
chainlit_config = Path("/home/user/TradingAgents/.chainlit")
if chainlit_config.exists():
print("✓ .chainlit config exists")
else:
print("✗ .chainlit config not found")
return False
# Check chainlit is importable
try:
import chainlit
print(f"✓ Chainlit installed (version: {chainlit.__version__ if hasattr(chainlit, '__version__') else 'unknown'})")
except ImportError:
print("⚠ Chainlit not installed (pip install chainlit)")
# Check web_app imports
with open(web_app, 'r') as f:
content = f.read()
if 'chainlit' in content:
print("✓ Web app uses Chainlit")
if 'AlpacaBroker' in content:
print("✓ Web app integrates broker")
if 'TradingAgentsGraph' in content:
print("✓ Web app integrates TradingAgents")
print("\n✓ Web Interface: PASS")
return True
except Exception as e:
print(f"\n✗ Web Interface: FAIL - {e}")
return False
def test_docker_files():
"""Test Docker configuration files."""
print("\n" + "="*70)
print("TEST 4: Docker Support")
print("="*70)
try:
base_path = Path("/home/user/TradingAgents")
# Check Dockerfile
dockerfile = base_path / "Dockerfile"
if dockerfile.exists():
print("✓ Dockerfile exists")
with open(dockerfile, 'r') as f:
content = f.read()
if 'python:3.11' in content:
print(" - Uses Python 3.11")
if 'chainlit' in content:
print(" - Includes web interface")
if 'EXPOSE 8000' in content:
print(" - Exposes port 8000")
else:
print("✗ Dockerfile not found")
return False
# Check docker-compose.yml
compose = base_path / "docker-compose.yml"
if compose.exists():
print("✓ docker-compose.yml exists")
with open(compose, 'r') as f:
content = f.read()
if 'tradingagents' in content:
print(" - Defines tradingagents service")
if 'jupyter' in content:
print(" - Includes optional Jupyter service")
if 'volumes' in content:
print(" - Configures data persistence")
else:
print("✗ docker-compose.yml not found")
return False
# Check .dockerignore
dockerignore = base_path / ".dockerignore"
if dockerignore.exists():
print("✓ .dockerignore exists")
else:
print("⚠ .dockerignore not found (recommended)")
# Check DOCKER.md
docker_md = base_path / "DOCKER.md"
if docker_md.exists():
print("✓ DOCKER.md documentation exists")
else:
print("⚠ DOCKER.md not found")
print("\n✓ Docker Support: PASS")
return True
except Exception as e:
print(f"\n✗ Docker Support: FAIL - {e}")
return False
def test_documentation():
"""Test documentation files."""
print("\n" + "="*70)
print("TEST 5: Documentation")
print("="*70)
try:
base_path = Path("/home/user/TradingAgents")
docs = {
"NEW_FEATURES.md": "New features guide",
"DOCKER.md": "Docker documentation",
"tradingagents/brokers/README.md": "Broker integration guide",
"examples/use_claude.py": "Claude example",
"examples/paper_trading_alpaca.py": "Paper trading example",
"examples/tradingagents_with_alpaca.py": "Full integration example",
}
found = 0
for doc, description in docs.items():
if (base_path / doc).exists():
print(f"{description}")
found += 1
else:
print(f"{doc} not found")
print(f"\n✓ Documentation: {found}/{len(docs)} files present")
return found == len(docs)
except Exception as e:
print(f"\n✗ Documentation: FAIL - {e}")
return False
def test_examples():
"""Test example scripts."""
print("\n" + "="*70)
print("TEST 6: Example Scripts")
print("="*70)
try:
base_path = Path("/home/user/TradingAgents/examples")
examples = [
"use_claude.py",
"paper_trading_alpaca.py",
"tradingagents_with_alpaca.py",
]
for example in examples:
script = base_path / example
if script.exists():
# Check if executable
is_executable = os.access(script, os.X_OK)
exec_mark = "" if is_executable else ""
print(f"{exec_mark} {example} {'(executable)' if is_executable else ''}")
else:
print(f"{example} not found")
print("\n✓ Example Scripts: PASS")
return True
except Exception as e:
print(f"\n✗ Example Scripts: FAIL - {e}")
return False
def main():
"""Run all verification tests."""
print("="*70)
print("TRADINGAGENTS NEW FEATURES VERIFICATION")
print("="*70)
results = []
# Run tests
results.append(("LLM Factory", test_llm_factory()))
results.append(("Broker Integration", test_broker_integration()))
results.append(("Web Interface", test_web_interface()))
results.append(("Docker Support", test_docker_files()))
results.append(("Documentation", test_documentation()))
results.append(("Example Scripts", test_examples()))
# Summary
print("\n" + "="*70)
print("VERIFICATION SUMMARY")
print("="*70)
passed = sum(1 for _, result in results if result)
total = len(results)
for name, result in results:
status = "✓ PASS" if result else "✗ FAIL"
print(f"{status}: {name}")
print(f"\nResults: {passed}/{total} tests passed ({passed/total*100:.0f}%)")
if passed == total:
print("\n🎉 All new features verified successfully!")
print("\nNext steps:")
print(" 1. Configure .env with your API keys")
print(" 2. Try: chainlit run web_app.py -w")
print(" 3. Or: docker-compose up")
print(" 4. Or run: python examples/use_claude.py")
return 0
else:
print(f"\n{total - passed} test(s) failed. Review errors above.")
return 1
if __name__ == "__main__":
sys.exit(main())