The ToolCallArgsParsingWrapper was replaced by the model factory approach which uses native ChatDeepSeek for DeepSeek models. Removed: - agent/chat_model_wrapper.py (no longer used) - tests/unit/test_chat_model_wrapper.py (tests for removed functionality) The model factory provides a cleaner solution by using provider-specific implementations rather than wrapping ChatOpenAI.
27 KiB
Fix IF_TRADE Flag and DeepSeek Tool Calls Validation Implementation Plan
For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
Goal: Fix two bugs: (1) "No trading" message always displayed despite trading activity, and (2) sporadic Pydantic validation errors for DeepSeek tool_calls arguments.
Architecture:
- Issue #1: Change IF_TRADE initialization from False to True in runtime config manager
- Issue #2: Replace ChatOpenAI with native ChatDeepSeek for DeepSeek models to eliminate OpenAI compatibility layer issues
Tech Stack: Python 3.10+, LangChain 1.0.2, langchain-deepseek, FastAPI, SQLite
Task 1: Fix IF_TRADE Initialization Bug
Files:
- Modify:
api/runtime_manager.py:80-86 - Test:
tests/unit/test_runtime_manager.py - Verify:
agent/base_agent/base_agent.py:745-752
Root Cause:
IF_TRADE is initialized to False but never updated when trades execute. The design documents show it should initialize to True (trades are expected by default).
Step 1: Write failing test for IF_TRADE initialization
Add to tests/unit/test_runtime_manager.py after existing tests:
def test_create_runtime_config_if_trade_defaults_true(self):
"""Test that IF_TRADE initializes to True (trades expected by default)"""
manager = RuntimeConfigManager()
config_path = manager.create_runtime_config(
date="2025-01-16",
model_sig="test-model",
job_id="test-job-123",
trading_day_id=1
)
try:
# Read the config file
with open(config_path, 'r') as f:
config = json.load(f)
# Verify IF_TRADE is True by default
assert config["IF_TRADE"] is True, "IF_TRADE should initialize to True"
finally:
# Cleanup
if os.path.exists(config_path):
os.remove(config_path)
Step 2: Run test to verify it fails
Run: ./venv/bin/python -m pytest tests/unit/test_runtime_manager.py::TestRuntimeConfigManager::test_create_runtime_config_if_trade_defaults_true -v
Expected: FAIL with assertion error showing IF_TRADE is False
Step 3: Fix IF_TRADE initialization
In api/runtime_manager.py, change line 83:
# BEFORE (line 80-86):
initial_config = {
"TODAY_DATE": date,
"SIGNATURE": model_sig,
"IF_TRADE": False, # BUG: Should be True
"JOB_ID": job_id,
"TRADING_DAY_ID": trading_day_id
}
# AFTER:
initial_config = {
"TODAY_DATE": date,
"SIGNATURE": model_sig,
"IF_TRADE": True, # FIX: Trades are expected by default
"JOB_ID": job_id,
"TRADING_DAY_ID": trading_day_id
}
Step 4: Run test to verify it passes
Run: ./venv/bin/python -m pytest tests/unit/test_runtime_manager.py::TestRuntimeConfigManager::test_create_runtime_config_if_trade_defaults_true -v
Expected: PASS
Step 5: Update existing test expectations
The existing test test_create_runtime_config_creates_file at line 66 expects IF_TRADE to be False. Update it:
# In test_create_runtime_config_creates_file, change line 66:
# BEFORE:
assert config["IF_TRADE"] is False
# AFTER:
assert config["IF_TRADE"] is True
Step 6: Run all runtime_manager tests
Run: ./venv/bin/python -m pytest tests/unit/test_runtime_manager.py -v
Expected: All tests PASS
Step 7: Verify integration test expectations
Check tests/integration/test_agent_pnl_integration.py line 63:
# Current mock (line 62-66):
mock_get_config.side_effect = lambda key: {
"IF_TRADE": False, # This may need updating depending on test scenario
"JOB_ID": "test-job",
"TODAY_DATE": "2025-01-15",
"SIGNATURE": "test-model"
}.get(key)
This test mocks a no-trade scenario, so False is correct here. No change needed.
Step 8: Commit IF_TRADE fix
git add api/runtime_manager.py tests/unit/test_runtime_manager.py
git commit -m "fix: initialize IF_TRADE to True (trades expected by default)
Root cause: IF_TRADE was initialized to False and never updated when
trades executed, causing 'No trading' message to always display.
Design documents (2025-02-11-complete-schema-migration) specify
IF_TRADE should start as True, with trades setting it to False only
after completion.
Fixes sporadic issue where all trading sessions reported 'No trading'
despite successful buy/sell actions."
Task 2: Add langchain-deepseek Dependency
Files:
- Modify:
requirements.txt - Verify:
venv/bin/pip list
Step 1: Add langchain-deepseek to requirements.txt
Add after line 3 in requirements.txt:
langchain==1.0.2
langchain-openai==1.0.1
langchain-mcp-adapters>=0.1.0
langchain-deepseek>=0.1.20
Step 2: Install new dependency
Run: ./venv/bin/pip install -r requirements.txt
Expected: Successfully installs langchain-deepseek and its dependencies
Step 3: Verify installation
Run: ./venv/bin/pip show langchain-deepseek
Expected: Shows package info with version >= 0.1.20
Step 4: Commit dependency addition
git add requirements.txt
git commit -m "deps: add langchain-deepseek for native DeepSeek support
Adds official LangChain DeepSeek integration to replace ChatOpenAI
wrapper approach for DeepSeek models. Native integration provides:
- Better tool_calls argument parsing
- DeepSeek-specific error handling
- No OpenAI compatibility layer issues
Version 0.1.20+ includes tool calling support for deepseek-chat."
Task 3: Implement Model Provider Factory
Files:
- Create:
agent/model_factory.py - Test:
tests/unit/test_model_factory.py
Rationale:
Currently base_agent.py hardcodes model creation logic. Extract to factory pattern to support multiple providers (OpenAI, DeepSeek, Anthropic, etc.) with provider-specific handling.
Step 1: Write failing test for model factory
Create tests/unit/test_model_factory.py:
"""Unit tests for model factory - provider-specific model creation"""
import pytest
from unittest.mock import Mock, patch
from agent.model_factory import create_model
class TestModelFactory:
"""Tests for create_model factory function"""
@patch('agent.model_factory.ChatDeepSeek')
def test_create_model_deepseek(self, mock_deepseek_class):
"""Test that DeepSeek models use ChatDeepSeek"""
mock_model = Mock()
mock_deepseek_class.return_value = mock_model
result = create_model(
basemodel="deepseek/deepseek-chat",
api_key="test-key",
base_url="https://api.deepseek.com",
temperature=0.7,
timeout=30
)
# Verify ChatDeepSeek was called with correct params
mock_deepseek_class.assert_called_once_with(
model="deepseek-chat", # Extracted from "deepseek/deepseek-chat"
api_key="test-key",
base_url="https://api.deepseek.com",
temperature=0.7,
timeout=30
)
assert result == mock_model
@patch('agent.model_factory.ChatOpenAI')
def test_create_model_openai(self, mock_openai_class):
"""Test that OpenAI models use ChatOpenAI"""
mock_model = Mock()
mock_openai_class.return_value = mock_model
result = create_model(
basemodel="openai/gpt-4",
api_key="test-key",
base_url="https://api.openai.com/v1",
temperature=0.7,
timeout=30
)
# Verify ChatOpenAI was called with correct params
mock_openai_class.assert_called_once_with(
model="openai/gpt-4",
api_key="test-key",
base_url="https://api.openai.com/v1",
temperature=0.7,
timeout=30
)
assert result == mock_model
@patch('agent.model_factory.ChatOpenAI')
def test_create_model_anthropic(self, mock_openai_class):
"""Test that Anthropic models use ChatOpenAI (via compatibility)"""
mock_model = Mock()
mock_openai_class.return_value = mock_model
result = create_model(
basemodel="anthropic/claude-sonnet-4.5",
api_key="test-key",
base_url="https://api.anthropic.com/v1",
temperature=0.7,
timeout=30
)
# Verify ChatOpenAI was used (Anthropic via OpenAI-compatible endpoint)
mock_openai_class.assert_called_once()
assert result == mock_model
@patch('agent.model_factory.ChatOpenAI')
def test_create_model_generic_provider(self, mock_openai_class):
"""Test that unknown providers default to ChatOpenAI"""
mock_model = Mock()
mock_openai_class.return_value = mock_model
result = create_model(
basemodel="custom/custom-model",
api_key="test-key",
base_url="https://api.custom.com",
temperature=0.7,
timeout=30
)
# Should fall back to ChatOpenAI for unknown providers
mock_openai_class.assert_called_once()
assert result == mock_model
def test_create_model_deepseek_extracts_model_name(self):
"""Test that DeepSeek model name is extracted correctly"""
with patch('agent.model_factory.ChatDeepSeek') as mock_class:
create_model(
basemodel="deepseek/deepseek-chat-v3.1",
api_key="key",
base_url="url",
temperature=0,
timeout=30
)
# Check that model param is just "deepseek-chat-v3.1"
call_kwargs = mock_class.call_args[1]
assert call_kwargs['model'] == "deepseek-chat-v3.1"
Step 2: Run test to verify it fails
Run: ./venv/bin/python -m pytest tests/unit/test_model_factory.py -v
Expected: FAIL with "ModuleNotFoundError: No module named 'agent.model_factory'"
Step 3: Implement model factory
Create agent/model_factory.py:
"""
Model factory for creating provider-specific chat models.
Supports multiple AI providers with native integrations where available:
- DeepSeek: Uses ChatDeepSeek for native tool calling support
- OpenAI: Uses ChatOpenAI
- Others: Fall back to ChatOpenAI (OpenAI-compatible endpoints)
"""
from typing import Any
from langchain_openai import ChatOpenAI
from langchain_deepseek import ChatDeepSeek
def create_model(
basemodel: str,
api_key: str,
base_url: str,
temperature: float,
timeout: int
) -> Any:
"""
Create appropriate chat model based on provider.
Args:
basemodel: Model identifier (e.g., "deepseek/deepseek-chat", "openai/gpt-4")
api_key: API key for the provider
base_url: Base URL for API endpoint
temperature: Sampling temperature (0-1)
timeout: Request timeout in seconds
Returns:
Provider-specific chat model instance
Examples:
>>> model = create_model("deepseek/deepseek-chat", "key", "url", 0.7, 30)
>>> isinstance(model, ChatDeepSeek)
True
>>> model = create_model("openai/gpt-4", "key", "url", 0.7, 30)
>>> isinstance(model, ChatOpenAI)
True
"""
# Extract provider from basemodel (format: "provider/model-name")
provider = basemodel.split("/")[0].lower() if "/" in basemodel else "unknown"
if provider == "deepseek":
# Use native ChatDeepSeek for DeepSeek models
# Extract model name without provider prefix
model_name = basemodel.split("/", 1)[1] if "/" in basemodel else basemodel
return ChatDeepSeek(
model=model_name,
api_key=api_key,
base_url=base_url,
temperature=temperature,
timeout=timeout
)
else:
# Use ChatOpenAI for OpenAI and OpenAI-compatible endpoints
# (Anthropic, Google, Qwen, etc. via compatibility layer)
return ChatOpenAI(
model=basemodel,
api_key=api_key,
base_url=base_url,
temperature=temperature,
timeout=timeout
)
Step 4: Run tests to verify they pass
Run: ./venv/bin/python -m pytest tests/unit/test_model_factory.py -v
Expected: All tests PASS
Step 5: Commit model factory
git add agent/model_factory.py tests/unit/test_model_factory.py
git commit -m "feat: add model factory for provider-specific chat models
Implements factory pattern to create appropriate chat model based on
provider prefix in basemodel string.
Supported providers:
- deepseek/*: Uses ChatDeepSeek (native tool calling)
- openai/*: Uses ChatOpenAI
- others: Fall back to ChatOpenAI (OpenAI-compatible)
This enables native DeepSeek integration while maintaining backward
compatibility with existing OpenAI-compatible providers."
Task 4: Integrate Model Factory into BaseAgent
Files:
- Modify:
agent/base_agent/base_agent.py:146-220 - Test:
tests/unit/test_base_agent.py(if exists) or manual verification
Step 1: Import model factory in base_agent.py
Add after line 33 in agent/base_agent/base_agent.py:
from agent.reasoning_summarizer import ReasoningSummarizer
from agent.model_factory import create_model # ADD THIS
Step 2: Replace model creation logic
Replace lines 208-220 in agent/base_agent/base_agent.py:
# BEFORE (lines 208-220):
if is_dev_mode():
from agent.mock_provider import MockChatModel
self.model = MockChatModel(date="2025-01-01")
print(f"🤖 Using MockChatModel (DEV mode)")
else:
self.model = ChatOpenAI(
model=self.basemodel,
base_url=self.openai_base_url,
api_key=self.openai_api_key,
temperature=0.7,
timeout=30
)
print(f"🤖 Using {self.basemodel} (PROD mode)")
# AFTER:
if is_dev_mode():
from agent.mock_provider import MockChatModel
self.model = MockChatModel(date="2025-01-01")
print(f"🤖 Using MockChatModel (DEV mode)")
else:
# Use model factory for provider-specific implementations
self.model = create_model(
basemodel=self.basemodel,
api_key=self.openai_api_key,
base_url=self.openai_base_url,
temperature=0.7,
timeout=30
)
# Determine model type for logging
model_class = self.model.__class__.__name__
print(f"🤖 Using {self.basemodel} via {model_class} (PROD mode)")
Step 3: Remove ChatOpenAI import if no longer used
Check if ChatOpenAI is imported but no longer used in base_agent.py:
# If line ~11 has:
from langchain_openai import ChatOpenAI
# And it's only used in the section we just replaced, remove it
# (Keep if used elsewhere in file)
Step 4: Manual verification test
Since this changes core agent initialization, test with actual execution:
Run: DEPLOYMENT_MODE=DEV python main.py configs/default_config.json
Expected:
- Logs show "Using deepseek-chat-v3.1 via ChatDeepSeek (PROD mode)" for DeepSeek
- Logs show "Using openai/gpt-5 via ChatOpenAI (PROD mode)" for OpenAI
- No import errors or model creation failures
Step 5: Run existing agent tests
Run: ./venv/bin/python -m pytest tests/unit/ -k agent -v
Expected: All agent-related tests still PASS (factory is transparent to existing behavior)
Step 6: Commit model factory integration
git add agent/base_agent/base_agent.py
git commit -m "refactor: use model factory in BaseAgent
Replaces direct ChatOpenAI instantiation with create_model() factory.
Benefits:
- DeepSeek models now use native ChatDeepSeek
- Other models continue using ChatOpenAI
- Provider-specific optimizations in one place
- Easier to add new providers
Logging now shows both model name and provider class for debugging."
Task 5: Add Integration Test for DeepSeek Tool Calls
Files:
- Create:
tests/integration/test_deepseek_tool_calls.py - Reference:
agent_tools/tool_math.py(math tool for testing)
Rationale: Verify that DeepSeek's tool_calls arguments are properly parsed to dicts without Pydantic validation errors.
Step 1: Write integration test
Create tests/integration/test_deepseek_tool_calls.py:
"""
Integration test for DeepSeek tool calls argument parsing.
Tests that ChatDeepSeek properly converts tool_calls.arguments (JSON string)
to tool_calls.args (dict) without Pydantic validation errors.
"""
import pytest
import os
from unittest.mock import patch, AsyncMock
from langchain_core.messages import AIMessage
from agent.model_factory import create_model
@pytest.mark.integration
class TestDeepSeekToolCalls:
"""Integration tests for DeepSeek tool calling"""
def test_create_model_returns_chat_deepseek_for_deepseek_models(self):
"""Verify that DeepSeek models use ChatDeepSeek class"""
# Skip if no DeepSeek API key available
if not os.getenv("OPENAI_API_KEY"):
pytest.skip("OPENAI_API_KEY not available")
model = create_model(
basemodel="deepseek/deepseek-chat",
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_API_BASE"),
temperature=0,
timeout=30
)
# Verify it's a ChatDeepSeek instance
assert model.__class__.__name__ == "ChatDeepSeek"
@pytest.mark.asyncio
async def test_deepseek_tool_calls_args_are_dicts(self):
"""Test that DeepSeek tool_calls.args are dicts, not strings"""
# Skip if no API key
if not os.getenv("OPENAI_API_KEY"):
pytest.skip("OPENAI_API_KEY not available")
# Create DeepSeek model
model = create_model(
basemodel="deepseek/deepseek-chat",
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_API_BASE"),
temperature=0,
timeout=30
)
# Bind a simple math tool
from langchain_core.tools import tool
@tool
def add(a: float, b: float) -> float:
"""Add two numbers"""
return a + b
model_with_tools = model.bind_tools([add])
# Invoke with a query that should trigger tool call
result = await model_with_tools.ainvoke(
"What is 5 plus 3?"
)
# Verify response is AIMessage
assert isinstance(result, AIMessage)
# Verify tool_calls exist
assert len(result.tool_calls) > 0, "Expected at least one tool call"
# Verify args are dicts, not strings
for tool_call in result.tool_calls:
assert isinstance(tool_call['args'], dict), \
f"tool_calls.args should be dict, got {type(tool_call['args'])}"
assert 'a' in tool_call['args'], "Missing expected arg 'a'"
assert 'b' in tool_call['args'], "Missing expected arg 'b'"
@pytest.mark.asyncio
async def test_deepseek_no_pydantic_validation_errors(self):
"""Test that DeepSeek doesn't produce Pydantic validation errors"""
# Skip if no API key
if not os.getenv("OPENAI_API_KEY"):
pytest.skip("OPENAI_API_KEY not available")
model = create_model(
basemodel="deepseek/deepseek-chat",
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("OPENAI_API_BASE"),
temperature=0,
timeout=30
)
from langchain_core.tools import tool
@tool
def multiply(a: float, b: float) -> float:
"""Multiply two numbers"""
return a * b
model_with_tools = model.bind_tools([multiply])
# This should NOT raise Pydantic validation errors
try:
result = await model_with_tools.ainvoke(
"Calculate 7 times 8"
)
assert isinstance(result, AIMessage)
except Exception as e:
# Check that it's not a Pydantic validation error
error_msg = str(e).lower()
assert "validation error" not in error_msg, \
f"Pydantic validation error occurred: {e}"
assert "input should be a valid dictionary" not in error_msg, \
f"tool_calls.args validation error occurred: {e}"
# Re-raise if it's a different error
raise
Step 2: Run test (may require API access)
Run: ./venv/bin/python -m pytest tests/integration/test_deepseek_tool_calls.py -v
Expected:
- If API key available: Tests PASS
- If no API key: Tests SKIPPED with message "OPENAI_API_KEY not available"
Step 3: Commit integration test
git add tests/integration/test_deepseek_tool_calls.py
git commit -m "test: add DeepSeek tool calls integration tests
Verifies that ChatDeepSeek properly handles tool_calls arguments:
- Returns ChatDeepSeek for deepseek/* models
- tool_calls.args are dicts (not JSON strings)
- No Pydantic validation errors on args
Tests skip gracefully if API keys not available."
Task 6: Update Documentation
Files:
- Modify:
CLAUDE.md(sections on model configuration and troubleshooting) - Modify:
CHANGELOG.md
Step 1: Update CLAUDE.md architecture section
In CLAUDE.md, find the "Agent System" section (around line 125) and update:
**BaseAgent Key Methods:**
- `initialize()`: Connect to MCP services, create AI model via model factory
- `run_trading_session(date)`: Execute single day's trading with retry logic
- `run_date_range(init_date, end_date)`: Process all weekdays in range
- `get_trading_dates()`: Resume from last date in position.jsonl
- `register_agent()`: Create initial position file with $10,000 cash
**Model Factory:**
The `create_model()` factory automatically selects the appropriate chat model:
- `deepseek/*` models → `ChatDeepSeek` (native tool calling support)
- `openai/*` models → `ChatOpenAI`
- Other providers → `ChatOpenAI` (OpenAI-compatible endpoint)
**Adding Custom Agents:**
[existing content remains the same]
Step 2: Update CLAUDE.md common issues section
In CLAUDE.md, find "Common Issues" (around line 420) and add:
**DeepSeek Pydantic Validation Errors:**
- Error: "Input should be a valid dictionary [type=dict_type, input_value='...', input_type=str]"
- Cause: Using `ChatOpenAI` for DeepSeek models (OpenAI compatibility layer issue)
- Fix: Ensure `langchain-deepseek` is installed and basemodel uses `deepseek/` prefix
- The model factory automatically uses `ChatDeepSeek` for native support
Step 3: Update CHANGELOG.md
Add new version entry at top of CHANGELOG.md:
## [0.4.2] - 2025-11-05
### Fixed
- Fixed "No trading" message always displaying despite trading activity by initializing `IF_TRADE` to `True` (trades expected by default)
- Resolved sporadic Pydantic validation errors for DeepSeek tool_calls arguments by switching to native `ChatDeepSeek` integration
### Added
- Added `agent/model_factory.py` for provider-specific model creation
- Added `langchain-deepseek` dependency for native DeepSeek support
- Added integration tests for DeepSeek tool calls argument parsing
### Changed
- `BaseAgent` now uses model factory instead of direct `ChatOpenAI` instantiation
- DeepSeek models (`deepseek/*`) now use `ChatDeepSeek` instead of OpenAI compatibility layer
Step 4: Commit documentation updates
git add CLAUDE.md CHANGELOG.md
git commit -m "docs: update for IF_TRADE and DeepSeek fixes
- Document model factory architecture
- Add troubleshooting for DeepSeek validation errors
- Update changelog with version 0.4.2 fixes"
Task 7: End-to-End Verification
Files:
- Test: Full simulation with DeepSeek model
- Verify: Logs show correct messages and no errors
Step 1: Run simulation with DeepSeek in PROD mode
Run:
# Ensure API keys are set
export OPENAI_API_KEY="your-deepseek-key"
export OPENAI_API_BASE="https://api.deepseek.com/v1"
export DEPLOYMENT_MODE=PROD
# Run short simulation (1 day)
python main.py configs/default_config.json
Step 2: Verify expected behaviors
Check logs for:
-
Model initialization:
- ✅ Should show: "🤖 Using deepseek/deepseek-chat-v3.1 via ChatDeepSeek (PROD mode)"
- ❌ Should NOT show: "via ChatOpenAI"
-
Tool calls execution:
- ✅ Should show: "[DEBUG] Extracted X tool messages from response"
- ❌ Should NOT show: "⚠️ Attempt 1 failed" with Pydantic validation errors
- Note: If retries occur for other reasons (network, rate limits), that's OK
-
Trading completion:
- ✅ Should show: "✅ Trading completed" (if trades occurred)
- ❌ Should NOT show: "📊 No trading, maintaining positions" (if trades occurred)
Step 3: Check database for trade records
Run:
sqlite3 data/jobs.db "SELECT job_id, date, model, status FROM trading_days ORDER BY created_at DESC LIMIT 5;"
Expected: Recent records show status='completed' for DeepSeek runs
Step 4: Verify position tracking
Run:
sqlite3 data/jobs.db "SELECT trading_day_id, action_type, symbol, quantity FROM actions WHERE trading_day_id IN (SELECT id FROM trading_days ORDER BY created_at DESC LIMIT 1);"
Expected: Shows buy/sell actions if AI made trades
Step 5: Run test suite
Run full test suite to ensure no regressions:
./venv/bin/python -m pytest tests/ -v --cov=. --cov-report=term-missing
Expected: All tests PASS, coverage >= 85%
Step 6: Final commit
git add -A
git commit -m "chore: verify end-to-end functionality after fixes
Confirmed:
- DeepSeek models use ChatDeepSeek (no validation errors)
- Trading completion shows correct message
- Database tracking works correctly
- All tests pass with good coverage"
Summary of Changes
Files Modified:
api/runtime_manager.py- IF_TRADE initialization fixrequirements.txt- Added langchain-deepseek dependencyagent/base_agent/base_agent.py- Integrated model factorytests/unit/test_runtime_manager.py- Updated test expectationsCLAUDE.md- Architecture and troubleshooting updatesCHANGELOG.md- Version 0.4.2 release notes
Files Created:
agent/model_factory.py- Provider-specific model creationtests/unit/test_model_factory.py- Model factory teststests/integration/test_deepseek_tool_calls.py- DeepSeek integration tests
Testing Strategy:
- Unit tests for IF_TRADE initialization
- Unit tests for model factory provider routing
- Integration tests for DeepSeek tool calls
- End-to-end verification with real simulation
- Full test suite regression check
Verification Commands:
# Quick test (unit tests only)
bash scripts/quick_test.sh
# Full test suite
bash scripts/run_tests.sh
# End-to-end simulation
DEPLOYMENT_MODE=PROD python main.py configs/default_config.json
Notes for Engineer
Key Architectural Changes:
- Factory pattern separates provider-specific logic from agent core
- Native integrations preferred over compatibility layers
- IF_TRADE semantics: True = trades expected, tools set to False after execution
Why These Fixes Work:
- IF_TRADE: Design always intended True initialization, False was a typo
- DeepSeek: Native ChatDeepSeek handles tool_calls parsing correctly, eliminating sporadic OpenAI compatibility layer bugs
Testing Philosophy:
- @superpowers:test-driven-development - Write test first, watch it fail, implement, verify pass
- @superpowers:verification-before-completion - Never claim "it works" without running verification
- Each commit should leave the codebase in a working state
If You Get Stuck:
- Check logs for exact error messages
- Run pytest with
-vvfor verbose output - Use
git diffto verify changes match plan - @superpowers:systematic-debugging - Never guess, always investigate root cause