diff --git a/agent/mock_provider/__init__.py b/agent/mock_provider/__init__.py new file mode 100644 index 0000000..a4740fc --- /dev/null +++ b/agent/mock_provider/__init__.py @@ -0,0 +1,4 @@ +"""Mock AI provider for development mode testing""" +from .mock_ai_provider import MockAIProvider + +__all__ = ["MockAIProvider"] diff --git a/agent/mock_provider/mock_ai_provider.py b/agent/mock_provider/mock_ai_provider.py new file mode 100644 index 0000000..fc17484 --- /dev/null +++ b/agent/mock_provider/mock_ai_provider.py @@ -0,0 +1,60 @@ +""" +Mock AI Provider for Development Mode + +Returns static but rotating trading responses to test orchestration without AI API costs. +Rotates through NASDAQ 100 stocks in a predictable pattern. +""" + +from typing import Optional +from datetime import datetime + + +class MockAIProvider: + """Mock AI provider that returns pre-defined trading responses""" + + # Rotation of stocks for variety in testing + STOCK_ROTATION = [ + "AAPL", "MSFT", "GOOGL", "AMZN", "NVDA", + "META", "TSLA", "BRK.B", "UNH", "JNJ" + ] + + def __init__(self): + """Initialize mock provider""" + pass + + def generate_response(self, date: str, step: int = 0) -> str: + """ + Generate mock trading response based on date + + Args: + date: Trading date (YYYY-MM-DD) + step: Current step in reasoning loop (0-indexed) + + Returns: + Mock AI response string with tool calls and finish signal + """ + # Use date to deterministically select stock + date_obj = datetime.strptime(date, "%Y-%m-%d") + day_offset = (date_obj - datetime(2025, 1, 1)).days + stock_idx = day_offset % len(self.STOCK_ROTATION) + selected_stock = self.STOCK_ROTATION[stock_idx] + + # Generate mock response + response = f"""Let me analyze the market for today ({date}). + +I'll check the current price for {selected_stock}. +[calls tool_get_price with symbol={selected_stock}] + +Based on the analysis, I'll make a small purchase to test the system. +[calls tool_trade with action=buy, symbol={selected_stock}, amount=5] + +I've completed today's trading session. +""" + + return response + + def __str__(self): + return "MockAIProvider(mode=development)" + + def __repr__(self): + return self.__str__() diff --git a/tests/unit/test_mock_provider.py b/tests/unit/test_mock_provider.py new file mode 100644 index 0000000..1b5e4bb --- /dev/null +++ b/tests/unit/test_mock_provider.py @@ -0,0 +1,34 @@ +import pytest +from agent.mock_provider.mock_ai_provider import MockAIProvider + + +def test_mock_provider_rotates_stocks(): + """Test that mock provider returns different stocks on different days""" + provider = MockAIProvider() + + # Day 1 should recommend AAPL + response1 = provider.generate_response("2025-01-01", step=0) + assert "AAPL" in response1 + assert "" in response1 + + # Day 2 should recommend MSFT + response2 = provider.generate_response("2025-01-02", step=0) + assert "MSFT" in response2 + assert "" in response2 + + # Responses should be different + assert response1 != response2 + + +def test_mock_provider_finish_signal(): + """Test that all responses include finish signal""" + provider = MockAIProvider() + response = provider.generate_response("2025-01-01", step=0) + assert "" in response + + +def test_mock_provider_valid_json_tool_calls(): + """Test that responses contain valid tool call syntax""" + provider = MockAIProvider() + response = provider.generate_response("2025-01-01", step=0) + assert "[calls tool_get_price" in response or "get_price" in response.lower()