角色模拟Web API文档

一、接口要求

内容 说明
传输协议 https/wss
接口鉴权 签名机制,详情请参照下方鉴权认证
字符编码 UTF-8
响应格式 统一采用 JSON 格式
开发语言 任意,只要可以向车联云服务发起 HTTP/WebSocket 请求的均可

二、鉴权认证

在调用业务接口时,请求方需要对请求进行签名,服务端通过签名来校验请求的合法性。

鉴权方法

1、设置签名

在 HTTP 请求头 Header 或者 WebSocket 接口中设置参数:appId, timestamp, signature

示例:

  • HTTP接口:在 Http Request Header 中配置以下参数
String appId = "应用ID"String secret = "应用的秘钥"
Long timestamp = System.currentTimeMillis();
String signature = ApiAuthAlgorithm.getSignature(appId, secret, timestamp);

request.setHeader("appId",appId);
request.setHeader("timestamp",timestamp);
request.setHeader("signature",signature);
  • WebSocket接口:通过在请求地址后面加上鉴权相关参数的方式
wss://ai-character.xfyun.cn/api/open/interactivews/{sid}?appId=xxx&timestamp=xxx&signature=xxxxxx

签名参数说明:

字段名 类型 描述 必须
appId String 应用 ID Y
timestamp Long 时间戳,单位: ms,与服务端时间相差五分钟之内 Y
signature String 签名 Y

2、签名(signature)生成规则

  • 首先,用应用 ID(appId)和时间戳(timestamp)通过 MD5 算法生成随机授权参数 auth
  • 再使用授权参数 auth 和接口密钥(secret)基于 HmacSHA1 生产签名 signature

示例:

public class ApiAuthAlgorithm {

  private static final char[] MD5_TABLE = {
    '0',
    '1',
    '2',
    '3',
    '4',
    '5',
    '6',
    '7',
    '8',
    '9',
    'a',
    'b',
    'c',
    'd',
    'e',
    'f'
  };

  /**
   * 获取签名
   *
   * @param appId    签名的key
   * @param secret 签名秘钥
   * @return 返回签名
   */
  public String getSignature(String appId, String secret, long ts) {
    try {
      String auth = md5(appId + ts);
      return hmacSHA1Encrypt(auth, secret);
    } catch (SignatureException e) {
      return null;
    }
  }

  /**
   * sha1加密
   *
   * @param encryptText 加密文本
   * @param encryptKey  加密键
   * @return 加密
   */
  private String hmacSHA1Encrypt(String encryptText, String encryptKey)
    throws SignatureException {
    byte[] rawHmac;
    try {
      byte[] data = encryptKey.getBytes(StandardCharsets.UTF_8);
      SecretKeySpec secretKey = new SecretKeySpec(data, "HmacSHA1");
      Mac mac = Mac.getInstance("HmacSHA1");
      mac.init(secretKey);
      byte[] text = encryptText.getBytes(StandardCharsets.UTF_8);
      rawHmac = mac.doFinal(text);
    } catch (InvalidKeyException e) {
      throw new SignatureException("InvalidKeyException:" + e.getMessage());
    } catch (NoSuchAlgorithmException e) {
      throw new SignatureException(
        "NoSuchAlgorithmException:" + e.getMessage()
      );
    }
    return new String(Base64.encodeBase64(rawHmac));
  }

  private String md5(String cipherText) {
    try {
      byte[] data = cipherText.getBytes();
      // 信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
      MessageDigest mdInst = MessageDigest.getInstance("MD5");

      // MessageDigest对象通过使用 update方法处理数据, 使用指定的byte数组更新摘要
      mdInst.update(data);

      // 摘要更新之后,通过调用digest()执行哈希计算,获得密文
      byte[] md = mdInst.digest();

      // 把密文转换成十六进制的字符串形式
      int j = md.length;
      char[] str = new char[j * 2];
      int k = 0;
      for (byte byte0 : md) { // i = 0
        str[k++] = MD5_TABLE[byte0 >>> 4 & 0xf]; // 5
        str[k++] = MD5_TABLE[byte0 & 0xf]; // F
      }
      // 返回经过加密后的字符串
      return new String(str);
    } catch (Exception e) {
      return null;
    }
  }
}

