kuaifan ec1ab31b0e refactor(ai-kb): 索引同步改为容器启动 reconcile
- 删除 CI reindex workflow(ai-kb-reindex.yml):内容入库不再依赖 CI
  远程触发,AI 插件容器每次启动按文件 hash 对账(reconcile)自动增量
  收敛,免重启即时生效时可手动调 POST /kb/reindex(默认 mode=reconcile)
- ai-kb README.md 同步更新贡献流程与内容同步机制说明
- CLAUDE.md 精简 ai-kb 同步规则:去除与 _schema/README 重复的写作规范
  与背景说明,保留同步时机、操作指引、改完无需触发索引三条
- 另:auth 接口 locale 检索语种缺省改为由请求语言推导(含 zh 视为 zh,
  否则 en),删除 config/ai.php 的 rag_supported_locales 与回退逻辑,
  前端改用 getLanguage() 统一映射,同步更新 ai-kb auth.md
- appstore 镜像升级 0.4.3 -> 0.5.0

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 09:46:58 +00:00

65 lines
2.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: ai-assistant.auth.concept
title: AI 助手鉴权stream_key
type: concept
feature: ai-assistant
scope: end-user
locale: zh
aliases:
- AI 鉴权
- AI 授权
- stream_key
- AI token
- AI 流凭证
related_tools: []
related_pages: []
prerequisites:
- 用户已登录
- 当前用户允许聊天
negative:
- stream_key 是一次性凭证,发完一条消息就失效
- 流式接口 /ai/invoke/stream/* 不在主仓库,由 dootask-ai 容器提供
- 普通用户不需要关心 stream_key前端自动获取
last_verified: v1.7.90
---
# AI 助手鉴权stream_key
## 定义
AI 助手发送提问前必须先调用 `POST api/assistant/auth` 生成一次性 `stream_key`,再用它去开 SSE 流(`/ai/invoke/stream/{stream_key}`),既复用登录态又避免把用户 token 暴露给 ai 容器。
## 数据流
1. 用户点发送
2. 前端 `POST api/assistant/auth`,参数:`model_type``model_name``context`JSON`locale`zh/en缺省取请求语言语言包含 zh 视为 zh否则 en
3. 后端 `AssistantController::auth` 校验登录 + 聊天权限,写入临时凭证
4. 返回 `{stream_key: "xxx"}`
5. 前端开 SSE`ai/invoke/stream/{stream_key}`
6. ai 容器消费凭证、转发上游模型,推回 `append/replace/done`
## 关键约束
- **一次性**:一个 stream_key 仅能开一次 SSE 流
- **绑定用户**:内嵌 `userid`,越权使用被拒
- **携带 context**:对话历史在 auth 阶段写入ai 容器不反向查 DooTask 库
- **插件校验**`AssistantController` 构造函数先做 `Apps::isInstalledThrow('ai')`;未装直接抛错
## 权限校验
`User::auth()->checkChatInformation()`:未登录 / 被禁止聊天 / 激活异常都会拒绝。
## 相关接口
| 接口 | 用途 |
|---|---|
| `POST api/assistant/auth` | 生成 stream_key |
| `GET api/assistant/models` | 拉可用模型列表 |
| `POST api/assistant/session/list` | 历史会话 |
| `POST api/assistant/session/save` | 保存当前会话 |
| `POST api/assistant/session/delete` | 删除 / 清空 |
## 不支持
- 不支持复用 stream_key
- 不支持匿名调用
- 不支持终端用户直接管理 token
## 相关
- [[ai-assistant.privacy.concept]]
- [[ai-assistant.streaming.concept]]