From 4254f4aed0327fda777b4796984a5d8c4d2e4b92 Mon Sep 17 00:00:00 2001 From: Davi Samora Date: Fri, 19 Dec 2025 14:37:32 -0300 Subject: [PATCH] Fix strategy service crash: update pydantic-settings v2 config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The strategy service was crashing with exit status 3 on Render deployment because pydantic-settings v2 doesn't automatically parse comma-separated environment variables into List[str] types. Changes: - Replace deprecated `class Config` with `model_config = SettingsConfigDict()` - Add `@field_validator` for symbols field to parse comma-separated strings (e.g., "BTCUSDT,ETHUSDT" -> ["BTCUSDT", "ETHUSDT"]) This fixes the startup crash when SYMBOLS env var is set in Render. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- strategy/src/config.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/strategy/src/config.py b/strategy/src/config.py index 7e218a4..4a6902c 100644 --- a/strategy/src/config.py +++ b/strategy/src/config.py @@ -3,13 +3,18 @@ from functools import lru_cache from typing import List -from pydantic import Field -from pydantic_settings import BaseSettings +from pydantic import Field, field_validator +from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): """Application settings loaded from environment variables.""" + model_config = SettingsConfigDict( + env_file=".env", + env_file_encoding="utf-8", + ) + # Database database_url: str = Field(default="sqlite:///data/trades.db") @@ -50,9 +55,13 @@ class Settings(BaseSettings): host: str = Field(default="0.0.0.0") port: int = Field(default=8000) - class Config: - env_file = ".env" - env_file_encoding = "utf-8" + @field_validator("symbols", mode="before") + @classmethod + def parse_symbols(cls, v: str | List[str]) -> List[str]: + """Parse comma-separated symbols from environment variable.""" + if isinstance(v, str): + return [s.strip() for s in v.split(",") if s.strip()] + return v @lru_cache