产品介绍
Aivory 是一个开源、可自托管的多模型 AI 对话平台:后端为 Go 1.24 单进程服务,前端为 React 19 单页应用,两者打包在同一个容器里同源提供服务(SPA 与 /api 同域,监听 :8787)。你可以在自己的服务器上,用一条 docker compose up -d 获得一套完整的 AI 工作台:Claude、GPT、Gemini 及任意 OpenAI 兼容模型统一接入,流式输出、多轮工具调用、Python 沙箱、知识库 RAG、深度研究、团队工作空间、图片生成与完整管理后台全部内置。
| 项目 | 说明 |
|---|---|
| 当前版本 | 2.2.0 |
| 开源许可 | Apache 2.0 |
| 代码仓库 | github.com/hjxwz123/Aivory |
| 官方镜像 | ghcr.io/hjxwz123/aivory-app、ghcr.io/hjxwz123/aivory-sandbox、ghcr.io/hjxwz123/aivory-sandbox-sidecar |
| 服务端口 | 容器内 8787(生产 Compose 默认映射宿主机 80) |
| 依赖栈 | postgres:16-alpine / redis:7-alpine / qdrant:v1.12.4(均可选,详见下文) |
| 技术栈 | Go 1.24 + React 19 + TypeScript 5 + Tailwind 4 |
Aivory 有什么不一样
大多数自部署聊天前端只是一层薄代理:把请求转发给模型 API,再把流式文本推回来。Aivory 在几个真正影响日常使用的地方走得更远:
- 工具是真正的流水线:模型在单条用户消息里最多执行 48 次工具调用(12 个 provider 循环),不同领域的工具可以自由串联。一个工具的产物会自动暂存进沙箱文件系统,供下一个工具直接读取。
- 对话是树,不是线性日志:编辑历史问题、重新生成回答、换模型重试,每次操作都开一个新分支,通过
< 2/3 >控件切换,数据库保留完整树形结构。 - 管理后台改动即时生效:渠道、模型、技能、用户、系统设置全部在管理 UI 里操作,保存后下一次请求立即生效,无需重启进程。渠道 API key 存在数据库里而非环境变量,轮换密钥不用登录宿主机。
核心能力
多渠道多模型聊天
一套 UI 内任意切换 Claude / GPT / Gemini 以及任何 OpenAI 兼容端点。管理员在后台按「渠道(Channel)」维度接入上游(类型:Anthropic / OpenAI / Gemini / OpenAI 兼容,填 Base URL + API Key),再在「模型(Model)」页面创建对用户可见的模型条目,可配置显示名称、图标、定价、vision 能力与工具模式(native / prompt / none)。同一类型可以配置多个渠道。
模型选择器顶部展示管理员定义的标签筛选芯片(如「快速」「多模态」「编程」),选中标签即收窄列表;每条消息记录当次实际使用的模型。详见渠道与模型。
流式输出与思考过程
所有模型请求走 streaming,前端通过 SSE 实时接收:打字机式输出、Markdown 渲染、代码高亮、LaTeX 公式。支持思考过程(thinking)的折叠展示,推理型模型的思维链与正式回答分区呈现。配置了 Redis 后还支持流恢复:刷新页面不丢在途回复。
实时多轮工具调用
模型自主决定调用哪些工具、调多少轮,全过程通过 SSE 事件实时推送,用户能看到每一步在做什么。内置八个自建平台工具:
| 工具 | 功能 |
|---|---|
web_search | 通过 SearXNG(自部署)或 Serper 兼容后端进行全文网络搜索 |
web_fetch | 抓取指定 URL 并提取正文,遵守 robots.txt 与内容安全过滤 |
fetch_image | 把公网图片下载到沙箱 /workspace/uploads/,供后续代码使用 |
python_execute | 在隔离沙箱中运行 Python 代码,支持完整标准库、pip 安装、文件 I/O |
image_generate | 调用配置的图像模型生成图片并保存为产物 |
search_knowledge_base | 对挂载的知识库执行混合检索(密集向量 + BM25,RRF 融合) |
save_memory | 写入用户记忆库,后续对话自动注入 |
use_skill | 执行管理员预定义的技能(提示词模板 + 资产包) |
单轮工具调用预算(防滥用与成本失控):
| 工具 | 普通模式上限 | 深度研究模式 |
|---|---|---|
web_search | 16 | 40 |
web_fetch | 12 | 25 |
fetch_image | 16 | 12 |
image_generate | 8 | 4 |
python_execute | 16 | 8 |
| 全工具合计 | 48 | 150 |
关键机制是自动文件暂存:每次 python_execute 执行前,本对话中用户上传的文件、image_generate 生成的图片、用户可用的技能资产,全部自动就位于沙箱文件系统。因此「分析 data.csv,画一张柱状图,再做成 PPT」这类跨工具工作流可以在一次发送内端到端完成,用户无需任何中间操作。
对不支持原生 function calling 的模型,可按管理员配置回退到提示词拼接协议(提示词模式下 provider 循环上限为 6)。
深度研究
独立的多轮研究引擎:模型先生成研究计划,然后并行发出最多 40 次网络搜索和 25 次页面抓取,对断言做交叉校验,最终产出带引用的完整综述报告,全程有实时进度面板。详见深度研究。
Python 沙箱
每个对话拥有独立的沙箱容器(HTTP sidecar 服务):
- 会话在对话生命周期内持久保存,后续消息可以读取之前轮次写入的文件;容器被回收后自动重建会话、重新暂存文件并透明重试,用户无感知。
- 代码输出(stdout / stderr / 异常)实时流式回传;写入
/workspace/output/的文件成为产物,以下载卡片形式出现在聊天界面。 - 沙箱默认无网络(
SANDBOX_NETWORK=none),需要联网数据时由web_fetch/fetch_image在沙箱外抓取后暂存进来。 - 未配置沙箱地址时,
python_execute进入安全模式,只执行简单算术,适合开发调试与演示。
详见Python 沙箱使用与沙箱部署。
知识库与 RAG
每个账号可创建多个知识库,支持文本 / PDF / DOCX / XLSX / 图片上传,文档状态全程可跟踪(pending → parsing → embedding → ready)。检索管线包含:
- 层级化切块:small-to-big,约 12% 重叠,结构感知(代码块、表格、公式整块保留);每个分块带从根到当前位置的标题面包屑。
- 混合检索:Qdrant 密集向量 + BM25 关键词检索,RRF 融合排序,按相似度动态 Top-K,带引用作答。
- 查询路由:任务模型在检索前把查询分类为
retrieve/full_doc/none并改写查询,小文档直接全文注入,不浪费检索开销。 - MinerU OCR:带文字层的 PDF 在本地毫秒级解析;扫描件 PDF、DOCX、PPTX、XLSX、图片才走 MinerU 云端 OCR。原文件存放在你自己的 S3 / 阿里云 OSS 桶,MinerU 只拿到预签名 URL,凭据不出域。
未配置 Qdrant 时,RAG 自动降级为全文注入,功能仍可用。详见知识库。
团队工作空间
在头像菜单创建工作空间,发出邀请链接即可让同伴加入。空间内的对话、项目、知识库对全体成员共享,并与每个人的个人空间完全隔离。任何成员都能续聊任何对话,谁发送谁计费;气泡按作者归属(自己在右,他人与 AI 在左,带头像昵称);创建者可踢人、重置邀请链接、删除整个空间。出于隐私考虑,跨对话记忆在共享工作空间中完全关闭。详见团队工作空间。
图片生成
独立绘图模式:提示词先经任务模型润色,再按图片模型逐张计积分;管理员维护风格预设库;生成结果进入个人画廊,支持基于参考图的编辑与变体工作流。每用户每日生成张数可限额(默认 30 张)。详见图片生成。
完整管理后台
| 模块 | 管理内容 |
|---|---|
| 渠道 | 各 Provider 的 Base URL + API key,同类型可多渠道 |
| 模型 | 启停、显示名、上下文窗口、定价、每模型 UI 控件、深度研究暴露开关、标签 |
| 模型标签 | 创建标签并分配给模型,在选择器顶部渲染为筛选芯片 |
| 技能 | 提示词模板 + 资产包,经 use_skill 工具调用 |
| 用户 | 角色、用户组分配、实时封禁、配额与积分 |
| 工作空间 | 钻取成员 / 对话 / 项目 / 知识库,对话可直接查看完整记录 |
| 用量 | 按用户、模型、用途(聊天 / 任务 / 图像 / 嵌入)的报表 |
| 设置 | 沙箱地址、S3/OSS 凭据、搜索后端、上传白名单、禁用工具、压缩策略等 |
| 备份与迁移 | 全量备份导出导入、配置导出导入、向量维护 |
| 沙箱检查器 | 浏览和清理指定对话的沙箱工作区文件 |
所有改动保存即生效,全程无需重启。从管理后台总览开始了解。
备份与迁移
管理后台一键导出完整备份:单个 zip 内含 manifest、每表一个 JSONL(引擎中立)、上传与产物文件、逐 collection 的 Qdrant 向量点位。大库走异步导出任务。导入为整库替换,支持跨数据库引擎:SQLite 备份可以导入 Postgres 部署,反之亦然。另有轻量「配置导出/导入」只搬运渠道、模型、技能等管理资产,不动用户数据。详见备份与迁移。
PWA 与多语言
- 可安装 PWA:支持添加到桌面/主屏,移动端界面完整重做。
- 五语界面:简体中文、繁体中文、English、日本語、Français,覆盖每一个页面、对话框、Toast 与错误信息,包括管理后台。
- 明暗双主题,编辑感设计系统。
更多能力
| 能力 | 说明 |
|---|---|
| 对话树 | 编辑/重试开真分支,< N/M > 切换且不打断在途流式;可拖拽缩放的概述节点图;长对话右缘侧边预览条秒级定位 |
| 多模型互审(Verify) | 第二个模型对回答做对抗式事实核查,输出逐句引用与严重级别的结构化 findings 与信任徽章 |
| 跨对话记忆 | 每轮异步提取用户事实并自动判定旧记忆失效,用户可在专属页面管理 |
| 项目与技能 | 项目容器(共享库 + 项目级指令);管理员技能包运行时渐进加载 |
| 长上下文压缩 | 保留最近 N 轮原文,更早轮次由任务模型滚动摘要,前缀缓存友好,不修改原始存档 |
| 积分与用户组 | 定时额度 + 永久积分、按模型配额、发送前费用预检、兑换码 |
| 安全基线 | API key 全后端代理、每请求 HMAC 签名、能力令牌分享/邀请、HTML 沙箱预览、上传扩展名与 MIME 白名单、全面限速 |
架构总览
Aivory 的生产形态是五个容器:app 单容器同时托管前端 SPA 与 /api(同源,无 CORS 问题),其余为数据与执行组件。
| 容器 | 镜像 | 作用 |
|---|---|---|
app | ghcr.io/hjxwz123/aivory-app | Go HTTP + SSE 服务,同源托管前端 SPA |
postgres | postgres:16-alpine | 用户、对话、知识库、设置、用量记录 |
redis | redis:7-alpine | 缓存、限频计数、队列与流恢复 |
qdrant | qdrant/qdrant:v1.12.4 | RAG 向量检索 |
sandbox | ghcr.io/hjxwz123/aivory-sandbox-sidecar | 代码执行沙箱(仅内网) |
Redis、Qdrant、沙箱都是可选组件:不配 REDIS_URL 时使用进程内缓存与队列;不配 QDRANT_URL 时 RAG 走全文注入回退;不配 SANDBOX_BASE_URL 时代码执行进入安全模式。数据库默认甚至可以用嵌入式 SQLite,详见 SQLite 模式。
为什么选 Aivory
数据自持
所有数据落在你自己的基础设施上:数据库、向量库、上传文件与产物(绑定挂载到宿主机 DATA_DIR 目录,方便直接查看与备份)。模型 API key 存在数据库并全程由后端代理,绝不暴露给浏览器;文档 OCR 场景下 MinerU 只拿到你对象存储的预签名 URL,凭据不出域;共享工作空间中自动关闭跨对话记忆。
单命令部署
docker compose up -d 即完成部署,五个容器全部就绪。前端与 /api 同源,解析到哪个域名哪个域名就能用,不需要配置 PUBLIC_ORIGIN 或 CORS;管理员账号通过首启页面创建而非环境变量预置;此后几乎所有配置(渠道、模型、搜索后端、上传白名单等)都在管理后台实时修改,保存即生效,无需重启。
引擎中立备份
完整备份是一个自描述 zip:每表一个 JSONL,与具体数据库引擎无关。今天用 SQLite 起步,明天可以把同一份备份导入 Postgres 部署(反之亦然),序列与外键自动处理;Qdrant 向量随备份携带,也可以事后从数据库存储的分块文本重建。你的数据永远不会被锁死在某个引擎或某台机器上。
下一步
| 目标 | 页面 |
|---|---|
| 5 分钟部署一套 Aivory | 快速开始 |
| 创建管理员并配置第一个模型 | 首次运行 |
| 生产级 Docker Compose 部署 | Docker Compose 部署 |
| 配置 HTTPS 与反向代理 | 反向代理 / Cloudflare |
| 了解核心环境变量 | 核心配置 / 进阶配置 |
| 日常聊天功能一览 | 对话功能 |
| 管理后台上手 | 管理后台总览 |
| 疑难速查 | 常见问题 |