图片生成 Android SDK 集成文档
#1、简介
支持用户向大模型发送一个文本请求,大模型根据请求生成相应的图片。
#2、SDK集成指南
#2.1 兼容性说明
类别 |
兼容范围 |
系统 |
支持armv7和armv8架构,兼容android 5.0及以上版本 |
开发环境 |
建议使用Android Studio 进行开发 |
#2.2 授权说明
星火认知大模型授权支持按照tokens授权和设备级授权两种方式。
tokens 授权:授权tokens总量,按照tokens 使用量计费,1 tokens 约等于1.5个中文汉字 或者 0.8个英文单词。
设备级授权:授权设备台数和有效期,按照设备指纹计量计费,此方式仅支持定制级客户,如有需要请与开放平台联系。
#2.3 SDK集成包目录结构
将SDK zip包解压缩,得到如下文件:
├── Demo SparkChain的使用DEMO,DEMO中已经集成了SDK,您可以参考DEMO,集成SDK。集成前,请先测通DEMO,了解调用原理。 ├── ReleaseNotes.txt SDK版本日志 ├── SDK SparkChain SDK │ └── SparkChain.aar └── SparkChain Android SDK集成文档.pdf SparkChain集成指南
#2.4 SDK工程配置
#2.4.1 导入SDK库
复制SparkChain.aar到项目的libs目录下,然后在主Module的build.gradle文件中,增加如下配置:
implementation files('libs/SparkChain.aar')
#2.4.2 配置权限
SparkChain SDK中默认配置了以下权限:
权限 |
使用说明 |
INTERNET |
必须权限,SDK需要访问网络获取结果。 |
READ_EXTERNAL_STORAGE |
必须权限,SDK需要判断日志路径是否存在。 |
WRITE_EXTERNAL_STORAGE |
必须权限,SDK写本地日志需要用到该权限。 |
MANAGE_EXTERNAL_STORAGE |
可选权限,安卓10以上设备用于动态授权弹出授权框需要用到该权限,安卓10以上设备必选。 |
READ_PHONE_STATE |
可选权限,用于获取设备标识。 |
如果部分权限不需要,可通过如下配置去除,去除示例如下:
<!-- 移除SDK非必须权限示例 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />
如果使用邮件插件,则需要配置以下权限:
权限 |
使用说明 |
READ_CONTACTS |
可选权限,使用邮箱插件需要该权限,用于获取通讯录信息 |
Android 10.0(API 29)及以上版本需要在application中做如下配置
<application android:requestLegacyExternalStorage="true"/>
#2.4.3 混淆配置
SparkChain SDK 已做过混淆,如果您项目中也使用了混淆,请在 proguard-rules.pro文件中添加如下配置保持SparkChain SDK 不再被混淆。
-keep class com.iflytek.sparkchain.** {*;}
-keep class com.iflytek.sparkchain.**
#2.5 初始化
#2.5.1 SDK初始化
在使用SDK功能前,需要先开通星火大模型授权并获取已开通授权的应用信息(appId、apiKey、apiSecret)。SDK全局只需要初始化一次。初始化时,开发者需要构建一个SparkChainConfig实例config,把相关的appid信息以及日志设置等传入config中,然后再通过SparkChain.getInst().init方法把config实例设置到SDK中。具体初始化示例如下:
//配置应用信息
SparkChainConfig config = SparkChainConfig.builder()
.appID("$appId")
.apiKey("$apiKey")
.apiSecret("$apiSecret");
int ret = SparkChain.getInst().init(getApplicationContext(), config);
Log.d(TAG,"sdk init:"+ret);
初始化参数说明:
接口名称 |
含义 |
参数类型 |
限制 |
是否必填 |
appID |
创建应用后,生成的应用ID |
String |
与平台生成的appID完全一致 |
是 |
apiKey |
创建应用后,生成的唯一应用标识 |
String |
与平台生成的apiKey完全一致 |
是 |
apiSecret |
创建应用后,生成的唯一应用秘钥 |
String |
与平台生成的apiSecret完全一致 |
是 |
logLevel |
日志等级 |
int |
枚举,0:VERBOSE,1:DEBUG,2:INFO,3:WARN,4:ERROR,5:FATAL,100:OFF |
否 |
logPath |
日志存储路径(具体指定到文件名,如”/sdcard/iflytek/sparkchain.log”),设置则会把日志存在该路径下,不设置则会把日志打印在终端上。 |
String |
设置的路径需要有读写权限 |
否 |
uid |
用户自定义标识 |
String |
|
否 |
初始化返回值:0:初始化成功,非0:初始化失败,请根据具体返回值参考第13.1节查询原因。
#2.5.2 LLM初始化
SDK是通过LLM实例和大模型进行交互的,不同的功能需要创建不同类型的LLM实例,SDK通过LLMFactory类向开发者提供相应功能的LLM实例。LLMFactory提供的LLM实例构造方法如下:
功能 |
说明 |
文本交互 |
构造方法: public static LLM textGeneration() public static LLM textGeneration(Memory memory) public static LLM textGeneration(LLMConfig config) public static LLM textGeneration(LLMConfig config, Memory memory) 参数说明: config:星火大模型配置参数。如果不传入此参数,则默认使用generalv2。 memory:Memory,星火可以根据memory进行上下文关联回答 |
图片生成 |
构造方法: public static LLM imageGeneration() public static LLM imageGeneration(LLMConfig config) public static LLM imageGeneration(int width, int height) public static LLM imageGeneration(int width, int height, LLMConfig config) 参数说明: config:星火大模型配置参数。其中的domain为tti,其他domain参数不生效。 width:生成图片的宽度。参考下方分辨率说明, 不同的分辨率计费不同,请选择合适的使用 height:生成图片的高度。参考下方分辨率说明, 不同的分辨率计费不同,请选择合适的使用 |
图片理解 |
构造方法: public static LLM imageUnderstanding() public static LLM imageUnderstanding(Memory memory) public static LLM imageUnderstanding(LLMConfig config) public static LLM imageUnderstanding(LLMConfig config, Memory memory) 参数说明: config:星火大模型配置参数。其中的domain为image,其他domain参数不生效。 memory:Memory,星火可以根据memory进行上下文关联回答 |
2.7 图片生成
该功能可以令大模型根据用户提出的问题,生成一个符合问题的图片。在使用此功能前,需要执行SDK工程配置和初始化。具体执行步骤参考第5节和第6节.
注意:
1.通过imageGeneration获取的LLM实例,只能进行图片生成的功能,不可进行常规的星火大模型交互功能。
2.当前图片生成功能,不支持带上下文的memory调用。
#2.7.1 接口调用流程图
#2.7.2 同步调用
图片理解 API 文档
#接口说明
内容 |
说明 |
传输方式 |
ws[s] (为提高安全性,强烈推荐wss) |
请求地址 |
wss://spark-api.cn-huabei-1.xf-yun.com/v2.1/image 注:服务器IP不固定,为保证您的接口稳定,请勿通过指定IP的方式调用接口,使用域名方式调用 |
Content-Type |
application/json;charset=UTF-8 |
接口鉴权 |
签名机制,详情请参照签名生成 |
字符编码 |
UTF-8 |
响应格式 |
统一采用JSON格式 |
开发语言 |
任意,只要可以向讯飞云服务发起HTTP请求的均可 |
适用范围 |
任意操作系统,但因不支持跨域不适用于浏览器 |
#鉴权说明
在调用业务接口时,请求方需要对请求进行签名,服务端通过签名来校验请求的合法性。
#鉴权方法
详情请参照下方签名生成
#### #鉴权结果
如果鉴权失败,则根据不同错误类型返回不同HTTP Code状态码,同时携带错误描述信息,详细错误说明如下:
HTTP Code |
说明 |
错误描述信息 |
解决方法 |
401 |
缺少authorization参数 |
{“message”:”Unauthorized”} |
检查是否有authorization参数,详情见authorization参数详细生成规则 |
401 |
签名参数解析失败 |
{“message”:”HMAC signature cannot be verified”} |
检查签名的各个参数是否有缺失是否正确,特别确认下复制的api_key是否正确 |
401 |
签名校验失败 |
{“message”:”HMAC signature does not match”} |
签名验证失败,可能原因有很多。 1. 检查api_key,api_secret 是否正确。 2.检查计算签名的参数host,date,request-line是否按照协议要求拼接。 3. 检查signature签名的base64长度是否正常(正常44个字节)。 |
403 |
时钟偏移校验失败 |
{“message”:”HMAC signature cannot be verified, a valid date or x-date header is required for HMAC Authentication”} |
检查服务器时间是否标准,相差5分钟以上会报此错误 |
时钟偏移校验失败示例:
HTTP/1.1 403 Forbidden
Date: Mon, 22 May 2023 05:44:14 GMT
Content-Length: 116
Content-Type: text/plain; charset=utf-8
{
"message": "HMAC signature does not match, a valid date or x-date header is required for HMAC Authentication"
}
#请求参数
在调用业务接口时,都需要在 Http Request Body 中配置以下参数,请求数据均为json字符串。
请求参数示例:
json
{
"header": {
"app_id": "123456",
"uid": "39769795890"
},
"parameter": {
"chat": {
"domain": "general",
"temperature": 0.5,
"top_k": 4,
"max_tokens": 2028,
"auditing": "default"
}
},
"payload": {
"message": {
"text": [
{
"role": "user",
"content": "base64",
"content_type": "image"
},
{
"role": "user",
"content": "这张图片是什么内容",
"content_type": "text"
}
]
}
}
}
请求参数说明:
| 参数名 | 类型 | 必传 | 描述 |
| —- | —- | —- | —- |
| header.app_id | string | 是 | 应用的app_id,需要在飞云交互平台申请 ,”maxLength”:8 |
| header.uid | string | 否 | 每个用户的id,非必传字段,用于后续扩展 ,”maxLength”:32 |
| parameter.chat | object | 是 | 用于上传对话的参数信息 |
| parameter.chat.domain | string | 是 | 需要使用的领域,模型:image |
| parameter.chat.temperature | float | 否 | 核采样阈值,向上调整可以增加结果的随机程度,取值范围 (0,1] ,默认值0.5 |
| parameter.chat.top_k | int | 否 | 从k个中随机选择一个(非等概率),最小值1,最大值6,默认值4 |
| parameter.chat.max_tokens | int | 否 | 回答的tokens的最大长度 ,最小值是1, 最大值是8192,默认值2048 |
| parameter.chat.auditing | string | 否 | 内容审核的严格程度,strict表示严格审核策略;moderate表示中等审核策略;default表示默认的审核程度 |
| parameter.chat.chat_id | string | 否 | 用于关联会话chat ,需要保障用户下唯一 |
| payload.message.text | json/object/array | 是 | 文本数据,受Token限制,有效内容不能超过8192Token |
+ 单轮交互示例说明: 单轮交互只需要传递一个user角色的数据
[
// 用户的提问
{"role": "user", "content": "xxx", "content_type":"image"}, // 首个必须是图片
{"role": "user", "content": "你会做什么?"}
]
- 多轮交互的格式示例: 多轮交互需要将之前的交互历史按照user(image)->user->assistant->user->assistant规则进行拼接,保证最后一条是user的当前问题
[
// 拼接对话历史信息:
{"role": "user", "content": "xxx", "content_type":"image"}, // 首个必须是图片
{"role": "user", "content": "图片里面有几个人"}, // 用户第一个问题 role是user,表示是用户的提问
{"role": "assistant", "content": "有三个人"}, // AI的第一个回复 role是assistant,表示是AI的回复
// 用户最新的提问
{"role": "user", "content": "几条腿?"}
]
字段参数说明:
字段 |
含义 |
数据类型 |
取值范围 |
默认值 |
说明 |
role |
角色 |
string |
user, assistant |
|
user表示是用户的问题,assistant表示AI的回复 |
content |
文本内容 |
string |
— |
|
该角色的对话内容 |
{
"role": "user",
"content": "base64",
"content_type": "image",
}
字段参数说明:
字段 |
含义 |
数据类型 |
取值范围 |
默认值 |
说明 |
role |
角色 |
string |
user |
|
多模的数据上传使用user |
content |
图片的base64数据 |
string |
— |
|
模型自动判断格式,直接传二进制数据即可 |
content_type |
数据的类型 |
string |
image、text、audio、video |
text |
图片上传的时候固定使用image |
#返回结果
返回参数示例:
成功
{
"header": {
"code": 0,
"message": "Success",
"sid": "cht000704fa@dx16ade44e4d87a1c802",
"status": 0
},
"payload": {
"choices": {
"status": 2,
"seq": 0,
"text": [
{
"content": "这是AI的回复文本",
"content_type": "text",
"content_meta": {
"desc": "xxxx",
"url": false,
},
"index": 0,
"role": "assistant"
}
]
},
"usage": {
"text": {
"completion_tokens": 0,
"question_tokens": 0,
"prompt_tokens": 0,
"total_tokens": 0
}
}
}
}
异常
{
"header": {
"code": 10110,
"message": "xxxx",
"sid": "cht00120013@dx181c8172afb0001102",
"status": 2,
}
}
返回参数说明:
参数 |
类型 |
含义 |
header.code |
int |
服务错误码 , 0表示正常,非0表示出错 |
header.sid |
string |
会话的sid |
header.status |
int |
会话的状态,取值[0,1,2], 其中0表示第一个结果, 1表示中间结果, 2表示最后一个结果 |
header.message |
string |
返回消息描述 ,错误码的描述信息 |
payload.choices.status |
int |
数据状态 ,0:开始, 1:开始, 2:结束(表示文本响应结束) |
payload.choices.seq |
int |
数据序号,最小值:0, 最大值:9999999 |
payload.choices.text |
json object array |
文本结果 ,是一个json 数组 |
payload.usage |
object |
token消耗响应,最后一个结果时,才会有该字段 |
payload.usage.text |
json / object |
文本数据 |
payload.usage.text.completion_tokens |
int |
回答tokens大小 |
payload.usage.text.question_tokens |
int |
问题不带历史的tokens大小 ,单轮情况下,此数值会略小于prompt_tokens |
payload.usage.text.prompt_tokens |
int |
问题总tokens大小 |
payload.usage.text.total_tokens |
int |
问题和回答的tokens大小 |
choices字段参数说明
参数 |
类型 |
含义 |
content |
string |
回答的结果 |
content_type |
string |
数据的类型 |
index |
int |
结果序号,在多候选中使用 |
role |
string |
角色,assistant说明这是AI的回复 |
#结果格式补充说明
模型结果除了普通文本类型,为了满足排版需求,会出现以下的标记语言,建议集成方进行适配:
- markdown(表格、列表等)
- latex(数学公式)
#常见问题
#图片理解的主要功能是什么?
答:用户输入一张图片和问题,从而识别出图片中的对象、场景等信息回答用户的问题。
#图片理解支持什么应用平台?
答:目前支持Web API应用平台。
#图片理解的文本大小限制多少?
答:有效内容不能超过8192Token。