--- phase: 04-single-model-qa plan: 01 subsystem: api tags: [openai, ai-client, requesty, openrouter, async] # Dependency graph requires: - phase: 03-project-crud provides: BotConfig pattern, project context provides: - AIClient class for AI model interactions - MODEL_MAP with claude/gpt/gemini short names - Module-level init_ai_client/get_ai_client functions - Config extended with AI router settings affects: [04-02, 04-03, 05-multi-model, discussion handlers] # Tech tracking tech-stack: added: [openai] patterns: [async-client-singleton, model-routing-abstraction] key-files: created: [src/moai/core/ai_client.py] modified: [pyproject.toml, src/moai/bot/config.py] key-decisions: - "OpenAI SDK for router abstraction (both Requesty and OpenRouter are OpenAI-compatible)" - "Module-level singleton pattern for AI client (matches database pattern)" - "Short model names (claude/gpt/gemini) mapped to full identifiers" patterns-established: - "AI client abstraction: all AI calls go through AIClient.complete()" - "Model name resolution: short names in code, full identifiers to routers" issues-created: [] # Metrics duration: 5min completed: 2026-01-16 --- # Phase 04-01: AI Client Abstraction Summary **OpenAI SDK-based AI client with Requesty/OpenRouter routing and claude/gpt/gemini model mappings** ## Performance - **Duration:** 5 min - **Started:** 2026-01-16T19:00:00Z - **Completed:** 2026-01-16T19:05:00Z - **Tasks:** 2 - **Files modified:** 3 ## Accomplishments - Created AIClient class wrapping AsyncOpenAI for model routing - Extended BotConfig with ai_router, ai_api_key, ai_referer settings - Added MODEL_MAP with claude, gpt, gemini short name mappings - Implemented module-level singleton pattern with init_ai_client/get_ai_client ## Task Commits Each task was committed atomically: 1. **Task 1: Add openai dependency and extend config** - `3740691` (feat) 2. **Task 2: Create AI client abstraction** - `e04ce4e` (feat) **Plan metadata:** `f8fa4e7` (docs) ## Files Created/Modified - `src/moai/core/ai_client.py` - AIClient class, MODEL_MAP, init/get functions - `pyproject.toml` - Added openai dependency - `src/moai/bot/config.py` - Extended BotConfig with AI settings ## Decisions Made - Used OpenAI SDK instead of raw httpx - both Requesty and OpenRouter are OpenAI-compatible - Default router is "requesty" (can be changed via AI_ROUTER env var) - Model short names (claude/gpt/gemini) resolve to specific model versions ## Deviations from Plan None - plan executed exactly as written. ## Issues Encountered None. ## Next Phase Readiness - AI client foundation ready for /ask command implementation in 04-02 - Model routing abstraction enables easy addition of new models - Singleton pattern allows handlers to access client via get_ai_client() --- *Phase: 04-single-model-qa* *Completed: 2026-01-16*