鉴权结果

如果鉴权失败,则根据不同错误类型返回不同 HTTP Code 状态码,同时携带错误描述信息,详细错误说明如下:

HTTP Code 说明 错误描述信息 解决方法
401 鉴权参数为空 Invalid Param, Please check header 检查是否设置鉴权参数
401 签名参数解析失败 Signature cannot be verified 检查签名的各个参数是否有缺失是否正确,特别确认下复制的secret是否正确
401 签名校验失败 Signature required 签名验证失败,可能原因有很多。 1. 检查 appId、secret 是否正确。 2.检查计算签名的方法是否正确。 3. 检查时间戳是否正确等等
403 时钟偏移校验失败 Invalid time or time required 检查服务器时间是否标准,相差 5 分钟以上会报此错误
405 应用无效 Invalid App 检查该 appId 是否开通授权

三、接口列表

1 判断玩家账号是否注册

1.1 接口描述

您需要为每一位使用对话功能的用户创建玩家帐号。
同一应用下,玩家名称不可重复,同名视为已注册。

1.2 接口地址

https://ai-character.xfyun.cn/api/open/player/if-register

1.3 请求参数

GET,application/form-data
字段名 类型 描述 必须 默认值
appId String 应用ID Y
playerName String 玩家姓名 Y

1.4 返回参数

字段名 类型 描述 必须 默认值
code int 错误码,成功= 10000 Y 10000
success Boolean 是否成功 Y
message String 结果描述 Y
data Boolean 结果描述,玩家账号已存在为true,不存在为false Y

示例:

{
    "success": true,
    "code": 10000,
    "message": "操作成功!",
    "data": true
}

2 创建玩家账号

2.1 接口描述

玩家帐号,即与角色对话的终端用户。您需要为每一位使用对话功能的用户创建玩家帐号。
除非您在应用层自定义了特殊逻辑,否则默认情况下,每个玩家都可以与应用下的任意角色进行对话。

2.2 接口地址

https://ai-character.xfyun.cn/api/open/player/register

2.3 请求参数

POST,application/json
字段名 类型 描述 必须 默认值
appId String 应用ID Y
playerName String 玩家名称(同一应用下不允许重复),50字符以内 Y
playerType String 玩家类型(开发者自定义枚举值),50字符以内 N
description String 玩家描述,300字符以内 N
senderIdentity String 玩家身份标识,300字符以内 N

示例:

{
    "appId":"12345678",
    "playerName":"张三",
    "description":"张三是一名程序员。",
	"playerType":"移动端注册玩家",
    "senderIdentity":"张三"
}

2.4 返回参数

字段名 类型 描述 必须 默认值
code int 错误码,成功= 10000 Y 10000
success Boolean 是否成功 Y
message String 结果描述 Y
data String 新建玩家ID Y

示例:

{
    "success": true,
    "code": 10000,
    "message": "操作成功!",
    "data": "0f1c9c1ab6ce1fc7c2f1731394fdf33e"
}

3 编辑玩家账号

3.1 接口描述

编辑玩家名称、描述和类型信息。

3.2 接口地址

https://ai-character.xfyun.cn/api/open/player/modify

3.3 请求参数

POST,application/json
字段名 类型 描述 必须 默认值
appId String 应用ID Y
playerId String 玩家ID Y
playerName String 玩家姓名(同一应用下不允许重复) Y
playerType String 玩家用户类型(开发者自定义枚举值) N
description String 玩家用户描述 N
senderIdentity String 玩家身份标识,300字符以内 N

示例:

{
    "appId": "12345678",
    "playerId": "0f1c9c1ab6ce1fc7c2f1731394fdf33e",
    "playerName": "张三",
    "description": "张三是一名程序员。",
    "playerType": "网页端注册用户",
    "senderIdentity":"张三"
}

3.4 返回参数

字段名 类型 描述 必须 默认值
code int 错误码,成功= 10000 Y 10000
success Boolean 是否成功 Y
message String 结果描述 Y
data String 结果描述 Y

示例:

{
    "success": true,
    "code": 10000,
    "message": "操作成功!",
    "data": true
}

4 删除玩家账号

4.1 接口描述

