[project] name = "awoooi-api" version = "0.1.0" description = "AWOOOI BFF API Gateway" readme = "README.md" requires-python = ">=3.11" dependencies = [ "fastapi>=0.115.0", # Upgraded for starlette 1.0.0 compatibility (claude-agent-sdk) "uvicorn[standard]>=0.27.0", "pydantic>=2.5.0", "pydantic-settings>=2.1.0", "httpx>=0.26.0", "redis>=5.0.0", "asyncpg>=0.29.0", "structlog>=24.1.0", # CTO-201: Infrastructure Execution Engine "kubernetes-asyncio>=29.0.0", "sqlalchemy[asyncio]>=2.0.0", # NOTE: 禁止 aiosqlite/SQLite (AWOOOI 鐵律 #2),使用 asyncpg + PostgreSQL # OpenTelemetry (SigNoz Integration) "opentelemetry-api>=1.20.0", "opentelemetry-sdk>=1.20.0", "opentelemetry-exporter-otlp>=1.20.0", "opentelemetry-instrumentation-fastapi>=0.41b0", "opentelemetry-instrumentation-httpx>=0.41b0", "opentelemetry-instrumentation-logging>=0.41b0", # Sentry (Error Tracking - 補強 SignOz,Self-Hosted @ 192.168.0.110) "sentry-sdk[fastapi]>=2.0.0", # Langfuse (LLMOps - Phase 15.1,Self-Hosted @ 192.168.0.110:3100) # 2026-04-02 Claude Code: 鎖定 v2.60.x — v3.x/v4.x 移除 client.trace() API,與 langfuse_client.py 不相容 # v2.x 最高版 = 2.60.10,有 client.trace()、trace.generation()、trace.score() "langfuse>=2.0.0,<3.0.0", # Prometheus (ADR-037 Wave A.5 監控指標) "prometheus-client>=0.20.0", # Phase 6.4g: leWOOOgo Brain - 積木化決策引擎 # NOTE: Local packages 透過 Dockerfile 預先安裝,無需在此列出 # 請參閱 apps/api/Dockerfile Phase 6.4i 註解 # Phase 9: Agent Teams - Claude Agent SDK "claude-agent-sdk>=0.1.50", ] # [tool.uv.sources] # lewooogo-brain = { path = "../../packages/lewooogo-brain", editable = true } [project.optional-dependencies] dev = [ "pytest>=7.4.0", "pytest-asyncio>=0.23.0", "pytest-cov>=4.1.0", "ruff>=0.1.0", "mypy>=1.8.0", ] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src"] [tool.ruff] target-version = "py311" line-length = 88 [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # Pyflakes "I", # isort "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade ] ignore = [ "E501", # line too long (handled by formatter) ] [tool.ruff.lint.isort] known-first-party = ["src"] [tool.mypy] python_version = "3.11" # 漸進式類型檢查 (業界最佳實踐) # strict = true # TODO: 當所有模組都完成類型註解後啟用 warn_return_any = true warn_unused_configs = true disallow_untyped_defs = false # 暫時關閉,允許部分函數無類型 disallow_incomplete_defs = false check_untyped_defs = true ignore_missing_imports = true no_implicit_optional = true warn_redundant_casts = true warn_unused_ignores = true # 排除舊代碼 (漸進式遷移) [[tool.mypy.overrides]] module = [ "scripts.*", "tests.*", ] ignore_errors = true [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] markers = [ "integration: 需要外部服務 (Redis/PostgreSQL/K8s) 的整合測試,需在有外部服務的環境執行", ]