""" ModelScope 部署入口文件 使用 Gradio 包装 FastAPI 应用 """ import os import sys from pathlib import Path import gradio as gr # 添加项目根目录到 Python 路径 sys.path.insert(0, str(Path(__file__).parent)) # 设置环境变量 os.environ.setdefault("DATA_DIR", "data") os.environ.setdefault("LOG_LEVEL", "INFO") # 确保数据目录存在 data_dir = Path("data") data_dir.mkdir(exist_ok=True) generated_images_dir = Path("generated_images") generated_images_dir.mkdir(exist_ok=True) # 导入 FastAPI 应用 from app.main import app as fastapi_app from fastapi.staticfiles import StaticFiles from fastapi.responses import FileResponse # 挂载前端静态文件 frontend_dist = Path(__file__).parent / "frontend" / "dist" if frontend_dist.exists(): # 挂载静态资源(CSS, JS) assets_dir = frontend_dist / "assets" if assets_dir.exists(): fastapi_app.mount("/assets", StaticFiles(directory=str(assets_dir)), name="assets") print(f"✅ 前端资源文件已挂载: {assets_dir}") print(f"✅ 前端应用已挂载: {frontend_dist}") else: print(f"⚠️ 前端构建目录不存在: {frontend_dist}") # 重写根路由以服务前端 @fastapi_app.get("/", include_in_schema=False) async def serve_root(): """服务前端应用首页""" if frontend_dist.exists(): index_file = frontend_dist / "index.html" if index_file.exists(): return FileResponse(index_file) return { "service": "SoulMate AI Companion", "status": "running", "version": "1.0.0", "message": "Welcome! Visit /docs for API documentation." } # 添加 catch-all 路由用于 SPA @fastapi_app.get("/{full_path:path}", include_in_schema=False) async def serve_spa(full_path: str): """服务前端应用(SPA 路由支持)""" # 如果是 API 路径,跳过 if full_path.startswith("api/") or full_path == "docs" or full_path == "openapi.json" or full_path == "health": from fastapi import HTTPException raise HTTPException(status_code=404, detail="Not found") # 返回前端 index.html if frontend_dist.exists(): index_file = frontend_dist / "index.html" if index_file.exists(): return FileResponse(index_file) return {"error": "Frontend not found"} # 创建 Gradio 界面(用于 ModelScope 的展示) with gr.Blocks( title="治愈系记录助手 - SoulMate AI Companion", theme=gr.themes.Soft( primary_hue="purple", secondary_hue="pink", ), ) as demo: gr.Markdown(""" # 🌟 治愈系记录助手 - SoulMate AI Companion 一个温暖、治愈的 AI 陪伴应用,帮助你记录心情、捕捉灵感、管理待办。 ### ✨ 核心特性 - 🎤 **语音/文字快速记录** - 自动分类保存 - 🤖 **AI 语义解析** - 智能提取情绪、灵感和待办 - 💬 **AI 对话陪伴(RAG)** - 基于历史记录的个性化对话 - 🖼️ **AI 形象定制** - 生成专属治愈系角色(720 种组合) - 🫧 **物理引擎心情池** - 基于 Matter.js 的动态气泡可视化 --- ### 🚀 开始使用 **🎯 前端应用地址:** 点击上方的 "App" 标签页访问完整应用 **📚 API 文档:** [FastAPI Swagger Docs →](/docs) --- ### 📖 使用说明 1. **首页快速记录** - 点击麦克风录音或在输入框输入文字 - AI 自动分析并分类保存 2. **查看分类数据** - 点击顶部心情、灵感、待办图标 - 查看不同类型的记录 3. **与 AI 对话** - 点击 AI 形象显示问候对话框 - 点击对话框中的聊天图标进入完整对话 - AI 基于你的历史记录提供个性化回复 4. **定制 AI 形象** - 点击右下角 ✨ 按钮 - 选择颜色、性格、外观、角色 - 生成专属形象(需要 MiniMax API) 5. **心情气泡池** - 点击顶部心情图标 - 左右滑动查看不同日期的心情卡片 - 点击卡片展开查看当天的气泡池 - 可以拖拽气泡,感受物理引擎效果 --- ### ⚙️ 配置说明 需要在 ModelScope 的环境变量中配置: **必需:** - `ZHIPU_API_KEY` - 智谱 AI API 密钥 - 获取地址:https://open.bigmodel.cn/ - 用途:语音识别、语义解析、AI 对话 **可选:** - `MINIMAX_API_KEY` - MiniMax API 密钥 - `MINIMAX_GROUP_ID` - MiniMax Group ID - 获取地址:https://platform.minimaxi.com/ - 用途:AI 形象生成 --- ### 🔗 相关链接 - [GitHub 仓库](https://github.com/kernel-14/Nora) - [详细文档](https://github.com/kernel-14/Nora/blob/main/README.md) - [智谱 AI](https://open.bigmodel.cn/) - [MiniMax](https://platform.minimaxi.com/) --- ### 📊 API 端点 - `POST /api/process` - 处理文本/语音输入 - `POST /api/chat` - 与 AI 对话(RAG) - `GET /api/records` - 获取所有记录 - `GET /api/moods` - 获取情绪数据 - `GET /api/inspirations` - 获取灵感 - `GET /api/todos` - 获取待办事项 - `POST /api/character/generate` - 生成角色形象 - `GET /health` - 健康检查 - `GET /docs` - API 文档 """) # 挂载 FastAPI 到 Gradio app = gr.mount_gradio_app(fastapi_app, demo, path="/gradio") # 如果直接运行此文件 if __name__ == "__main__": import uvicorn print("=" * 50) print("🌟 治愈系记录助手 - SoulMate AI Companion") print("=" * 50) print(f"📍 前端应用: http://0.0.0.0:7860/") print(f"📚 Gradio 界面: http://0.0.0.0:7860/gradio") print(f"📖 API 文档: http://0.0.0.0:7860/docs") print(f"🔍 健康检查: http://0.0.0.0:7860/health") print("=" * 50) uvicorn.run(app, host="0.0.0.0", port=7860)