删除玩家帐号,会同步删除该玩家创建的所有人格,人格的所有记忆,以及该玩家参与的所有对话记忆。
删除后可重新注册同名帐号。

4.2 接口地址

https://ai-character.xfyun.cn/api/open/player/delete

4.3 请求参数

POST,application/json
字段名 类型 描述 必须 默认值
appId String 应用ID Y
playerId String 玩家账号ID Y
playerName String 玩家姓名 Y

示例:

{
    "appId":"12345678",
    "playerId":"0f1c9c1ab6ce1fc7c2f1731394fdf33e",
    "playerName":"张三"
}

4.4 返回参数

字段名 类型 描述 必须 默认值
code int 错误码,成功= 10000 Y 10000
success Boolean 是否成功 Y
message String 结果描述 Y
data String 结果描述 Y

示例:

{
    "success": true,
    "code": 10000,
    "message": "操作成功!",
    "data": true
}

5 创建人格

5.1 接口描述

角色,即人格。角色必须创建在某个玩家帐号下。您可以使用固定的玩家帐号来集中管理所有角色,也可以允许玩家自定义角色, 将角色创建在不同玩家帐号下。
角色设定信息请以角色名称或第二人称“你”来指代。

5.2 接口地址

https://ai-character.xfyun.cn/api/open/agent/edit-character

5.3 请求参数

POST,application/json
字段名 类型 描述 必须 默认值
appId String 应用ID Y
playerId String 玩家ID Y
agentName String 人格名称(同一应用下,不允许重复) Y
agentType String 人格类型(由开发者自定义枚举值) N
description String 人格描述(仅做静态展示用,不影响模型生成效果) N
identity String 社会身份 N
personalityDescription String 性格描述 N
languageStyle JSONArray 语言风格示例,包含序号field,场景描述scene (max=100),发言示例example (max=100)三个属性 N
hobby String 爱好 N
speaker String 发音人 N
keyPersonality String 性格标签,100字符以内 N
mission String 任务目标,1000字符以内 N

示例:

{
    "appId": "12345678",
    "playerId": "0f1c9c1ab6ce1fc7c2f1731394fdf33e",
    "agentName": "张三",
    "agentType": "测试",
    "description": "这里描述角色的介绍,比如张三是一名程序员。",
    "identity": "这里描述角色的职业身份,比如‘程序员’‘你是一名程序员’。",
    "personalityDescription": "这里描述角色的性格特征,比如‘热情’‘你待人非常热情’。",
    "languageStyle": [
      {
        "scene": "这里描述一种场景",
        "example": "这里写角色在场景中最有可能说的话",
        "field": "这里写序号"
      },
      {
        "scene": "张三和他人打招呼",
        "example": "嗨,朋友~",
        "field": "1"
      }
    ],
    "hobby": "这里描述角色的爱好,比如‘游泳’。",
    "speaker": "这里写发音人参数vcn",  //如果您购买了语音合成,可以设置发音人 
	"keyPersonality": "乐观",
    "mission": "这里描述角色任务"
}

5.4 返回参数

字段名 类型 描述 必须 默认值
code int 错误码,成功= 10000 Y 10000
success Boolean 是否成功 Y
message String 结果描述 Y
data String 新增人格ID Y

示例:

{
    "success": true,
    "code": 10000,
    "message": "操作成功!",
    "data": "513fb8e354a546e75c0c7bda32a408fd"
}

6 编辑人格

6.1 接口描述

编辑人格的属性。

6.2 接口地址

https://ai-character.xfyun.cn/api/open/agent/edit-character

6.3 请求参数

POST,application/json
字段名 类型 描述 必须 默认值
appId String 应用ID Y
playerId String 玩家ID Y
agentId String 人格ID Y
agentName String 人格名称(同一应用下,不允许重复) Y
agentType String 人格类型(由开发者自定义枚举值) N
description String 人格描述(仅做静态展示用,不影响模型生成效果) N
identity String 社会身份 N
personalityDescription String 性格描述 N
languageStyle JSONArray 语言风格示例,包含序号field,场景描述scene (max=100),发言示例example (max=100)三个属性 N
hobby String 爱好 N
speaker String 发音人 N
keyPersonality String 性格标签,100字符以内 N
mission String 任务目标,1000字符以内 N

