Autolink iOS SDK接入文档

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

Tips:

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

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

  3. 车联AIV1.5支持[搜索]内置插件;车联AIV2.0支持[搜索]、[天气]、[日期]、[诗词]、[字词]、[股票]六个内置插件

1. Autolink SDK介绍

Autolink SDK提供了一套快速集成Autolink-AI的工具,让开发者无需关注底层协议细节,提高开发效率。同时,它支持Android、Linux、iOS、Windows多个平台,方便开发者选择最适合自己的平台进行开发。Autolink SDK可以帮助企业快速将Autolink-AI应用到业务场景中,提高效率和竞争力。本文档主要介绍iOS平台集成过程。

2. 兼容性说明

参数说明:

类别 兼容范围
系统 支持arm64架构,兼容iOS 9.0 及以上版本
开发环境 建议使用Xcode 进行开发

3. 授权说明

车联AI认知大模型授权支持按照tokens授权和设备级授权两种方式。

tokens 授权:授权tokens总量,按照tokens 使用量计费,1 tokens 约等于1.5个中文汉字 或者 0.8个英文单词。

设备级授权:授权设备台数和有效期,按照设备指纹计量计费,此方式仅支持定制级客户,如有需要请与开放平台联系。

4. Autolink SDK组成

将SDK zip包解压缩,得到如下文件:

├── Demo Spark的使用DEMO,DEMO中已经集成了SDK,您可以参考DEMO,集成SDK。集成前,请先测通DEMO,了解调用原理。
├── ReleaseNotes.txt SDK版本日志
├── SDK Autolink SDK
│ └── Spark.framework
└── Autolink LLM iOS SDK集成文档.pdf Autolink SDK集成指南

5. 接口调用流程图

6. SDK工程配置

6.1 导入SDK库

Autolink iOS SDK 核心代码库由AutolinkChain.framework组成。在引入工程中时,在工程的General的frameworks,Libraries,and Embedded Content 中使用Embedded & sign

示例如下:

6.2 设置BitCode

Autolink iOS SDK暂不支持Bitcode,Xcode 7、Xcode 8默认开启了Bitcode,而Bitcode 需要工程依赖的所有类库同时支持,可关闭此设置,只需在Targets - Build Settings 中搜索Bitcode 即可,找到相应选项,设置为NO。

7. 快速集成

7.1 SDK初始化

在使用Autolink SDK Autolink-AI交互功能前,需要首先开通Autolink-AI授权并获取已开通授权的应用信息**(appId、apiKey、apiSecret)。SDK全局只需要初始化一次。**初始化示例如下::

AutolinkChainConfig * config = [[AutolinkChainConfig alloc] init];
config.appID("appID") //配置应用信息
      .apiKey("apiKey")
      .apiSecret("apiSecret");
int ret = [AutolinkChain.getInst init:config];
NSLog("初始化结果 ret = %d",ret);

初始化参数说明:

参数名 类型 说明 是否必填
appID NSString 创建应用后,生成的应用ID
apiKey NSString 创建应用后,生成的唯一应用标识
apiSecret NSString 创建应用后,生成的唯一应用秘钥
logLevel NSInteger 0:VERBOSE,1:DEBUG,2:INFO,3:WARN,4:ERROR,5:FATAL,100:OFF
logPath NSString 日志存储路径,设置则会把日志存在该路径下,不设置则会把日志打印在终端上
uid NSString 用户自定义标识

初始化返回值:0:初始化成功,非0:初始化失败,请根据具体返回值参考错误码章节查询原因。

首先需要配置Autolink-AI的相关参数,示例如下:

LLMConfig * config = [[LLMConfig alloc] init];
config.domain(@"generalv2");
config.url(@"ws(s)://Autolink-api.xf-yun.com/v2.1/chat");//如果使用generalv2,domain和url都可缺省,SDK默认;如果使用general,url可缺省,SDK会自动补充;如果是其他,则需要设置domain和url。
LLM *llm = [[LLM alloc] initWithConfig:config];

参数说明:

