Skip to content

实时通知与 AI 助手 ​

通知与 AI 使用同一套前端,但连接方式不同。通知用 EventSource 接收刷新信号;AI 用 fetch 发起带 JSON 与 Bearer 头的流式 POST。

通知链路 ​

  1. 登录后请求 POST /api/v1/notifications/stream-token 获取短期令牌。
  2. 建立 GET /api/v1/notifications/stream?streamToken=...。
  3. 接收 connected、心跳与 notification 事件。
  4. 收到信号后重新查询收件箱和未读统计。

通知事件不是离线消息重放队列。持久化收件箱是通知内容的依据,断线后通过查询补齐。多实例使用 Redis Pub/Sub 广播已提交通知的刷新信号,Pub/Sub 故障或断线期间不保证每条信号送达。

生产持久配置 app.notification.stream-token-secret,同一部署的所有实例保持相同且至少 32 字节;不同环境隔离 Redis、前缀和频道。

启用 AI 助手 ​

在外置开发或生产 YAML 中填写:

yaml
art:
  ai-assistant:
    api-key: "填写客户模型密钥"
    base-url: https://api.deepseek.com
    chat-endpoint: /chat/completions
    model: deepseek-chat

示例对应当前默认模型适配方式,实际地址、模型与凭据须匹配供应商账号。最终 URL 由 base-url 与 chat-endpoint 组合,不要重复拼接路径。修改后重启;Docker 执行 sh scripts/deploy.sh config。

不填写密钥时其他模块仍可启动,AI 接口返回 503。Java 使用 JDK HttpClient 代理兼容流式聊天的模型服务,不依赖独立 AI 服务进程。

配置后如何确认可用 ​

进入管理端 AI 助手发送一条简短问题。正常情况下,文字应逐步显示;若最后才一次出现,优先检查代理缓冲。浏览器 Network 中对应请求应为流式响应,观察 meta、delta、done 或 error 事件。

修改显示名称只影响界面;真正切换供应商要一起修改地址、接口路径、模型和密钥。供应商账号可调用的模型以客户实际服务为准。

第一次验证通知 ​

用有发布权限的账号向一个实际测试用户发布通知,再用该用户查看收件箱和未读数。实时信号负责提醒刷新,收件箱负责保存内容;断线后重新进入收件箱仍应能查询已持久化通知。

HTTP 与事件 ​

POST /api/v1/ai-assistant/chat/stream 接收 messages,使用现有 Bearer Token。有效登录账号可使用,不增加角色权限门槛;停用、删除账号不能调用。

事件主要字段前端用途
metaprovider、label、model模型显示信息
deltacontent增量追加正文
pingts保持连接
donecontent、finishReason完整回复与结束
errormessage已建流后的失败提示

Java 当前公开安全配置不要求请求签名,前端自动跳过签名头,仍携带 Authorization。请求签名与 SSE 连接不是互相替代关系。

建流前鉴权、参数、配置或限流错误返回实际 HTTP 400/401/429/503;建流后的上游错误通过 error 事件结束。排查时不能只看 HTTP 200。

上下文与资源限制 ​

请求接受 user/assistant 消息,数量 1–20,每条最多 4000 字符;服务端添加系统提示。默认总会话超时 120000 毫秒、心跳 15000 毫秒,每实例最多 8 条并发 AI 流,超限直接返回 429,不排队。

可调整 max-context-messages、request-timeout-ms、heartbeat-ms、max-concurrent-streams 与 max-output-chars。字符上限不是模型 token 配额,容量需结合上游限额与实例资源验证。

AI 助手只提供对话,不执行业务操作、不读取业务表,也不保存对话历史;conversationTitle 兼容接收但不持久化。Java 不包含 AI 代码生成器。

网关与排障 ​

流式响应应为 text/event-stream,代理关闭缓冲并允许超过心跳间隔的空闲连接。AI 一直挂起时检查是否收到 meta、delta 或 error;所有内容最后一次性出现时先查代理缓冲。

问题优先核对
通知 401短期令牌申请、过期与多实例密钥一致性
收不到通知收件关系、事件信号和收件箱查询
AI 503密钥、模型与上游连接配置
AI 429实例并发上限和供应商额度
回复中断客户端取消、代理超时、上游错误与会话总超时

源码入口:notifications/controller/NotificationController、NotificationStreamTokenService、NotificationRealtimeService;AI 位于 aiassistant/controller、AiChatStreamService。前端解析见 流式请求。

根据 MIT 许可证发布