# SparkChain 星火大模型 Linux SDK集成文档

有奖调研 (opens new window)诚邀您参与我们星火大模型服务有奖调研,参与问卷即有机会获取千万Tokens

注意: 该接口可以正式使用。如您需要申请使用,请点击前往产品页面 (opens new window)

Tips:

  1. 计费包含接口的输入和输出内容

  2. 1tokens 约等于1.5个中文汉字 或者 0.8个英文单词

  3. 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 授权错误:并发流控超限。并发路数超过授权路数限制
咨询
建议
体验
中心