routes.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. from core_domain import ChatCompletionRequestContract, ChatCompletionResponseContract, ServiceHealth
  2. from fastapi import APIRouter, Depends, HTTPException
  3. from sqlalchemy import text
  4. from sqlalchemy.orm import Session
  5. from app.application.services import ModelGatewayApplicationService
  6. from app.bootstrap.settings import ModelGatewayServiceSettings
  7. from app.db.session import get_db
  8. from app.domain.repositories import ModelDefinitionRepository
  9. from app.infrastructure.provider import ModelProviderClient, ModelProviderClientError
  10. from app.schemas.model import (
  11. ModelCreateRequest,
  12. ModelResponse,
  13. ModelStatusUpdateRequest,
  14. ModelTestRequest,
  15. ModelTestResponse,
  16. ModelUpdateRequest,
  17. )
  18. router = APIRouter()
  19. def get_model_gateway_settings() -> ModelGatewayServiceSettings:
  20. return ModelGatewayServiceSettings()
  21. def get_model_gateway_application_service(
  22. db: Session = Depends(get_db),
  23. settings: ModelGatewayServiceSettings = Depends(get_model_gateway_settings)) -> ModelGatewayApplicationService:
  24. return ModelGatewayApplicationService(
  25. model_repository=ModelDefinitionRepository(db),
  26. provider_client=ModelProviderClient(settings=settings),
  27. settings=settings)
  28. @router.get("/health", response_model=ServiceHealth)
  29. def health_check(
  30. db: Session = Depends(get_db),
  31. settings: ModelGatewayServiceSettings = Depends(get_model_gateway_settings)) -> ServiceHealth:
  32. db.execute(text("SELECT 1"))
  33. provider_status = "configured" if settings.provider_base_url else "missing"
  34. return ServiceHealth(service="model-gateway-service", status="ok", database=provider_status)
  35. @router.post("", response_model=ModelResponse)
  36. def create_model(
  37. payload: ModelCreateRequest,
  38. service: ModelGatewayApplicationService = Depends(get_model_gateway_application_service),
  39. ) -> ModelResponse:
  40. try:
  41. entity = service.create_model(payload)
  42. except ValueError as exc:
  43. raise HTTPException(status_code=422, detail=str(exc)) from exc
  44. return ModelResponse.from_entity(entity)
  45. @router.get("", response_model=list[ModelResponse])
  46. def list_models(
  47. service: ModelGatewayApplicationService = Depends(get_model_gateway_application_service),
  48. ) -> list[ModelResponse]:
  49. return [ModelResponse.from_entity(item) for item in service.list_models()]
  50. @router.patch("/{model_id}", response_model=ModelResponse)
  51. def update_model(
  52. model_id: str,
  53. payload: ModelUpdateRequest,
  54. service: ModelGatewayApplicationService = Depends(get_model_gateway_application_service),
  55. ) -> ModelResponse:
  56. try:
  57. entity = service.update_model(model_id=model_id, payload=payload)
  58. except ValueError as exc:
  59. raise HTTPException(status_code=422, detail=str(exc)) from exc
  60. if entity is None:
  61. raise HTTPException(status_code=404, detail=f"model not found: {model_id}")
  62. return ModelResponse.from_entity(entity)
  63. @router.patch("/{model_id}/status", response_model=ModelResponse)
  64. def update_model_status(
  65. model_id: str,
  66. payload: ModelStatusUpdateRequest,
  67. service: ModelGatewayApplicationService = Depends(get_model_gateway_application_service),
  68. ) -> ModelResponse:
  69. entity = service.update_model_status(model_id=model_id, payload=payload)
  70. if entity is None:
  71. raise HTTPException(status_code=404, detail=f"model not found: {model_id}")
  72. return ModelResponse.from_entity(entity)
  73. @router.delete("/{model_id}", status_code=204)
  74. def delete_model(
  75. model_id: str,
  76. service: ModelGatewayApplicationService = Depends(get_model_gateway_application_service),
  77. ) -> None:
  78. if not service.delete_model(model_id):
  79. raise HTTPException(status_code=404, detail=f"model not found: {model_id}")
  80. @router.post("/{model_id}/test", response_model=ModelTestResponse)
  81. def test_model(
  82. model_id: str,
  83. payload: ModelTestRequest,
  84. service: ModelGatewayApplicationService = Depends(get_model_gateway_application_service),
  85. ) -> ModelTestResponse:
  86. try:
  87. result = service.test_model(model_id=model_id, payload=payload)
  88. except ModelProviderClientError as exc:
  89. raise HTTPException(status_code=502, detail=str(exc)) from exc
  90. if result is None:
  91. raise HTTPException(status_code=404, detail=f"model not found: {model_id}")
  92. return result
  93. @router.post("/chat-completions", response_model=ChatCompletionResponseContract)
  94. def create_chat_completion(
  95. payload: ChatCompletionRequestContract,
  96. service: ModelGatewayApplicationService = Depends(get_model_gateway_application_service)) -> ChatCompletionResponseContract:
  97. try:
  98. return service.create_chat_completion(payload)
  99. except ModelProviderClientError as exc:
  100. raise HTTPException(status_code=502, detail=str(exc)) from exc