示例:

{
  "appId": "12345678",
  "playerId": "0f1c9c1ab6ce1fc7c2f1731394fdf33e",
  "agentId": "513fb8e354a546e75c0c7bda32a408fd",
  "agentName": "张三",
  "agentType": "测试",
  "description": "这里描述角色的介绍,比如张三是一名程序员。",
  "identity": "这里描述角色的职业身份,比如‘程序员’‘你是一名程序员’。",
  "personalityDescription": "这里描述角色的性格特征,比如‘热情’‘你待人非常热情’。",
  "languageStyle": [
    {
      "scene": "这里描述一种场景",
      "example": "这里写角色在场景中最有可能说的话",
      "field": "这里写序号"
    },
    {
      "scene": "张三和他人打招呼",
      "example": "嗨,朋友~",
      "field": "1"
    }
  ],
  "hobby": "这里描述角色的爱好,比如‘游泳’。",
  "speaker": "这里写发音人参数vcn",  //如果您购买了语音合成,可以设置发音人 
  "keyPersonality": "乐观",
  "mission": "这里描述角色任务"
}

6.4 返回参数

字段名 类型 描述 必须 默认值
code int 错误码,成功=10000 Y 10000
success Boolean 是否成功 Y
message String 结果描述 Y
data String 编辑人格ID Y

示例:

{
    "success": true,
    "code": 10000,
    "message": "操作成功!",
    "data": "513fb8e354a546e75c0c7bda32a408fd"
}

7 查询人格

7.1 接口描述

查询人格的所有属性信息。

7.2 接口地址

https://ai-character.xfyun.cn/api/open/agent/get-character

7.3 请求参数

GET,application/form-data
字段名 类型 描述 必须 默认值
appId String 应用ID Y
agentId String 人格ID N
agentName String 人格名称 N

示例:

https://ai-character.xfyun.cn/api/open/agent/get-character?appId=xxxx&agentId=xxxx&agentName=xxxxxx

7.4 返回参数

字段名 类型 描述 必须 默认值
code int 错误码,成功= 10000 Y 10000
success Boolean 是否成功 Y
message String 结果描述 Y
data String 结果描述 Y

data示例:

{
  "appId": "12345678",
  "playerId": "0f1c9c1ab6ce1fc7c2f1731394fdf33e",
  "agentId": "513fb8e354a546e75c0c7bda32a408fd",
  "agentName": "张三",
  "agentType": "测试",
  "description": "张三是一名程序员。",
  "identity": "程序员",
  "personalityDescription": "你待人非常热情。",
  "languageStyle": [
    {
      "scene": "张三在评审需求",
      "example": "我觉得这个需求不合理。",
      "field": "2"
    },
    {
      "scene": "张三和他人打招呼",
      "example": "嗨,朋友~",
      "field": "1"
    }
  ],
  "hobby": "游泳。",
  "speaker": "xxx"
}

8 删除人格

8.1 接口描述

删除角色,且同步删除角色的所有记忆。

8.2 接口地址

https://ai-character.xfyun.cn/api/open/agent/delete-character

8.3 请求参数

DELETE,application/form-data
字段名 类型 描述 必须 默认值
appId String 应用ID Y
agentId String 人格ID Y
agentName String 人格名称 Y

示例:

https://ai-character.xfyun.cn/api/open/agent/get-character?appId=xxxx&agentId=xxxx&agentName=xxxxxx

8.4 返回参数

字段名 类型 描述 必须 默认值
code int 错误码,成功= 10000 Y 10000
success Boolean 是否成功 Y
message String 结果描述 Y
data String 结果描述:成功删除 Y

9 新增短期记忆

9.1 接口描述

用于创建短期记忆,包含对话记忆和观察记忆。
• 对话记忆指玩家和角色经历过的每一轮对话。对话记忆将持续影响角色的后续对话及行为反应。对话记忆由我们的服务自动创建。 • 观察记忆指角色视角下的剧情场景、背景知识、对话人身份信息等。您可以在调用对话接口前,为角色创建一条观察记忆,帮助角色了解场景上下文,并按照剧情展开对话。

9.2 接口地址

