Skip to content

AI 能力

本文档介绍产品内置的 AI 智能对话功能;面向开发者的 AI 协作(AGENTS.md、Zenith Skill)见 AI 辅助开发


能力总览

能力当前实现
智能对话独立「智能对话」页面,支持多轮对话、SSE 流式输出、停止生成、重新生成、编辑后重发、消息删除、会话导出、PDF 上传卡片与右侧预览
服务商管理管理系统级 AI 服务商配置,字段包括供应商类型、API 地址、API Key、模型、系统提示词、最大 Token、温度、默认与启用状态;支持连接测试
个人 AI 偏好通过 ai_allow_user_custom_key 系统配置控制是否展示「我的 AI 配置」入口;用户可维护自己的模型端点与 API Key
使用统计按日期范围统计对话数、消息数、输入 / 输出 Token、活跃用户、模型分布、用户 Top 10 与按日趋势
提示词模板支持系统级与用户私有模板,包含名称、内容、描述、分类、排序、启停和内置标记;聊天页可将模板应用为当前对话角色
反馈管理用户可对 AI 回复点赞 / 点踩;点踩可选择原因;管理员可按反馈类型与处理状态筛选并维护处理备注
聊天机器人Webhook 机器人属于即时通讯模块,用于向聊天会话投递卡片消息,详见 即时通讯

AI 对话需要可用的系统服务商配置;未指定具体配置时使用启用的系统默认配置。允许用户自带 Key 时,也可以选择有效的个人配置。


智能对话

页面与交互

前端页面菜单路径为 /ai/chat。页面采用左右主从布局:

  • 左侧为会话列表,支持按标题或消息内容搜索、查看已归档会话、新建会话、重命名、置顶、归档、删除、导出 Markdown / JSON。
  • 右侧为对话区,支持双侧气泡、无气泡、用户气泡三种展示模式,以及左右对齐 / 左对齐切换。
  • 空会话显示引导问题,包括「介绍一下你能做什么」「帮我写一封简短的请假邮件」等快捷入口。
  • 输入区使用 Semi Design AIChatInput,支持选择模型、停止生成和上传 PDF。

流式输出

聊天接口为 POST /api/ai/conversations/{id}/chat,注册在 /api/ai/conversations 下。接口使用 streamSSE 返回服务端事件:

SSE 事件说明
delta返回增量文本片段,前端实时追加到当前 AI 回复
done返回 tokensInputtokensOutput,表示本次生成结束
saved返回 assistantMsgId,前端据此把临时消息 ID 替换为数据库消息 ID
error返回错误信息,前端将当前回复标记为失败

请求体包含:

字段说明
message用户消息,长度 1–8192
configSource可选,system / user,表示使用系统配置或个人配置
configId可选,指定系统服务商配置 ID 或个人配置 ID

服务端会校验会话归属,读取历史消息并按 Token 预算保留最近上下文。历史消息默认最多读取 50 条,裁剪预算默认 6000 Token。用户主动断开或停止生成时,上游请求会被中断;如果已经生成了部分 AI 回复,服务端仍会保存已生成内容。

消息与会话管理

对话保存在 ai_conversations,消息保存在 ai_messages。每次成功生成会写入一条 user 消息和一条 assistant 消息;助手消息会记录生成所用模型、输入 Token、输出 Token。会话标题默认为「新对话」,当首轮提问完成后,服务端用用户消息前 30 个字符更新标题。

支持的会话与消息操作包括:

  • 会话列表、详情、创建、删除
  • 消息历史读取
  • 会话重命名、置顶 / 取消置顶、归档 / 取消归档
  • 对话级提示词设置与清除
  • 导出 Markdown / JSON
  • 删除单条 assistant 消息用于重新生成
  • 删除指定消息及其之后所有消息

PDF 文档预览

聊天输入区允许选择 PDF 文件。前端会:

  1. 在消息区插入 PDF 卡片;
  2. 调用 /api/files/upload-one 上传文件;
  3. 在右侧打开 PDFPreviewPanel 预览本地 File
  4. 使用 @embedpdf/react-pdf-viewer 与本地 @embedpdf/pdfium/pdfium.wasm 渲染 PDF。

PDF 能力用于上传展示与预览,不会在聊天接口中自动解析 PDF 内容。


AI 服务商管理

系统级服务商配置页面菜单路径为 /ai/providers

支持的供应商类型

供应商类型由 ai_provider 枚举定义:

枚举值前端显示
openai_compatibleOpenAI Compatible
anthropicAnthropic
geminiGoogle Gemini
baidu百度千帆

当前流式适配器位于 packages/server/src/lib/ai/adapters/。调用层统一按 OpenAI Compatible 的 /chat/completions 协议发送请求,支持 stream: true 的 SSE 增量响应。

配置字段

