发起聊天(技能)

建立websocket

curl -X WS 'wss://HOST:PORT/api/v1/third_interface/new/chat?chai_id=聊天ID?key=秘钥&token=令牌/access_token'

鉴权

出于安全考虑,必须将 TOKEN 存储于服务端并通过后端接口调用,避免在前端代码中直接暴露,以防止凭证泄露造成损失

请在 Websocket 请求的 请求参数中携带 token,见Request Params

TOKEN获取可通过 个人令牌 和 OAuth 应用获取,具体见 个人令牌授权OAuth 授权码授权

应用秘钥private_key 的获取具体见 生成应用密钥

Request Params

  • chat_id (str) 聊天ID (非必填) 在原有聊天基础上继续对话,可通过对话消息返回的 chat_id 获取
  • key* (str)秘钥
  • token* (str)令牌

发送请求

直接发送 Json 字符串,格式如下

  • chatHistory (arr) 聊天历史列表 ,从获取历史消息接口中获取,需要过滤category为node的记录
  • inputs(obj)
    • input(str) 用户问题
    • file_list(array) 文件列表
    • form(obj) 高级变量
      • 高级变量名
      • ...
{
  "chatHistory":[
    {
      "is_bot": false,
      "source": 0,
      "message": {
        "input": "李明今天赚了100元人民币",
        "file_list": []
      },
      "extra": "\"{}\"",
      "type": "human",
      "category": "question",
      "flow_id": "ac5da15cc68f4b289a1123b2486c551f",
      "chat_id": "5f85f74988e830aad4332b09d7f13eab",
      "user_id": "3",
      "liked": 0,
      "solved": 0,
      "sender": null,
      "receiver": null,
      "intermediate_steps": null,
      "files": null,
      "remark": null,
      "create_time": "2024-08-27T14:01:16",
      "update_time": null,
      "user_question": null,
      "knowledge_source": null,
      "answer_files": null,
      "id": null,
      "isSend": true
    },
    {
      "is_bot": true,
      "source": 0,
      "message": "李明今天赚了100元人民币。",
      "extra": "\"{}\"",
      "type": "end_cover",
      "category": "answer",
      "flow_id": "ac5da15cc68f4b289a1123b2486c551f",
      "chat_id": "5f85f74988e830aad4332b09d7f13eab",
      "user_id": "3",
      "liked": 0,
      "solved": 0,
      "sender": null,
      "receiver": null,
      "intermediate_steps": null,
      "files": null,
      "remark": null,
      "create_time": "2024-08-27T14:01:16",
      "update_time": null,
      "user_question": null,
      "knowledge_source": [],
      "answer_files": [],
      "id": "157c3a24049d47f2a51530de80af877e",
      "isSend": false
    }
  ],
  "inputs": {
    "input": "你好",
    "file_list": [],
    "form": {
      "Input_1744788467616": "1",
      "InputNumber_1744788460520": 3,
      "Select_1744788459205": "选项1",
      "Checkbox_1744788456599": [
        "选项2",
        "选项1"
      ],
      "DatePicker_1744788455301": "2025-04-03",
      "UploadFile_1744788453579": [
        {
          "file_path": "http://Host:PORT/api/v1/file/download?object_name=20250416a13adaaed549458cab4c98c341b35986.pdf",
          "object_name": "20250416a13adaaed549458cab4c98c341b35986.pdf",
          "file_name": "半云科技员工绩效考核管理办法.pdf",
          "hash_code": "afe14fae2b9422afacd384da2091ea15"
        }
      ]
    }
  }
}

Response

消息返回参数说明

返回参数key 类型 含义
is_bot bool true是大模型回复,false是用户问题
message str/ json 返回的消息最终结果
type str begin/close 表示整轮会话的开始和结束,start/stream/end 表示stream的开始和结束
category str processing: 暂无特别实用 question/answer/report/system: 对应前端不同的展示样式
user_id int 当前用户id
message_id int 消息id
source bool 是否支持溯源, 0 不支持, 1 支持, 2有权限限制,3 问答库, 4 QA库
flow_id str 当前聊天的技能id
chat_id str 当前会话id
knowledge_source json 知识库来源列表 包含file_name和file_url
answer_files json 结束节点文件输出列表 包含file_name和file_url
is_microApp json 微应用数据(返回前端代码信息)

当完整构建一条消息,至少需要后端给前端发送4条消息:

type=begin, category=system
type=start, category=system
type=end, message=""
type=close, category=system

开始处理对话的消息

表示已经接受到消息,准备开始执行

{
  "is_bot": true,
  "message": "",
  "type": "begin",
  "category": "system",
  "user_id": 3,
  "flow_id": "ac5da15c-c68f-4b28-9a11-23b2486c551f",
  "chat_id": "5f85f74988e830aad4332b09d7f13eac"
}

接受节点运行状态的消息

