一个面向真实决策场景的推演与路径规划系统。
它不是聊天演示页,而是把“输入问题 -> 提交异步任务 -> 生成结构化结果 -> 购买套餐 -> 兑换码补量 -> 后台运营管理”做成可落地的产品骨架。
当前仓库已经包含这些可运行能力:
- 用户注册、登录、会话管理
- 套餐购买与套餐切换
- 单次兑换码体系
- 额外额度余额体系
- 异步任务队列、轮询与 SSE 推送
- 额度不足 / 模型权限不足阻断
- 全局 Toast 成功反馈
- 运营后台用户 CRUD
- 套餐额度与模型权限维护
- 兑换码后台生成、停用、删除
- 推演结果结构化展示
- 宝塔部署样例
前端:
- Next.js 14
- React 18
后端:
- FastAPI
- SQLAlchemy
模型:
- DeepSeek
- OpenAI
数据库:
- 本地开发默认 SQLite
- 生产建议 PostgreSQL
本地启动后主要入口:
- 首页:
http://127.0.0.1:3000 - 登录:
http://127.0.0.1:3000/login - 走向预测:
http://127.0.0.1:3000/forecast - 路径规划:
http://127.0.0.1:3000/pathfinder - 模板库:
http://127.0.0.1:3000/templates - 历史推演:
http://127.0.0.1:3000/history - 控制台:
http://127.0.0.1:3000/workspace - 套餐与兑换:
http://127.0.0.1:3000/account - 运营后台:
http://127.0.0.1:3000/admin - API 文档:
http://127.0.0.1:8000/docs
本地默认管理员账号:
- 邮箱:
founder@inference.local - 密码:
Demo12345!
用户在“走向预测”或“路径规划”页面输入:
- 标题
- 核心问题
- 时间范围
- 已知事实
- 约束条件
- 不确定项
- 相关方
- 目标结果
- 已尝试动作
- 模型档位
前端不会一直卡在提交按钮上等待模型返回。
提交时会:
- 调用
POST /api/analysis-jobs - 后端先校验套餐、额度、模型权限、并发上限
- 校验通过后创建
job - 前端跳转任务页
- 前端通过轮询和 SSE 订阅任务状态
这样做的好处是:
- 大模型慢时页面依旧流畅
- 可以展示排队、运行、完成、失败
- 更适合正式产品的任务中心体验
后端会根据当前套餐允许的模型档位,选择对应 provider 和模型。
当前支持:
LLM_PROVIDER=deepseekLLM_PROVIDER=openai
模型返回后会被归一化成固定结构,主要包括:
- 问题定义
- 当前状态
- 关键变量
- 因果边
- 情景分支
- 推荐路径
- 风险
- 观察信号
- 下一步动作
结果页会展示:
- 主结论和置信度
- 因果关系图谱
- 情景概率分支
- 推荐执行路径
- 风险与监控信号
- 下一步动作
- 重演版本差异说明
当前系统的额度规则已经做成正式逻辑,不再是 mock。
每个套餐有自己的月度基础额度:
- 免费版:10 次
- 专业版:80 次
- VIP 深度版:300 次
- 企业版:2000 次
兑换“额度码”后,会给用户增加 bonus_quota_balance。
这部分额度:
- 独立于月度基础额度
- 不会在月初自动恢复
- 不会被月度重置清空
- 会一直保留到消费完
推演时系统按这个顺序扣减:
- 先扣套餐月度基础额度
- 基础额度用完后,再扣兑换得到的额外额度
每月只会重置:
monthly_analysis_usage
不会重置:
bonus_quota_balance
当前支持两类兑换码:
- 套餐码
- 额度码
兑换码是“单次唯一兑换码”,每个码全局只能成功兑换一次。
不支持:
- 通用活动码
- 每人限领 N 次
- 无限复用码
套餐码兑换后会:
- 切换当前用户主空间订阅到目标套餐
- 按兑换码指定的月付 / 年付创建新周期
- 自动生成一笔
provider=redeem_code、amount=0、status=paid的订单 - 写入审计日志
额度码兑换后会:
- 增加当前用户
bonus_quota_balance - 更新账户页额度概览
- 写入审计日志
POST /api/billing/redeem-code
请求:
{
"code": "SO-AB12-CD34"
}返回:
- 兑换结果
- 最新用户信息
- 最新订阅
- 可选订单
- 当前额度快照
- 兑换码记录
GET /api/admin/redemption-codesPOST /api/admin/redemption-codesPATCH /api/admin/redemption-codes/{id}DELETE /api/admin/redemption-codes/{id}
后台支持:
- 生成单个兑换码
- 批量生成唯一单次码
- 停用未使用兑换码
- 删除未使用兑换码
- 查看已兑换记录
成功操作统一会在右上角弹出可见 Toast,包括:
- 创建用户
- 保存用户
- 删除用户
- 保存套餐
- 生成兑换码
- 更新兑换码
- 删除兑换码
- 切换套餐
- 兑换成功
- 提交任务成功
当用户提交推演但条件不满足时,系统不再只显示一行错误字。
现在会统一弹出白色科技风阻断弹窗,覆盖这些场景:
- 套餐额度耗尽
- 所选模型档位不在当前套餐权限内
- 并发任务达到上限
弹窗会给出:
- 当前问题原因
- 跳转购买套餐入口
- 跳转兑换中心入口
运营后台当前以“少而准”为原则,默认折叠低频区块。
支持:
- 创建用户
- 编辑用户姓名 / 公司 / 角色 / 登录状态
- 编辑套餐
- 编辑月度已用额度
- 编辑额外额度余额
- 删除非创始者账号
支持:
- 月费
- 年费
- 月度额度
- 导出权限
- 高级模型开关
- 团队席位
支持:
- 创建套餐码
- 创建额度码
- 批量生成
- 状态筛选
- 停用
- 恢复启用
- 删除未兑换码
为了避免首页信息过载,以下模块放在折叠区:
- 任务与订单
- 最近推演
- 系统结构
后端配置文件位于:
backend/.envbackend/.env.example
关键变量:
DATABASE_URL=sqlite:///./world_inference.db
LLM_PROVIDER=deepseek
LLM_FALLBACK_TO_MOCK=false
DEEPSEEK_API_KEY=your_real_key
DEEPSEEK_CHAT_MODEL=deepseek-chat
DEEPSEEK_REASONING_MODEL=deepseek-reasoner
DEEPSEEK_BASE_URL=https://api.deepseek.com
OPENAI_API_KEY=
OPENAI_MODEL=gpt-5-mini
OPENAI_REASONING_MODEL=gpt-5
APP_SECRET=replace_me
ENABLE_DEMO_AUTH=false建议:
- 生产环境始终关闭
LLM_FALLBACK_TO_MOCK - 没有真实 Key 时直接报错,不要静默回退
- 高成本模型只开放给高阶套餐
cd backend
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txtcd backend
uvicorn app.main:app --host 127.0.0.1 --port 8000创建 frontend/.env.local:
NEXT_PUBLIC_API_BASE_URL=http://127.0.0.1:8000然后:
cd frontend
npm install
npm run dev生产启动方式:
cd frontend
npm run build
npm run start -- --hostname 127.0.0.1 --port 3000仓库已经提供宝塔部署参考文件:
docs/baota-deployment.mddeploy/baota/nginx.confdeploy/baota/frontend.pm2.config.cjsdeploy/baota/backend-start.sh
- Nginx
- Node.js 运行前端
- Python 运行 FastAPI
- PostgreSQL
- PM2 或 Supervisor
- 在宝塔安装
Node.js、Python、Nginx、PostgreSQL - 拉取仓库代码
- 配置后端
.env - 安装后端依赖
pip install -r requirements.txt - 构建前端
npm install && npm run build - 用 PM2 启动前端
- 用脚本或 Supervisor 启动后端
- 配置 Nginx 反代
- 开启 HTTPS
80/443对外/转发到前端3000/api转发到后端8000
上线前至少完成这些:
- 切到 PostgreSQL
- 替换所有本地密钥和默认密码
- 关闭 demo 登录
- 配置正式域名和 HTTPS
- 配置日志与监控
- 做数据库备份
- 核验套餐价格与额度
- 核验模型权限和并发限制
这些内容不要提交到 GitHub:
backend/.envfrontend/.env.local- 数据库文件
- 运行日志
- 本地缓存
推送前建议执行:
git status当前版本已经实际验证过这些场景:
- 管理员登录
- 普通用户注册
- 普通用户无法访问兑换码后台
- 后台创建额度码
- 后台创建套餐码
- 用户兑换额度码
- 用户兑换套餐码
- 已兑换码拒绝重复兑换
- 停用码拒绝兑换
- 过期码拒绝兑换
- 无效码拒绝兑换
- 月额度耗尽后继续消耗额外额度
- 月度重置不会清空额外额度
- 额度不足时返回结构化错误码
- 模型权限不足时返回结构化错误码
- 后台创建用户成功后 Toast 正常展示
- 前端生产构建通过
- 后端编译通过
codexya/
├─ frontend/
├─ backend/
├─ docs/
├─ deploy/baota/
├─ runtime/
└─ docker-compose.yml