diff --git a/src/backend/api/routes/health.py b/src/backend/api/routes/health.py index d688a9d..256f3ee 100644 --- a/src/backend/api/routes/health.py +++ b/src/backend/api/routes/health.py @@ -1,8 +1,9 @@ from fastapi import APIRouter, Depends from src.backend.api.dependencies import verify_api_key +from src.backend.config import settings from src.backend.db.database import get_db -from src.backend.models.api import ok +from src.backend.models.api import ok, fail from src.backend.services.worker_client import WorkerClient router = APIRouter(dependencies=[Depends(verify_api_key)]) @@ -26,3 +27,17 @@ async def health(): "database": db_ok, "worker": worker_ok, }) + + +@router.get("/models", summary="List available models", tags=["system"]) +async def list_models(): + worker = WorkerClient() + result = await worker.models() + + if not result.get("success"): + return fail("WORKER_ERROR", result.get("error", "Failed to fetch models")) + + return ok({ + "default_model": settings.claude_model, + "models": result["models"], + }) diff --git a/src/backend/services/worker_client.py b/src/backend/services/worker_client.py index 7da8650..d7d42de 100644 --- a/src/backend/services/worker_client.py +++ b/src/backend/services/worker_client.py @@ -38,6 +38,11 @@ class WorkerClient: ) return resp.json() + async def models(self) -> dict: + async with httpx.AsyncClient(timeout=30.0) as client: + resp = await client.get(f"{self.base_url}/models") + return resp.json() + async def health(self) -> bool: try: async with httpx.AsyncClient(timeout=5.0) as client: diff --git a/worker/index.js b/worker/index.js index 072cddc..835173b 100644 --- a/worker/index.js +++ b/worker/index.js @@ -11,6 +11,20 @@ app.get("/health", (_req, res) => { res.json({ status: "ok" }); }); +app.get("/models", async (_req, res) => { + try { + const conv = query({ + prompt: ".", + options: { model: "claude-sonnet-4-6", allowedTools: [] }, + }); + const models = await conv.supportedModels(); + await conv.return(); + res.json({ success: true, models }); + } catch (error) { + res.json({ success: false, error: error.message }); + } +}); + app.post("/process", async (req, res) => { const { prompt, system_prompt, model, session_id } = req.body;