Renames the chat caller to a name that signals its actual purpose, and factors the reusable cached-system-block + cached-history + cache-usage-log primitives out to app.core.ai_provider so they can be shared with the provider-generic path without pulling MCP/beta/images into the abstract interface. Helpers added to ai_provider.py: - `build_anthropic_chat_messages(history, new_message, images, format_reminder)` — owns: copy history, apply cache_control to last history message, append format reminder to new message, render images as multimodal blocks. Anthropic-shaped by design; do not call from Gemini paths. chat_call_cached keeps exactly the concerns that are unique to the one MCP/beta/multimodal chat caller: - Anthropic beta endpoint invocation - Microsoft Learn MCP server wiring (ENABLE_MCP_MICROSOFT_LEARN) - Retry-without-MCP fallback - Format-reminder content string (declared as module constant) - Phase 0.5 telemetry (mcp.turn, mcp.fallback) Documents in the module docstring AND at the function site that this is the ONE MCP/beta chat caller and should not become the general provider path. MCP/beta/images are features of exactly one optional Anthropic beta endpoint; routing them through AnthropicProvider would leak a provider- specific concern into the abstract interface that also serves Gemini. Behavior change: chat_call_cached now reuses the singleton AnthropicProvider HTTP client via `_get_anthropic_client(...)` instead of instantiating a new `anthropic.AsyncAnthropic(...)` per call. Matches the provider's own pattern and avoids burning connections per-turn. No user-visible difference. No runtime verification from code-server. TODO(phase0-verify) in ai_provider.py tracks the cache-hit verification owed on the new dev env. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Troubleshooting Decision Tree - Backend API
FastAPI backend for the Troubleshooting Decision Tree application.
Quick Start
1. Set up Python environment
cd backend
python -m venv venv
# Windows
venv\Scripts\activate
# macOS/Linux
source venv/bin/activate
pip install -r requirements.txt
2. Start PostgreSQL database
Using Docker:
docker-compose up -d
Or install PostgreSQL locally and create a database:
CREATE DATABASE decision_tree;
3. Configure environment
Copy the example env file and update as needed:
cp .env.example .env
4. Run database migrations
alembic upgrade head
5. Start the server
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
The API will be available at:
- API: http://localhost:8000
- Docs: http://localhost:8000/api/docs
- ReDoc: http://localhost:8000/api/redoc
API Endpoints
Authentication
POST /api/v1/auth/register- Register new userPOST /api/v1/auth/login- Login (form data)POST /api/v1/auth/login/json- Login (JSON body)POST /api/v1/auth/refresh- Refresh tokenGET /api/v1/auth/me- Get current userPOST /api/v1/auth/logout- Logout
Trees
GET /api/v1/trees- List all treesGET /api/v1/trees/categories- List categoriesGET /api/v1/trees/search?q=query- Search treesGET /api/v1/trees/{id}- Get specific treePOST /api/v1/trees- Create tree (engineer/admin)PUT /api/v1/trees/{id}- Update tree (engineer/admin)DELETE /api/v1/trees/{id}- Delete tree (admin)
Sessions
GET /api/v1/sessions- List user's sessionsGET /api/v1/sessions/{id}- Get specific sessionPOST /api/v1/sessions- Start new sessionPUT /api/v1/sessions/{id}- Update sessionPOST /api/v1/sessions/{id}/complete- Complete sessionPOST /api/v1/sessions/{id}/export- Export session
Development
Create new migration
alembic revision --autogenerate -m "description"
Run migrations
alembic upgrade head
Rollback migration
alembic downgrade -1
Project Structure
backend/
├── alembic/ # Database migrations
│ └── versions/
├── app/
│ ├── api/
│ │ ├── endpoints/ # API route handlers
│ │ ├── deps.py # Dependencies (auth, etc.)
│ │ └── router.py # Main router
│ ├── core/
│ │ ├── config.py # Settings
│ │ ├── database.py # DB connection
│ │ └── security.py # JWT, password hashing
│ ├── models/ # SQLAlchemy models
│ ├── schemas/ # Pydantic schemas
│ └── main.py # FastAPI app
├── tests/
├── alembic.ini
├── docker-compose.yml
├── requirements.txt
└── README.md