https://ai-character.xfyun.cn/api/open/interactive/generate

9.3 请求参数

POST,application/json
字段名 类型 描述 必须 默认值
appId String 应用ID Y
agentId String 人格ID Y
interactionType String 记忆类型,cnv:对话,obs:观察 Y
description String 记忆内容 Y

示例:

{
    "appId": "12345678",
    "agentId": "513fb8e354a546e75c0c7bda32a408fd",
    "interactionType": "obs",
    "description": "张三正在敲代码,遇到了李四来提需求。"
}

9.4 返回参数

字段名 类型 描述 必须 默认值
code int 错误码,成功= 10000 Y 10000
success Boolean 是否成功 Y
message String 结果描述 Y

示例:

{
    "success": true,
    "code": 10000,
    "message": "操作成功!"
}

10 对话开启

10.1 接口描述

驱动角色主动发言。 为保障人格的发言能接上之前的对话内容,开启会话时需要填写上轮会话ID。

10.2 接口地址

wss://ai-character.xfyun.cn/api/open/interactivews/{sid}?appId=xxx&timestamp=xxx&signature=xxxxxx

在请求URL上带上参数:appId, timestamp, signature 鉴权生成见上文接口鉴权,首次连接时,服务器会校验身份凭证及配额。

10.3 请求参数

POST,application/json
字段名 类型 描述 必须 默认值
header.app_id String 应用ID Y
header.agent_id String 人格ID Y
header.uid String 玩家ID Y
parameter.chat.chat_id String 当前会话Id(同一应用下不允许重复),和请求接口地址中的sid需一致 Y
parameter.chat. pre_chat_id String 首次会话可不填,后续会话必填。 Y
payload.message.text Array 使用对话开启功能时,请传空数组 Y

示例:

{
    "header": {
        "app_id": "12345678",
        "uid": "0f1c9c1ab6ce1fc7c2f1731394fdf33e",
        "agent_id": "513fb8e354a546e75c0c7bda32a408fd"
    },
    "parameter": {
        "chat": {
            "chat_id": "test123456"
        }
    },
    "payload": {
        "message": {
            "text": []//必须传空数组
        }
    }
}

10.4 返回参数

字段名 类型 描述 必须 默认值
header.code int 错误码,成功= 0 Y 0
header.status int 状态码,2表示会话完成 Y
header.message String 结果描述 Y
header.sid String 大模型会话session id Y
payload.usage.agent_current_chars int 当前轮次角色输出的字数 N
payload.usage.player_current_chars int 当前轮次玩家输入的字数 N
payload.usage.total_current_tokens int 当前轮次消耗的总token数 N
payload.usage.system_current_chars int 角色设定字数 N
payload.choices.seq int 返回片段在回答全句中的次序 Y
payload.choices.status int 状态码,2表示会话完成 Y
payload.choices.text Array 大模型生成的会话内容 Y

示例:

{
    "payload": {
        "usage": {
            "agent_current_chars": 97,
            "player_current_chars": 0,
            "total_current_tokens": 242,
			"system_current_chars": 220
        },
        "choices": {
            "seq": 6,
            "status": 2,
            "text": [
                {
                    "content": "嗨李四,你是来提需求的吗?",
                    "role": "assistant"
                }
            ]
        }
    },
    "header": {
        "code": 0,
        "message": "Success",
        "sid": "cht000bf8f0@dx18e4f6b6abab8f2550",
        "status": 2
    }
}

11 对话响应

11.1 接口描述

驱动角色回应玩家的发言。

11.2 接口地址

wss://ai-character.xfyun.cn/api/open/interactivews/{sid}?appId=xxx&timestamp=xxx&signature=xxxxxx

在请求URL上带上参数:appId, timestamp, signature 鉴权生成见上文接口鉴权,首次连接时,服务器会校验身份凭证及配额。

11.3 请求参数

POST,application/json
字段名 类型 描述 必须 默认值
header.app_id String 应用ID Y
header.agent_id String 人格ID Y
header.uid String 玩家ID Y
parameter.chat.chat_id String 当前会话Id(同一应用下不允许重复),和请求接口地址中的sid需一致 Y
parameter.chat. pre_chat_id String 首次对话不填,后续会话必填。 Y
payload.message. text Array 传玩家最新一轮发言即可 Y

