XmLLM / src /app /api /routes_providers.py
Claude
Sprint 8: FastAPI routes — providers, jobs, exports, viewer
240c946 unverified
Raw
History Blame Contribute Delete
2.02 kB
"""Provider management routes."""
from __future__ import annotations
from typing import Any
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel, Field
from src.app.api import get_db, get_file_store
router = APIRouter(prefix="/providers", tags=["providers"])
class ProviderCreateRequest(BaseModel):
provider_id: str = Field(min_length=1)
display_name: str = Field(min_length=1)
runtime_type: str = Field(min_length=1)
model_id_or_path: str = Field(min_length=1)
family: str = Field(min_length=1)
endpoint: str | None = None
auth_mode: str = "none"
timeout: int = Field(default=120, gt=0)
prompt_template: str | None = None
class ProviderResponse(BaseModel):
provider_id: str
data: dict[str, Any]
@router.post("", status_code=201)
async def register_provider(req: ProviderCreateRequest) -> ProviderResponse:
"""Register a new provider profile."""
db = get_db()
store = get_file_store()
data = req.model_dump()
db.save_provider_record(req.provider_id, data)
store.save_provider(req.provider_id, data)
return ProviderResponse(provider_id=req.provider_id, data=data)
@router.get("")
async def list_providers() -> list[dict[str, Any]]:
"""List all registered providers."""
db = get_db()
return db.list_provider_records()
@router.get("/{provider_id}")
async def get_provider(provider_id: str) -> dict[str, Any]:
"""Get a provider by ID."""
db = get_db()
record = db.get_provider_record(provider_id)
if record is None:
raise HTTPException(status_code=404, detail=f"Provider '{provider_id}' not found")
return record
@router.delete("/{provider_id}", status_code=204)
async def delete_provider(provider_id: str) -> None:
"""Delete a provider."""
db = get_db()
store = get_file_store()
if not db.delete_provider_record(provider_id):
raise HTTPException(status_code=404, detail=f"Provider '{provider_id}' not found")
store.delete_provider(provider_id)