""" 改进版Python FastAPI服务器实现,使用DashScope Python SDK连接阿里云百炼平台API 拆分模块版本 """ import os import json from datetime import datetime from pathlib import Path import dashscope from dotenv import load_dotenv from fastapi import FastAPI, HTTPException, File, UploadFile, Request from fastapi.responses import JSONResponse # 导入模块 import sys sys.path.append('/home/mt/project/ai-chat-ui/server_python') from api.chat_routes import ( chat_endpoint_handler, get_models_handler, get_conversations_handler, get_conversation_handler, save_conversation_handler, delete_conversation_handler, upload_file_handler, serve_upload_handler, stop_generation_handler ) from models.chat_models import ChatRequest, ModelInfo from utils.helpers import log_request, log_response # 加载环境变量 load_dotenv() # 设置 DashScope API 密钥 api_key = os.getenv("ALIYUN_API_KEY") if not api_key: raise ValueError("请在环境变量中设置 ALIYUN_API_KEY") dashscope.api_key = api_key # 创建 FastAPI 应用 app = FastAPI(title="AI Chat API Server (Python)", version="2.0.0") @app.middleware("http") async def logging_middleware(request: Request, call_next): """中间件:记录请求日志""" start_time = datetime.utcnow() # 记录请求信息 log_request(request.method, request.url.path, request.client.host if request.client else 'unknown') response = await call_next(request) # 计算处理时间 process_time = (datetime.utcnow() - start_time).total_seconds() * 1000 # 记录响应信息 log_response(response.status_code, process_time) # 在响应头中添加处理时间 response.headers["X-Process-Time"] = f"{process_time:.2f}ms" return response @app.get("/health") async def health_check(): """健康检查端点""" return {"status": "healthy", "timestamp": datetime.utcnow().isoformat()} @app.post("/api/chat-ui/chat") async def chat_endpoint(request: Request): """聊天接口 - 与阿里云百炼API兼容的接口""" body = await request.json() return await chat_endpoint_handler(body) @app.get("/api/chat-ui/models") async def get_models(): """获取模型列表""" return await get_models_handler() @app.get("/api/chat-ui/conversations") async def get_conversations(): """获取所有对话""" return await get_conversations_handler() @app.get("/api/chat-ui/conversations/{conversation_id}") async def get_conversation(conversation_id: str): """获取特定对话""" return await get_conversation_handler(conversation_id) @app.post("/api/chat-ui/conversations") async def save_conversation(request: Request): """保存或更新对话""" data = await request.json() return await save_conversation_handler(data) @app.delete("/api/chat-ui/conversations/{conversation_id}") async def delete_conversation(conversation_id: str): """删除对话""" return await delete_conversation_handler(conversation_id) @app.post("/api/chat-ui/upload") async def upload_file(file: UploadFile = File(...)): """文件上传接口""" return await upload_file_handler(file=file) @app.get("/uploads/{filename}") async def serve_upload(filename: str): """提供上传文件的访问""" return serve_upload_handler(filename) @app.post("/api/chat-ui/stop") async def stop_generation(): """停止生成接口""" return await stop_generation_handler() @app.post("/api/chat-ui/stop/{message_id}") async def stop_generation_by_id(message_id: str): """根据消息ID停止生成""" return await stop_generation_handler(message_id) if __name__ == "__main__": import uvicorn port = int(os.getenv("PORT", 8000)) print("="*50) print(f"Python AI Chat Server 启动中...") print(f"监听端口: {port}") print(f"API Key 状态: {'已配置' if api_key else '未配置'}") print("="*50) if not api_key: print("警告: 未在环境变量中检测到 ALIYUN_API_KEY!") print("请在 .env 文件中添加您的百炼 API Key。") else: print("API Key 已检测到。") uvicorn.run(app, host="0.0.0.0", port=port)