字段说明
name配置名称,最大 100 字符
provider供应商类型,默认 openai_compatible
baseUrlAPI 地址,最大 500 字符
apiKeyAPI Key,最大 1000 字符;接口返回时脱敏
model模型名称,最大 100 字符
systemPrompt系统提示词,系统配置最大 4096 字符
maxTokens最大 Token,范围 1–128000,默认 4096
temperature温度参数,数字字符串,默认 0.7
isDefault是否默认服务商
isEnabled是否启用

当某个系统配置被设为默认时,服务端会取消其他配置的默认状态。聊天接口未指定配置时使用启用状态下的系统默认配置;没有可用默认配置时返回 503。

连接测试

POST /api/ai/providers/test-connection 使用给定配置向 {baseUrl}/chat/completions 发送非流式测试请求,请求内容为一条 Hi 消息,max_tokens 为 10,超时时间为 15 秒。编辑已有配置时,如果 API Key 为空或为脱敏值,后端会按配置 ID 读取真实密钥进行测试。


个人 AI 配置

个人配置接口挂载路径为 /api/ai/user-configs

聊天页启动时会读取系统配置 ai_allow_user_custom_key

  • false:页面只加载系统服务商配置,不展示「我的 AI 配置」按钮。
  • true:页面展示「我的 AI 配置」入口,并把启用且填写模型的个人配置加入模型选择器。

个人配置字段包括 nameproviderbaseUrlapiKeymodeltemperaturemaxTokenssystemPromptisEnabled。聊天时选择个人配置会传入 configSource = user 与对应 configId,服务端只允许读取当前登录用户自己的配置,并要求配置启用且包含 API 地址、API Key 和模型名称。

个人配置的接口响应会对 API Key 做脱敏展示;保存时若提交的是脱敏值,服务端保留原始密钥。


提示词模板

提示词模板页面菜单路径为 /ai/prompts

模板范围由 ai_prompt_scope 枚举定义:

枚举值说明
system系统级模板
user用户私有模板

模板字段包括 namecontentdescriptioncategoryscopeuserIdisBuiltinsortisEnabled。管理列表支持分页、范围筛选与名称 / 描述关键词搜索。聊天页通过 GET /api/ai/prompt-templates/available 获取所有启用且当前用户可见的模板,并可将模板内容应用为当前会话的 systemPromptOverride

内置模板种子数据来自 SEED_AI_PROMPT_TEMPLATES,包括:

  • 通用助手
  • 翻译助手
  • 编程助手
  • 文案写作
  • 内容总结

内置模板 isBuiltin = true,服务端禁止删除。


使用统计

用量统计页面菜单路径为 /ai/usage

统计接口为 GET /api/ai/usage/stats,支持查询参数:

参数说明
startDate起始日期,格式 YYYY-MM-DD
endDate结束日期,格式 YYYY-MM-DD

统计数据基于 ai_messages.created_at 聚合,并通过 ai_conversations 关联会话用户与供应商快照。模型名称优先使用 ai_messages.model,其次使用 ai_conversations.provider_snapshot->model,兜底为「未知」。

返回结构包括:

字段说明
overviewtotalConversationstotalMessagestokensInputtokensOutputtotalTokensactiveUsers
byModel按模型统计消息数、输入 Token、输出 Token、总 Token
byUser按用户统计 Top 10,包含用户、对话数、消息数、总 Token
trend按日统计消息数与总 Token,日期格式为 YYYY-MM-DD

Token 数来自模型响应中的 usage 字段;服务商未返回 usage 信息时,对应 Token 计数为 0。


反馈闭环

用户可在聊天消息操作区对 assistant 回复点赞或点踩。反馈写入 ai_messages

字段说明
feedback1 表示点赞,-1 表示点踩,null 表示未反馈
feedbackReason点踩原因;前端预置 inaccurateirrelevantharmfulother
feedbackStatus处理状态:pending / resolved / ignored
feedbackRemark管理员处理备注
feedbackHandledAt处理时间

点踩时前端会先提交 feedback = -1,随后弹窗选择原因。服务端只允许对 assistant 消息提交反馈。点踩反馈默认进入 pending,点赞不会写入处理状态。

管理员页面菜单路径为 /ai/feedback。页面支持按反馈类型与处理状态筛选,并可将反馈状态更新为「待处理」「已处理」或「已忽略」,同时填写处理备注。


接口一览

