AI 助手
AI 助手将自然语言需求拆成可编辑的待确认任务。桌面端从侧边栏进入;网页移动端和 Android 原生 App 保留底部加号,在快捷菜单中选择 AI 助手。正式页面为 /assistant,不使用设计稿的模拟身份或示例执行逻辑。
配置连接
打开助手右上角的连接配置,填写 API 端点、模型名称和 API 密钥。接口格式可选 Chat Completions(兼容) 或 OpenAI Responses(原生)。端点可填写基础地址(如 OpenAI 的 https://api.openai.com/v1)或完整的 /chat/completions、/responses 地址;后端按所选格式使用对应路径。旧配置默认保持兼容格式,未指定格式且端点以 /responses 结尾时自动识别为原生格式。模型需要支持工具调用,否则只能进行文字对话。模型名称按服务商提供的 ID 填写,不预设默认付费模型。
- 默认是个人模式,每个用户单独保存配置,管理员也有自己的个人配置。
- 管理员可切换到「全站共享配置」,填写专用连接并开启共享。此后所有用户使用该连接,普通用户只能查看是否可用,不能读取共享端点、密钥或修改开关。
- 关闭共享后恢复个人配置。共享不可用时直接报错,不自动改用个人密钥。
- 保存后不返回密钥。留空保留旧密钥,填写新值替换;更换端点必须重新填写密钥,避免将旧密钥发送给其他服务。
- 密钥使用应用加密密钥加密后存储。个人密钥的加密上下文绑定用户 ID,共享密钥使用独立上下文。备份和恢复时须保留
APP_ENCRYPTION_KEY或数据库内自动生成的加密密钥。
端点支持 HTTP 和 HTTPS、本机 / 内网地址、IPv4 / IPv6,以及 1–65535 范围内的自定义端口。例如本机代理 http://127.0.0.1:8787/v1、Ollama 的兼容接口 http://localhost:11434/v1,或内网服务 https://192.168.1.10:8443/v1。模型和服务仍需支持所选接口格式与工具调用,并填写服务接受的密钥。
连接由后端发起:localhost、127.0.0.1 和 ::1 指运行 Tunnel Manager 后端的电脑或容器,不是浏览器或 Android App 所在设备。容器访问宿主机服务时,应使用部署环境提供的宿主机地址(例如已配置的 host.docker.internal)或可达的内网地址。
HTTP 会明文传输 API 密钥与对话,仅适合本机或可信网络;跨公网建议使用 HTTPS。HTTPS 仍校验证书,自签名证书需由后端系统信任。不接受 URL 用户密码、查询参数、片段、未指定地址、链路本地地址(包括 169.254.169.254)、组播及保留地址,并拦截 fd00:ec2::254 元数据地址。连接时再次校验全部 DNS 结果、直接连接已校验的 IP,不跟随重定向,也不使用系统代理。
允许本机和内网端点意味着已登录用户可以让后端向这些网络发送 AI 请求;这不是内网访问隔离机制。多人部署时只向可信用户开放个人连接配置,或由管理员开启全站共享固定端点,并用后端防火墙限制不应访问的目标。
对话与资源
输入内容及该会话的近期消息会发送给配置的服务商。不要在消息中粘贴密钥、连接器令牌或密码。
「允许发送我的资源名称与 ID」默认不选。开启后,可将当前用户权限内的隧道、区域及本人监控项目和探测目标的名称与 ID 摘要发送给 AI;不发送 Cloudflare 凭据、通知配置或其他用户的会话。列表最多各取 100 项,未读到的资源 ID 可由用户明确提供。
会话和任务保存在服务端、按用户隔离,共享连接不共享历史。每个用户最多保存 20 个会话;每会话最多 48 条消息和 48 个任务,每次最多生成 8 个任务。达到限制后删除旧会话或新建会话。切换页面会保留当前草稿;未发送草稿只在客户端内存中,刷新网页或退出 App 后不保证保留。
流式回复与思考摘要
Web 和 Android 点击发送后,消息立即进入对话区,输入框清空,可继续写下一条草稿。回复通过 SSE 逐步显示,等待期间显示「AI 思考中」;小箭头可展开进度或服务商实际返回的思考摘要。兼容接口读取 reasoning_content;原生 Responses 可在配置中开启「请求思考摘要」,发送 reasoning.summary: auto。该选项默认关闭,需模型和服务商支持;不支持时关闭即可。没有返回摘要时只显示进度,不生成虚构思考内容。
摘要随已完成回复保存在当前用户的会话中,不附加到后续模型请求。Responses 请求使用 store: false;服务商自身的数据保留政策仍然适用。事件格式参考 OpenAI Streaming API 文档。服务商忽略流式参数、返回普通 JSON 时也可接收,但只能一次性显示。
只有完整响应通过校验后才保存回复和待确认任务。连接中断时保留当前页面已显示的文字,提示失败并提供重试;重试不会覆盖输入框里新写的草稿。未完成的消息只在客户端内存中,刷新网页或重启 App 后可能丢失;若在服务端保存完成后断线,可先刷新会话检查是否已生成任务,避免重复生成。反向代理需允许 SSE 并关闭响应缓冲。
支持的任务
| 任务 | 确认后的效果 | 权限 |
|---|---|---|
| 创建隧道 | 创建 Cloudflare Tunnel,不部署主机或启动连接器;令牌请到隧道页面获取 | tunnels |
| 新增直连域名绑定 | 为已有隧道新增源站路由及代理 CNAME,TTL 自动,将服务公开到互联网 | domain_bind |
| 新增 DNS 记录 | 新建 A / AAAA / CNAME / TXT / MX / NS / SRV / CAA / PTR 记录 | dns |
| 修改 / 删除 DNS | 按区域、现有完整域名和类型定位记录,展示原值;重名时须指定记录 ID | dns |
| 删除隧道 | 删除指定隧道,不自动清理 DNS;活动连接仍受 Cloudflare 限制 | tunnels |
| 删除监控项目 / 目标 | 删除本人项目(含目标和历史记录)或其中一个目标 | monitors |
| 修改普通后台设置 | 站点名称、描述、图标、落地页、注册开关、邀请码模式和实验功能 | 管理员 |
| 修改优选 CNAME | 修改全局默认值或替换完整预设列表,不自动改动现有 DNS | 管理员 |
| 创建监控项目 | 创建私有空项目,不自动公开或开启告警 | monitors |
| 添加 HTTP 探测目标 | 向已有项目添加 GET 探测,随后开始周期访问目标 | monitors |
工具遵守原有角色、用户组和 Cloudflare 授权边界。模型只能提交固定工具及其参数,不能执行 shell、指定任意业务 API、操作用户权限或读取密钥。任务执行时重新检查权限;Cloudflare 任务还会重新检查连接,连接切换后需要重新生成计划。本地后台设置不依赖 Cloudflare 连接。
必要信息明确后,助手直接生成待确认任务,不会仅因缺少有产品默认值的可选参数而追问:监控检测间隔默认 60 秒,仍不公开、不告警;新增 DNS 的 TTL 默认 1(自动)、代理默认 关闭。服务端在保存任务前补齐并校验参数,Web 和 Android 确认卡展示这些实际默认值。明确指定的有效值会保留;显式无效的 0、null、空字符串等不会当作省略处理(代理的 false 和 MX 优先级的 0 是有效值)。真实资源 ID、名称、域名、记录类型和值、目标 URL、MX 优先级等必要信息缺失或有歧义时仍需澄清,不会编造资源或跳过执行确认。
本版不支持优选 / SaaS 域名绑定、自动安装连接器、依赖前一步结果的同批任务或自动回滚。创建监控项目或隧道后,先确认执行,再用真实资源 ID 继续下一步。已有路由或 DNS 会阻止新增直连绑定;高级变更请到相应业务页面操作。
SRV 使用结构化 data.priority、weight、port、target,记录名包含 _服务._协议.域名;CAA 使用 data.flags、tag、value,其他类型使用 content。这些业务值没有隐含默认,缺少时仍会询问。CAA 明确提供空值是有效输入,不等于省略。确认卡保留结构化数据,便于核对后执行。
助手优先利用已知信息和产品默认值生成草稿,不在聊天中逐项追问可选细节,用户可在确认卡修改。无法定位真实资源或缺少没有依据的必填值时仍需澄清。编辑时,DNS 区域和记录 ID 固定;删除任务没有可编辑的配置,更换对象需取消并重新生成。
修改 DNS 只提交要改的字段;未指定的 TTL、代理、MX 优先级和 SRV / CAA 数据保持原值,不套用新增默认值。服务端按真实记录生成原值快照及最终参数;后台设置只修改白名单中的普通字段。原值快照和自动补齐的 DNS 参数保存在用户的任务中,不发送给 AI;后续对话仅附带任务标题、ID 和状态摘要。
修改和删除前会再次核对快照,资源或设置变化时拒绝执行,需重新生成任务。助手内部对同一记录、监控项目或设置串行执行,但外部控制台及手动编辑不共用这把锁,核对和写入也不是跨系统原子事务,操作期间应避免并发编辑同一对象。
确认、暂停与重试
Web 宽屏在右侧显示任务清单;手机和平板窄屏,以及 Android 原生 App,直接在对话中显示可勾选卡片,新任务到达或重新打开会话时会定位到待确认项。顶部「待确认」按钮可再次定位,不需要在对话中输入“确认”。已完成或已取消的任务保留状态,不再显示勾选框。原生端刷新会保留仍待确认的勾选项,切换会话则清空勾选;二次确认只执行当时选定的任务版本。其他窗口若修改过参数,旧确认会被拒绝,必须刷新后重新核对。
手机网页和原生助手的输入框默认一行,长消息在达到高度上限后内部滚动,发送按钮与输入框同排。原生输入保留换行,最多显示四行、最多 8000 字符。隐私说明按需打开,资源授权仍默认不勾选。助手页使用紧凑底栏,原生端键盘弹出时隐藏底栏并释放预留空间,收起键盘或离开助手后恢复对应布局。
- 查看任务清单,核对资源 ID、域名、源站、DNS 值、代理和探测间隔等具体参数。新增或修改任务可点击「修改参数」,调整表单后「保存修改」。保存只更新待确认任务,不执行业务操作。
- 勾选要执行的任务,再进行一次执行确认。未选任务不执行,纯对话不产生写操作。
- Web 最多同时发送两个独立任务,Android 按所选顺序逐项执行。服务端记录各项真实状态,不把动画当执行结果。
- 暂停仅针对待执行任务。恢复后回到待确认状态;取消不会撤销已经完成的资源操作。
- 超时、服务重启或执行错误时,结果可能是「需核对」。先检查真实资源,确认变更尚未生效且仍需执行后再重试;原值已变化时须重新生成任务。完成的任务不能再次执行;并发重复请求也会被拒绝。
直连绑定涉及 DNS 和隧道配置两次写入,不是原子事务。助手保留完整隧道配置和未修改字段,在写路由前再次比较配置;检测到变化则停止,不自动覆盖或回滚。Cloudflare 外部控制台没有与本服务共用锁,操作期间避免同时编辑同一隧道。失败时可能已创建 DNS,必须同时检查 DNS 与路由,不能盲目重试。
执行记录写入原业务审计分类。审计不记录 API 密钥或完整对话。AI 服务的费用、限额和数据保留规则由所配置服务商决定,开启共享前应在服务商侧设置预算和额度。
开发验证
- 后端:在
backend运行go test ./...。 - Web:在
frontend运行npm test、npm run build。 - 原生:在
android运行gradle --offline --max-workers=2 :app:assembleDebug;按本机配置设置JAVA_HOME。 - 浏览器:启动前端开发服务器(默认测试地址
127.0.0.1:8084)及启用 CDP 的 Chromium(默认9223),运行node frontend/tests/assistant-browser.mjs。可通过ASSISTANT_TEST_ORIGIN、ASSISTANT_TEST_CDP、ASSISTANT_TEST_OUTPUT覆盖地址和截图目录。
浏览器测试拦截业务 API,禁止外部请求,覆盖窄屏、明暗主题、即时发送、增量回复、摘要展开、断流重试、编辑后确认、暂停恢复、共享只读、会话隔离和密钥不写本地存储,不调用付费模型或真实 Cloudflare 写接口。APK 构建通过不等于真机 UI 或真实服务联调已验证。