MeshCanvas 是一个可本地部署的多模型 AI 工作台。用户输入一条问题后,系统会同时调用多个大模型,把流式回答以节点方式渲染到一张可缩放、可平移、可分支的无限画布中,并配套提供联网搜索、讨论轮次、积分计费、用户管理和管理后台能力。
它不是单纯的聊天框,而是一套兼顾“多模型使用体验”和“平台运营能力”的完整产品原型。
- 完整产品说明书:
docs/product-manual.md - 功能介绍书:
docs/feature-guide.md
这个产品适合以下场景:
- 同时对比多个模型的回答质量、速度和风格
- 在一张画布上保留问题拆解、分支思路和研究过程
- 构建团队内部的 AI 工作台或轻量多模型平台
- 对用户、积分、模型成本和系统配置进行统一管理
- 多模型并发对话:一次提问并发请求多个模型
- 流式展示:各模型回答实时回传、独立显示
- 无限画布:支持缩放、平移、拖拽、小地图、框选
- 多轮讨论:支持 1 到 4 轮模型讨论
- 联网搜索:支持
自动/开/关 - 思考模式:更偏分析与验证的回答风格
- 分支对话:从任意模型某轮回答继续延展
- 单模型重试:失败时只重试某个模型
- 圈选总结:对选中的多个节点做摘要
- 会话分析与结题:对已有会话生成总结或结论
- 多画布管理:新建、切换、重命名、删除
- 账号与用量:查看余额、统计和用量明细
- 自定义 API Key:按模型配置个人 Key,切换计费模式
- 管理员登录:独立
admin_session会话 - 用户管理:查看用户、充值、扣费、重置密码、调整角色
- 模型配置:统一配置 API 地址、Key、模型列表和格式
- 预处理模型:用于自动判断是否需要联网搜索
- 用户自定义 Key 网关:单独配置用户侧 API 网关
- Firecrawl 配置:搜索 Key、国家代码、超时
- 模型定价:按输入 / 输出 tokens 配置积分单价
- 用量统计:按用户和模型查看调用与消耗
- 系统配置:默认积分、低余额阈值、搜索扣费、注册开关
- 审计日志:记录关键管理操作
- 登录系统后进入无限画布
- 输入问题,设置讨论轮数、联网模式和思考模式
- 系统并发调用多个模型,流式返回回答
- 用户在画布上比较结果、拖动节点、框选内容或建立分支
- 如有需要,可继续追问、生成圈选总结或查看个人用量
- 访问
/admin登录管理后台 - 配置模型网关、模型列表、Firecrawl 和用户侧网关
- 设置模型定价、默认积分和注册策略
- 管理用户余额、密码和角色
- 通过用量统计和审计日志追踪平台运行情况
/:产品首页(Landing Page)/app:用户主画布(需登录)/login:用户登录 / 注册页/setup:首次安装初始化页/settings:账号与用量页/admin:管理后台登录页/admin/dashboard:管理后台控制台
- 原生 JavaScript 实现无限画布交互
- WebSocket 接收多模型流式事件
- DOM 节点渲染用户消息、模型回答、讨论轮次和状态变化
FastAPI提供页面、REST API 和 WebSocketAsyncOpenAI调用 OpenAI 兼容接口- 支持
openai与anthropic两种接口格式 Firecrawl提供联网搜索
SQLite保存用户、会话、对话请求、模型结果、画布、积分、定价、审计日志等数据JSONL形式保存每日请求日志
app/main.py:FastAPI 入口、用户端和管理后台路由、WebSocket 调度app/chat_service.py:多模型并发、流式处理、讨论轮次、计费记录app/database.py:SQLite 封装、schema 迁移、业务数据读写app/config.py:模型配置与环境变量加载app/auth.py:用户注册、登录、密码哈希、会话逻辑app/security.py:安全头、Origin 校验和限流app/search_service.py:Firecrawl 搜索封装app/request_logger.py:每日 JSONL 请求日志app/bootstrap_admin.py:默认管理员与初始配置种子逻辑app/static/:用户端静态资源app/static/admin/:管理后台静态资源app/templates/admin_login.html:后台登录模板docs/product-manual.md:完整产品说明书docs/feature-guide.md:对外功能介绍书
python3 -m venv .venv
source .venv/bin/activate
pip install -e .如果希望直接通过文件启动,可先复制示例配置:
cp models_setting.example.json models_setting.jsonmodels_setting.example.json 示例:
{
"base_url": "https://your-openai-compatible-endpoint/v1",
"api_format": "openai",
"API_key": "YOUR_API_KEY",
"models": [
{ "name": "GPT-5", "id": "gpt-5" },
{ "name": "Kimi-K2.5", "id": "kimi-k2.5" },
{ "name": "DeepSeek-V3", "id": "deepseek-v3" }
]
}如果不提前创建 models_setting.json,系统首次访问时会自动跳转到 /setup 页面完成初始化。
cat > .env <<'ENV'
FIRECRAWL_API_KEY=your-firecrawl-key
FIRECRAWL_COUNTRY=CN
FIRECRAWL_TIMEOUT_MS=45000
ENVuvicorn app.main:app --reload浏览器打开:
http://127.0.0.1:8000
当 models_setting.json 不存在时:
- 访问任意页面会跳转到
/setup - 填写 API 地址、接口格式、API Key 和模型列表
- 保存后自动初始化数据库
- 系统自动确保默认管理员账号存在
也可以手动执行:
python -m app.init_db默认管理员账号通常为:
- 用户名:
admin - 密码:
admin
系统启动时只会确保 admin 用户存在且具备管理员角色,不会在每次启动时把已修改过的密码重置回 admin。
- 登录页:
/admin - 控制台:
/admin/dashboard
- 配置全局 API 地址、API Key 和接口格式
- 配置模型列表和预处理模型
- 配置用户自定义 Key 的独立 API 网关
- 配置 Firecrawl
- 管理用户余额和角色
- 设置模型积分价格
- 查看平台用量和积分流水
- 设置默认积分、低余额阈值、搜索扣费和注册开关
- 查看审计日志
- 请使用同一主机名访问站点,不要混用
127.0.0.1和localhost - 如果部署在 HTTPS 反向代理之后,需要正确传递
X-Forwarded-Proto - 若使用反向代理,建议启动方式类似:
uvicorn app.main:app --host 0.0.0.0 --port 8000 --forwarded-allow-ips='*'生产环境请将 * 改为可信代理 IP。
- 用户拥有独立积分余额
- 模型调用按模型定价扣减积分
- 搜索功能可按次扣减积分
- 管理员可充值或扣减
- 按模型维度配置
- 输入 tokens 和输出 tokens 分别计价
- 用量会被记录到数据库中,支持前台查看和后台统计
- 用户可在
/settings配置按模型自定义 Key - 可在“使用积分”和“使用自定义 API Key”之间切换
- 使用自定义 Key 时,可绕开平台的模型积分计费逻辑
默认读取项目根目录下的 models_setting.json,也支持以下环境变量:
export MODELS_SETTING_PATH=/absolute/path/to/models_setting.json
export REQUEST_LOG_DIR=/absolute/path/to/logs
export LOCAL_DB_PATH=/absolute/path/to/app.db常用可选环境变量:
FIRECRAWL_API_KEY=fc-xxxxx
FIRECRAWL_COUNTRY=CN
FIRECRAWL_TIMEOUT_MS=45000
MODELS_SETTING_PATH=/path/to/models_setting.json
LOCAL_DB_PATH=/path/to/data/app.db
REQUEST_LOG_DIR=/path/to/logs数据库默认位于 data/app.db,主要保存:
- 用户、角色、会话
- 对话请求、模型结果、请求事件
- 画布、集群位置
- 用户设置
- 积分余额、模型定价、用量日志、充值流水
- 管理操作审计日志
- 请求摘要
- 请求日志按天保存到
logs/requests-YYYY-MM-DD.jsonl - 登录失败会在服务端输出
WARNING日志
HttpOnlySession Cookie- 密码使用
PBKDF2-HMAC-SHA256哈希存储 - WebSocket 与受保护 API 要求登录态
- POST 与 WebSocket 升级执行 Origin 校验
- 全站 CSP、
X-Frame-Options: DENY等安全响应头 - 注册、登录、后台登录和部分 API 具有基础限流
- 当前没有自动化测试与完整 lint 体系
- 当前对话运行时上下文主要保存在 WebSocket 连接内存中,刷新或重启后不会完整恢复
- SQLite 更适合单机和轻量并发场景,不建议多进程同时高频写同一数据库
- 联网搜索依赖 Firecrawl 的可用性
- 增加自动化测试和 CI
- 增加更多模型供应商适配
- 引入更强的会话恢复能力
- 支持团队、组织和更细粒度权限
- 增加导出、分享和协作能力