ai_config.py 4.0 KB

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