示例:

{
    "header": {
        "app_id": "12345678",
        "uid": "0f1c9c1ab6ce1fc7c2f1731394fdf33e",
        "agent_id": "513fb8e354a546e75c0c7bda32a408fd"
    },
    "parameter": {
        "chat": {
            "chat_id": "test1234567",
			"pre_chat_id": "test123456"
        }
    },
    "payload": {
        "message": {
            "text": [
                {
                    "role": "user",
                    "content": "咱们约个需求评审吧。"
                }
            ]
        }
    }
}

11.4 返回参数

字段名 类型 描述 必须 默认值
header.code int 错误码,成功= 0 Y 0
header.status int 状态码,2表示会话完成 Y
header.message String 结果描述 Y
header.sid String 大模型会话session id Y
payload.usage.agent_current_chars int 当前轮次角色输出的字数 N
payload.usage.player_current_chars int 当前轮次玩家输入的字数 N
payload.usage.total_current_tokens int 当前轮次消耗的总token数 N
payload.usage.system_current_chars int 角色设定字数 N
payload.choices.seq int 返回片段在回答全句中的次序 Y
payload.choices.status int 状态码,2表示会话完成 Y
payload.choices.text Array 大模型生成的对话内容 Y

示例:

{
    "payload": {
        "usage": {
            "agent_current_chars": 46,
            "player_current_chars": 5,
            "total_current_tokens": 45,
			"system_current_chars": 220
        },
        "choices": {
            "seq": 6,
            "status": 2,
            "text": [
                {
                    "content": "我现在手上有点活,约2点吧。",
                    "role": "assistant"
                }
            ]
        }
    },
    "header": {
        "code": 0,
        "message": "Success",
        "sid": "cht000b1dfd@dx18e4f704ffd9a4b550",
        "status": 2
    }
}

12 全新对话

12.1 接口描述

删除角色记忆缓存中的对话历史。当玩家输入新一轮发言时,角色将不携带任何上文记忆进行响应。
若角色出现重复生成等异常,可调用本接口进行重置。

12.2 接口地址

https://ai-character.xfyun.cn/api/open/interactive/clear-cache

12.3 请求参数

POST,application/form-data
字段名 类型 描述 必须 默认值
appId String 应用ID Y
chatId String 当前会话ID Y

示例:

https://ai-character.xfyun.cn/api/open/interactive/clear-cache?appId=xxxx&chatId=xxxx

12.4 返回参数

字段名 类型 描述 必须 默认值
code int 错误码,成功= 10000 Y 10000
success Boolean 是否成功 Y
message String 结果描述 Y

示例:

{
    "success": true,
    "code": 10000,
    "message": "操作成功!"
}

四、错误码

操作成功响应 10000

系统错误码列表

错误码 描述 处理方式
10001 内部异常 系统内部异常,请联系管理员
10004 数据库操作异常 请联系管理员
10005 服务间调用异常 请联系管理员
10007 请求参数类型不匹配 检查请求参数类型
10008 参数超出限制 检查参数字符数

鉴权错误码列表

错误码 描述 处理方式
11001 鉴权参数不完整 检查鉴权是否正确
11002 无效的appKey 检查appKey
11003 无效的secret 检查secret

接口错误码列表

错误码 描述 处理方式
20001 用户名或密码错误 检查入参
60001 未查询到人格! 检查入参
60002 未查询到玩家! 检查入参
60003 未查询到会话! 检查入参
60004 该应用不存在,请确认AppID是否填写正确! 检查入参
60005 该应用已存在(应用ID或应用名称重复)! 检查入参
60006 该会话已经存在! 检查入参
70001 授权失败 排查
70002 查询授权失败 排查
70003 并发路数不足,请检查路数余量! 排查
70004 问答总字数不足,请检查字数余量! 排查
90000 请求方式不支持! 检查入参
90001 参数非法! 检查入参
90002 参数缺失! 检查入参
90003 参数重复! 检查入参
90010 安全合规封禁! 排查
90011 配额不足! 排查
99998 请求超时! 排查
99999 抱歉,系统繁忙,请稍后重试! 请稍后重试