字段 含义 类型 限制 是否必传
domain 需要使用的领域 String 取值为[general,generalv2],默认generalv2
general:通用大模型V1.5版本
generalv2:通用大模型V2版本
general和generalv2对应的url不同,需要严格对应。url地址参见下文。
url 配置chat服务器域名地址 String general:wss://Autolink-api.xf-yun.com/v1.1/chat
generalv2:wss://Autolink-api.xf-yun.com/v2.1/chat
generalv3:wss://Autolink-api.xf-yun.com/v3.1/chat
domian 取值为 general或generalv2 时,SDK自动设置url,可缺省。
maxToken 回答的tokens的最大长度 int 取值范围1-4096,默认:2048
temperature 配置核采样阈值,改变结果的随机程度 float 取值范围 (0,1],默认:0.5
auditing 内容审核的场景策略 String 当前仅支持default
topK 配置从k个候选中随机选择⼀个(⾮等概率) int 取值范围1-6,默认值:4
chatID 配置关联会话chat_id标识,需要保障用户下唯一 String

7.3 车联AI请求调用

当前支持同步调用和异步调用两种方式。用户可以通过run方法或者arun方法向大模型发送问题请求,获取大模型返回结果。run方法、arun方法不支持并发调用。

7.3.1 同步调用

7.3.1.1 请求调用
//同步调用
// 第一轮交互,如果不需要交互上下文,均可按照此方式调用即可
NSString *query1 = @"上海有什么景点?";
LLMOutput *output  = [llm run:query1];
if (output.errCode == 0) {
     NSLog(@"同步调用:role:%@ content:%@",output.role,output.content);
 }else{
     NSLog(@"同步调用:errCode:%d errMsg:%@",output.errCode,output.errMsg);
}

//第二轮交互,示例带历史上下文
//构造历史上下文数据
NSString *query2 = @"那帮我带一份旅游计划吧。";
NSMutableArray *array = [[NSMutableArray alloc] init];
NSMutableDictionary *item1 = [[NSMutableDictionary alloc] init];
[item1 setValue:@"user" forKey:@"role"];
[item1 setValue:query1 forKey:@"content"];
NSMutableDictionary *item2 = [[NSMutableDictionary alloc] init];
[item2 setValue:@"assistant" forKey:@"role"];
[item2 setValue:result forKey:@"content"];
NSMutableDictionary *item3 = [[NSMutableDictionary alloc] init];
[item3 setValue:@"user" forKey:@"role"];
[item3 setValue:query2 forKey:@"content"];
[array addObject:item1];
[array addObject:item2];
[array addObject:item3];
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:array options:NSJSONWritingPrettyPrinted error:&error];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

//调用同步接口
output = [llm run:jsonString];
if(output.errCode == 0){
     result = output.content;
     NSLog(@"result2 ==  %@",result);
 }else{
     NSLog(@"%@",output.errMsg);
}

run方法参数说明:

参数名 类型 说明 限制 是否必填
query NSString 输入信息文本,包含历史信息 general:4096 tokensgeneralv2:8192 tokens

LLMOutput数据结构说明:

参数 类型 说明
errCode NSInteger 调用结果状态,0:调用成功,非0:调用失败,具体原因请根据返回值参考错误码
errMsg NSString 调用失败时的错误信息
role NSString Autolink-AI的角色,assistant::助手,user:用户
content NSString 调用结果
completionTokens NSInteger 回答的Token大小
promptTokens NSInteger 包含历史问题的总Tokens大小
totalTokens NSInteger promptTokens和completionTokens的和,也是本次交互计费的Tokens大小

返回结果参考7.4节响应协议说明

7.3.2 异步调用

7.3.2.1.注册结果回调
//实现数据回调函数
- (void)llm:(LLM *)llm onResult:(LLMResult *)result usrContext:(id)usrContext {
    NSLog(@"异步调用:content:%@  status:%d",result.content,result.status);
}
- (void)llm:(LLM *)llm onEvent:(LLMEvent *)event usrContext:(id)usrContext {
    NSLog(@"异步调用:eventID:%d  eventMsg:%@",event.eventID,event.eventMsg);
}
- (void)llm:(LLM *)llm onError:(LLMError *)error usrContext:(id)usrContext {
    NSLog(@"异步调用:code:%d  msg:%@",error.errCode,error.errMsg);
}
llm.callback = self;

