geo/backend/app/api/platforms.py

172 lines
4.8 KiB
Python

"""
平台健康检查API - 验证各AI平台适配器状态
端点: GET /api/platforms/health
返回: 各平台适配器配置状态和健康信息
"""
import logging
from typing import Annotated
from fastapi import APIRouter, Depends
from app.config import settings
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/platforms", tags=["platforms"])
class PlatformHealthStatus:
"""平台健康状态"""
def __init__(
self,
name: str,
configured: bool,
url: str = "",
api_key_set: bool = False,
status: str = "unknown",
message: str = "",
):
self.name = name
self.configured = configured
self.url = url
self.api_key_set = api_key_set
self.status = status
self.message = message
def check_kimi_health() -> PlatformHealthStatus:
"""检查Kimi平台健康状态"""
try:
from app.workers.platforms.kimi import KimiAdapter
adapter = KimiAdapter()
api_key_set = bool(adapter.api_key and adapter.api_key.strip())
configured = adapter.is_configured
return PlatformHealthStatus(
name="kimi",
url=adapter.platform_url,
configured=configured,
api_key_set=api_key_set,
status="configured" if configured else "not_configured",
message="API Key已配置" if configured else "API Key未配置",
)
except Exception as e:
logger.error(f"Kimi健康检查失败: {e}")
return PlatformHealthStatus(
name="kimi",
configured=False,
status="error",
message=str(e),
)
def check_wenxin_health() -> PlatformHealthStatus:
"""检查文心平台健康状态"""
try:
from app.workers.platforms.wenxin import WenxinAdapter
adapter = WenxinAdapter()
api_key_set = bool(adapter.api_key and adapter.api_key.strip())
secret_key_set = bool(adapter.secret_key and adapter.secret_key.strip())
configured = adapter.is_configured
return PlatformHealthStatus(
name="wenxin",
url=adapter.platform_url,
configured=configured,
api_key_set=api_key_set,
status="configured" if configured else "not_configured",
message="API Key和Secret Key已配置" if configured else "API Key或Secret Key未配置",
)
except Exception as e:
logger.error(f"文心健康检查失败: {e}")
return PlatformHealthStatus(
name="wenxin",
configured=False,
status="error",
message=str(e),
)
def check_doubao_health() -> PlatformHealthStatus:
"""检查豆包平台健康状态"""
try:
from app.workers.platforms.doubao import DoubaoAdapter
adapter = DoubaoAdapter()
api_key_set = bool(adapter.api_key and adapter.api_key.strip())
configured = adapter.is_configured
return PlatformHealthStatus(
name="doubao",
url=adapter.platform_url,
configured=configured,
api_key_set=api_key_set,
status="configured" if configured else "not_configured",
message="API Key已配置" if configured else "API Key未配置",
)
except Exception as e:
logger.error(f"豆包健康检查失败: {e}")
return PlatformHealthStatus(
name="doubao",
configured=False,
status="error",
message=str(e),
)
def check_all_platforms() -> dict:
"""检查所有平台健康状态"""
platforms = [
check_kimi_health(),
check_wenxin_health(),
check_doubao_health(),
]
return {
"platforms": [vars(p) for p in platforms],
"total": len(platforms),
"configured_count": sum(1 for p in platforms if p.configured),
}
@router.get("/health")
async def get_platform_health():
"""
获取所有AI平台适配器的健康状态
返回每个平台的:
- name: 平台名称
- configured: 是否已配置
- url: 平台URL
- api_key_set: API Key是否已设置
- status: 健康状态 (configured / not_configured / error)
- message: 状态消息
"""
health_info = check_all_platforms()
return health_info
@router.get("/health/{platform_name}")
async def get_platform_health_by_name(platform_name: str):
"""
获取指定平台适配器的健康状态
Args:
platform_name: 平台名称 (kimi / wenxin / doubao)
"""
if platform_name == "kimi":
result = vars(check_kimi_health())
elif platform_name == "wenxin":
result = vars(check_wenxin_health())
elif platform_name == "doubao":
result = vars(check_doubao_health())
else:
return {"error": f"未知平台: {platform_name}"}
return result