使用文档
从安装到日常使用,以及企业部署需要知道的事。
安装
源有三种安装方式,选一种就行。
桌面版(推荐)
下载安装包后一路下一步。装完会在桌面和开始菜单创建快捷方式,首次启动需要 20 到 40 秒(要初始化数据库、加载模型配置)。
支持 Windows 10 以上。macOS 和 Linux 目前需要用源码方式安装。
Docker
适合装在公司内网服务器上,让整个团队连进来用。
docker run -d --name yuan \
-p 8080:8080 \
-v $(pwd)/data:/app/data \
-v $(pwd)/config:/app/config \
--restart unless-stopped \
yuan-assistant:latest
启动后打开 http://服务器地址:8080。
data/ 放数据库、上传的文件、日志;config/ 放配置文件。这两个目录一定要挂出来,否则容器重建时数据会丢。
源码
需要 Python 3.10 以上。
git clone <你的来源> yuan && cd yuan
pip install -r requirements.txt
python main.py web
前端如果要重新构建:
cd frontend && npm install && npm run build
系统要求
| 最低 | 推荐 | |
|---|---|---|
| CPU | 2 核 | 4 核以上 |
| 内存 | 4 GB | 8 GB 以上 |
| 硬盘 | 5 GB | 20 GB 以上 |
| 显卡 | 不需要 | 8 GB 显存(跑本地模型才需要) |
只用云端模型(OpenAI、Claude、Gemini)的话不需要显卡。要完全离线跑本地模型才需要,没显卡也能跑,只是慢很多。
首次启动
首次启动时,系统会生成一组管理员账号密码,只显示一次。
桌面版会直接弹窗显示。服务器版本会打印在终端的启动信息里:
============================================
管理员账号已创建
账号:admin
密码:xK9mP2vL8qR4nW7t
请立即登录并修改密码
============================================
data/ 目录里的数据库文件删掉重新初始化(会清空所有数据),所以请先抄下来。登录后第一件事:到 设置 → 账号 改成自己的密码。
接下来配置模型
没配置模型的话源没法回话。有两条路:
用云端模型 — 到 设置 → 模型,粘贴 API Key。支持 OpenAI、Anthropic、Google。Key 会加密后存进数据库,不会写进配置文件。
用本地模型 — 到 设置 → 推理引擎,点「一键安装 Ollama」。详见本地推理。
两种可以同时配置,之后在对话框上方切换。
对话
主界面左边是对话列表,中间是对话区,右边是状态面板。
模式
左上角有三个模式可切换,会影响回答风格和可用的工具:
| 模式 | 用途 |
|---|---|
| 聊天 | 日常问答、写作、翻译 |
| 工作 | 文档处理、数据分析、定时任务 |
| 程序 | 读写代码、Git、终端 |
思考深度
对话框旁边的设置可以调整思考深度:
- ⚡ 快速 — 直接回答,适合简单问题
- ⚖️ 平衡 — 默认值
- 🧐 深度 — 会先想过再回答,适合复杂问题,慢一些也贵一些
- 🎨 创意 — 发散、头脑风暴
只有支持推理的模型(o 系列、Claude、Gemini 等)会实际生效,其他模型会忽略这个设置。
附加文件
可以直接拖进对话框,或点回形针。支持 PDF、Word、Excel、PowerPoint、纯文本、代码文件、图片。
单个文件上限 25 MB。图片会用视觉模型分析,文档会抽取文字后放进上下文。
屏幕上下文
对话框旁边的眼睛图标打开后,发消息时会一并告诉源你当前在用哪个程序、窗口标题是什么。
问「这个报错是什么意思」的时候不用再解释你在哪个界面。关掉就不会采集。
语音
语音输入
按 Alt+V,或点对话框旁边的麦克风。说完后会自动识别成文字填进输入框,你可以先改再发。
有两种识别方式,在麦克风旁边切换:
- 本地识别 — 浏览器内置的语音识别,或本地的 faster-whisper。不会上传音频。
- 云端识别 — 发到 Whisper API,准确度更高。
首次使用本地识别会下载语音模型(约 150 MB),界面上会显示进度。
实时语音对话
按两下 Alt+V 进入实时对话模式。这是双向语音,说完就回,讲到一半可以直接打断它。
适合开会、开车、手上在忙的时候。用的是云端实时语音服务,所以这个模式下音频会离开你的机器。要完全离线就用上面的本地识别。
工具与自动化
源不只是回话,它会自己用工具把事情做完。你说「把这个文件夹的 CSV 合并后画成图表发给 Kevin」,它会自己拆成读文件、运算、生成图、发邮件几步执行。
执行工具时对话里会出现灰色小标签,显示它正在做什么。
有哪些工具
| 类别 | 能做的事 |
|---|---|
| 文件 | 读取、写入、搜索、复制、移动、删除 |
| 代码 | 执行代码、跑终端命令 |
| 网络 | 搜索、抓网页、操作浏览器 |
| 浏览器 | 打开网页、点按钮、填表单、滚动、提取内容、截图 |
| 版本控制 | status、diff、commit、log、branch |
| 桌面 | 截图、分析画面 |
| 记忆 | 记住、回忆、搜索历史对话 |
| 定时 | 创建定时任务 |
| 通讯 | 发邮件、发送平台消息 |
共 43 个。实际可用数量看你的授权版本。
权限与确认
危险操作(删文件、跑系统命令、写入文件)默认需要你点确认才会执行。可以在 设置 → 权限 改成自动批准,但不建议。
文件操作限制在沙箱目录和你明确授权的路径内,源碰不到授权范围外的文件。
浏览器自动化
源可以实际操作浏览器:
你:去 example.com 登录,账号 [email protected],然后把订单页的数据抓下来
它会依次执行打开页面、填表单、点按钮、提取内容。浏览器 session 在同一段对话里会保持登录状态。
本地推理
本地推理让数据完全不离开你的机器。适合有合规要求或处理敏感数据的场景。
安装
到 设置 → 推理引擎,点「一键安装 Ollama」。系统会检测你的显存,推荐合适的模型大小:
| 显存 | 推荐模型 |
|---|---|
| 没有显卡(纯 CPU) | qwen2.5:3b、phi3:mini |
| 4–7 GB | qwen2.5:3b |
| 8–15 GB | qwen2.5:7b、llama3.1:8b |
| 16–23 GB | qwen2.5:14b |
| 24 GB 以上 | qwen2.5:32b |
下载过程会显示进度。装完后在对话框上方就能选到本地模型。
支持 37 个模型系列,包含 Qwen、Llama、Gemma、DeepSeek、Mistral、Phi。
隐私模式
设置 → 隐私 里可以开启隐私模式。开启后系统会强制只走本地模型,就算你误选了云端模型也不会发出去。
vLLM
如果有多张显卡,可以改用 vLLM 获得更好的吞吐。在 设置 → 推理引擎 选择 vLLM 并指定模型即可。vLLM 需要显卡,不支持纯 CPU。
通讯平台
源可以挂到通讯软件上,让同事或客户直接对话。所有平台共用同一份记忆和知识库。
支持飞书、Telegram、Discord、LINE 官方账号。
它们的运行方式不一样,这会影响你要开几个进程、要不要公网地址:
| 平台 | 怎么跑 | 需要公网地址 |
|---|---|---|
| 飞书 | 跟 web 主进程一起 | 要 |
| LINE | 独立进程,自己的端口 | 要 |
| Telegram | 独立进程,主动轮询 | 不用 |
| Discord | 独立进程,长连接 | 不用 |
飞书
到飞书开放平台创建企业自建应用:
feishu:
app_id: "cli_xxxx"
app_secret: "你的 secret"
verification_token: "事件订阅验证 token"
事件订阅地址填 https://你的域名/api/feishu/webhook,订阅 im.message.receive_v1 事件。这是唯一挂在 web 主进程下的平台,不用另外开进程。
Telegram
找 BotFather 申请 bot 拿到 token:
telegram:
token: "你的 token"
python main.py telegram
Telegram 用主动轮询,不需要公网地址,纯内网也能跑。
Discord
到 Discord Developer Portal 创建应用和 bot,开启 Message Content Intent:
discord:
token: "你的 bot token"
python main.py discord
Discord 走长连接,同样不需要公网地址。
LINE 官方账号
面向海外客户时常用。到 LINE Developers 创建 Messaging API channel:
line:
channel_access_token: "你的 token"
channel_secret: "你的 secret"
webhook_port: 8443
python main.py line
Webhook 地址填 https://你的域名:8443/webhook。
/webhook,不在 web 主进程的 /api 下面。配反向代理时记得指向这个端口。改完配置要重启对应的进程才生效。要同时开多个平台,就各自开一个进程,它们共用同一个数据库。
项目与文件
项目让你把一组相关的对话、文件和规则绑在一起。
创建项目
侧边栏的项目图标 → 新建项目。填名称和说明。
关联文件夹
在项目里可以关联本机文件夹。关联后源会扫描里面的文件结构(会自动跳过 .git、node_modules、__pycache__ 这类目录,也会读 .gitignore),之后在这个项目里对话时就知道有哪些文件。
桌面版会弹出系统的文件夹选择窗口。
工作约定
项目里可以写「工作约定」,就是这个项目专属的规则。例如:
回复一律用简体中文。
代码注释用英文。
提到金额时一律标注币种。
这些规则只在该项目的对话里生效。
项目记忆
项目积累的知识会存成项目记忆,跟着项目走。切到别的项目不会互相干扰。
设置
模型
管理各家 API Key 和默认模型。Key 加密存在数据库里,界面上只显示末四位,需要时可以点眼睛图标查看。
可以设置主模型和备用模型。主模型失败时会自动切到备用。
外观与语言
界面语言支持繁体中文、简体中文、英文、日文。深色和浅色主题。
快捷键
桌面版的全局快捷键,在任何程序里都能用:
| 快捷键 | 功能 |
|---|---|
Alt+M | 显示/隐藏主窗口 |
Alt+V | 语音输入 |
Alt+S | 截图并分析 |
Alt+D | 打开仪表板 |
Alt+P | 把浮动球叫回屏幕中央 |
个人 API 令牌
要从自己的程序调用源,可以在 设置 → 令牌 创建个人访问令牌。创建时会显示一次完整的令牌,之后只看得到前缀。
备份
设置 → 备份 可以手动创建备份,或配置自动备份。备份包含数据库和上传的文件。也可以导出成 JSON 带走全部数据。
授权
版本差异
| 社区版 | Pro | 企业版 | |
|---|---|---|---|
| 用户数 | 1 | 5 | 无限 |
| 每日对话 | 100 | 1,000 | 无限 |
| 对话与记忆 | ✓ | ✓ | ✓ |
| 本地推理 | ✓ | ✓ | ✓ |
| 语音助理 | — | ✓ | ✓ |
| 工作自动化 | — | ✓ | ✓ |
| 通讯平台集成 | — | ✓ | ✓ |
| 项目管理 | — | ✓ | ✓ |
| SSO 单点登录 | — | — | ✓ |
| PostgreSQL / Redis / K8s | — | — | ✓ |
| 多组织架构 | — | — | ✓ |
| 审计与合规报告 | — | — | ✓ |
激活
到 设置 → 授权,会看到这台机器的设备识别码(HWID)。购买时把这串码提供给我们,我们会发一组授权码给你。
拿到授权码后粘进同一页的输入框点激活即可。
一组授权码绑定一台机器。要换机器的话联系我们解绑。
授权状态
授权会定期跟授权服务器确认。断网情况下有 1 天宽限期,超过就会停用。功能或到期日有调整时,会在下次确认时自动更新,不需要重新激活。
企业部署
这一节是给运维人员看的。
PostgreSQL
默认用 SQLite,单机够用。要多台机器共享数据就改 PostgreSQL:
database:
url: "postgresql://user:password@db-host:5432/yuan"
pool_size: 20
改完重启,schema 会自动创建。
Redis
多台机器需要共享缓存和限流:
cache:
backend: "redis"
redis_url: "redis://redis-host:6379/0"
不配置的话用内存缓存,单机没问题,多台会各算各的。
后台任务队列
耗时任务可以丢给 Celery worker 处理,避免卡住 web 服务:
task_queue:
backend: "celery"
broker_url: "redis://redis-host:6379/1"
worker 用这个命令启动:
celery -A worker worker --loglevel=info
SSO 单点登录
支持 OIDC(微信、QQ、Google、Microsoft Entra ID)和 SAML 2.0。
sso:
oidc:
wechat:
client_id: "..."
client_secret: "..."
google:
client_id: "..."
client_secret: "..."
saml:
idp_entity_id: "..."
idp_sso_url: "..."
idp_x509_cert: "..."
回调地址填 https://你的域名/api/sso/{provider}/callback。SAML 的 SP metadata 在 https://你的域名/api/sso/saml/metadata。
访问控制
security:
ip_whitelist: ["10.0.0.0/8", "192.168.1.0/24"]
ip_blacklist: []
max_sessions: 5
login_lockout_attempts: 5
login_lockout_minutes: 15
ip_whitelist 留空表示不限制。支持 CIDR 格式。
session_limit / login_lockout 时,配置值会被忽略并记录警告,但保护照常运行。>
ip_whitelist 和 ip_blacklist 不一样:授权不含这两项时服务会拒绝启动,而不是静默忽略。否则你会以为有 IP 防护,实际上没有。权限分四级:访客、普通、高级、管理员。每一级能用的工具不同,可在 设置 → 权限 调整。
审计与合规
所有操作都会记录,包含操作者、动作、目标、IP、时间。管理员可在后台查看。
合规报告可导出:
GET /api/admin/compliance/report?start=<unix>&end=<unix>&format=csv
需要管理员权限。内容包含审计日志、登录记录、用量统计。
数据删除:后台可以一键删除指定用户的所有数据,包含对话、记忆、文档、上传文件。
Kubernetes
deploy/k8s/ 有现成的部署文件,包含 Deployment(3 副本)、Service、Ingress、HPA(CPU 70% 触发,2 到 10 副本)。
kubectl apply -f deploy/k8s/
数据库连接串和密钥放在 Secret 里,配置文件用 ConfigMap 挂载。
加密
配置文件里的敏感字段(API Key、token、密码)会自动加密,加密后的值以 ENC:: 开头。密钥绑定机器,换机器需要重新输入。
数据库可选择加密。安装 pysqlcipher3 后系统会自动检测并启用,现有的未加密数据库会自动迁移。
API 参考
源的 API 跑在你自己的机器上,不是我们的服务器。Base URL 就是你的安装地址,例如 http://localhost:8080 或 https://yuan.你的公司.com。
适合把源接进公司现有系统:内部工单、CRM、定时脚本、自己写的前端。
所有端点同时挂在 /api 和 /api/v1 两个前缀下,内容一样。下面统一用 /api。
认证
到 设置 → 令牌 创建个人访问令牌,创建时会返回一次完整的令牌:
{ "token": "sk-asst-xxxxxxxxxxxxxxxxxxxx", "name": "我的集成" }
之后每个请求带上这个 header:
Authorization: Bearer sk-asst-xxxxxxxxxxxxxxxxxxxx
权限跟着账号走,不是跟着令牌 —— 把账号降权,它名下所有令牌一起降权。在 设置 → 令牌 删掉某个令牌,它会立刻失效。
还有一条路:桌面版在本机(127.0.0.1)发出的请求会自动以本机用户身份通过,不用带 header。所以在同一台机器上写脚本,可以直接调用,不必先建令牌。
先跑一个看看
最短的完整例子 —— 发一句话,拿一句回复:
curl -X POST http://localhost:8080/api/chat \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"message": "把上周的销售数字整理一下", "stream": false}'
返回:
{ "conversation_id": 42, "content": "上周总销售额为 ..." }
对话
POST /api/chat 是主要的对话端点。
| 字段 | 类型 | 说明 |
|---|---|---|
message | string | 必填,要发送的内容 |
stream | bool | 默认 true。设 false 拿完整 JSON,写脚本更好处理 |
conversation_id | int | 续接已有对话。省略就开新的 |
model_name | string | 指定模型,省略用默认 |
mode | string | chat、work 或 code |
project_id | string | 绑到某个项目,会套用该项目的规则 |
stream: true 时返回 text/event-stream,每条事件是一行 data: 加一个 JSON:
| 事件 | 含义 |
|---|---|
{"content": "..."} | 回复的一小段文字,需要自己拼接 |
{"done": true, "conversation_id": 42} | 结束 |
{"error": "..."} | 出错 |
管理对话
| 方法 | 路径 | 说明 |
|---|---|---|
GET | /api/conversations | 列出。支持 search、limit(上限 200,默认 50)、offset |
POST | /api/conversations | 创建。可带 title、model_name、template_id |
GET | /api/conversations/{id}/messages | 获取消息(最近 100 条) |
PUT | /api/conversations/{id}/title | 改标题 |
DELETE | /api/conversations/{id} | 删除 |
GET | /api/conversations/{id}/export | 导出成文件 |
curl -H "Authorization: Bearer $TOKEN" \
"http://localhost:8080/api/conversations?search=销售&limit=20"
文档
| 方法 | 路径 | 说明 |
|---|---|---|
POST | /api/documents/upload | 上传单个文件(multipart,字段名 file) |
POST | /api/documents/upload-batch | 批量上传 |
GET | /api/documents | 列出 |
GET | /api/documents/search | 全文搜索,关键词放 q |
DELETE | /api/documents/{id} | 删除 |
curl -H "Authorization: Bearer $TOKEN" \
-F "[email protected]" \
http://localhost:8080/api/documents/upload
上传后会自动切块建索引,之后对话时可以被引用。
语音与图片
| 方法 | 路径 | 说明 |
|---|---|---|
POST | /api/voice/stt | 语音转文字。multipart,字段名 file,可带 engine(local/cloud)和 language |
POST | /api/voice/tts | 文字转语音,返回 audio/mpeg |
GET | /api/voice/status | 语音引擎状态 |
POST | /api/image/analyze | 分析图片内容 |
POST | /api/image/ocr | 文字识别 |
POST | /api/image/describe | 无障碍描述 |
POST | /api/image/compare | 比较多张图片 |
系统
| 方法 | 路径 | 说明 |
|---|---|---|
GET | /api/health | 健康检查,不需认证 |
GET | /api/license/info | 当前授权状态 |
GET | /api/user | 当前用户 |
GET | /api/tokens | 列出自己的令牌 |
POST | /api/tokens | 创建令牌,body 带 name |
DELETE | /api/tokens/{id} | 删除令牌 |
/api/health 不需要认证,适合给负载均衡或监控系统做探测。
WebSocket
界面本身走 WebSocket,因为要实时推送工具执行状态。要自己写交互式前端才需要用到,一般集成用上面的 /api/chat 就够了。
浏览器客户端必须先用个人令牌或 JWT 换取一个短时有效、仅可使用一次的 WebSocket ticket。凭据只能放在 HTTP Authorization header 中,绝对不要放进 URL。
POST http://localhost:8080/api/ws-ticket
Authorization: Bearer <你的令牌>
返回的 ticket 只可用于一次连接尝试。每次重新连接前都要换取新的 ticket:
ws://localhost:8080/api/ws?ticket=<一次性 ticket>
非浏览器客户端如果能在 WebSocket upgrade 请求中设置 Authorization: Bearer header,也可以直接使用该 header,不必换取 ticket。
连上后必须先发一条消息,服务端会把第一条当作 init frame。这个 frame 用来设置 session,不负责连接认证:
{ "type": "init" }
之后才发实际内容:
{ "type": "chat", "message": "...", "conversation_id": 42, "mode": "work" }
服务端返回的 type 包括 typing、tool_call、tool_result、chunk、done、error、conversation_created。
错误格式
错误一律返回这个结构:
{
"error": "AUTH_1002",
"message": "令牌已过期"
}
代码有前缀,分段如下:
| 前缀 | 范围 | 类别 |
|---|---|---|
AUTH_ | 1xxx | 认证 |
RES_ | 2xxx | 资源 |
VAL_ | 3xxx | 参数校验 |
RATE_ | 4xxx | 限流 |
AI_ | 5xxx | AI 服务 |
CHAT_ | 6xxx | 对话 |
SRV_ | 9xxx | 服务端 |
用程序判断时请比对 error 代码,message 的文字会随语言变化。
限流
超过限制会返回 429。每日对话条数依授权版本而定,见授权。
故障排查
启动失败
先看日志,位置在 data/logs/。桌面版可以从托盘菜单打开日志目录。
常见原因:
端口被占用 — 默认 8080。改 config.yaml 里的 web.port,或关掉占用的程序。
数据库被锁 — 有另一个实例还在跑。桌面版会自动检测并切到已有窗口;服务器版本要先确认旧进程已退出。
模型未配置 — 界面会提示,到设置里填 API Key 或装本地模型。
回复很慢
- 用本地模型的话,看 设置 → 推理引擎 里的显存占用。如果模型太大塞不进显存,会退回 CPU 运算,速度差很多,换小一点的模型。
- 思考深度设成「深度」会明显变慢,日常用「平衡」就好。
- 对话很长的时候,上下文变大也会变慢。开新对话会快很多。
语音没反应
- 检查浏览器或系统有没有给麦克风权限
- 本地识别首次要下载模型,等进度条跑完
- 桌面版如果
Alt+V没反应,可能是被其他程序抢了快捷键
通讯平台收不到消息
- Webhook 地址必须是 HTTPS,而且要能从外网访问到
- 检查
data/logs/里有没有收到请求的记录 - Telegram 可以先用
polling模式测试,不需要公网地址 - 国内环境注意机器能否访问对应的境外服务
授权失效
- 确认机器能连到授权服务器
- 换过硬件(主板、网卡、硬盘)会导致设备识别码改变,需要重新绑定
- 离线超过 1 天会停用,联网后会自动恢复
还是解决不了
把 data/logs/ 里最近的日志发给我们,附上你做了什么操作、预期什么结果、实际发生什么。