加载中…
AI 助手 chat

模块说明

chat 提供 AI 助手体系:应用中心(助手应用列表)、对话页(默认应用 / 指定应用)、流式对话(SSE)、会话管理(新建/列表/消息增量轮询)、配额校验、套餐与我的订阅、历史会话。

鉴权级别:对话、会话、配额、我的订阅均必须登录;应用中心与套餐浏览可选(游客可见,用于引导)。

流式接口(chat/stream)为 SSE 文本协议(非 JSON 信封),需以 chunked 方式接收;其余接口均为统一 JSON 信封。

接口一览

方法 URL 鉴权 说明
GET /api/chat 必须 默认应用对话页数据
GET /api/chat/list 可选 应用中心(助手应用列表)
GET /api/chat/app 必须 指定应用对话页数据
POST /api/chat/stream 必须 流式对话(SSE)
GET /api/chat/quota_check 必须 配额校验
POST /api/chat/new_session 必须 新建会话
GET /api/chat/sessions 必须 会话列表
GET /api/chat/messages 必须 会话消息(支持增量轮询)
GET /api/chat/package 可选 套餐列表
GET /api/user/chat 必须 我的订阅
GET /api/user/chat/history 必须 历史会话

对话页

默认应用 GET /api/chat

无可用默认应用时不报错,返回跳转标记:

{
  "code": "OK",
  "message": "",
  "data": { "redirect_to_home": true },
  "errors": {},
  "request_id": "9f2a5c8e1b3d7f40"
}

正常返回:

{
  "code": "OK",
  "message": "",
  "data": {
    "title": "助手名称",
    "redirect_to_home": false,
    "chat": {
      "id": 1, "name": "...", "slug": "...", "type": "...", "description": "...",
      "icon": "https://...", "is_default": 1, "is_free": 0
    },
    "no_subscription": false,
    "quota_status": { "...": "配额状态" },
    "available_models": [ { "...": "可选模型列表" } ]
  },
  "errors": {},
  "request_id": "9f2a5c8e1b3d7f40"
}

指定应用 GET /api/chat/app?slug=xxx

场景 响应
slug 缺失或格式非法 422 INVALID_PARAMS
应用不存在/未启用 404 NOT_FOUND

响应结构同默认应用(不含 redirect_to_home)。

应用中心 GET /api/chat/list

公开浏览(游客可用):返回 title、app_list(应用摘要列表,字段同 chat 摘要)。

流式对话 POST /api/chat/stream

参数 必填 说明
prompt 是 用户提问(为空 → 422)
session_sn 是 会话编号(须属于当前会员)
model_id 否 指定模型
  • 响应为 SSE 文本流(text/event-stream 语义),客户端以 chunked 持续接收增量内容;
  • 会话已关闭 → 422 BUSINESS_RULE_VIOLATION;应用不存在 → 404 CHAT_NOT_FOUND;
  • 配额不足 → 422 QUOTA_EXCEEDED(免费应用按每日限额 checkFreeAppDaily 校验、不扣订阅配额;付费应用校验并扣减订阅配额);
  • 前置校验失败时走统一 JSON 信封短路(HTTP 错误码 + {code,message,...}),客户端需兼容"首包可能是 JSON 错误"的情形;
  • 限流 20 次/60 秒。

会话管理

新建会话 POST /api/chat/new_session

参数 必填 说明
chat_id 是 应用 ID
model_id 否 指定模型
title 否 会话标题

成功返回 data.session(会话摘要)。模型配置不可用 → 500 AI_CONFIG_UNAVAILABLE;创建失败 → 500 CHAT_CREATE_FAILED。限流 10 次/60 秒。

会话列表 GET /api/chat/sessions

参数 chat_id;返回 data.sessions(当前会员在该应用下的会话列表)。

会话消息 GET /api/chat/messages

参数 必填 说明
session_sn 是 会话编号(须属于当前会员)
after_id 否 增量拉取起点(只返回该消息 ID 之后的新消息)
{
  "code": "OK",
  "message": "",
  "data": {
    "messages": [
      { "id": 1, "role": "user", "content": "...", "content_type": "", "has_error": 0, "created_at": "2026-01-01 10:00:00" }
    ],
    "session": { "...": "会话摘要" }
  },
  "errors": {},
  "request_id": "9f2a5c8e1b3d7f40"
}

单次最多返回 100 条;配合 after_id 做轮询补全(流式结束后的落库消息)。

配额校验 GET /api/chat/quota_check

  • 未登录 → 401 AUTH_REQUIRED;
  • 配额不足 → 422 QUOTA_EXCEEDED,data 携带配额详情;
  • 充足 → 200,data 为配额状态(同对话页的 quota_status)。

套餐与订阅

套餐列表 GET /api/chat/package

公开浏览(游客可用):返回 title、package_list、quota_status(登录时含个人配额状态)。

我的订阅 GET /api/user/chat

参数 必填 说明
page 否 页码,默认 1

返回 title、quota_status、subscription_list、pager。

历史会话 GET /api/user/chat/history

参数 page;返回 title、session_list(跨应用的历史会话)、pager。

注意事项

  • 双重配额模型:免费应用按"每日限额"(不扣订阅配额),付费应用消耗订阅配额(按 token 计量);quota_check 返回的 quota_status 是统一状态视图;
  • 会话归属:sessions / messages / stream 均校验会话归属当前会员,越权返回错误;
  • 流式协议:stream 首包失败为 JSON 信封,成功则为 SSE 文本流;小程序用 wx.request 的 enableChunked 接收,通用客户端可用 fetch 流式读取;
  • AI 相关错误码:AI_CONFIG_UNAVAILABLE(503/500)、CHAT_NOT_FOUND、CHAT_CREATE_FAILED、CHAT_SAVE_FAILED、QUOTA_EXCEEDED;
  • 会话消息落库与流式输出可能存在毫秒级时差,UI 建议以流式内容即时渲染、以 messages 增量接口做最终校正。
添加日期:2026-10-06