deepllm / app /main.py
mistpe's picture
Upload 13 files
a2cbf8a verified
import os
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
from fastapi import FastAPI, Depends, Request
from fastapi.responses import StreamingResponse
from fastapi.middleware.cors import CORSMiddleware
from app.utils.logger import logger
from app.utils.auth import verify_api_key
from app.deepclaude.deepclaude import DeepClaude
import os
app = FastAPI(title="DeepClaude API")
# 从环境变量获取 CORS配置, API 密钥、地址以及模型名称
ALLOW_ORIGINS = os.getenv("ALLOW_ORIGINS", "*")
CLAUDE_API_KEY = os.getenv("CLAUDE_API_KEY")
CLAUDE_MODEL = os.getenv("CLAUDE_MODEL")
CLAUDE_PROVIDER = os.getenv("CLAUDE_PROVIDER", "anthropic") # Claude模型提供商, 默认为anthropic
CLAUDE_API_URL = os.getenv("CLAUDE_API_URL", "https://api.anthropic.com/v1/messages")
DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY")
DEEPSEEK_API_URL = os.getenv("DEEPSEEK_API_URL")
DEEPSEEK_MODEL = os.getenv("DEEPSEEK_MODEL")
IS_ORIGIN_REASONING = os.getenv("IS_ORIGIN_REASONING", "True")
# CORS设置
allow_origins_list = ALLOW_ORIGINS.split(",") if ALLOW_ORIGINS else [] # 将逗号分隔的字符串转换为列表
app.add_middleware(
CORSMiddleware,
allow_origins=allow_origins_list,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 验证日志级别
logger.debug("当前日志级别为 DEBUG")
logger.info("开始请求")
@app.get("/", dependencies=[Depends(verify_api_key)])
async def root():
logger.info("访问了根路径")
return {"message": "Welcome to DeepClaude API"}
@app.post("/v1/chat/completions", dependencies=[Depends(verify_api_key)])
async def chat_completions(request: Request):
"""处理聊天完成请求,返回流式响应
请求体格式应与 OpenAI API 保持一致,包含:
- messages: 消息列表
- model: 模型名称(可选)
- stream: 是否使用流式输出(必须为 True)
"""
try:
# 1. 获取并验证请求数据
body = await request.json()
messages = body.get("messages")
if not messages:
return {"error": "messages 不能为空"}
if not body.get("stream", False):
return {"error": "目前仅支持流式输出,stream 必须为 True"}
# 3. 创建 DeepClaude 实例
if not DEEPSEEK_API_KEY or not CLAUDE_API_KEY:
return {"error": "未设置 API 密钥"}
deep_claude = DeepClaude(
DEEPSEEK_API_KEY,
CLAUDE_API_KEY,
DEEPSEEK_API_URL,
CLAUDE_API_URL,
CLAUDE_PROVIDER,
IS_ORIGIN_REASONING
)
# 4. 返回流式响应
return StreamingResponse(
deep_claude.chat_completions_with_stream(
messages=messages,
deepseek_model=DEEPSEEK_MODEL,
claude_model=CLAUDE_MODEL
),
media_type="text/event-stream"
)
except Exception as e:
logger.error(f"处理请求时发生错误: {e}")
return {"error": str(e)}