# ADR-008: Python 模組化獨立積木架構 **狀態**: 已批准 ✅ 完整實施 **日期**: 2026-03-23 **決策者**: CEO (統帥) + C-Suite **執行者**: CTO + Claude Code **驗收日期**: 2026-03-28 (Phase 16 首席架構師審查 50/50 OUTSTANDING) ## 背景 AWOOOI 2.0 的後端 Python 代碼 (`apps/api/src/services/`) 出現以下問題: 1. **模組化原則淡化**: 所有邏輯直接寫在 `services/` 目錄,未建立獨立積木 2. **跨模組非法引用**: `proposal_service.py` 直接 import `redis_client`, `db.base` 3. **前後端積木不對稱**: 前端有 `packages/lewooogo-core` (TS),後端無對應 Python 積木 4. **Skill Registry 缺失**: 6 個 Skill MD 檔案無動態載入機制 ## 決策 **採用統帥方案 (方案 A): 在 `packages/` 下建立獨立 Python 積木** ### 放棄的方案 - **方案 B (漸進式)**: 在 `apps/api/src/` 內建立 `brain/`、`memory/` 模組 - **理由**: 無法達成真正的物理隔離,違反 leWOOOgo 積木化原則 ### 採用的技術 ```toml # apps/api/pyproject.toml dependencies = [ "lewooogo-brain @ file:../../packages/lewooogo-brain", "lewooogo-data @ file:../../packages/lewooogo-data", ] ``` 使用 `pip install -e .` (Editable Install) 達成本地聯動開發。 ## 積木職責定義 ### lewooogo-brain (AI 邏輯積木) | 模組 | 職責 | |------|------| | `interfaces/` | ABC 定義 (IProposalEngine, IIncidentProcessor) | | `engines/` | 推論引擎 (IncidentEngine, ProposalEngine) | | `skills/` | Skill 動態載入器 | ### lewooogo-data (資料抽象積木) | 模組 | 職責 | |------|------| | `interfaces/` | ABC 定義 (IMemoryProvider) | | `providers/` | 具體實作 (RedisMemory, PgMemory) | ## 目錄結構 ``` packages/ ├── lewooogo-core/ # TS 前端積木 (已有) ├── lewooogo-brain/ # Python AI 積木 (新建) │ ├── pyproject.toml │ └── src/lewooogo_brain/ │ ├── __init__.py │ ├── interfaces/ │ │ ├── __init__.py │ │ ├── proposal_engine.py │ │ └── incident_processor.py │ ├── engines/ │ │ ├── __init__.py │ │ ├── incident_engine.py │ │ └── proposal_engine.py │ └── skills/ │ ├── __init__.py │ └── loader.py └── lewooogo-data/ # Python 資料積木 (新建) ├── pyproject.toml └── src/lewooogo_data/ ├── __init__.py ├── interfaces/ │ ├── __init__.py │ └── memory_provider.py └── providers/ ├── __init__.py ├── redis_memory.py └── pg_memory.py ``` ## 引用方式 ```python # apps/api/src/api/v1/incidents.py from lewooogo_brain.engines import ProposalEngine from lewooogo_data.providers import RedisMemory engine = ProposalEngine(memory=RedisMemory()) proposal = await engine.generate(incident_id) ``` ## 依賴配置 ### lewooogo-brain ```toml dependencies = [ "pydantic>=2.5.0", "structlog>=24.1.0", "opentelemetry-api>=1.20.0", "lewooogo-data", # 依賴資料積木 ] ``` ### lewooogo-data ```toml dependencies = [ "pydantic>=2.5.0", "redis>=5.0.0", "sqlalchemy[asyncio]>=2.0.0", "structlog>=24.1.0", ] ``` ## 後果 ### 優點 1. **完全物理隔離**: Brain 和 Data 積木可獨立測試、獨立部署 2. **可複用性**: 其他專案可直接引用這些積木 3. **符合 leWOOOgo 原則**: 高內聚、低耦合 4. **介面先行**: 強制定義 ABC,再實作具體類別 ### 缺點 1. **初期工時增加**: 約 3-4 天建立積木骨架 2. **依賴管理複雜度**: 需維護多個 pyproject.toml 3. **學習曲線**: 團隊需適應新的引用方式 ## 實施狀態 (Phase 16) > **首席架構師驗收**: 2026-03-28 **50/50 OUTSTANDING** ### 實施成果 | 項目 | 結果 | |------|------| | 絞殺者模式 (USE_NEW_ENGINE) | ✅ 雙軌切換完美運作 | | Repository 抽象化 | ✅ 7 個 Repository 已建立 | | Router 瘦身 | ✅ 1,097 → 796 行 (-28%) | | 封存策略 | ✅ 866 行 → `_archived/` | ### 模組化 5 問驗證 | # | 問題 | 結果 | |---|------|------| | 1 | 邏輯是否已存在於 packages? | ✅ | | 2 | Router 是否只做 HTTP 轉發? | ✅ | | 3 | Service 是否依賴 Interface? | ✅ | | 4 | 是否可被其他模組重用? | ✅ | | 5 | 是否遵循依賴注入? | ✅ | ## 相關決策 - ADR-003: leWOOOgo 模組架構 (前端 TS 版) - ADR-005: BFF 閘道架構 ## 參考資料 - [Python Packaging User Guide](https://packaging.python.org/) - [PEP 621 – Storing project metadata in pyproject.toml](https://peps.python.org/pep-0621/) - Phase 16 計畫: `memory/project_phase16_great_refactoring.md`