该类型消息会成对发送,第一条 "type": "start"表示该节点开始运行, 第二条"type": "end",同时在message中携带该节点的运行时间,下列实例表示大模型节点执行过程,执行了0.12秒

  • 第一条
{
  "is_bot": true,
  "message": {
    "node_id": "BigModel-ab5e1",
    "node_name": "大模型",
    "input_str": {}
  },
  "type": "start",
  "category": "node",
  "user_id": 3,
  "flow_id": "ac5da15c-c68f-4b28-9a11-23b2486c551f",
  "chat_id": "5f85f74988e830aad4332b09d7f13eac"
}
  • 第二条
{
  "is_bot": true,
  "message": {
    "node_id": "BigModel-ab5e1",
    "node_name": "大模型",
    "output_str": "",
    "cost_time": "0.12s"
  },
  "type": "end",
  "category": "node",
  "user_id": 3,
  "flow_id": "ac5da15c-c68f-4b28-9a11-23b2486c551f",
  "chat_id": "5f85f74988e830aad4332b09d7f13eac"
}

流式开始输出的消息

表示接下来准备输出流式消息

{
  "is_bot": true,
  "message": "",
  "type": "start",
  "category": "processing",
  "user_id": 3,
  "flow_id": "ac5da15c-c68f-4b28-9a11-23b2486c551f",
  "chat_id": "5f85f74988e830aad4332b09d7f13eac"
}

流式输出消息

message为输出的片段

{
  "is_bot": true,
  "message": "你好",
  "type": "stream",
  "category": "processing",
  "user_id": 3,
  "flow_id": "ac5da15c-c68f-4b28-9a11-23b2486c551f",
  "chat_id": "5f85f74988e830aad4332b09d7f13eac"
}

流式输出结束消息

{
  "is_bot": true,
  "message": "",
  "type": "end",
  "category": "processing",
  "user_id": 3,
  "flow_id": "f9688199-4d7c-47a8-b118-0110b3b32a6a",
  "chat_id": "ed34c807e84f7d7d375a543c493a1b47"
}

最终回答的消息

将流式输出拼接成完成的一段话,并且返回文件、知识库来源、微应用等信息

{
  "is_bot": true,
  "message": "你好!有什么我可以帮助你的吗?",
  "type": "end_cover",
  "category": "answer",
  "user_id": 3,
  "message_id": "580228c75f134cada43a625515529988",
  "flow_id": "ac5da15c-c68f-4b28-9a11-23b2486c551f",
  "chat_id": "5f85f74988e830aad4332b09d7f13eac",
  "knowledge_source": [
    {
      "file_name": "日常用语.txt",
      "file_url": "http://bywin-file/tmp-dir/mydocx.txt"
    }
  ],
  "answer_files": [
    {
      "file_url": "public-files/tmp_answer_files/cae48dcfa9b2a7e14fe4a2655c560b61/技能基本信息.docx",
      "file_name": "技能基本信息.docx"
    }
  ],
  "is_microApp": {
    "id": "MicroApp-b8378",
    "pageList": [
      {
        "key": "0",
        "code": "<!DOCTYPE html>前端代码</html>",
        "label": "首页",
        "pageId": "0"
      },
      {
        "key": "1",
        "code": "<!DOCTYPE html>前端代码</html>",
        "label": "成功",
        "pageId": "success"
      }
    ]
  }
}

回答结束消息

表示该次回答结束

{
  "is_bot": true,
  "message": "",
  "type": "close",
  "category": "processing",
  "user_id": 3,
  "flow_id": "f9688199-4d7c-47a8-b118-0110b3b32a6a",
  "chat_id": "ed34c807e84f7d7d375a543c493a1b47"
}

api方式调用

Post请求 https://HOST:PORT/api/v1/flow/chat/api

Request Body

{
  "chat_id":"222",   #随机生成
  "message":{"question":"hello","file_list":[]}, #question对应为用户问题  file_list默认为空即可
  "api_key":"api_key", #扳手ai平台生成的key
  "message_id":"2222222222222",#随机生成
  "chat_history":[]   #聊天历史示例见下文
}

ResponseBody

event: message
data: {"is_bot": true, "message": "", "type": "start", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": " \u60a8", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\u597d", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\uff01", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\u5982\u679c\u60a8", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\u6709\u4efb\u4f55", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\u95ee\u9898", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\u6216", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\u9700\u8981", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\u5e2e\u52a9", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\uff0c\u8bf7", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\u968f\u65f6", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\u544a\u8bc9\u6211", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\u3002", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\u6211", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\u5728\u8fd9\u91cc", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\u4e3a\u60a8\u63d0\u4f9b", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\u652f\u6301", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "\u3002", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event: message
data: {"is_bot": true, "message": "", "type": "end", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}

event:message
data:{"is_bot": true, "message": " \u60a8\u597d\uff01\u5982\u679c\u60a8\u6709\u4efb\u4f55\u95ee\u9898\u6216\u9700\u8981\u5e2e\u52a9\uff0c\u8bf7\u968f\u65f6\u544a\u8bc9\u6211\u3002\u6211\u5728\u8fd9\u91cc\u4e3a\u60a8\u63d0\u4f9b\u652f\u6301\u3002", "type": "end_cover", "category": "answer", "intermediate_steps": null, "files": [], "user_id": 1, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "\"{}\"", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null, "answer_files": null, "is_microApp": null} #全部回答

event: message
data:DONE

参数说明

输出数据格式跟扳手平台模型配置有关 无论是否配置模型流式输出  结束消息之前都会返回最后一条消息
具体参数说明见上文