ai_config.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. from fastapi import APIRouter, HTTPException, status, Depends
  2. from pydantic import BaseModel
  3. from typing import Optional, Annotated
  4. from datetime import datetime
  5. from ..db.ai_config import (
  6. get_config_by_app_name,
  7. create_config,
  8. update_config,
  9. delete_config,
  10. get_all_configs
  11. )
  12. router = APIRouter()
  13. class AIConfigCreate(BaseModel):
  14. appName: str
  15. knowledgeId: str
  16. apiKey: str
  17. baseUrl: str
  18. class AIConfigUpdate(BaseModel):
  19. knowledgeId: Optional[str] = None
  20. apiKey: Optional[str] = None
  21. baseUrl: Optional[str] = None
  22. status: Optional[int] = None
  23. class AIConfigResponse(BaseModel):
  24. id: str
  25. appName: str
  26. knowledgeId: str
  27. apiKey: str
  28. baseUrl: str
  29. status: int
  30. deleted: int
  31. createdAt: datetime
  32. updatedAt: datetime
  33. @router.post("/", response_model=dict, summary="创建AI配置", description="创建新的AI应用配置映射")
  34. async def create_ai_config(
  35. config: AIConfigCreate
  36. ) -> dict:
  37. """创建新的AI配置"""
  38. existing = get_config_by_app_name(config.appName)
  39. if existing:
  40. raise HTTPException(
  41. status_code=status.HTTP_400_BAD_REQUEST,
  42. detail=f"appName '{config.appName}' 已存在"
  43. )
  44. config_id = create_config(config.model_dump())
  45. if not config_id:
  46. raise HTTPException(
  47. status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
  48. detail="创建配置失败"
  49. )
  50. return {
  51. "message": "配置创建成功",
  52. "id": config_id,
  53. "appName": config.appName
  54. }
  55. @router.get("/{app_name}", response_model=dict, summary="获取AI配置", description="根据appName获取AI配置")
  56. async def get_ai_config(
  57. app_name: str
  58. ) -> dict:
  59. """获取指定appName的配置"""
  60. config = get_config_by_app_name(app_name)
  61. if not config:
  62. raise HTTPException(
  63. status_code=status.HTTP_404_NOT_FOUND,
  64. detail=f"appName '{app_name}' 的配置不存在"
  65. )
  66. return config
  67. @router.put("/{app_name}", response_model=dict, summary="更新AI配置", description="更新指定appName的AI配置")
  68. async def update_ai_config(
  69. app_name: str,
  70. config_update: AIConfigUpdate
  71. ) -> dict:
  72. """更新指定appName的配置"""
  73. existing = get_config_by_app_name(app_name)
  74. if not existing:
  75. raise HTTPException(
  76. status_code=status.HTTP_404_NOT_FOUND,
  77. detail=f"appName '{app_name}' 的配置不存在"
  78. )
  79. update_data = {k: v for k, v in config_update.model_dump().items() if v is not None}
  80. if not update_data:
  81. raise HTTPException(
  82. status_code=status.HTTP_400_BAD_REQUEST,
  83. detail="没有要更新的字段"
  84. )
  85. matched = update_config(app_name, update_data)
  86. if matched == 0:
  87. raise HTTPException(
  88. status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
  89. detail="更新配置失败"
  90. )
  91. return {
  92. "message": "配置更新成功",
  93. "appName": app_name
  94. }
  95. @router.delete("/{app_name}", response_model=dict, summary="删除AI配置", description="删除指定appName的AI配置")
  96. async def delete_ai_config(
  97. app_name: str
  98. ) -> dict:
  99. """删除指定appName的配置"""
  100. existing = get_config_by_app_name(app_name)
  101. if not existing:
  102. raise HTTPException(
  103. status_code=status.HTTP_404_NOT_FOUND,
  104. detail=f"appName '{app_name}' 的配置不存在"
  105. )
  106. matched = delete_config(app_name)
  107. if matched == 0:
  108. raise HTTPException(
  109. status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
  110. detail="删除配置失败"
  111. )
  112. return {
  113. "message": "配置删除成功",
  114. "appName": app_name
  115. }
  116. @router.get("/", response_model=dict, summary="获取所有AI配置", description="获取所有启用的AI配置")
  117. async def list_ai_configs(
  118. ) -> dict:
  119. """获取所有启用的配置"""
  120. configs = get_all_configs()
  121. return {
  122. "total": len(configs),
  123. "configs": configs
  124. }