Files
grok2api/app/api/v1/chat.py
T
2025-10-10 16:59:56 +08:00

88 lines
2.6 KiB
Python

# -*- coding: utf-8 -*-
"""
聊天API路由模块
提供OpenAI兼容的聊天API接口,支持与Grok模型的交互。
"""
from fastapi import APIRouter, Depends, HTTPException
from typing import Optional
from fastapi.responses import StreamingResponse
from app.core.auth import auth_manager
from app.core.exception import GrokApiException
from app.core.logger import logger
from app.services.grok.client import GrokClient
from app.models.openai_schema import OpenAIChatRequest
# 聊天路由
router = APIRouter(prefix="/chat", tags=["聊天"])
@router.post("/completions", response_model=None)
async def chat_completions(
request: OpenAIChatRequest,
authenticated: Optional[str] = Depends(auth_manager.verify)
):
"""
创建聊天补全
兼容OpenAI聊天API的端点,支持流式和非流式响应。
Args:
request: OpenAI格式的聊天请求
authenticated: 认证状态(由依赖注入)
Returns:
OpenAIChatCompletionResponse: 非流式响应
StreamingResponse: 流式响应
Raises:
HTTPException: 当请求处理失败时
"""
try:
logger.info(f"[Chat] 聊天请求 - 模型: {request.model}")
# 调用Grok客户端处理请求
result = await GrokClient.openai_to_grok(request.model_dump())
# 如果是流式响应,GrokClient已经返回了Iterator,直接包装为StreamingResponse
if request.stream:
return StreamingResponse(
content=result,
media_type="text/event-stream",
headers={
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"X-Accel-Buffering": "no"
}
)
# 非流式响应直接返回
return result
except GrokApiException as e:
logger.error(f"[Chat] Grok API错误: {str(e)}", extra={"details": e.details})
raise HTTPException(
status_code=500,
detail={
"error": {
"message": str(e),
"type": e.error_code or "grok_api_error",
"code": e.error_code or "unknown"
}
}
)
except Exception as e:
logger.error(f"[Chat] 聊天请求处理失败: {str(e)}", exc_info=True)
raise HTTPException(
status_code=500,
detail={
"error": {
"message": "服务器内部错误",
"type": "internal_error",
"code": "internal_server_error"
}
}
)