内容提要
IssueRelay 是一个开源 AI 客服系统,为 React 网站提供反馈组件。访客提交问题后先存入数据库,由 AI 模型 Jev 分类,经人工审核确认后自动创建 GitHub issue,并去除隐私信息。系统基于 Next.js 和 PostgreSQL,支持自托管,约 15 分钟即可部署。
延伸解读
AI 分类的边界与人工确认
IssueRelay 将 AI 定位为推荐者而非决策者。Jev 仅根据访客消息和所选主题输出类型与严重性标签及概率,路由和是否创建 GitHub issue 由代码中的策略函数决定。例如,只有类型为 bug、路由到工程队列且置信度不低于 0.9 的工单才允许升级。人工审核在仪表板中进行,可覆盖 AI 建议,且覆盖记录单独存储,保留 AI 历史以供评估。这种设计避免了模型误判直接产生公开 issue。
隐私保护与数据安全机制
系统在创建 GitHub issue 前会经过隐私门,检测邮箱、电话、卡号、私钥、API 令牌等敏感信息,并与访客提交的联系方式比对,防止姓名泄露。AI 分类时仅发送消息和主题,不包含姓名、邮箱或工单 ID。GitHub issue 由 GitHub App 创建,权限仅限于写 issue 和读元数据。Webhook 使用 HMAC SHA256 签名验证,并采用恒定时间比较防止时序攻击。这些措施确保公开 issue 不包含私人数据。
部署与自托管的实用要点
自托管 IssueRelay 约需 15 分钟,基于 Vercel 和 Neon PostgreSQL。部署时需注意:首次构建会因根目录设置失败,需将 Root Directory 设为 apps/web 并重新部署;必须运行 /setup 页面并输入 SETUP_TOKEN 来创建所有者账户;需通过命令创建 GitHub App 并订阅 Issues 事件,否则无法同步关闭状态;Jev 的 API 密钥是创建 GitHub issue 的必要条件,缺少时报告仍可入库但无法升级。这些步骤在官方自托管指南中有详细说明
Q&A
IssueRelay 是什么?它主要解决什么问题?
IssueRelay 是一个开源 AI 客服系统,为 React 网站提供反馈组件。它解决网站反馈分散、手动复制到 GitHub 时可能泄露隐私的问题。访客提交问题后先存入数据库,由 AI 模型 Jev 分类,经人工审核确认后自动创建 GitHub issue,并去除隐私信息。
Jev 在 IssueRelay 中扮演什么角色?它是如何工作的?
Jev 是 TypeSafe 的 AI 模型,用于对支持工单进行有界分类。它接收访客消息和所选主题,回答固定选项的问题(如工单类型和严重程度),并返回每个选项的概率。IssueRelay 只将访客消息和主题发送给 Jev,不发送姓名、邮箱等隐私信息。
IssueRelay 如何确保访客报告不会丢失?
IssueRelay 采用“先保存,后处理”的原则。报告到达 API 后,首先在 PostgreSQL 事务中保存,然后才进行 AI 分类等后续步骤。这样即使 AI 或 GitHub 服务中断,报告也不会丢失,工单会保留在仪表板中等待重新处理。
IssueRelay 如何保护访客隐私,避免敏感信息泄露到 GitHub?
在创建 GitHub issue 前,报告会经过隐私门(privacy gate),检查邮箱、电话、卡号、私钥、API 令牌等敏感信息,并与访客提交的联系方式比对。如果发现敏感信息,预览会被阻止,不会发布。此外,GitHub issue 中只包含报告内容和 AI 分类,不包含联系方式。
部署自己的 IssueRelay 需要哪些步骤?
部署步骤包括:1. 使用 Vercel 部署按钮复制仓库并添加 Neon 数据库;2. 访问 /setup 页面创建所有者账户和项目;3. 使用命令创建 GitHub App;4. 添加 GitHub App 密钥和 TypeSafe API 密钥到 Vercel 环境变量并重新部署;5. 在仪表板中连接仓库;6. 在网站上安装 widget。整个过程约 15 分钟。
IssueRelay 如何保持 GitHub 和仪表板之间的同步?
通过 GitHub 的 webhook 实现同步。当 issue 在 GitHub 上关闭或重新打开时,GitHub 会发送 webhook 到 IssueRelay。IssueRelay 验证签名后,更新对应工单的状态。它还会存储每个交付 ID 以避免重复处理,并确保事件按 GitHub 上的发生顺序应用。