LLMCallback数据结构说明:

方法 参数 类型 说明
onResult result LLMResult Autolink-AI结果实例
usrContext id 上下文
onEvent event LLMEvent 调用事件结果实例
usrContext id 上下文
onError error LLMError 错误信息结果实例
usrContext id 上下文
结构类 参数 说明
LLMResult role Autolink-AI角色,assistant::助手,user:用户
content 调用结果
completionTokens 回答的Token大小
promptTokens 包含历史问题的总Tokens大小
totalTokens promptTokens和completionTokens的和,也是本次交互计费的Tokens大小
status 返回结果状态,0:start,1:continue,2:end
LLMEvent eventID 事件ID,15:建立连接,19:断开连接
eventMsg 事件信息
LLMError errCode 错误码ID
errMsg 错误信息
7.3.2.2 请求调用
//异步调用
_sema = dispatch_semaphore_create(0);
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 15);
NSString *myContext = @"myContext";
self.result = @"".mutableCopy;

//第一轮交互,如果不需要交互上下文,均可按照此方式调用
NSString *query1 = @"上海有什么景点?";
int ret = [llm arun:query1 usrContext:myContext];
dispatch_semaphore_wait(_sema, DISPATCH_TIME_FOREVER);

//第二轮交互 示例带历史上下文的交互
//构造历史上下文数据
self.result = @"".mutableCopy;
NSString *query2 = @"那帮我带一份旅游计划吧。";
NSMutableArray *array = [[NSMutableArray alloc] init];
NSMutableDictionary *item1 = [[NSMutableDictionary alloc] init];
[item1 setValue:@"user" forKey:@"role"];
[item1 setValue:query1 forKey:@"content"];
NSMutableDictionary *item2 = [[NSMutableDictionary alloc] init];
[item2 setValue:@"assistant" forKey:@"role"];
[item2 setValue:self.result forKey:@"content"];
NSMutableDictionary *item3 = [[NSMutableDictionary alloc] init];
[item3 setValue:@"user" forKey:@"role"];
[item3 setValue:query2 forKey:@"content"];
[array addObject:item1];
[array addObject:item2];
[array addObject:item3];
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:array options:NSJSONWritingPrettyPrinted error:&error];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

//调用异步接口
ret = [llm arun:jsonString usrContext:myContext];
dispatch_semaphore_wait(_sema, DISPATCH_TIME_FOREVER);

arun方法参数说明:

参数 类型 说明 限制 是否必填
query NSString 输入信息文本 general:4096 tokens,generalv2和generalv3:8192 tokens
usrContext Object 用户自定义标识
返回结果参考7.4节响应协议说明

7.4 响应协议说明

该协议为中间协议,Autolink-AI是按照此协议格式返回结果。SDK已完成对此协议的解析和封装,获取相应字段方法请查询7.3节LLMOutput和LLMResult的结构说明。

# 接口为流式返回,此示例为最后一次返回结果,开发者需要将接口多次返回的结果进行拼接展示
{
  "header":{
    "code":0,
    "message":"Success",
    "sid":"cht000b2d3c@dx18a980cc0beb894540",
    "status":2
  },
  "payload":{
    "choices":{
      "status":2,
      "seq":9,
      "text":[
        {
          "content":"”",
          "role":"assistant",
          "index":0
        }
      ]
    },
    "usage":{
      "text":{
        "question_tokens":15,
        "prompt_tokens":15,
        "completion_tokens":61,
        "total_tokens":76
      }
    }
  }
}

协议结构说明

字段 含义 类型 说明
header 协议头部 Object 协议头部,用于描述平台特性的参数
payload 响应数据块 Object 数据段,携带响应的数据。

响应参数说明