所有 AI 接口均挂载到 /api/ai/*ai-chatai-conversations 都挂载在 /api/ai/conversations,其中聊天接口为该路径下的流式子路由。

对话与消息

方法路径说明权限
GET/api/ai/conversations获取当前用户对话列表,支持 archivedkeyword登录用户
POST/api/ai/conversations新建对话登录用户
GET/api/ai/conversations/{id}获取对话详情登录用户
DELETE/api/ai/conversations/{id}删除对话登录用户
GET/api/ai/conversations/{id}/messages获取消息历史登录用户
POST/api/ai/conversations/{id}/chatSSE 流式对话登录用户
PUT/api/ai/conversations/{id}/rename重命名对话登录用户
PUT/api/ai/conversations/{id}/pin置顶 / 取消置顶登录用户
PUT/api/ai/conversations/{id}/archive归档 / 取消归档登录用户
PUT/api/ai/conversations/{id}/system-prompt设置对话级提示词登录用户
GET/api/ai/conversations/{id}/export导出 Markdown / JSON登录用户
DELETE/api/ai/conversations/{id}/messages/{msgId}删除 assistant 消息登录用户
DELETE/api/ai/conversations/{id}/messages/{msgId}/cascade删除指定消息及其之后所有消息登录用户
PUT/api/ai/conversations/{id}/messages/{msgId}/feedback提交点赞 / 点踩反馈登录用户

服务商、个人配置、模板与统计

方法路径说明权限
GET/api/ai/providers获取系统服务商配置列表ai:provider:list
GET/api/ai/providers/{id}获取系统服务商配置详情ai:provider:list
POST/api/ai/providers创建系统服务商配置ai:provider:create
PUT/api/ai/providers/{id}更新系统服务商配置ai:provider:edit
DELETE/api/ai/providers/{id}删除系统服务商配置ai:provider:delete
POST/api/ai/providers/{id}/set-default设为默认服务商ai:provider:edit
POST/api/ai/providers/test-connection测试服务商连接登录用户
GET/api/ai/user-configs获取我的 AI 配置列表登录用户
POST/api/ai/user-configs创建我的 AI 配置登录用户
PUT/api/ai/user-configs/{id}更新我的 AI 配置登录用户
DELETE/api/ai/user-configs/{id}删除我的 AI 配置登录用户
GET/api/ai/prompt-templates获取提示词模板列表ai:prompt:list
GET/api/ai/prompt-templates/available获取聊天页可用模板登录用户
GET/api/ai/prompt-templates/{id}获取模板详情ai:prompt:list
POST/api/ai/prompt-templates创建模板ai:prompt:create
PUT/api/ai/prompt-templates/{id}更新模板ai:prompt:edit
DELETE/api/ai/prompt-templates/{id}删除模板ai:prompt:delete
GET/api/ai/usage/stats获取用量统计ai:usage:view
GET/api/ai/conversations/admin/feedback管理员获取反馈列表ai:feedback:view
PUT/api/ai/conversations/admin/feedback/{msgId}管理员处理反馈ai:feedback:handle

数据模型

AI 模块表定义在 packages/server/src/db/schema/ai.ts

枚举

枚举说明
ai_provideropenai_compatible / anthropic / gemini / baiduAI 供应商类型
ai_message_rolesystem / user / assistant消息角色
ai_feedback_statuspending / resolved / ignored反馈处理状态
ai_prompt_scopesystem / user提示词模板范围

表结构速查

关键字段说明
ai_provider_configsidnameproviderbase_urlapi_keymodelsystem_promptmax_tokenstemperatureis_defaultis_enabled、审计字段、created_atupdated_at系统级 AI 服务商配置
ai_conversationsiduser_idtenant_idtitleprovider_snapshotis_archivedis_pinnedsystem_prompt_overridecreated_atupdated_at用户 AI 对话主表
ai_messagesidconversation_idrolecontentmodeltokens_inputtokens_outputfeedbackfeedback_reasonfeedback_statusfeedback_remarkfeedback_handled_atcreated_at对话消息与反馈记录
user_ai_configsiduser_idnameproviderbase_urlapi_keymodeltemperaturemax_tokenssystem_promptis_enabledcreated_atupdated_at用户个人 AI 配置
ai_prompt_templatesidnamecontentdescriptioncategoryscopeuser_idis_builtinsortis_enabled、审计字段、created_atupdated_at提示词模板

用量统计由 ai_messagesai_conversationsusers 聚合产生;反馈闭环复用 ai_messages 字段,不使用独立反馈表。

对外时间字段通过 formatDateTime / formatNullableDateTime 输出,格式为 YYYY-MM-DD HH:mm:ss


前端页面

页面路由说明
智能对话/ai/chat多轮对话、模型选择、提示词角色、PDF 预览、反馈、会话管理
AI 服务商/ai/providers系统级服务商配置管理、启停、默认切换、连接测试
AI 反馈/ai/feedback反馈筛选与处理
提示词模板/ai/prompts模板 CRUD、范围筛选、启停展示
用量统计/ai/usage概览卡片、趋势图、模型统计、用户 Top 10
我的 AI 配置智能对话页侧边弹窗个人配置查看、创建、编辑、删除

相关文档

Built with VitePress for local documentation preview.