yuuuuc/deepseek-coder-v2
0
1from fastapi import FastAPI, HTTPException2from fastapi.staticfiles import StaticFiles3from fastapi.responses import FileResponse4from pydantic import BaseModel5from openai import OpenAI6import logging7import os8from datetime import datetime9 10# 创建带时间戳的日志文件,存放在logs目录下11log_filename = f"logs/deepseek_chat_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log"12 13# 确保logs目录存在14os.makedirs('logs', exist_ok=True)15 16# 配置日志17logging.basicConfig(18 level=logging.INFO,19 format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',20 handlers=[21 logging.FileHandler(log_filename, encoding='utf-8'),22 logging.StreamHandler()23 ]24)25logger = logging.getLogger(__name__)26 27app = FastAPI(title="DeepSeek Coder V2 Chat", version="1.0.0")28 29# 挂载静态文件目录30app.mount("/static", StaticFiles(directory="static"), name="static")31 32# 请求模型33class ChatRequest(BaseModel):34 message: str35 36class ChatResponse(BaseModel):37 response: str38 39# DeepSeek API 客户端40client = None41api_key = os.getenv("DEEPSEEK_API_KEY")42api_available = False43 44def initialize_api_client():45 """初始化 DeepSeek API 客户端"""46 global client, api_available47 48 if not api_key:49 logger.warning("⚠️ 未设置 DEEPSEEK_API_KEY 环境变量")50 api_available = False51 return False52 53 try:54 client = OpenAI(55 api_key=api_key,56 base_url="https://api.deepseek.com"57 )58 59 # 测试 API 连接60 test_response = client.chat.completions.create(61 model="deepseek-chat",62 messages=[{"role": "user", "content": "Hello"}],63 max_tokens=1064 )65 66 api_available = True67 logger.info("✅ DeepSeek API 连接成功")68 return True69 70 except Exception as e:71 logger.error(f"❌ DeepSeek API 初始化失败: {str(e)}")72 api_available = False73 return False74 75def generate_response(message: str) -> str:76 """使用 DeepSeek API 生成AI响应"""77 global client, api_available78 79 if not api_available or client is None:80 return "DeepSeek API 不可用,请检查 API Key 配置。"81 82 try:83 response = client.chat.completions.create(84 model="deepseek-chat",85 messages=[86 {"role": "system", "content": "你是 DeepSeek Coder V2,一个专业的AI编程助手。请用中文回答问题,并提供准确、有用的编程建议和代码示例。"},87 {"role": "user", "content": message}88 ],89 max_tokens=1024,90 temperature=0.7,91 top_p=0.992 )93 94 return response.choices[0].message.content.strip()95 96 except Exception as e:97 logger.error(f"DeepSeek API 调用失败: {str(e)}")98 return f"抱歉,API 调用时出现错误: {str(e)}"99 100@app.on_event("startup")101async def startup_event():102 """应用启动时初始化 API 客户端"""103 logger.info("🌟 DeepSeek Chat 应用启动中...")104 logger.info(f"📝 日志文件: {log_filename}")105 106 # 初始化 DeepSeek API 客户端107 success = initialize_api_client()108 if success:109 logger.info("✅ DeepSeek API 初始化完成,现在可以使用AI响应")110 else:111 logger.warning("⚠️ DeepSeek API 初始化失败,使用模拟响应")112 logger.info("💡 请设置 DEEPSEEK_API_KEY 环境变量")113 114 logger.info("🚀 服务器启动完成!")115 116@app.get("/")117async def serve_index():118 """提供主页 - 确保对HF Space健康检查返回200状态"""119 return FileResponse("static/index.html")120 121@app.get("/health")122async def health_endpoint():123 """Hugging Face Spaces 健康检查"""124 return await health_check()125 126@app.post("/api/chat", response_model=ChatResponse)127async def chat_endpoint(request: ChatRequest):128 """聊天API端点"""129 global api_available130 131 if not request.message.strip():132 raise HTTPException(status_code=400, detail="消息不能为空")133 134 if len(request.message) > 4000:135 raise HTTPException(status_code=400, detail="消息长度不能超过4000字符")136 137 logger.info(f"💬 收到消息: {request.message[:100]}...")138 139 # 检查 API 状态140 if not api_available:141 # API 不可用时的演示响应142 response_text = f"""🤖 DeepSeek API 当前不可用143 144可能的原因:145- 未设置 DEEPSEEK_API_KEY 环境变量146- API Key 无效或已过期147- 网络连接问题148 149💡 获取 API Key 步骤:1501. 访问 https://platform.deepseek.com/1512. 注册并登录账户1523. 创建 API Key1534. 设置环境变量:export DEEPSEEK_API_KEY="your-key-here"154 155作为演示,这里是一个模拟响应:156 157我是DeepSeek Coder V2,一个专业的AI编程助手。我可以帮助你:158 1591. **代码编写** - 各种编程语言的代码实现1602. **问题解决** - 调试和优化代码1613. **代码审查** - 分析代码质量和最佳实践1624. **算法解释** - 解释复杂的算法和数据结构163 164```python165# 示例:快速排序算法166def quicksort(arr):167 if len(arr) <= 1:168 return arr169 pivot = arr[len(arr) // 2]170 left = [x for x in arr if x < pivot]171 middle = [x for x in arr if x == pivot]172 right = [x for x in arr if x > pivot]173 return quicksort(left) + middle + quicksort(right)174```175 176配置 API Key 后重启应用即可使用真实的AI响应。"""177 else:178 # 使用 DeepSeek API 生成响应179 response_text = generate_response(request.message)180 181 return ChatResponse(response=response_text)182 183@app.get("/api/health")184async def health_check():185 """健康检查端点"""186 global api_available, api_key187 api_status = "available" if api_available else "unavailable"188 return {189 "status": "healthy",190 "api_status": api_status,191 "api_key_configured": bool(api_key),192 "api_available": api_available,193 "log_file": log_filename194 }