mirror of
https://github.com/Xe138/AI-Trader.git
synced 2026-04-01 17:17:24 -04:00
fix: resolve DeepSeek tool_calls args parsing validation error
Added ToolCallArgsParsingWrapper to handle AI providers (like DeepSeek) that return tool_calls.args as JSON strings instead of dictionaries. The wrapper monkey-patches ChatOpenAI's _create_chat_result method to parse string arguments before AIMessage construction, preventing Pydantic validation errors. Changes: - New: agent/chat_model_wrapper.py - Wrapper implementation - Modified: agent/base_agent/base_agent.py - Wrap model during init - Modified: CHANGELOG.md - Document fix as v0.4.1 - New: tests/unit/test_chat_model_wrapper.py - Unit tests Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -33,6 +33,7 @@ from tools.deployment_config import (
|
||||
from agent.context_injector import ContextInjector
|
||||
from agent.pnl_calculator import DailyPnLCalculator
|
||||
from agent.reasoning_summarizer import ReasoningSummarizer
|
||||
from agent.chat_model_wrapper import ToolCallArgsParsingWrapper
|
||||
|
||||
# Load environment variables
|
||||
load_dotenv()
|
||||
@@ -208,10 +209,10 @@ class BaseAgent:
|
||||
# Create AI model (mock in DEV mode, real in PROD mode)
|
||||
if is_dev_mode():
|
||||
from agent.mock_provider import MockChatModel
|
||||
self.model = MockChatModel(date="2025-01-01") # Date will be updated per session
|
||||
base_model = MockChatModel(date="2025-01-01") # Date will be updated per session
|
||||
print(f"🤖 Using MockChatModel (DEV mode)")
|
||||
else:
|
||||
self.model = ChatOpenAI(
|
||||
base_model = ChatOpenAI(
|
||||
model=self.basemodel,
|
||||
base_url=self.openai_base_url,
|
||||
api_key=self.openai_api_key,
|
||||
@@ -219,6 +220,10 @@ class BaseAgent:
|
||||
timeout=30
|
||||
)
|
||||
print(f"🤖 Using {self.basemodel} (PROD mode)")
|
||||
|
||||
# Wrap model to fix tool_calls args parsing
|
||||
self.model = ToolCallArgsParsingWrapper(model=base_model)
|
||||
print(f"✅ Applied tool_calls args parsing wrapper")
|
||||
except Exception as e:
|
||||
raise RuntimeError(f"❌ Failed to initialize AI model: {e}")
|
||||
|
||||
@@ -541,7 +546,7 @@ Summary:"""
|
||||
|
||||
# Update mock model date if in dev mode
|
||||
if is_dev_mode():
|
||||
self.model.date = today_date
|
||||
self.model.wrapped_model.date = today_date
|
||||
|
||||
# Get job_id from context injector
|
||||
job_id = self.context_injector.job_id if self.context_injector else get_config_value("JOB_ID")
|
||||
|
||||
Reference in New Issue
Block a user