字段 含义 类型
sid 本次会话的id NSString
status 数据状态 0:start,1:continue,2:end NSInteger
seq 数据序号,标明数据为第几块。最小值:0, 最大值:9999999 NSInteger
content 文本数据 NSString
role Autolink-AI角色 NSString
prompt_tokens 包含历史问题的总Tokens大小 NSInteger
completion_tokens 回答的Token大小 NSInteger
total_tokens promptTokens和completionTokens的和,也是本次交互计费的Tokens大小 NSInteger

7.5 SDK逆初始化

当不再使用能力时,需调用逆初始化方法释放资源,示例代码如下:

[[AutolinkChain getInst] unInit];

8. 错误码

错误码包含SDK错误码和云端错误码,SDK错误码用来反馈SDK本地运行时遇到的错误;云端错误码用来反馈Autolink-AI交互时服务端错误。

8.1 SDK错误码

错误码 含义 自查指南
0 操作成功
18007 授权应用不匹配(apiKey、apiSecret) apiKey、apiSecret 配置有误,请核对项目中配置的 apiKey、apiSecret 。
18301 SDK未初始化 在使用大模型前请先初始化 SDK,如果有调用 uninit 方法,再次使用大模型交互时需要重新初始化。
18302 SDK初始化失败 请根据init接口回调中返回的错误码参考此文档做对应检查
18303 SDK 已经初始化 重复初始化导致,使用能力时,SDK 只需要初始化一次,请检查 SDK 初始化逻辑是否存在多次初始化。
18304 不合法参数 请参考demo及集成文档仔细检查所传参数是否正确。
18311 sdk同一能力并发路数超出最大限制
18312 此实例已处在运行态,禁止单实例并发运行
18400 工作目录无写权限 在设置 workDir 时,请确保该工作路径有读写权限。若无法设置读写权限,请修改为有读写权限的工作路径。
18402 文件打开失败 请检查 日志中所打印的文件是否存在,以及对应路径下是否有读权限。
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 值
18509 必填参数缺失 请参考demo或者文档检查是否漏传必填参数
18700 通用网络错误 请检查网络连接是否正常
18701 网络不通 请检查网络连接是否正常
18702 网关检查不过 检查设备时间是否正确; 请检查 SDK 初始化时所传 apiKey、apiScrect 是否正确;
18703 云端响应格式不对 请检查网络是否可以正常访问外网
18705 应用 ApiKey & ApiSecret 校验失败 请检查 apiKey、apiSecret 是否正确
18707 授权已过期 请检查授权期限
18708 无可用授权 没有授权或者授权已满
18712 网络请求 404 错误 请检查网络是否通畅
18713 设备指纹安全等级不匹配 设备指纹安全等级不符合要求
18714 应用信息有误 服务端无法查询到api_key,请检查api_key和api_secret信息是否填写正确
18717 SDK授权不足 授权数量已满
18801 连接建立出错 请检查网络是否通畅
18802 结果等待超时 请检查网络是否通畅
18803 连接状态异常 请检查网络是否通畅
18902 并发超过路数限制 不支持并发
18903 大模型规划步骤为空 请检查请求数据的意图是否明确
18904 插件未找到 请检查是否使用了未存在的插件
18906 与大模型交互次数超限制
18907 运行超限制时长
18908 大模型返回结果格式异常
18951 同一流式大模型会话,禁止并发交互请求
18952 输入文本格式或内容非法

8.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 表示本次会话内容有涉及违规信息的倾向;建议开发者收到此错误码后给用户一个输入涉及违规的提示
10110 服务忙,请稍后再试
10163 请求引擎的参数异常 引擎的schema 检查不通过
10222 引擎网络异常
10907 token数量超过上限。对话历史+问题的字数太多,需要精简输入
11200 授权错误:该appId没有相关功能的授权 或者 业务量超过限制
11201 授权错误:日流控超限。超过当日最大访问量的限制
11202 授权错误:秒级流控超限。秒级并发超过授权路数限制
11203 授权错误:并发流控超限。并发路数超过授权路数限制

详见服务说明