feat: add config module with pydantic-settings
This commit is contained in:
parent
2a2e98c53d
commit
a9e0115824
35
.env.example
Normal file
35
.env.example
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# .env.example
|
||||||
|
# LLM
|
||||||
|
ANTHROPIC_API_KEY=sk-ant-...
|
||||||
|
|
||||||
|
# Gitea
|
||||||
|
GITEA_URL=http://gitea:3000
|
||||||
|
GITEA_EXTERNAL_URL=https://ayuriel.duckdns.org
|
||||||
|
GITEA_TOKEN=
|
||||||
|
GITEA_WEBHOOK_SECRET=
|
||||||
|
|
||||||
|
# Discord
|
||||||
|
DISCORD_TOKEN=
|
||||||
|
DISCORD_CHANNEL_ID=
|
||||||
|
DISCORD_BOT_USER_ID=
|
||||||
|
|
||||||
|
# LangGraph
|
||||||
|
LANGGRAPH_URL=http://langgraph-server:8123
|
||||||
|
|
||||||
|
# Agent
|
||||||
|
AUTONOMY_LEVEL=conservative
|
||||||
|
DEFAULT_REPO_OWNER=quant
|
||||||
|
DEFAULT_REPO_NAME=galaxis-po
|
||||||
|
AGENT_API_KEY=
|
||||||
|
|
||||||
|
# Sandbox
|
||||||
|
SANDBOX_IMAGE=galaxis-sandbox:latest
|
||||||
|
SANDBOX_MEM_LIMIT=4g
|
||||||
|
SANDBOX_CPU_COUNT=2
|
||||||
|
SANDBOX_TIMEOUT=600
|
||||||
|
|
||||||
|
# Database
|
||||||
|
TEST_DATABASE_URL=postgresql://user:pass@postgres:5432/galaxis_test
|
||||||
|
|
||||||
|
# Encryption
|
||||||
|
FERNET_KEY=
|
||||||
65
agent/config.py
Normal file
65
agent/config.py
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
from pydantic_settings import BaseSettings
|
||||||
|
|
||||||
|
|
||||||
|
class Settings(BaseSettings):
|
||||||
|
# LLM
|
||||||
|
ANTHROPIC_API_KEY: str
|
||||||
|
|
||||||
|
# Gitea
|
||||||
|
GITEA_URL: str = "http://gitea:3000"
|
||||||
|
GITEA_EXTERNAL_URL: str = "https://ayuriel.duckdns.org"
|
||||||
|
GITEA_TOKEN: str
|
||||||
|
GITEA_WEBHOOK_SECRET: str
|
||||||
|
|
||||||
|
# Discord
|
||||||
|
DISCORD_TOKEN: str
|
||||||
|
DISCORD_CHANNEL_ID: str = ""
|
||||||
|
DISCORD_BOT_USER_ID: str = ""
|
||||||
|
|
||||||
|
# LangGraph
|
||||||
|
LANGGRAPH_URL: str = "http://langgraph-server:8123"
|
||||||
|
|
||||||
|
# Agent
|
||||||
|
AUTONOMY_LEVEL: str = "conservative"
|
||||||
|
DEFAULT_REPO_OWNER: str = "quant"
|
||||||
|
DEFAULT_REPO_NAME: str = "galaxis-po"
|
||||||
|
AGENT_API_KEY: str = ""
|
||||||
|
|
||||||
|
# Sandbox
|
||||||
|
SANDBOX_IMAGE: str = "galaxis-sandbox:latest"
|
||||||
|
SANDBOX_MEM_LIMIT: str = "4g"
|
||||||
|
SANDBOX_CPU_COUNT: int = 2
|
||||||
|
SANDBOX_TIMEOUT: int = 600
|
||||||
|
SANDBOX_PIDS_LIMIT: int = 256
|
||||||
|
|
||||||
|
# Database
|
||||||
|
TEST_DATABASE_URL: str = ""
|
||||||
|
|
||||||
|
# Encryption
|
||||||
|
FERNET_KEY: str = ""
|
||||||
|
|
||||||
|
# Path access control
|
||||||
|
WRITABLE_PATHS: list[str] = [
|
||||||
|
"backend/app/",
|
||||||
|
"backend/tests/",
|
||||||
|
"frontend/src/",
|
||||||
|
"backend/alembic/versions/",
|
||||||
|
"docs/",
|
||||||
|
]
|
||||||
|
BLOCKED_PATHS: list[str] = [
|
||||||
|
".env",
|
||||||
|
"docker-compose.prod.yml",
|
||||||
|
"quant.md",
|
||||||
|
]
|
||||||
|
|
||||||
|
# Auto merge
|
||||||
|
AUTO_MERGE: bool = False
|
||||||
|
REQUIRE_TESTS: bool = True
|
||||||
|
REQUIRE_E2E: bool = False
|
||||||
|
MAX_FILES_CHANGED: int = 10
|
||||||
|
|
||||||
|
# Cost limits
|
||||||
|
DAILY_COST_LIMIT_USD: float = 10.0
|
||||||
|
PER_TASK_COST_LIMIT_USD: float = 3.0
|
||||||
|
|
||||||
|
model_config = {"env_file": ".env", "extra": "ignore"}
|
||||||
39
tests/test_config.py
Normal file
39
tests/test_config.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
import pytest
|
||||||
|
from agent.config import Settings
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def test_settings(monkeypatch):
|
||||||
|
"""테스트용 환경변수로 Settings 인스턴스 생성"""
|
||||||
|
monkeypatch.setenv("ANTHROPIC_API_KEY", "test-key")
|
||||||
|
monkeypatch.setenv("GITEA_TOKEN", "test-token")
|
||||||
|
monkeypatch.setenv("GITEA_WEBHOOK_SECRET", "test-secret")
|
||||||
|
monkeypatch.setenv("DISCORD_TOKEN", "test-token")
|
||||||
|
monkeypatch.setenv("FERNET_KEY", "dGVzdGtleXRlc3RrZXl0ZXN0a2V5dGVzdGtleXg=")
|
||||||
|
return Settings()
|
||||||
|
|
||||||
|
|
||||||
|
def test_config_loads_defaults(test_settings):
|
||||||
|
assert test_settings.GITEA_URL == "http://gitea:3000"
|
||||||
|
assert test_settings.AUTONOMY_LEVEL == "conservative"
|
||||||
|
assert test_settings.SANDBOX_TIMEOUT == 600
|
||||||
|
assert test_settings.DEFAULT_REPO_OWNER == "quant"
|
||||||
|
assert test_settings.DEFAULT_REPO_NAME == "galaxis-po"
|
||||||
|
assert test_settings.SANDBOX_MEM_LIMIT == "4g"
|
||||||
|
assert test_settings.SANDBOX_CPU_COUNT == 2
|
||||||
|
|
||||||
|
|
||||||
|
def test_config_autonomy_levels(test_settings):
|
||||||
|
assert test_settings.AUTONOMY_LEVEL in ("conservative", "autonomous")
|
||||||
|
|
||||||
|
|
||||||
|
def test_writable_paths_include_backend(test_settings):
|
||||||
|
assert "backend/app/" in test_settings.WRITABLE_PATHS
|
||||||
|
assert "backend/tests/" in test_settings.WRITABLE_PATHS
|
||||||
|
assert "backend/alembic/versions/" in test_settings.WRITABLE_PATHS
|
||||||
|
|
||||||
|
|
||||||
|
def test_blocked_paths_include_protected_files(test_settings):
|
||||||
|
assert ".env" in test_settings.BLOCKED_PATHS
|
||||||
|
assert "quant.md" in test_settings.BLOCKED_PATHS
|
||||||
|
assert "docker-compose.prod.yml" in test_settings.BLOCKED_PATHS
|
||||||
Loading…
x
Reference in New Issue
Block a user