# SparkChain 星火大模型 Linux SDK集成文档
有奖调研 (opens new window)诚邀您参与我们星火大模型服务有奖调研,参与问卷即有机会获取千万Tokens
注意: 该接口可以正式使用。如您需要申请使用,请点击前往产品页面 (opens new window)。
Tips:
计费包含接口的输入和输出内容
1tokens 约等于1.5个中文汉字 或者 0.8个英文单词
Spark Lite支持[搜索]内置插件;Spark Pro和Spark3.5 Max支持[搜索]、[天气]、[日期]、[诗词]、[字词]、[股票]六个内置插件
# 1. SDK介绍
Spark SDK提供了一套快速集成星火大模型的工具,让开发者无需关注底层协议细节,提高开发效率。支持Android、Linux、iOS、Windows多个平台,方便开发者选择最适合自己的平台进行开发。Spark SDK可以帮助企业快速将星火大模型应用到业务场景中,提高效率和竞争力。本文档主要介绍Linux平台集成过程。
# 2. 兼容性说明
类别 | 兼容范围 |
---|---|
系统 | 支持x86,x86_64,arm和arm64架构,支持交叉编译,适配常见芯片型号。 |
开发环境 | 建议使用 VS Studio 进行开发 |
# 3. 授权说明
星火认知大模型授权支持按照tokens授权和设备级授权两种方式。
tokens 授权:授权tokens总量,按照tokens 使用量计费,1 tokens 约等于1.5个中文汉字 或者 0.8个英文单词。
设备级授权:授权设备台数和有效期,按照设备指纹计量计费,此方式仅支持定制级客户,如有需要请与开放平台联系。
# 4. SDK集成包目录结构
将SDK zip包解压缩,得到如下文件:
├── Demo Spark的使用DEMO,DEMO中已经集成了SDK,您可以参考DEMO,集成SDK。集成前,请先测通DEMO,了解调用原理。
├── ReleaseNotes.txt SDK版本日志
├── SDK Spark SDK
│ └── libSparkChain.so
└── SparkChain 文本交互 Linux SDK集成文档.pdf Spark集成指南
# 5. 接口调用流程图
# 6. SDK工程配置
# 6.1 导入SDK库
将SDK/libs文件夹、头文件文件夹include存放到项目中,并在环境变量里添加库路径;
#include "../include/sparkchain.h"
# 6.2 配置权限
如果需要存储日志,SDK日志路径需要读写权限,缺少读写权限,日志将无法正常存储。
# 7. SDK 初始化
在使用SparkChain 星火大模型交互功能前,需要首先开通星火大模型授权并获取已开通授权的应用信息(appId、apiKey、apiSecret)。SDK全局只需要初始化一次。 初始化时,开发者需要构建一个SparkChainConfig实例config,把相关的appid信息以及日志设置等传入config中,然后再通过SparkChain::init(config)方法把config实例设置到SDK中。SparkChainConfig 结构如下:
class SPARKCHAIN_API SparkChainConfig {
public:
static SparkChainConfig* builder();
virtual ~SparkChainConfig();
//配置appid
virtual SparkChainConfig* appID(const char* appid) = 0;
//配置apiKey
virtual SparkChainConfig* apiKey(const char* apiKey) = 0;
//配置apiSecret
virtual SparkChainConfig* apiSecret(const char* apiSecret) = 0;
//配置用户自定义标识
virtual SparkChainConfig* uid(const char* uid) = 0;
//配置SDK工作路径
virtual SparkChainConfig* workDir(const char* workDir) = 0;
//配置日志等级
virtual SparkChainConfig* logLevel(int logLevel ) = 0;
//配置日志存储路径
virtual SparkChainConfig* logPath(const char* logPath) = 0;
};
SparkChainConfig接口说明:
接口名称 | 含义 | 参数类型 | 限制 | 是否必填 |
---|---|---|---|---|
appID | 创建应用后,生成的应用ID | const char* | 与平台生成的appID完全一致 | 是 |
apiKey | 创建应用后,生成的唯一应用标识 | const char* | 与平台生成的apiKey完全一致 | 是 |
apiSecret | 创建应用后,生成的唯一应用秘钥 | const char* | 与平台生成的apiSecret完全一致 | 是 |
logLevel | 日志等级 | int | 枚举,0:VERBOSE,1:DEBUG,2:INFO,3:WARN,4:ERROR,5:FATAL,100:OFF | 否 |
logPath | 日志存储路径,设置则会把日志存在该路径下,不设置则会把日志打印在终端上 | const char* | 设置的路径需要有读写权限 | 否 |
uid | 用户自定义标识 | const char* | 否 |
初始化返回值:0:初始化成功,非0:初始化失败,请根据具体返回值参考错误码章节查询原因。
具体示例如下:
SparkChainConfig* config = SparkChainConfig::builder();
config->appID("$appId")
->apiKey("$apiKey")
->apiSecret("$apiSecret");//从平台获取的授权appid,apikey,apisecrety
int ret = SparkChain::init(config);
# 8. LLM 初始化
SDK是通过LLM实例和大模型进行交互的,不同的功能需要创建不同类型的LLM实例,SDK通过LLMFactory类向开发者提供相应功能的LLM实例。LLMFactory提供的LLM实例构造方法如下:
功能 | 说明 |
---|---|
文本交互 | 构造方法: static LLM* textGeneration(LLMConfig* config = nullptr, Memory* memory = nullptr); 参数说明: config:星火大模型配置参数。如果不传入此参数,则默认使用generalv2。 memory:Memory,星火可以根据memory进行上下文关联回答 |
- LLMConfig 结构如下:
class SPARKCHAIN_API LLMConfig {
public:
static LLMConfig* builder();
virtual ~LLMConfig();
//需要使用的领域
virtual LLMConfig* domain(const char* domain) = 0;
//内容审核的场景策略
virtual LLMConfig* auditing(const char* auditing) = 0;
//配置关联会话chat_id标识,需要保障用户下唯一
virtual LLMConfig* chatID(const char* chatID) = 0;
//配置核采样阈值,改变结果的随机程度
virtual LLMConfig* temperature(float temperature) = 0;
//配置从k个候选中随机选择⼀个(⾮等概率)
virtual LLMConfig* topK(int topK) = 0;
//回答的tokens的最大长度
virtual LLMConfig* maxToken(int maxToken) = 0;
//配置chat服务器域名地址
virtual LLMConfig* url(const char* url) = 0;
//该参数仅4.0 Ultra版本支持,返回搜索结果信源
virtual LLMConfig* showRefLabel(bool show) = 0;
};
LLMConfig 接口说明:
接口名称 含义 参数类型 限制 是否必传 domain 需要使用的领域 const char* 取值为[general,generalv3,generalv3.5,4.0Ultra,pro-128k,max-32k],默认generalv3.5
general:通用大模型Spark Lite版本
generalv3:通用大模型Spark Pro版本
generalv3.5:通用大模型Spark Max版本
4.0Ultra:通用大模型Spark4.0 Ultra版本
pro-128k:通用大模型pro128k版本
max-32k:通用大模型max32k版本
domain的取值对应的url不同,需要严格对应。url地址参见下文。否 url 配置chat服务器域名地址 const char* general:wss://spark-api.xf-yun.com/v1.1/chat
generalv3:wss://spark-api.xf-yun.com/v3.1/chat
generalv3.5:wss://spark-api.xf-yun.com/v3.5/chat
4.0Ultra:wss://spark-api.xf-yun.com/v4.0/chat
pro-128k:wss://spark-api.xf-yun.com/chat/pro-128k
max-32k:wss://spark-api.xf-yun.com/chat/max-32k
url和domain是配合使用的,SDK里预设了general,generalv3,generalv3.5,4.0Ultra,pro-128k和max-32k的url。当使用这几个domain时,SDK会自动设置url,故开发者可不用额外设置其值。SDK同样支持开发者访问其他未预置的服务,此时则需要开发者同时设置domain和url。否 maxToken 回答的tokens的最大长度 int 取值范围1-4096,默认2048 否 temperature 配置核采样阈值,改变结果的随机程度 float 最小是0, 最大是1,默认0.5 否 auditing 内容审核的场景策略 const char* 当前仅支持default 否 topK 配置从k个候选中随机选择⼀个(⾮等概率) int 取值范围1-6,默认值4 否 chatID 配置关联会话chat_id标识,需要保障用户下唯一 const char* 否 showRefLabel 该参数仅4.0 Ultra版本支持,当设置为true时,如果输入内容触发联网检索插件,会先返回检索信源列表,然后再返回星火回复结果,否则仅返回星火回复结果。 bool 取值范围[true,false] ,默认 false 否 Memory支持windowMemory、tokenMemory两种模式,具体说明如下:
类型 说明 构造参数类型 构造参数限制 是否必填 windowMemory 通过会话轮数控制上下文范围,即一次提问和一次回答为一轮会话交互。用户可指定会话关联几轮上下文。 int 最小值:0,最大值:无,实际送入长度受接口Token阈值限制 是 tokenMemory 通过Token总长度控制上下文范围,1 token 约等于1.5个中文汉字 或者 0.8个英文单词。用户可指定历史会话Token长度 int 最小值:0,最大值:general:4096 tokens,generalv2:8192 tokens 是
开发者在使用memory中,可以通过调用llm->clearHistory()方法清空其memory。
具体构造示例如下:
Memory* window_memory = Memory::WindowMemory(5);//windowMemory
Memory* token_memory = Memory::TokenMemory(8192);//tokenMemory
/****** *文本交互 *******/
LLMConfig *chat_llmConfig = LLMConfig::builder();
chat_llmConfig->maxToken(2048);
...
chat_llmConfig->topK(4);//config配置可缺省,demo仅供展示如何使用,开发者根据实际情况选择。
LLM *chat_llm = LLMFactory::textGeneration(chat_llmConfig,window_memory);
# 9. 同步调用
用户可以通过chat_llm->run方法向大模型发送文本交互请求,并获取交互结果,不支持单实例并发调用。调用接口如下:
LLMSyncOutput* run(const char* question, int ttl = 60);
run方法参数说明:
参数名 | 类型 | 说明 | 限制 | 是否必填 |
---|---|---|---|---|
question | const char* | 输入信息文本,包含历史信息 | general:4096 tokens generalv2:8192 tokens | 是 |
ttl | int | 同步调用超时时间 | 用户根据自身需求设置相应的超时时间,默认60秒 | 否 |
LLMSyncOutput数据结构说明:
方法 | 返回值类型 | 说明 |
---|---|---|
getErrCode() | int | 调用结果状态,0:调用成功,非0:调用失败 |
getErrMsg() | const char* | 调用失败时的错误信息 |
getRole() | const char* | 星火大模型的角色,assistant::助手,user:用户 |
getContent() | const char* | 调用结果 |
getContentLen() | int | 调用结果长度 |
getContentType() | SparkChain::LLMResult::ContentType | 获取返回结果类型,TEXT:返回结果为文本,IMAGE:返回结果为图片 |
getSid() | const char* | 获取本次交互的sid |
getCompletionTokens() | int | 回答的Token大小 |
getPromptTokens() | int | 包含历史问题的总Tokens大小 |
getTotalTokens() | int | promptTokens和completionTokens的和,也是本次交互计费的Tokens大小 |
具体调用示例如下:
//同步调用
LLMSyncOutput* result = chat_llm->run("给我讲个笑话吧。");
//解析获取的结果,示例展示所有结果获取,开发者可根据自身需要,选择获取。
const char* content = result->getContent();//获取返回结果
int contentLen = result->getContentLen();//获取返回结果长度
SparkChain::LLMResult::ContentType type = result->getContentType();//获取返回结果类型,TEXT:返回结果为文本,IMAGE:返回结果为图片
int errCode = result->getErrCode();//获取结果状态,0:调用成功,非0:调用失败
const char* errMsg = result->getErrMsg();//获取失败时的错误信息
const char* role = result->getRole();//获取角色信息
const char* sid = result->getSid();//获取本次交互的sid
int completionTokens = result->getCompletionTokens();//获取回答的Token大小
int promptTokens = result->getPromptTokens();//包含历史问题的总Tokens大小
int totalTokens = result->getTotalTokens();//promptTokens和completionTokens的和,也是本次交互计费的Tokens大小
# 10. 异步调用
用户可以通过chat_llm->arun方法向大模型发送文本交互请求,通过监听回调获取交互结果,不支持单实例并发调用。
# 10.1 注册结果监听回调
文本交互的异步请求结果通过LLMCallbacks监听回调返回,监听回调接口如下:
class SparkCallbacks : public LLMCallbacks {
void onLLMResult(LLMResult* result, void* usrContext) {
}
void onLLMEvent(LLMEvent* event, void* usrContext) {
}
void onLLMError(LLMError* error, void* usrContext) {
}
};
LLMCallbacks数据结构说明:
onLLMResult为星火请求结果回调,参数说明如下:
参数 类型 说明 result LLMResult* 星火大模型结果实例 usrContext void* 用户自定义标识 LLMResult结构说明:
方法 返回值类型 说明 getContent() const char* 返回结果 getContentType() SparkChain::LLMResult::ContentType 获取返回结果类型,TEXT:返回结果为文本,IMAGE:返回结果为图片 getContentLen() int 获取返回结果长度 getStatus() int 返回结果状态,0:start,1:continue,2:end getRole() const char* 星火大模型角色,assistant::助手,user:用户 getSid() const char* 获取本次交互的sid getCompletionTokens() int 回答的Token大小 getPromptTokens() int 包含历史问题的总Tokens大小 getTotalTokens() int promptTokens和completionTokens的和,也是本次交互计费的Tokens大小 onLLMEvent为星火请求事件回调,参数说明如下:
参数 类型 说明 event LLMEvent* 调用事件结果实例 usrContext void* 用户自定义标识 LLMEvent结构说明:
方法 返回值类型 说明 getEventID() int 事件ID,15:建立连接,19:连接断开 getEventMsg() const char* 事件信息 getSid() const char* 获取本次交互的sid onLLMError为星火请求错误回调,参数说明如下:
参数 类型 说明 error onLLMError* 错误信息结果实例 usrContext void* 用户自定义标识 LLMError结构说明:
方法 返回值类型 说明 getErrCode() int 错误码ID getErrMsg() const char* 错误信息 getSid() const char* 获取本次交互的sid
具体示例如下:
class SparkCallbacks : public LLMCallbacks {
void onLLMResult(LLMResult* result, void* usrContext) {
//解析获取的交互结果,示例展示所有结果获取,开发者可根据自身需要,选择获取。
const char* content = result->getContent();//获取返回结果
int contentLen = result->getContentLen();//获取返回结果长度
SparkChain::LLMResult::ContentType type = result->getContentType();//获取返回结果类型,TEXT:返回结果为文本,IMAGE:返回结果为图片
int status = result->getStatus();//返回结果状态,0:结果返回第一帧,1:结果返回中间帧,2:结果返回最终帧
const char* role = result->getRole();//获取角色信息
const char* sid = result->getSid();//获取本次会话的sid
int completionTokens = result->getCompletionTokens();//获取回答的Token大小
int promptTokens = result->getPromptTokens();//包含历史问题的总Tokens大小
int totalTokens = result->getTotalTokens();//promptTokens和completionTokens的和,也是本次交互计费的Tokens大小
}
void onLLMEvent(LLMEvent* event, void* usrContext) {
//解析获取的事件结果,示例展示所有结果获取,开发者可根据自身需要,选择获取。
int eventId = event->getEventID();//获取事件id
const char* eventMsg = event->getEventMsg();//获取事件信息
const char* sid = event->getSid();//获取交互sid
}
void onLLMError(LLMError* error, void* usrContext) {
//解析获取的错误结果,示例展示所有结果获取,开发者可根据自身需要,选择获取。
int errCode = error->getErrCode();//获取错误码
const char* errMsg = error->getErrMsg();//获取错误信息
const char* sid = error->getSid();//获取交互sid
}
};
SparkCallbacks* cbs = new SparkCallbacks(); chat_llm->registerLLMCallbacks(cbs);
# 10.2 请求调用
异步请求调用接口如下:
int arun(const char* question, void* usrTag = nullptr);
arun方法参数说明:
参数 | 类型 | 说明 | 限制 | 是否必填 |
---|---|---|---|---|
question | const char* | 输入信息文本 | general:4096 tokens generalv2:8192 tokens | 是 |
usrTag | void* | 用户自定义标识 | 否 |
具体调用示例如下:
int ret = chat_llm->arun("给我讲个笑话吧。");
//带有用户自定义标识交互
//char* usrContext = "myContext";
//int ret = chat_llm->arun("给我讲个笑话吧。",usrContext);
# 11. 停止调用
如果开发者不需要此次交互结果,可以通过调用stop()方法抛弃此结果,然后重新进行下一次交互。注意,虽然调用此方法可以让SDK抛弃此次交互结果,但由于本次交互已经产生,因此还是会扣取相应的token量。具体调用如下:
chat_llm->stop();
如果不需要继续使用SDK,需要执行逆初始化释放资源。逆初始化执行步骤参考第12节。
# 12. 逆初始化
当SDK需要完整退出时,需调用逆初始化方法释放资源,示例代码如下:
SparkChain::unInit();
# 13. 高级功能
# 13.1 FunctionCall
SDK支持FunctionCall功能,在使用前需要先确认SDK版本以及请求的星火版本。FunctionCall功能要求SDK版本号大于等于1.1.5,且使用的星火版本Spark Max/4.0 Ultra。
使用该功能前,需要先构建FunctionCall请求协议,下面以天气查询和税率查询为例,具体协议如下:
[
{
"name":"天气查询",
"description":"天气插件可以提供天气相关信息。你可以提供指定的地点信息、指定的时间点或者时间段信息,来精准检索到天气信息。",
"parameters":{
"type":"object",
"properties":{
"location":{
"type":"string",
"description":"地点,比如北京。"
},
"date":{
"type":"string",
"description":"日期。"
}
},
"required":["location"]
}
},
{
"name":"税率查询",
"description":"税率查询可以查询某个地方的个人所得税率情况。你可以提供指定的地点信息、指定的时间点,精准检索到所得税率。",
"parameters":{
"type":"object",
"properties":{
"location":{
"type":"string",
"description":"地点,比如北京。"
},
"date":{
"type":"string",
"description":"日期。"
}
},
"required":["location"]
}
}
]
协议参数说明:
参数名 | 类型 | 是否必传 | 参数说明 |
---|---|---|---|
name | String | 是 | function名称。用户输入命中后,会返回该名称。 |
description | String | 是 | function功能描述。描述function功能即可,越详细越有助于大模型理解该function。 |
parameters | json | 是 | function参数列表。包含type、properties、required字段。 |
parameters.type | String | 是 | 参数类型 |
parameters.properties | String | 是 | 参数信息描述。该内容由用户定义,命中该方法时需要返回哪些参数。 |
properties.x.type | String | 是 | 参数类型描述。该内容由用户定义,需要返回的参数是什么类型。 |
properties.x.description | String | 是 | 参数详细描述。该内容由用户定义,需要返回的参数的具体描述。 |
parameters.required | array | 是 | 必须返回的参数列表。该内容由用户定义,命中方法时必须返回的字段。 |
构建完协议后,需通过LLMTools接口把协议设置到SDK中,最后通过arun或者run方法进行大模型问答请求。
LLMTools协议接口如下:
class SPARKCHAIN_API LLMTools {
LLMTools(const std::string & type, const std::string & description);
LLMTools();
virtual void setType(const std::string & type);
virtual void setDescription(const std::string & description);
virtual const std::string getType() const;
virtual const std::string getDescription() const;
}
LLMTools协议参数说明:
方法名 | 方法说明 | 参数说明 | 返回值说明 |
---|---|---|---|
setDescription | 设置协议 | description:json格式的function协议。参数类型std::string | 无 |
setType | 设置协议类型 | type:协议类型。function:function协议,当前仅支持function。参数类型std::string | 无 |
getDescription | 获取协议 | 无 | 返回协议内容,返回值类型std::string |
getType | 获取协议类型 | 无 | 返回协议类型,返回值类型std::string |
run和arun接口如下:
class SPARKCHAIN_API LLM {
LLMSyncOutput* run(const char* question, const LLMTools & tools, int ttl = 60);
int arun(const char* question, const LLMTools & tools, void* usrTag = nullptr);
}
run接口参数说明:
参数名 | 类型 | 说明 | 限制 | 是否必填 |
---|---|---|---|---|
question | char* | 输入信息文本,包含历史信息 | general:4096 tokens generalv2:8192 tokens | 是 |
tools | LLMTools | LLMTools工具实例,用于FunctionCall功能 | 否 | |
ttl | int | 同步调用超时时间 | 用户根据自身需求设置相应的超时时间,默认60秒 | 否 |
arun接口参数说明:
参数 | 类型 | 说明 | 限制 | 是否必填 |
---|---|---|---|---|
question | char* | 输入信息文本 | general:4096 tokens generalv2:8192 tokens | 是 |
tools | LLMTools | LLMTools工具实例,用于FunctionCall功能 | 否 | |
usrTag | Object | 用户自定义标识 | 否 |
具体调用示例如下:
string function = R"(
[
{
"name": "天气查询",
"description": "天气插件可以提供天气相关信息。你可以提供指定的地点信息、指定的时间点或者时间段信息,来精准检索到天气信息。",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "地点,比如北京。"
},
"date": {
"type": "string",
"description": "日期。"
}
},
"required": [
"location"
]
}
}
]
)";
// 配置大模型参数
LLMConfig *llmConfig = LLMConfig::builder();
llmConfig->domain("4.0Ultra");
LLM *functionCall_llm = LLMFactory::textGeneration(llmConfig);
SparkCallbacks *cbs = new SparkCallbacks();
functionCall_llm->registerLLMCallbacks(cbs);//注册监听回调
SparkChain::LLMTools tools("functions",function);
char* input = "合肥今天的天气怎么样?";
printf(GREEN "用户输入: %s\n" RESET, input);
finish = false;
int ret = functionCall_llm->arun(input,tools);
# 13.2 原始json请求输入
SDK支持用户使用原始json进行大模型交互。请求前,需要先拼接大模型请求协议。请求协议示例如下:
{
"header": {
"app_id": "12345",
"uid": "12345"
},
"parameter": {
"chat": {
"domain": "generalv3.5",
"temperature": 0.5,
"max_tokens": 1024
}
},
"payload": {
"message": {
# 如果想获取结合上下文的回答,需要开发者每次将历史问答信息一起传给服务端,如下示例
# 注意:text里面的所有content内容加一起的tokens需要控制在8192以内,开发者如有较长对话需求,需要适当裁剪历史信息
"text": [
#如果传入system参数,需要保证第一条是system
{"role":"system","content":"你现在扮演李白,你豪情万丈,狂放不羁;接下来请用李白的口吻和用户对话。"} #设置对话背景或者模型角色
{"role": "user", "content": "你是谁"} # 用户的历史问题
{"role": "assistant", "content": "吾乃李白,字太白,号青莲居士,唐代诗人,人称“诗仙”。吾之诗篇,豪放不羁,飘逸如风,犹如天上明月,照耀千古。汝有何事,欲与吾言?"} # AI的历史回答结果
# ....... 省略的历史对话
{"role": "user", "content": "你会做什么"} # 最新的一条问题,如无需上下文,可只传最新一条问题
]
},
"functions": {
"text": [
#FunctionCall功能协议,非必须
]
}
}
}
接口请求字段由三个部分组成:header,parameter, payload。 字段解释如下
header部分
参数名称 | 类型 | 必传 | 参数要求 | 参数说明 |
---|---|---|---|---|
app_id | string | 是 | 应用appid,从开放平台控制台创建的应用中获取 | |
uid | string | 否 | 每个用户的id,非必传字段,用于后续扩展 ,"maxLength":32 |
parameter.chat部分
参数名称 | 类型 | 必传 | 参数要求 | 参数说明 |
---|---|---|---|---|
domain | string | 是 | 取值为[lite,generalv3,pro-128k,generalv3.5,max-32k,4.0Ultra] | 指定访问的模型版本: lite指向Lite版本; generalv3指向Pro版本; pro-128k指向Pro-128K版本; generalv3.5指向Max版本; max-32k指向Max-32K版本; 4.0Ultra指向4.0 Ultra版本; 注意:不同的取值对应的url也不一样! |
temperature | float | 否 | 取值范围 (0,1] ,默认值0.5 | 核采样阈值。用于决定结果随机性,取值越高随机性越强即相同的问题得到的不同答案的可能性越高 |
max_tokens | int | 否 | Pro、Max、Max-32K、4.0 Ultra 取值为[1,8192],默认为4096; Lite、Pro-128K 取值为[1,4096],默认为4096。 | 模型回答的tokens的最大长度 |
top_k | int | 否 | 取值为[1,6],默认为4 | 从k个候选中随机选择⼀个(⾮等概率) |
show_ref_label | boolean | 否 | 取值范围[true,false] ,默认 false | 该参数仅4.0 Ultra版本支持,当设置为true时,如果输入内容触发联网检索插件,会先返回检索信源列表,然后再返回星火回复结果,否则仅返回星火回复结果 |
payload.message.text部分 注意:1、text下所有content累计内容 tokens需要控制在max_tokens参数设置的数值范围内。 2、如果传入system参数,需要保证第一条是system;多轮交互需要将之前的交互历史按照system-user-assistant-user-assistant进行拼接
参数名称 | 类型 | 必传 | 参数要求 | 参数说明 |
---|---|---|---|---|
role | string | 是 | 取值为[system,user,assistant] | system用于设置对话背景(仅Max、Ultra版本支持) user表示是用户的问题, assistant表示AI的回复 |
content | string | 是 | 所有content的累计tokens长度,不同版本限制不同: Lite、Pro、Max、4.0 Ultra版本: 不超过8192; Max-32K版本: 不超过32* 1024; Pro-128K版本:不超过 128*1024; | 用户和AI的对话内容 |
协议构建完成后,需要通过runWithJson或arunWithJson方法和大模型进行请求交互。runWithJson和arunWithJson接口如下:
class SPARKCHAIN_API LLM {
LLMSyncOutput* runWithJson(const char* json, int ttl = 60);
int arunWithJson(const char* body, void* usrTag);
}
runWithJson方法说明:
参数 | 类型 | 说明 | 限制 | 是否必填 |
---|---|---|---|---|
json | char* | 输入信息json文本 | 由maxToken限制 | 是 |
ttl | int | 同步请求超时时间 | 用户根据自身需求设置相应的超时时间,默认60秒 | 否 |
arunWithJson方法说明:
参数 | 类型 | 说明 | 限制 | 是否必填 |
---|---|---|---|---|
body | char* | 输入信息json文本 | 由maxToken限制 | 是 |
usrTag | void* | 用户自定义标识 | 是 |
具体调用示例如下:
LLMConfig *llmConfig = LLMConfig::builder();
llmConfig->domain("4.0Ultra");
LLM *json_llm = LLMFactory::textGeneration(llmConfig);
char* rawJson = "{\"header\": {\"app_id\": \"30dfb58a\",\"uid\": \"12345\"},\"parameter\": {\"chat\": {\"domain\": \"4.0Ultra\",\"temperature\": 0.5,\"max_tokens\": 1024}},\"payload\": {\"message\": {\"text\": [{\"role\": \"user\", \"content\": \"今天天气怎么样?\"}]}}}";
SparkCallbacks *cbs = new SparkCallbacks();
json_llm->registerLLMCallbacks(cbs);//注册监听回调
int ret = json_llm->arunWithJson(rawJson,nullptr);
# 14. SDK API介绍
# 14.1 SparkChainConfig API
返回值类型 | 方法说明 |
---|---|
SparkChainConfig* | virtual SparkChainConfig* appID(const char* appid) = 0 设置用户的appID |
SparkChainConfig* | virtual SparkChainConfig* apiKey(const char* apiKey) = 0 设置用户的apiKey |
SparkChainConfig* | virtual SparkChainConfig* apiSecret(const char* apiSecret) = 0 设置用户的apiSecret |
SparkChainConfig* | virtual SparkChainConfig* uid(const char* uid) = 0 设置用户自定义标识 |
SparkChainConfig* | virtual SparkChainConfig* workDir(const char* workDir) = 0 设置SDK工作路径 |
SparkChainConfig* | virtual SparkChainConfig* logLevel(int logLevel ) = 0 设置日志等级 |
SparkChainConfig* | virtual SparkChainConfig* logPath(const char* logPath) = 0 设置日志保存路径 |
SparkChainConfig* | static SparkChainConfig* builder() 构建SparkChain实例 |
# 14.2 SparkChain API
返回值类型 | 方法说明 |
---|---|
int32_t | SPARKCHAIN_API int32_t init(SparkChainConfig* config) SDK初始化 |
int32_t | SPARKCHAIN_API int32_t unInit() SDK逆初始化 |
# 14.3 LLMConfig API
返回值类型 | 方法说明 |
---|---|
LLMConfig* | virtual LLMConfig* uid(const char* uid) = 0 用户自定义标识 |
LLMConfig* | virtual LLMConfig* domain(const char* domain) = 0 设置需要使用的领域 |
LLMConfig* | virtual LLMConfig* auditing(const char* auditing) = 0 内容审核的场景策略 |
LLMConfig* | virtual LLMConfig* chatID(const char* chatID) = 0 配置关联会话chat_id标识,需要保障用户下唯一 |
LLMConfig* | virtual LLMConfig* temperature(float temperature) = 0 配置核采样阈值,改变结果的随机程度 |
LLMConfig* | virtual LLMConfig* topK(int topK) = 0 配置从k个候选中随机选择⼀个(⾮等概率) |
LLMConfig* | virtual LLMConfig* maxToken(int maxToken) = 0 回答的tokens的最大长度 |
LLMConfig* | virtual LLMConfig* url(const char* url) = 0 配置chat服务器域名地址 |
LLMConfig* | virtual LLMConfig* showRefLabel(bool show) = 0 信源返回开关,仅限4.0Ultra版本支持 |
LLMConfig* | virtual LLMConfig* param(const char* key, int value) = 0 扩展接口,用于扩展当前SDK不支持的参数 |
LLMConfig* | virtual LLMConfig* param(const char* key, double value) = 0 扩展接口,用于扩展当前SDK不支持的参数 |
LLMConfig* | virtual LLMConfig* param(const char* key, bool value) = 0 扩展接口,用于扩展当前SDK不支持的参数 |
LLMConfig* | virtual LLMConfig* param(const char* key, const char* value) = 0 扩展接口,用于扩展当前SDK不支持的参数 |
LLMConfig* | static LLMConfig* builder() 构建LLMConfig实例 |
# 14.4 Memory API
返回值类型 | 方法说明 |
---|---|
Memory* | static Memory* WindowMemory(int maxCache = DEFAULT_WINDOW_SIZE) 构建windowMemory |
Memory* | static Memory* TokenMemory(int maxTokens = DEFAULT_TOKEN_SIZE) 构建tokenMemory |
# 14.5 LLMFactory API
返回值类型 | 方法说明 |
---|---|
LLM* | static LLM* textGeneration(LLMConfig* config = nullptr, Memory* memory = nullptr) 构建星火大模型交互LLM |
LLM* | static LLM* imageUnderstanding(LLMConfig* config = nullptr, Memory* memory = nullptr) 构建图片理解LLM |
LLM* | static LLM* imageGeneration(int width = 512, int height = 512, LLMConfig* config = nullptr) 构建图片生成LLM |
void | static void destroy(LLM* llm) 销毁LLM |
# 14.6 LLM API
返回值类型 | 方法说明 |
---|---|
int | int addSystemPrompt(const char* prompt) 添加prompt |
void | void registerLLMCallbacks(LLMCallbacks* cbs) 注册SparkChain结果监听回调 |
LLMSyncOutput | LLMSyncOutput* run(const char* question, int ttl = 60) 文本同步调用 |
LLMSyncOutput | LLMSyncOutput* run(const char* question, const char* image, const int& len, int ttl = 60) 图片理解同步调用 |
LLMSyncOutput | LLMSyncOutput* run(const char* question, const LLMTools & tools, int ttl = 60); 带有FunctionCall的同步调用 |
LLMSyncOutput | LLMSyncOutput* runWithJson(const char* json, int ttl = 60); 使用原始协议的同步调用 |
int | int arun(const char* question, void* usrTag = nullptr) 文本异步调用 |
int | int arun(const char* question, const char* image, const int& len, void* usrTag = nullptr) 图片理解异步调用 |
int | int arun(const char* question, const LLMTools & tools, void* usrTag = nullptr); 带有FunctionCall的异步调用 |
int | int arunWithJson(const char* body, void* usrTag); 使用原始协议的异步调用 |
int | int stop() 停止请求调用 |
void | void clearHistory() 清空memory记录 |
# 14.7 LLMSyncOutput API
返回值类型 | 方法说明 |
---|---|
const char* | virtual const char* getSid() = 0 获取返回结果的sid字段 |
const int | virtual const int getErrCode() const = 0 获取错误码 |
const char* | virtual const char* getErrMsg() const = 0 获取错误信息 |
const char* | virtual const char* getRole() const = 0 获取角色 |
const char* | virtual const char* getContent() const = 0 获取交互结果 |
const ContentType | virtual const ContentType getContentType() const = 0 获取交互结果类型 |
const int | virtual const int getContentLen() const = 0 获取交互结果长度 |
int | virtual const int getStatus() const = 0 获取结果状态 |
int | virtual const int getCompletionTokens() const = 0 获取回答的Token大小 |
int | virtual const int getPromptTokens() const = 0 获取包含历史问题的总Tokens大小 |
int | virtual const int getTotalTokens() const = 0 promptTokens和completionTokens的和,也是本次交互计费的Tokens大小 |
# 14.8 LLMError API
返回值类型 | 方法说明 |
---|---|
const char* | virtual const char* getSid() = 0 获取返回结果的sid字段 |
const int | virtual const int getErrCode() const = 0 获取错误码 |
const char* | virtual const char* getErrMsg() const = 0 获取错误信息 |
# 14.9 LLMEvent API
返回值类型 | 方法说明 |
---|---|
const int | virtual const int getEventID() const = 0 获取事件id |
const char* | virtual const char* getEventMsg() const = 0 获取事件信息 |
const char* | virtual const char* getSid() = 0 获取返回结果的sid字段 |
# 14.10 LLMResult API
返回值类型 | 方法说明 |
---|---|
String | virtual const char* getRole() const = 0 获取角色 |
String | virtual const char* getContent() const = 0 获取大模型交互的文本结果 |
const ContentType | virtual const ContentType getContentType() const = 0 获取交互结果类型 |
const int | virtual const int getContentLen() const = 0 获取交互结果长度 |
const int | virtual const int getStatus() const = 0 获取结果状态 |
const int | virtual const int getCompletionTokens() const = 0 获取回答的Token大小 |
const int | virtual const int getPromptTokens() const = 0 获取包含历史问题的总Tokens大小 |
const int | virtual const int getTotalTokens() const = 0 promptTokens和completionTokens的和,也是本次交互计费的Tokens大小 |
const char* | virtual const char* getSid() = 0 获取返回结果的sid字段 |
# 15. 错误码
错误码包含SDK错误码和云端错误码。
# 15.1 SDK错误码
错误码 | 含义 | 自查指南 |
---|---|---|
0 | 操作成功 | |
18000 | 本地license文件不存在 | 检查工作目录下是否存在license文件,或者该目录是否有读写权限 |
18001 | 授权文件内容非法 | 授权文件存在问题,请联系技术支持询问 |
18002 | 授权文件解析失败 | 授权文件可能存在损坏,请联系技术支持询问 |
18003 | payload内容缺失 | 授权文件存在问题,请联系技术支持询问 |
18004 | signature内容缺失 | 授权文件存在问题,请联系技术支持询问 |
18005 | 授权已过期 | 授权时间过期,请检查系统时间是否是当前时间,并联系技术支持询问 |
18006 | 授权时间错误,比正常时间慢30分钟以上 | 请检查系统时间是否正确 |
18007 | 授权应用不匹配(apiKey、apiSecret) | apiKey、apiSecret 配置有误,请核对项目中配置的 apiKey、apiSecret 。 |
18008 | 授权文件激活过期 | 授权文件已超过15天未激活,需要联系相关人员重新生成离线授权文件 |
18009 | 授权app信息指针为空 | |
18010 | 离线授权激活文件指定平台与设备平台不匹配 | 授权文件里预置的平台架构与实际运行的设备的平台架构不一致 |
18011 | 离线授权激活文件指定架构与设备cpu架构不匹配 | 授权文件里预置的cpu架构与实际运行的设备的cpu架构不一致 |
18012 | 离线授权激活文件中包含License个数异常 | 离线授权文件异常,请联系相关人员重新生成离线授权文件 |
18013 | 离线授权激活文件中未找到当前设备 | 当前运行的设备的设备指纹不在离线授权文件中,请检查该设备的设备指纹是否在提供的指纹池中 |
18014 | 离线授权激活文件中设备指纹安全等级非法 | 请联系技术支持调整该appid的设备指纹等级 |
18015 | 硬件授权验证失败 | 硬件授权验证失败,请联系相关人员处理 |
18016 | 离线授权激活文件内容非法 | 离线授权文件被修改,请联系相关人员重新生成离线授权文件 |
18017 | 离线授权激活文件中协议头非法 | 离线授权文件被修改,请联系相关人员重新生成离线授权文件 |
18018 | 离线授权激活文件中指纹组成项个数为0 | 离线授权文件生成异常,请联系相关人员重新生成离线授权文件 |
18019 | 资源已过期 | 资源的时间校验已过期,请联系相关人员增加授权时间 |
18100 | 资源鉴权失败 | 资源鉴权失败,请联系相关人员处理 |
18101 | 资源格式解析失败 | 资源格式解析失败,请联系相关人员处理 |
18102 | 资源(与引擎)不匹配 | 资源(与引擎)不匹配,请检查资源是否用错,如果未用错,请联系相关人员处理 |
18103 | 资源参数不存在(指针为NULL) | 资源参数不存在,请检查资源是否正确 |
18104 | 资源路径打开失败 | 资源路径打开失败,请检查工作目录下是否存在该资源,或者该资源是否存在读写权限 |
18105 | 资源加载失败,workDir内未找到对应资源 | 请检查workDir中是否存在此资源,或者resDir是否设置正确,或者app是否有改路径的读写权限 |
18106 | 资源卸载失败, 卸载的资源未加载过 | 资源卸载失败, 卸载的资源未加载过 |
18200 | 引擎鉴权失败 | 引擎鉴权失败,引擎存在问题。请联系技术支持询问 |
18201 | 引擎动态加载失败 | 引擎动态加载失败,请联系技术支持询问 |
18202 | 引擎未初始化 | 引擎在使用前,需要调用engineInit初始化 |
18203 | 引擎不支持该接口调用 | 引擎不支持该接口调用,请查询对应的能力文档,使用正确的方法调用 |
18204 | 引擎craete函数指针为空 | 引擎存在问题,请联系技术支持询问 |
18300 | SDK不可用 | SDK存在异常,请联系技术支持询问 |
18301 | SDK未初始化 | 在使用大模型前请先初始化 SDK,如果有调用 uninit 方法,再次使用大模型交互时需要重新初始化。 |
18302 | SDK初始化失败 | 请根据init接口回调中返回的错误码参考此文档做对应检查 |
18303 | SDK 已经初始化 | 重复初始化导致,使用能力时,SDK 只需要初始化一次,请检查 SDK 初始化逻辑是否存在多次初始化。 |
18304 | 不合法参数 | 请参考demo及集成文档仔细检查所传参数是否正确。 |
18305 | SDK会话handle为空 | 请检查代码逻辑,handle是否被释放 |
18306 | SDK会话未找到 | SDK会话未找到 |
18307 | SDK会话重复终止 | SDK会话重复终止,请检查代码逻辑 |
18308 | 超时错误 | 请求超时 |
18309 | SDK正在初始化中 | SDK正在初始化中,请检查代码逻辑 |
18310 | SDK会话重复开启 | SDK会话重复开启,请检查代码逻辑 |
18311 | sdk同一能力并发路数超出最大限制 | sdk同一能力并发路数超出最大限制 |
18312 | 此实例已处在运行态,禁止单实例并发运行 | SDK同一能力单实例不支持并发 |
18400 | 工作目录无写权限 | 在设置 workDir 时,请确保该工作路径有读写权限。若无法设置读写权限,请修改为有读写权限的工作路径。 |
18401 | 设备指纹获取失败,设备未知 | 采集不到设备指纹 |
18402 | 文件打开失败 | 请检查 日志中所打印的文件是否存在,以及对应路径下是否有读权限。 |
18403 | 内存分配失败 | 请联系技术支持询问 |
18404 | 设备指纹比较失败 | 请联系技术支持询问 |
18500 | 未找到该参数 key | 请参照demo或集成文档仔细检查参数名拼写 |
18501 | 参数范围溢出,不满足约束条件 | 请根据文档检查调用 SDK 方法时所传参数范围,需要确保所传参数符合协议约束要求 |
18502 | SDK 初始化参数为空 | 请根据 SDK 集成文档检查 SDK 初始化代码,确保必填参数有值且合法 |
18503 | SDK 初始化参数中 appId 为空 | appId 为空值,请在 SDK 初始化时传入正确的 appId 值 |
18504 | SDK 初始化参数中 apiKey为空 | apiKey为空值,请在 SDK 初始化时传入正确的 apiKey值 |
18505 | SDK 初始化参数中 apiSecret 为空 | apiSecret 为空值,请在 SDK 初始化时传入正确的 apapiSecret 值 |
18506 | ability参数为空 | 请检查代码逻辑,参数是否未传入 |
18507 | input参数为空 | 请检查代码逻辑,参数是否未传入 |
18508 | 输入数据参数Key不存在 | 请检查代码逻辑,参数key是否不符合该引擎 |
18509 | 必填参数缺失 | 请参考demo或者文档检查是否漏传必填参数 |
18510 | output参数缺失 | 引擎输出参数异常,请联系技术支持询问 |
18520 | 不支持的编解码类型 | 请检查送入的数据是否符合要求 |
18521 | 编解码handle指针为空 | 请检查代码逻辑,handle是否被释放 |
18522 | 编解码模块条件编译未打开 | 请联系技术支持询问 |
18523 | 编码错误 | 请联系技术支持询问 |
18524 | 解码错误 | 请联系技术支持询问 |
18600 | 协议中时间戳字段缺失 | 协议文件异常,请联系技术支持询问 |
18601 | 协议中未找到该能力ID | 调用的能力不在该SDK中,请检查SDK是否使用错误,或者调用能力id是否写错 |
18602 | 协议中未找到该资源ID | appid没有该资源的使用权限 |
18603 | 协议中未找到该引擎ID | 协议存在问题,请联系技术支持询问 |
18604 | 协议中引擎个数为0 | 协议存在问题,请联系技术支持询问 |
18605 | 协议未被初始化解析 | 协议存在问题,请联系技术支持询问 |
18606 | 协议能力接口类型不匹配 | 协议存在问题,请联系技术支持询问 |
18607 | 预置协议解析失败 | 协议存在问题,请联系技术支持询问 |
18700 | 通用网络错误 | 请检查网络连接是否正常 |
18701 | 网络不通 | 请检查网络连接是否正常 |
18702 | 网关检查不过 | 检查设备时间是否正确; 请检查 SDK 初始化时所传 apiKey、apiScrect 是否正确; |
18703 | 云端响应格式不对 | 请检查网络是否可以正常访问外网 |
18704 | 应用未注册 | appid存在问题,请检查 appid 是否正确 |
18705 | 应用 ApiKey & ApiSecret 校验失败 | 请检查 apiKey、apiSecret 是否正确 |
18706 | 引擎不支持的平台架构 | 请检查运行的设备平台引擎是否支持 |
18707 | 授权已过期 | 请检查授权期限 |
18708 | 无可用授权 | 没有授权或者授权已满 |
18709 | 未找到该app绑定的能力 | 请检查该appid是否申请该能力 |
18710 | 未找到该app绑定的能力资源 | 该appid没有该资源的使用权限,请联系技术支持询问 |
18711 | JSON操作失败 | 请联系技术支持询问 |
18712 | 网络请求 404 错误 | 请检查网络是否通畅 |
18713 | 设备指纹安全等级不匹配 | 设备指纹安全等级不符合要求 |
18714 | 应用信息有误 | 服务端无法查询到api_key,请检查api_key和api_secret信息是否填写正确 |
18715 | 未找到该SDK ID | SDK异常,请联系技术支持询问 |
18716 | 未找到该组合能力集合 | 请检查使用的能力是否是该appid所申请的能力 |
18717 | SDK授权不足 | 授权数量已满 |
18718 | 无效授权应用签名 | 应用签名异常,请联系技术支持询问 |
18719 | 应用签名不唯一 | 应用签名异常,请联系技术支持询问 |
18720 | 能力schema不可用 | 请联系技术支持询问 |
18721 | 竞争授权: 未找到能力集模板 | 请联系技术支持询问 |
18722 | 竞争授权: 能力不在模板能力集模板中 | 请联系技术支持询问 |
18801 | 连接建立出错 | 请检查网络是否通畅 |
18802 | 结果等待超时 | 请检查网络是否通畅 |
18803 | 连接状态异常 | 请检查网络是否通畅 |
18902 | 并发超过路数限制 | 不支持并发 |
18903 | 大模型规划步骤为空 | 请检查请求数据的意图是否明确 |
18904 | 插件未找到 | 请检查是否使用了未存在的插件 |
18906 | 与大模型交互次数超限制 | |
18907 | 运行超限制时长 | |
18908 | 大模型返回结果格式异常 | 可能是因为大模型结果太多,导致30秒内没有返回完,从而引起SDK内部认为超时,建议使用异步调用。 |
18951 | 同一流式大模型会话,禁止并发交互请求 | |
18952 | 输入数据为空或异常 | |
19001 | 设备级授权: 设备被禁用 | |
19002 | 设备级授权: 协议解析失败 | |
19003 | 设备级授权: 本地缓存获取失败 | |
19004 | 设备级授权: 无网络 | |
19005 | 设备级授权: 授权未找到 | |
19006 | 设备级授权: 设备授权获取失败 | |
19007 | 设备级授权: 当前设备处于黑名单 | |
19008 | 设备级授权: 当前设备不在白名单 | |
19010 | 设备级授权: 鉴权参数非法 | |
20011 | 设备级授权: 不匹配的appid |
# 15.2 云端错误码
错误码 | 错误信息 |
---|---|
错误码 | 错误信息 |
0 | 成功 |
10000 | 升级为ws出现错误 |
10001 | 通过ws读取用户的消息出错 |
10002 | 通过ws向用户发送消息 错 |
10003 | 用户的消息格式有错误 |
10004 | 用户数据的schema错误 |
10005 | 用户参数值有错误 |
10006 | 用户并发错误:当前用户已连接,同一用户不能多处同时连接。 |
10007 | 用户流量受限:服务正在处理用户当前的问题,需等待处理完成后再发送新的请求。(必须要等大模型完全回复之后,才能发送下一个问题) |
10008 | 服务容量不足,联系工作人员 |
10009 | 和引擎建立连接失败 |
10010 | 接收引擎数据的错误 |
10011 | 发送数据给引擎的错误 |
10012 | 引擎内部错误 |
10013 | 输入内容审核不通过,涉嫌违规,请重新调整输入内容 |
10014 | 输出内容涉及敏感信息,审核不通过,后续结果无法展示给用户 |
10015 | appid在黑名单中 |
10016 | appid授权类的错误。比如:未开通此功能,未开通对应版本,token不足,并发超过授权 等等 |
10017 | 清除历史失败 |
10019 | 表示本次会话内容有涉及违规信息的倾向;建议开发者收到此错误码后给用户一个输入涉及违规的提示 |
10021 | 输入审核不通过 |
10022 | 模型生产的图片涉及敏感信息,审核不通过 |
10110 | 服务忙,请稍后再试 |
10163 | 请求引擎的参数异常 引擎的schema 检查不通过 |
10222 | 引擎网络异常 |
10907 | token数量超过上限。对话历史+问题的字数太多,需要精简输入 |
11200 | 授权错误:该appId没有相关功能的授权 或者 业务量超过限制 |
11201 | 授权错误:日流控超限。超过当日最大访问量的限制 |
11202 | 授权错误:秒级流控超限。秒级并发超过授权路数限制 |
11203 | 授权错误:并发流控超限。并发路数超过授权路数限制 |