平台角色对话
平台角色-平台历史
平台角色(平台历史调用流程)
通过系统推荐接口POST v2/api/chat/message/reminder 1、用reminder的接口,输入角色和用户的ID,以及固定文案的文本,写入用户和角色的对话历史。 2、用户A会看到这条历史消息,用户a回复后会再调用对话接口。 3、星尘客户使用用户A的回复调用星尘的对话接口,获取AI回复(星尘自动拼接包含reminder的历史)
鉴权
字段 | 传参方式 | 类型 | 必传 | 描述 | 示例值 |
Authorization | header | String | 是 | API-Key | Bearer d1**2a |
路由配置
备注:SDK已封装好路由关系,通过SDK调用接口,无需设置接口路由配置。
字段 | 传参方式 | 类型 | 必传 | 描述 | 示例值 |
x-fag-appcode | header | String | 是 | 应用表示,固定为 | |
x-fag-servicename | header | String | 是 | 请求路由标识,不同接口值不一样,映射管理参考 | aca-character-create |
x-fag-servicename 与接口映射关系
接口 | 路径 | x-fag-appcode |
对话(流式) | /v2/api/chat/send | aca-chat-send-sse |
对话(非流式) | /v2/api/chat/send | aca-chat-send |
对话消息查询 | /v2/api/chat/message/histories | aca-message-history |
对话消息评价 | /v2/api/chat/rating | aca-message-rating |
系统消息推送 | /v2/api/chat/reminder | aca-chat-reminder |
重置对话 | /v2/api/chat/reset | aca-chat-reset |
对话
注意:对话场景非为固定角色对话、非固定角色对话、和助手类对话,不用场景对话,入参有所不同,详细差异请参考接口说明-必看。
接口
POST /v2/api/chat/send
入参
请求头参数
字段 | 传参方式 | 类型 | 必传 | 描述 |
X-AcA-SSE | header | String | 否 | 是否开启流式对话 开启 - 不开启 - |
请求体参数
参数 | 类型 | 必传 | 说明 |
model | string | 否 | 模型,采用角色已配置的模型,也可传入其他模型名称进行路由 |
parameters | object | 否 | 模型设置 |
parameters.seed | double | 否 | 当使用xingchen-plus-v2默认模型时,每次调用的seed必须不同。seed生成时,随机数的种子,用于控制模型生成的随机性。如果使用相同的种子,每次运行生成的结果都将相同;当需要复现模型的生成结果时,可以使用相同的种子。seed参数支持无符号64位整数类型。默认值 1683806810 |
parameters.incrementalOutput | boolean | 否 | 是否增量输出,若为true,每次流式输出不包含已输出内容,只对流式接口的输出有效 |
input.messages | array | 是 | 对话历史(时间顺序正排),固定角色可通过角色配置最大对话轮数。list中的每个元素形式为{"role":角色, "content": 内容}。角色当前可选值:system、user、assistant,function,其中,仅messages[0]中支持role为system,user、assistant、function需要交替出现,最后一条为用户提问。 |
input.aca.botProfile | object | 是 | 角色设置 |
input.aca.botProfile.characterId | string | 是 | 固定角色必填 |
input.aca.userProfile | object | 是 | 用户设置 |
input.aca.userProfile.userId | string | 是 | 业务系统用户唯一标识,同一用户不能并行对话,必须待上次对话回复结束后才可发起下轮对话 |
input.aca.context | object | 是 | 对话上下文设置 |
input.aca.context.useChatHistory | boolean | 是 | 必填,且必须为true |
input.aca.context.isRegenerate | boolean | 否 | 是否为重新生成 |
input.aca.context.queryId | string | 否 | 重新生成且使用平台历史时,该值必传;不使用平台历史时,该值可以不传 |
input.aca.context.answerId | string | 否 | 重新生成场景,若 answerId 不为空,认为是重新生成后的新一轮对话,该 answerId 为最后一轮对话中多个回复中的一条回复消息ID,该条回复会被采纳,该轮对话其他回复消息会被废弃 |
注意:模型参数parameters
优先级从高到低可以通过接口传入、角色属性配置、和平台默认配置三个方式配置。
返回参数
流式调用返回
参数 | 类型 | 说明 |
requestId | string | 系统生成的标志本次调用的id。 |
success | boolean | 是否成功返回 |
errorCode | int | 错误码 |
errorName | string | 错误名称 |
httpStatusCode | int | http错误码 |
errorMessage | string | 错误消息 |
usage | object | |
usage.userTokens | int | 用户输入的token数 |
usage.inputTokens | int | 本次请求输入内容的 token 数目。在打开了搜索的情况下,输入的 token 数目因为还需要添加搜索相关内容支持,所以会超出客户在请求中的输入。 |
usage.outputTokens | int | 模型生成回复转换为Token后的长度。 |
choices | array | 消息体 |
choices[i].stopReason | string | 完成标识符,已完成为 stop,未完成为 “null” |
choices[i].messages | array | |
message.role | string | 模型role,固定为assistant |
message.content | string | 模型生成消息输出 |
message.meta | object | 消息属性 |
message.meta.hasRisk | boolean | 是否存在安全风险, |
非流式调用返回
参数 | 类型 | 说明 |
requestId | string | 系统生成的标志本次调用的id。 |
success | boolean | 是否成功返回 |
errorCode | int | 错误码 |
errorName | string | 错误名称 |
httpStatusCode | int | http错误码 |
errorMessage | string | 错误消息 |
data | object | |
data.usage | object | |
usage.userTokens | int | 用户输入的token数 |
usage.inputTokens | int | 本次请求输入内容的 token 数目。在打开了搜索的情况下,输入的 token 数目因为还需要添加搜索相关内容支持,所以会超出客户在请求中的输入。 |
usage.outputTokens | int | 模型生成回复转换为Token后的长度。 |
data.choices | array | 消息体 |
choices[i].stopReason | string | 完成标识符,已完成为 stop,未完成为 null |
choices[i].messages | array | |
message.role | string | 模型role,固定为assistant |
message.content | string | 模型生成消息输出 |
message.meta | object | 消息属性 |
message.meta.hasRisk | boolean | 是否存在安全风险,true/false |
对话历史
对话历史查询
接口
POST /v2/api/chat/message/histories
入参
名称 | 类型 | 是否必传 | 说明 |
where | object | 是 | 查询条件对象角色参考下表 |
where.characterId | string | 是 | 角色ID |
where.userId | string | 是 | 对话用户ID |
where.sessionId | string | 否 | 会话ID |
where.startTime | long | 否 | 开始时间戳精确到毫秒 |
where.endTime | long | 否 | 结束时间戳 |
where.messageIds | list | 否 | 消息ID列表 |
pageNum | int | 否(默认1) | 分页页码 |
pageSize | int | 否(默认10) | 分页大小 |
orderBy | list | 否(默认创建时间倒排) | 历史消息排序 |
返回
名称 | 类型 | 说明 |
messageId | string | 消息ID |
sessionId | string | 会话ID |
chatId | string | 一次对话ID,一问多答 chatId 相同 |
messageIssuer | object | 不同userType, userId 和 userName表示不同含义,userType 取值:- user - 用户,userId 和 userName 分别表示用户ID和用户名- character - 角色,userId 和 userName 分别表示角色ID和角色名 |
messageType | string | opening_remarks - 开场白sys_greetings - 系统问候user - 用户提问character - 角色回复chat_description - 对话提示 |
status | string | 历史消息状态normal:正常reset:被重置 |
content | string | json string |
对话历史评价
接口
POST /v2/api/chat/message/rating
入参
名称 | 类型 | 是否必传 | 说明 |
messageId | string | 是 | 消息ID |
rating | int | 是 | 评分 0为差评 5为好评 |
返回
名称 | 类型 | 说明 |
content | boolean | true成功、false失败 |
系统推荐
接口
POST /v2/api/chat/message/reminder
入参
名称 | 类型 | 是否必传 | 说明 |
characterId | string | 是 | 角色的id 角色给用户主动发消息 |
bizUserId | string | 是 | 接收消息的用户bizUserId |
content | string | 是 | 提示消息 |
返回
名称 | 类型 | 说明 |
content | boolean | true成功、false失败 |
重置对话(清除上下文)
在使用平台对话历史的场景下,每次对话会自动将对话历史作为记忆送给大模型,若要抹去这段记忆,可以通过该接口清除历史对话,开启新会话。
接口
POST /v2/api/chat/reset
入参
名称 | 类型 | 是否必传 | 说明 |
characterId | string | 是 | 角色的id |
userId | string | 是 | 接收消息的用户bizUserId |
返回
名称 | 类型 | 说明 |
data | boolean | true成功、false失败 |
平台角色-自定义历史
平台角色(自定义历史调用流程)
通过系统推荐接口POST v2/api/chat/message/reminder 1、星尘客户给他的用户推送运营文案 2、用户A会看到这条历史消息,用户A回复AI角色 3、星尘客户使用自定义历史(需包含运营文案+用户A的回复)调用星尘的对话接口,获取AI回复
鉴权
字段 | 传参方式 | 类型 | 必传 | 描述 | 示例值 |
Authorization | header | String | 是 | API-Key | Bearer yourAccessKeySecret |
路由配置
备注:SDK已封装好路由关系,通过SDK调用接口,无需设置接口路由配置。
字段 | 传参方式 | 类型 | 必传 | 描述 | 示例值 |
x-fag-appcode | header | String | 是 | 应用表示,固定为 | |
x-fag-servicename | header | String | 是 | 请求路由标识,不同接口值不一样,映射管理参考 | aca-character-create |
x-fag-servicename 与接口映射关系
接口 | 路径 | x-fag-appcode |
对话(流式) | /v2/api/chat/send | aca-chat-send-sse |
对话(非流式) | /v2/api/chat/send | aca-chat-send |
对话消息查询 | /v2/api/chat/message/histories | aca-message-history |
对话消息评价 | /v2/api/chat/rating | aca-message-rating |
系统消息推送 | /v2/api/chat/reminder | aca-chat-reminder |
重置对话 | /v2/api/chat/reset | aca-chat-reset |
角色描述自动生成 | /v2/api/character/auto/desc | aca-polling-image |
对话
注意:对话场景非为角色对话、和工作流对话,不用场景对话,入参有所不同,详细差异请参考接口说明
接口
POST /v2/api/chat/send
入参
请求头参数
字段 | 传参方式 | 类型 | 必传 | 描述 |
X-AcA-SSE | header | String | 否 | 是否开启流式对话- 开启 - |
请求体参数
参数 | 类型 | 必传 | 说明 |
model | string | 否 | 模型,采用角色已配置的模型,也可传入其他模型名称进行路由 |
parameters | object | 否 | 模型设置 |
parameters.seed | double | 否 | **当使用xingchen-plus-v2默认模型时,每次调用的seed必须不同。**seed生成时,随机数的种子,用于控制模型生成的随机性。如果使用相同的种子,每次运行生成的结果都将相同;当需要复现模型的生成结果时,可以使用相同的种子。seed参数支持无符号64位整数类型。默认值 1683806810 |
parameters.incrementalOutput | boolean | 否 | 是否增量输出,若为true,每次流式输出不包含已输出内容,只对流式接口的输出有效 |
input.messages | array | 是 | 对话历史(按时间正序),可支持自主拼接历史。list中的每个元素形式为{"role":角色, "content": 内容}。角色当前可选值:system、user、assistant,function,其中,仅messages[0]中支持role为system,user、assistant需要交替出现,最后一条为用户提问。 |
input.aca.botProfile | object | 是 | 角色设置 |
input.aca.botProfile.characterId | string | 是 | 固定角色必填 |
input.aca.userProfile | object | 是 | 用户设置 |
input.aca.userProfile.userId | string | 是 | 业务系统用户唯一标识,同一用户不能并行对话,必须待上次对话回复结束后才可发起下轮对话 |
input.aca.context | object | 是 | 对话上下文设置 |
input.aca.context.useChatHistory | boolean | 是 | 必填,且必须为false,false代表不使用平台历史 |
注意:模型参数parameters
优先级从高到低可以通过接口传入、角色属性配置、和平台默认配置三个方式配置。
返回参数
流式调用返回
参数 | 类型 | 说明 |
requestId | string | 系统生成的标志本次调用的id。 |
success | boolean | 是否成功返回 |
errorCode | int | 错误码 |
errorName | string | 错误名称 |
httpStatusCode | int | http错误码 |
errorMessage | string | 错误消息 |
usage | object | |
usage.userTokens | int | 用户输入的token数 |
usage.inputTokens | int | 本次请求输入内容的 token 数目。在打开了搜索的情况下,输入的 token 数目因为还需要添加搜索相关内容支持,所以会超出客户在请求中的输入。 |
usage.outputTokens | int | 模型生成回复转换为Token后的长度。 |
choices | array | 消息体 |
choices[i].stopReason | string | 完成标识符,已完成为 stop,未完成为 “null” |
choices[i].messages | array | |
message.role | string | 模型role,固定为assistant |
message.content | string | 模型生成消息输出 |
message.meta | object | 消息属性 |
message.meta.hasRisk | boolean | 是否存在安全风险, |
非流式调用返回
参数 | 类型 | 说明 |
requestId | string | 系统生成的标志本次调用的id。 |
success | boolean | 是否成功返回 |
errorCode | int | 错误码 |
errorName | string | 错误名称 |
httpStatusCode | int | http错误码 |
errorMessage | string | 错误消息 |
data | object | |
data.usage | object | |
usage.userTokens | int | 用户输入的token数 |
usage.inputTokens | int | 本次请求输入内容的 token 数目。在打开了搜索的情况下,输入的 token 数目因为还需要添加搜索相关内容支持,所以会超出客户在请求中的输入。 |
usage.outputTokens | int | 模型生成回复转换为Token后的长度。 |
data.choices | array | 消息体 |
choices[i].stopReason | string | 完成标识符,已完成为 stop,未完成为 null |
choices[i].messages | array | |
message.role | string | 模型role,固定为assistant |
message.content | string | 模型生成消息输出 |
message.meta | object | 消息属性 |
message.meta.hasRisk | boolean | 是否存在安全风险,true/false |
对话历史
对话历史查询
接口
POST /v2/api/chat/message/histories
入参
名称 | 类型 | 是否必传 | 说明 |
where | object | 是 | 查询条件对象角色参考下表 |
where.characterId | string | 是 | 角色ID |
where.userId | string | 是 | 对话用户ID |
where.sessionId | string | 否 | 会话ID |
where.startTime | long | 否 | 开始时间戳精确到毫秒 |
where.endTime | long | 否 | 结束时间戳 |
where.messageIds | list | 否 | 消息ID列表 |
pageNum | int | 否(默认1) | 分页页码 |
pageSize | int | 否(默认10) | 分页大小 |
orderBy | list | 否(默认创建时间倒排) | 历史消息排序 |
返回
名称 | 类型 | 说明 |
messageId | string | 消息ID |
sessionId | string | 会话ID |
chatId | string | 一次对话ID,一问多答 chatId 相同 |
messageIssuer | object | 不同userType, userId 和 userName表示不同含义,userType 取值:- user - 用户,userId 和 userName 分别表示用户ID和用户名- character - 角色,userId 和 userName 分别表示角色ID和角色名 |
messageType | string | opening_remarks - 开场白sys_greetings - 系统问候user - 用户提问character - 角色回复chat_description - 对话提示 |
status | string | 历史消息状态normal:正常reset:被重置 |
content | string | json string |
对话历史评价
接口
POST /v2/api/chat/message/rating
入参
名称 | 类型 | 是否必传 | 说明 |
messageId | string | 是 | 消息ID |
rating | int | 是 | 评分 0为差评 5为好评 |
返回
名称 | 类型 | 说明 |
content | boolean | true成功、false失败 |
系统推荐
接口
POST v2/api/chat/message/reminder
入参
名称 | 类型 | 是否必传 | 说明 |
characterId | string | 是 | 角色的id 角色给用户主动发消息 |
bizUserId | string | 是 | 接收消息的用户bizUserId |
content | string | 是 | 提示消息 |
返回
名称 | 类型 | 说明 |
content | boolean | true成功、false失败 |
重置对话
在不使用平台对话历史的场景下,如果需要重置对话,则传入新的对话历史即可。
示例参考
角色对话-平台历史
使用平台保存的历史记录继续对话
调用示例
curl --location \
'https://nlp.aliyuncs.com/v2/api/chat/send' \
--header 'Expect: ' \
--header 'Content-Type: application/json' \
--header 'X-AcA-DataInspection: enable' \
--header 'x-fag-servicename: aca-chat-send' \
--header 'x-fag-appcode: aca' \
--header 'Authorization: Bearer {YOUR_API_KEY}' \
--data '{
"input": {
"messages": [
{
"name":"小明",
"role":"user",
"content":"你有几个闺蜜?"
}
],
"aca": {
"botProfile": {
"characterId": "c39797a35ad243f1a85baaa6e1ec37e0"
},
"userProfile": {
"userId": "123456789"
"basicInfo": ""
},
"context": {
"useChatHistory": true,
}
}
}
}'
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;
/**
* API名称:平台角色对话
* 环境要求:Java 17及以上
*/
public class Example {
private static final String URL = "https://nlp.aliyuncs.com/v2/api/chat/send";
private static final String API_KEY = "Bearer {YOUR_API_KEY}";
private static final String jsonBody = """
{
"input": {
"messages": [
{
"name":"小明",
"role":"user",
"content":"你有几个闺蜜?"
}
],
"aca": {
"botProfile": {
"characterId": "c39797a35ad243f1a85baaa6e1ec37e0"
},
"userProfile": {
"userId": "123456789"
},
"context": {
"useChatHistory": true,
}
}
}
}
""";
public static void main(String[] args) throws Exception {
// 非流式调用
nonStreamingCall();
// 流式调用
streamingCall();
}
private static void nonStreamingCall() throws Exception {
System.out.println("=== 非流式调用示例 ===");
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(URL))
.headers(
"Authorization", API_KEY,
"X-AcA-DataInspection", "enable",
"x-fag-servicename", "aca-chat-send",
"x-fag-appcode", "aca",
"Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();
// 同步调用
HttpResponse<String> response = client.send(
request,
HttpResponse.BodyHandlers.ofString()
);
String responseBody = response.body();
System.out.println("响应数据: " + responseBody);
}
private static void streamingCall() {
System.out.println("\n=== 流式调用示例 ===");
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(URL))
.headers(
"Authorization", API_KEY,
"X-AcA-DataInspection", "enable",
"X-AcA-SSE", "enable",
"x-fag-servicename", "aca-chat-send-sse",
"x-fag-appcode", "aca",
"Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();
// 异步处理 SSE 流
CompletableFuture<Void> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofLines())
.thenApply(HttpResponse::body)
.thenAccept(stream -> {
stream.forEach(line -> {
System.out.println("流式响应数据: " + line);
});
});
// 保持主线程等待
future.join();
}
}
import requests
URL = "https://nlp.aliyuncs.com/v2/api/chat/send"
# API名称:平台角色对话
# 环境要求:python3.10及以上
def call(api_key):
headers = {
"Content-Type": "application/json",
"x-fag-servicename": "aca-chat-send",
# "X-AcA-SSE": "enable", # 流式调用开启此配置
"x-fag-appcode": "aca",
"Authorization": f"Bearer {api_key}",
"X-AcA-DataInspection": "enable"
}
payload = {
"input": {
"messages": messages,
"aca": {
"botProfile": {
"characterId": "c39797a35ad243f1a85baaa6e1ec37e0"
},
"userProfile": {
"userId": "123456789"
},
"context": {
"useChatHistory": True,
}
}
}
}
response = requests.post(URL, json=payload, headers=headers)
# 逐行打印原始响应内容
for line in response.iter_lines():
if line:
print(line.decode('utf-8'))
# 检查响应状态,如有错误则抛出异常
response.raise_for_status()
return response
if __name__ == "__main__":
api_key = "{YOUR_API_KEY}"
messages = [
{
"name": "小明",
"role": "user",
"content": "你有几个闺蜜?"
}
]
try:
response = call(api_key)
except requests.HTTPError as e:
print(f"请求出错: {e}")
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
// API名称:平台角色对话
// 环境要求:go 1.20及以上
const URL = "https://nlp.aliyuncs.com/v2/api/chat/send"
func call(messages []map[string]interface{}, apiKey string) (*http.Response, error) {
payload := map[string]interface{}{
"input": map[string]interface{}{
"messages": messages,
"aca": map[string]interface{}{
"botProfile": map[string]interface{}{
"characterId": "c39797a35ad243f1a85baaa6e1ec37e0",
},
"userProfile": map[string]interface{}{
"userId": "123456789",
},
"context": map[string]interface{}{
"useChatHistory": true,
},
},
},
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
return nil, err
}
req, err := http.NewRequest("POST", URL, bytes.NewBuffer(payloadBytes))
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/json")
//req.Header.Set("X-AcA-SSE", "enable") // 流式调用开启此配置
req.Header.Set("x-fag-servicename", "aca-chat-send")
req.Header.Set("x-fag-appcode", "aca")
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("X-AcA-DataInspection", "enable")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
// 逐行打印原始响应内容
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("请求出错,状态码:%d", resp.StatusCode)
}
return resp, nil
}
func main() {
messages := []map[string]interface{}{
{
"name": "小明",
"role": "user",
"content": "你有几个闺蜜?",
},
}
apiKey := "{YOUR_API_KEY}"
_, err := call(messages, apiKey)
if err != nil {
fmt.Printf("请求出错: %v\n", err)
}
}
返回示例
{
"requestId": "576041ab-240c-463a-9d6e-4f57eaea5951",
"code": 200,
"data": {
"requestId": "576041ab-240c-463a-9d6e-4f57eaea5951",
"choices": [
{
"messages": [
{
"name": "小婉",
"roleId": "c39797a35ad243f1a85baaa6e1ec37e0",
"role": "assistant",
"content": "你……你故意的吧!【愤怒】",
"finishReason": "stop",
"useMessage": true,
"validMessage": true,
"functionMessage": false,
"tempMessage": false
}
],
"stopReason": "stop"
}
],
"usage": {
"outputTokens": 10,
"inputTokens": 1460,
"userTokens": 4,
"pluginTokens": 0,
"cachedTokens": 0
},
"context": {
"chatRoomId": 72536669,
"sessionId": "ea8174b798554e7e8bd4f20872429923",
"chatId": "fab7bf3e39024da49c89e1a5e9ed0514",
"answerId": "ec397019cc9540569d69f9f15bd417f9",
"messageId": "ec397019cc9540569d69f9f15bd417f9",
"queryId": "70b3bbef65a247c09424bd2988d36d4f",
"replyMessageId": "70b3bbef65a247c09424bd2988d36d4f",
"enableDataInspection": true,
"isSave": true,
"requestId": "576041ab-240c-463a-9d6e-4f57eaea5951",
"modelRequestId": "6ba75834-a3c0-9940-808e-2283f88cfe8a",
"characterPk": 157,
"characterName": "小婉",
"characterId": "c39797a35ad243f1a85baaa6e1ec37e0",
"modelName": "xingchen-plus-v2",
"origin": "pass_v2",
"bizSrc": "PAAS",
"ext": "chat",
"bizUserId": "123456789",
"chatLockKey": "chat_5ed33fdb8d9d4d1489e44efb5c41312b_123456789_c39797a35ad243f1a85baaa6e1ec37e0",
"resultCount": 1,
"isGroupChat": false
},
"stop": true
},
"success": true
}
角色对话-自定义历史
不使用平台历史记录,用户自行保存对话历史记录,将自定义历史记录拼接到上下文,useChatHistory设置为 false。
调用示例
curl --location \
'https://nlp.aliyuncs.com/v2/api/chat/send' \
--header 'Expect: ' \
--header 'Content-Type: application/json' \
--header 'X-AcA-DataInspection: enable' \
--header 'x-fag-servicename: aca-chat-send' \
--header 'x-fag-appcode: aca' \
--header 'Authorization: Bearer {YOUR_API_KEY}' \
--data '{
"input": {
"messages": [
{
"name":"小明",
"role":"user",
"content":"你叫什么名字"
},
{
"name":"小婉",
"role":"assistant",
"content":"我叫小婉啊。"
},
{
"name":"小明",
"role":"user",
"content":"你今年多大"
},
{
"name":"小婉",
"role":"assistant",
"content":"我今年17岁了。"
},
{
"name":"小明",
"role":"user",
"content":"你有几个闺蜜?"
}
],
"aca": {
"botProfile": {
"characterId": "c39797a35ad243f1a85baaa6e1ec37e0"
},
"userProfile": {
"userId": "123456789"
},
"context": {
"useChatHistory": false
}
}
}
}'
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;
/**
* API名称:平台角色对话-自定义历史记录
* 环境要求:Java 17及以上
*/
public class Example {
private static final String URL = "https://nlp.aliyuncs.com/v2/api/groupchat/send";
private static final String API_KEY = "Bearer {YOUR_API_KEY}";
private static final String jsonBody = """
{
"input": {
"messages": [
{
"name":"小明",
"role":"user",
"content":"你叫什么名字"
},
{
"name":"小婉",
"role":"assistant",
"content":"我叫小婉啊。"
},
{
"name":"小明",
"role":"user",
"content":"你今年多大"
},
{
"name":"小婉",
"role":"assistant",
"content":"我今年17岁了。"
},
{
"name":"小明",
"role":"user",
"content":"你有几个闺蜜?"
}
],
"aca": {
"botProfile": {
"characterId": "c39797a35ad243f1a85baaa6e1ec37e0"
},
"userProfile": {
"userId": "123456789"
},
"context": {
"useChatHistory": false,
}
}
}
}
""";
public static void main(String[] args) throws Exception {
// 非流式调用
nonStreamingCall();
// 流式调用
streamingCall();
}
private static void nonStreamingCall() throws Exception {
System.out.println("=== 非流式调用示例 ===");
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(URL))
.headers(
"Authorization", API_KEY,
"X-AcA-DataInspection", "enable",
"x-fag-servicename", "aca-chat-send",
"x-fag-appcode", "aca",
"Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();
// 同步调用
HttpResponse<String> response = client.send(
request,
HttpResponse.BodyHandlers.ofString()
);
String responseBody = response.body();
System.out.println("响应数据: " + responseBody);
}
private static void streamingCall() {
System.out.println("\n=== 流式调用示例 ===");
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(URL))
.headers(
"Authorization", API_KEY,
"X-AcA-DataInspection", "enable",
"X-AcA-SSE", "enable",
"x-fag-servicename", "aca-chat-send-sse",
"x-fag-appcode", "aca",
"Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();
// 异步处理 SSE 流
CompletableFuture<Void> future = client.sendAsync(request, HttpResponse.BodyHandlers.ofLines())
.thenApply(HttpResponse::body)
.thenAccept(stream -> {
stream.forEach(line -> {
System.out.println("流式响应数据: " + line);
});
});
// 保持主线程等待
future.join();
}
}
import requests
URL = "https://nlp.aliyuncs.com/v2/api/chat/send"
# API名称:平台角色对话-自定义历史记录
# 环境要求:python3.10及以上
def call(api_key):
headers = {
"Content-Type": "application/json",
"x-fag-servicename": "aca-chat-send",
# "X-AcA-SSE": "enable", # 流式调用开启此配置
"x-fag-appcode": "aca",
"Authorization": f"Bearer {api_key}",
"X-AcA-DataInspection": "enable"
}
payload = {
"input": {
"messages": messages,
"aca": {
"botProfile": {
"characterId": "c39797a35ad243f1a85baaa6e1ec37e0"
},
"userProfile": {
"userId": "123456789"
},
"context": {
"useChatHistory": False,
}
}
}
}
response = requests.post(URL, json=payload, headers=headers)
# 逐行打印原始响应内容
for line in response.iter_lines():
if line:
print(line.decode('utf-8'))
# 检查响应状态,如有错误则抛出异常
response.raise_for_status()
return response
if __name__ == "__main__":
api_key = "{YOUR_API_KEY}"
messages = [
{
"name":"小明",
"role":"user",
"content":"你叫什么名字"
},
{
"name":"小婉",
"role":"assistant",
"content":"我叫小婉啊。"
},
{
"name":"小明",
"role":"user",
"content":"你今年多大"
},
{
"name":"小婉",
"role":"assistant",
"content":"我今年17岁了。"
},
{
"name":"小明",
"role":"user",
"content":"你有几个闺蜜?"
}
]
try:
response = call(api_key)
except requests.HTTPError as e:
print(f"请求出错: {e}")
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
// API名称:平台角色对话
// 环境要求:go 1.20及以上
const URL = "https://nlp.aliyuncs.com/v2/api/chat/send"
func call(messages []map[string]interface{}, apiKey string) (*http.Response, error) {
payload := map[string]interface{}{
"input": map[string]interface{}{
"messages": messages,
"aca": map[string]interface{}{
"botProfile": map[string]interface{}{
"characterId": "c39797a35ad243f1a85baaa6e1ec37e0",
},
"userProfile": map[string]interface{}{
"userId": "123456789",
},
"context": map[string]interface{}{
"useChatHistory": false,
},
},
},
}
payloadBytes, err := json.Marshal(payload)
if err != nil {
return nil, err
}
req, err := http.NewRequest("POST", URL, bytes.NewBuffer(payloadBytes))
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "application/json")
//req.Header.Set("X-AcA-SSE", "enable") // 流式调用开启此配置
req.Header.Set("x-fag-servicename", "aca-chat-send")
req.Header.Set("x-fag-appcode", "aca")
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("X-AcA-DataInspection", "enable")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
}
// 逐行打印原始响应内容
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("请求出错,状态码:%d", resp.StatusCode)
}
return resp, nil
}
func main() {
messages := []map[string]interface{}{
{
"name": "小明",
"role": "user",
"content": "你叫什么名字",
},
{
"name": "小婉",
"role": "assistant",
"content": "我叫小婉啊。",
},
{
"name": "小明",
"role": "user",
"content": "你今年多大",
},
{
"name": "小婉",
"role": "assistant",
"content": "我今年17岁了。",
},
{
"name": "小明",
"role": "user",
"content": "你有几个闺蜜?",
},
}
apiKey := "YOUR_API_KEY"
_, err := call(messages, apiKey)
if err != nil {
fmt.Printf("请求出错: %v\n", err)
}
}
返回示例
{
"requestId": "d9b4e665-49fb-4ce5-9752-184cd0328103",
"code": 200,
"data": {
"requestId": "d9b4e665-49fb-4ce5-9752-184cd0328103",
"choices": [
{
"messages": [
{
"name": "小婉",
"roleId": "c39797a35ad243f1a85baaa6e1ec37e0",
"role": "assistant",
"content": "我有三个闺蜜,我们经常一起出去玩。",
"finishReason": "stop",
"tempMessage": false,
"useMessage": true,
"validMessage": true,
"functionMessage": false
}
],
"stopReason": "stop"
}
],
"usage": {
"outputTokens": 11,
"inputTokens": 1157,
"userTokens": 4,
"pluginTokens": 0,
"cachedTokens": 0
},
"context": {
"chatRoomId": 72536669,
"sessionId": "f74dbfcbe9ea41fc8ba5e732a12e0970",
"chatId": "3e867a59922f457984f7a4c3c5fc70f7",
"answerId": "64430e6754644690a8d8c51efee16b61",
"messageId": "64430e6754644690a8d8c51efee16b61",
"queryId": "2ab073dbd8a04ddaa8316e67c3a22d50",
"replyMessageId": "2ab073dbd8a04ddaa8316e67c3a22d50",
"enableDataInspection": true,
"isSave": true,
"requestId": "d9b4e665-49fb-4ce5-9752-184cd0328103",
"modelRequestId": "b2780bd5-974e-9e82-8d29-27c027a273c9",
"characterPk": 157,
"characterName": "小婉",
"characterId": "c39797a35ad243f1a85baaa6e1ec37e0",
"modelName": "xingchen-plus-v2",
"origin": "pass_v2",
"bizSrc": "PAAS",
"ext": "chat",
"bizUserId": "123456789",
"chatLockKey": "chat_5ed33fdb8d9d4d1489e44efb5c41312b_123456789_c39797a35ad243f1a85baaa6e1ec37e0",
"resultCount": 1,
"isGroupChat": false
},
"stop": true
},
"success": true
}