Android ADK 集成指南
第一章:环境要求
项目 | 要求 |
minSdkVersion | 21(Android 5.0+) |
targetSdkVersion | 34 |
compileSdkVersion | 34 |
Java 兼容性 | Java 8 字节码(sourceCompatibility 1.8) |
Gradle | 7.0+(推荐 8.x) |
Android Gradle Plugin | 7.0+(推荐 8.x) |
友盟 UMCommon | 最低版本 9.9.9(见第二章) |
第二章:友盟 Common SDK 集成与基础配置
最低版本要求:UMCommon(common 组件)≥ 9.9.9(低于该版本不满足 U-ADK 1.1.0 要求,请升级后再集成)。
2.1 依赖引入
在 App 模块的 build.gradle 中添加:
dependencies {
implementation 'com.umeng.umsdk:common:+' // 最低版本要求 9.9.9
implementation 'com.umeng.umsdk:asms:+'
}若 + 动态版本解析到低于 9.9.9 的版本,请显式固定版本:implementation 'com.umeng.umsdk:common:9.9.9'(或更高的确定版本)。2.2 权限声明
在 AndroidManifest.xml 中声明以下权限(友盟 Common SDK 通常已自动合入,如有缺失请手动补充):
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />2.3 Application 中初始化
在自定义 Application.onCreate() 中完成友盟初始化:
import com.umeng.commonsdk.UMConfigure;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 预初始化(必须在 UMConfigure.init 之前调用)
UMConfigure.preInit(this, "YOUR_APPKEY", "default_channel");
// 正式初始化(UMADK 与 UMConfigure 使用同一 appKey 注册,见 3.2)
UMConfigure.init(this, "YOUR_APPKEY", "default_channel",
UMConfigure.DEVICE_TYPE_PHONE, "");
}
}2.4 混淆规则
友盟 Common SDK 自带 consumer-rules,正常情况下无需额外配置。若遇到混淆异常,可手动补充:
-keep class com.umeng.** { *; }
-keep class org.repackage.** { *; }
- keepclassmembers class * {
public <init>(org.json.JSONObject);
}第三章:ADK SDK 集成
3.1 依赖引入
方式一:Maven 在线依赖(推荐)
在 App 模块的 build.gradle 中添加:
dependencies {
implementation 'com.umeng.umsdk:adk:1.1.0'
// OkHttp 3.12.13 LTS — ADK 运行时必需依赖
implementation 'com.squareup.okhttp3:okhttp:3.12.13'
}方式二:本地 AAR 引入
将 ADK AAR 文件(如 adk-release.aar)放置于 App 模块的 libs/ 目录,并在 build.gradle 中添加:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.aar'])
// OkHttp 3.12.13 LTS — ADK 运行时必需依赖
implementation 'com.squareup.okhttp3:okhttp:3.12.13'
}注意:两种方式等效。ADK SDK 以 compileOnly 方式依赖 OkHttp 和友盟 Common SDK,不会打入产物。宿主 App 必须自行引入上述依赖(友盟 Common SDK 见第二章)。3.2 初始化
ADK SDK 初始化通过 UADK.prepare(InitCallback) 完成,在 UMConfigure
初始化之后调用(appKey 与 UMConfigure 使用同一注册值,
UMCommon ≥ 9.9.9 初始化完成时 SDK 配置自动就绪,无需其他调用):
方法 | 说明 |
| 异步执行初始化,完成后通过回调通知结果;可重复调用(仅首次生效),失败后可重试 |
完整示例:
import com.umeng.adk.UADK;
import com.umeng.adk.InitCallback;
import com.umeng.adk.UADKError;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 友盟初始化(略;必须先于 UADK 初始化)
// ADK 初始化
UADK.prepare(new InitCallback() {
@Override
public void onSuccess() {
// SDK 就绪,可调用业务接口
}
@Override
public void onError(UADKError error) {
// 初始化失败,根据 error.getCode() 与 error.getSource() 判断原因
}
});
}
}3.3 调试模式
开发阶段可开启调试日志(release 包中建议关闭):
UADK.setDebugMode(BuildConfig.DEBUG);调试模式开启后,SDK 将输出详细日志(凭证字段自动脱敏)。可通过 UADK.isDebugMode() 查询当前状态。
第四章:能力接口使用
前提:所有业务接口必须在UADK.prepare()成功回调之后调用。可通过UADK.isReady()判断就绪状态。
4.1 非流式聊天
接口:UADK.chat(ChatRequest request, ChatCallback callback)
请求参数(ChatRequest.Builder):
参数 | 类型 | 必填 | 说明 |
| String | 否 | 模型名称(缺省 |
| List<Message> | 是 | 对话消息列表;元素含 |
| String | 否 | 会话 ID( |
| boolean | 否 | 是否开启深度思考(缺省 |
| boolean | 否 | 是否由服务端拼接同会话历史(缺省 |
| ImageParams | 否 | 文生图参数(仅 |
返回(ChatResponse,字段详见第五章):content(完整回答)/ reasoning(思考过程,可空)/ meta / usage / traceId / rawJson。
import com.umeng.adk.*;
import java.util.ArrayList;
import java.util.List;
List<Message> messages = new ArrayList<>();
messages.add(new Message("user", "你好,请介绍一下自己"));
ChatRequest request = new ChatRequest.Builder()
.model("auto")
.messages(messages)
.build();
UADK.chat(request, new ChatCallback() {
@Override
public void onSuccess(ChatResponse response) {
String answer = response.getContent();
String reasoning = response.getReasoning(); // 思考过程,可能为 null
UsageInfo usage = response.getUsage();
runOnUiThread(() -> textView.setText(answer));
}
@Override
public void onError(UADKError error) {
runOnUiThread(() -> showError(error.getMessage()));
}
});4.2 流式聊天(SSE)
接口:UADK.chatStream(ChatRequest request, StreamCallback callback)
请求参数:与 4.1 完全一致(同一个 ChatRequest,见 4.1 参数表)。
回调参数说明(StreamCallback 四方法):
回调 | 参数类型 | 触发时机与说明 |
|
| 首事件,至多一次;含 |
|
| 零到多次,后台线程按序触发; |
|
| 至多一次,与 |
|
| 至多一次,与 |
import com.umeng.adk.*;
import java.util.ArrayList;
import java.util.List;
List<Message> messages = new ArrayList<>();
messages.add(new Message("user", "写一首关于春天的诗"));
ChatRequest request = new ChatRequest.Builder()
.model("auto")
.messages(messages)
.enableThinking(true) // 开启深度思考
.build();
final StringBuilder contentBuilder = new StringBuilder();
UADK.chatStream(request, new StreamCallback() {
@Override
public void onMeta(MetaInfo meta) {
// 首个事件,获取 sessionId 用于多轮会话
String sessionId = meta.getSessionId();
}
@Override
public void onDelta(DeltaEvent delta) {
if (DeltaEvent.TYPE_CONTENT.equals(delta.getType())) {
contentBuilder.append(delta.getDelta());
runOnUiThread(() -> textView.setText(contentBuilder.toString()));
} else if (DeltaEvent.TYPE_REASONING.equals(delta.getType())) {
// 思考过程增量
}
}
@Override
public void onDone(UsageInfo usage) {
// 流式完成,获取用量
long totalTokens = usage.getTotalTokens();
}
@Override
public void onError(UADKError error) {
runOnUiThread(() -> showError(error.getMessage()));
}
});4.3 文生图
文生图与文本生成同一入口,须通过流式接口 chatStream 调用,模型须为 modelType = image_generation 的模型(经 listModels 动态获取,禁止硬编码模型名)。
请求参数:同 4.1 ChatRequest(model 传 image_generation 模型的 displayName),其中 imageParams 子参数如下:
参数 | 类型 | 必填 | 说明 |
| String | 否 | 图片尺寸(缺省 |
| String | 否 | 图片质量: |
| int | 否 | 生成数量 1~4(缺省 1;越界回退 1) |
返回:图链经 onDelta 以 type=content 整段 Markdown 一次性下发(形如 )。
import com.umeng.adk.*;
import java.util.Collections;
List<Message> messages = Collections.singletonList(
new Message("user", "一只在滑雪的柴犬"));
ChatRequest request = new ChatRequest.Builder()
.model("<经 listModels 获取的 image_generation 模型 displayName>")
.messages(messages)
.imageParams(new ImageParams("1024x1024", "medium", 1))
.build();
UADK.chatStream(request, new StreamCallback() {
@Override
public void onMeta(MetaInfo meta) { }
@Override
public void onDelta(DeltaEvent delta) {
if (DeltaEvent.TYPE_CONTENT.equals(delta.getType())) {
// 文生图图链以 type=content 返回,Markdown 格式: 
String markdownImage = delta.getDelta();
// 解析 URL 后用 Glide 等图片库加载
}
}
@Override
public void onDone(UsageInfo usage) { }
@Override
public void onError(UADKError error) { }
});4.4 模型列表
接口:UADK.listModels(ModelsCallback callback)
请求参数:无。
返回(List<ModelInfo>):
字段 | 类型 | 说明 |
| String | 对外展示名(即请求时 |
| String | 实际上游模型名 |
| String | 模型档位( |
| boolean | 是否支持深度思考 |
| boolean | 是否支持图片输入 |
| String | 模型类型( |
| String | 模型描述 |
列表顺序由服务端返回(auto 通常排首位)。
import com.umeng.adk.*;
import android.util.Log;
UADK.listModels(new ModelsCallback() {
@Override
public void onSuccess(List<ModelInfo> models) {
for (ModelInfo model : models) {
Log.d("Models", model.getDisplayName()
+ " | type=" + model.getModelType()
+ " | thinking=" + model.isSupportsThinking());
}
}
@Override
public void onError(UADKError error) {
Log.e("Models", "获取模型列表失败: " + error.getMessage());
}
});4.5 多轮会话
import com.umeng.adk.*;
import java.util.Collections;
// 首轮:不传 sessionId
ChatRequest firstRequest = new ChatRequest.Builder()
.model("auto")
.messages(Collections.singletonList(new Message("user", "我叫小明")))
.build();
// 保存 sessionId
final String[ ] savedSessionId = new String[1];
UADK.chatStream(firstRequest, new StreamCallback() {
@Override
public void onMeta(MetaInfo meta) {
savedSessionId[0] = meta.getSessionId(); // 保存
}
@Override
public void onDelta(DeltaEvent delta) { }
@Override
public void onDone(UsageInfo usage) {
// 第二轮:携带 sessionId
ChatRequest secondRequest = new ChatRequest.Builder()
.model("auto")
.messages(Collections.singletonList(new Message("user", "我叫什么?")))
.sessionId(savedSessionId[0])
.loadHistory(true)
.build();
UADK.chatStream(secondRequest, new StreamCallback() {
@Override
public void onMeta(MetaInfo meta) { }
@Override
public void onDelta(DeltaEvent delta) {
// 模型将回答 "小明"
}
@Override
public void onDone(UsageInfo usage) { }
@Override
public void onError(UADKError error) { }
});
}
@Override
public void onError(UADKError error) { }
});4.6 七场景调用入口(text / nlp / translate / ocr / vision / asr / tts)
SDK 提供七个场景化调用入口,无需指定模型,场景参数由各 Request 构建器承载;回调在后台线程触发。
方法 | 签名 | messages 必填性 |
文本生成 |
| 必填 |
结构化抽取 |
| 必填 |
翻译 |
| 必填(targetLang 亦必填) |
OCR |
| 可选 |
视觉理解 |
| 无(仅图像输入) |
语音识别 |
| 可选 |
语音合成 |
| 必填(待合成文本 ≤2000 字符) |
统一结果字段:七场景结果均继承 ScenarioResult 基类,公共字段:
字段 | 类型 | 说明 |
executedBy | ExecutedBy | 执行层标注,成功回调时读取;Android 恒为 |
usage | UsageInfo | 用量信息(tokens 等);tts 的 characters 经 |
rawJson | String | 结果 data 段原文 |
meta | MetaInfo | 恒承载(Android 本期恒云端执行) |
traceId | String | 恒承载(Android 本期恒云端执行) |
子类便捷字段:TextResult.getContent()、NlpResult.getStructured()/getTokens()/getEntities()/getKeywords()、TranslateResult.getContent()/getDetectedLang()、OcrResult.getContent()/getStructured()、VisionResult.getStructured()、AsrResult.getContent()/getSentences()/getLanguage()、TtsResult.getAudioUrl()/getAudioData()/getDurationMs()(audioData 恒为 null)。
便捷入口——常用参数组合的简化构造:
入口 | 用途 |
| 构造用户消息(场景化调用推荐使用) |
| text 纯文本入口(prompt/maxLength/style/language 等可选参数需 Builder) |
| nlp 纯文本入口(language 需 Builder) |
| translate 纯文本入口(sourceLang/domain 需 Builder) |
| tts 纯文本入口(voice/format/sampleRate/speed 需 Builder) |
media 三场景(ocr/vision/asr) | Builder 不调用 |
⚠️ 当前版本限制:vision 场景按实测参考形态解析(见 4.7.5);ocr 场景 structured.result 内部结构未定型,只消费 content(见 4.7.4)。
示例:翻译(便捷入口)
import com.umeng.adk.*;
TranslateRequest request = TranslateRequest.ofText("你好,世界", "en");
// 需要 sourceLang / domain 等可选参数时用 Builder:
// new TranslateRequest.Builder()
// .messages(Collections.singletonList(Message.ofUser("你好,世界")))
// .sourceLang("auto").targetLang("en").build();
UADK.translate(request, new UADKCallback<TranslateResult>() {
@Override
public void onSuccess(TranslateResult result) {
Log.d("Scenario", "content=" + result.getContent()
+ ", detectedLang=" + result.getDetectedLang()
+ ", executedBy=" + result.getExecutedBy()
+ ", traceId=" + result.getTraceId());
}
@Override
public void onError(UADKError error) {
Log.e("Scenario", "翻译失败: " + error.getMessage());
}
});示例:语音合成(便捷入口)
TtsRequest ttsRequest = TtsRequest.ofText("你好,U-ADK");
// 需要 voice / format 等可选参数时用 Builder:
// new TtsRequest.Builder()
// .messages(Collections.singletonList(Message.ofUser("你好,U-ADK")))
// .voice("longxiaochun").format("mp3").build();
UADK.tts(ttsRequest, new UADKCallback<TtsResult>() {
@Override
public void onSuccess(TtsResult result) {
Log.d("Scenario", "audioUrl=" + result.getAudioUrl()
+ ", durationMs=" + result.getDurationMs()
+ ", executedBy=" + result.getExecutedBy());
}
@Override
public void onError(UADKError error) { }
});媒体输入(ocr / vision / asr),两种形态二选一:
本地文件路径:
imageFile(path)/audioFile(path)——SDK 自动完成素材上传;上传失败时通过 onError 返回错误。contentType(...)参数无效,无需调用。素材 URL:
imageUrl(url)/audioUrl(url)——已持有素材 URL 时直接传入。两种形态互斥(同时传入或均不传入 → 返回错误码 1001)。
4.7 七场景参数与返回明细
4.7.0 公共返回结构(阅读各场景前必读)
各场景成功回调均返回场景专属结果对象(如 TextResult),全部继承 ScenarioResult 基类,携带以下公共字段:
字段 | 类型 | 保证级 | 说明 |
|
| 恒有 | 本次结果的执行层;Android 本期恒为 |
| 对象 | 恒有 | 消耗信息 / 模型信息 / 链路追踪 ID / 原始响应 JSON(字段说明见 4.6 统一结果字段表) |
字段保证级图例(下文各表使用):
保证级 | 含义 | 接入方处理 |
恒有 | 成功回调中必定存在、可直接使用 | 直接消费 |
条件存在 | 仅在指定条件下存在(特定任务参数),表中已写明条件 | 按条件判断后消费 |
勿解析 | 字段存在但内部结构当前版本未定型 | 不读取内部子键 |
structured为结构化输出容器(org.json.JSONObject),内部字段在各场景返回表中逐一说明;text / translate 场景的structured可能为空,只消费content即可。
4.7.1 text —— 文本生成 / 摘要 / 改写
接口:UADK.text(TextRequest request, UADKCallback<TextResult> callback)
请求参数(TextRequest.Builder / TextRequest.ofText(text, task)):
参数 | 类型 | 必填 | 说明 |
| List<Message> | 是 | 待处理文本;便捷构造见 |
| String | 是 |
|
| String | 否 | 生成指令(task=GENERATE 时用) |
| Integer | 否 | 结果长度上限 |
| String | 否 | 摘要: |
| String | 否 | 语言(开放集,如 |
返回(TextResult):
字段 | 类型 | 保证级 | 说明 |
| String | 恒有 | 生成/摘要/改写结果文本(本场景唯一消费字段) |
| JSONObject | 勿解析 | 可能为空,不消费 |
4.7.2 nlp —— 分词 / NER / 关键词抽取
接口:UADK.nlp(NlpRequest request, UADKCallback<NlpResult> callback)
请求参数(NlpRequest.Builder / NlpRequest.ofText(text, tasks)):
参数 | 类型 | 必填 | 说明 |
| List<Message> | 是 | 待分析文本;便捷构造见 |
| List<String> | 是(可多选) |
|
| String | 否 | 语言(开放集) |
返回(NlpResult):本场景无 content,结果全部经 structured 承载。
structured 字段表:
字段 | 类型 | 存在条件 | 说明 |
| JSONArray | 请求含 TOKENIZATION 时恒有 | 分词结果,元素结构见下表;便捷读取 |
| JSONArray | 请求含 NER 时恒有 | 命名实体,元素结构见下表;便捷读取 |
| JSONArray | 请求含 KEYWORD_EXTRACTION 时恒有 | 关键词,元素结构见下表;便捷读取 |
tokens[ ] 元素结构:
键 | 类型 | 保证级 | 说明 |
| String | 恒有 | 词语原文 |
| int | 恒有 | 词语在原文中的起始字符偏移(含) |
| int | 恒有 | 词语在原文中的结束字符偏移(不含) |
| String | 恒有 | 词性代码(如 |
entities[ ] 元素结构:text(实体原文,恒有)、type(实体类型代码,如 ORG=机构 / PER=人名,恒有)、startOffset / endOffset(恒有)、confidence(0~1 浮点,恒有)。
keywords[ ] 元素结构:text(关键词,恒有)、score(相关度 0~1 浮点,恒有)。
返回示例(TOKENIZATION + NER + KEYWORD_EXTRACTION):
{
"structured": {
"tokens": [
{"text": "友盟", "startOffset": 0, "endOffset": 2, "partOfSpeech": "NR"}
],
"entities": [
{"text": "友盟", "type": "ORG", "startOffset": 0, "endOffset": 2, "confidence": 0.98}
],
"keywords": [
{"text": "开发者数据服务", "score": 0.92}
]
}
}4.7.3 translate —— 翻译
接口:UADK.translate(TranslateRequest request, UADKCallback<TranslateResult> callback)
请求参数(TranslateRequest.Builder / TranslateRequest.ofText(text, targetLang)):
参数 | 类型 | 必填 | 说明 |
| List<Message> | 是 | 待翻译文本;便捷构造见 |
| String | 是(缺失回调 1001) | 目标语言(开放集,如 |
| String | 否 | 源语言;不填或 |
| String | 否 |
|
返回(TranslateResult):
字段 | 类型 | 保证级 | 说明 |
| String | 恒有 | 译文(本场景主消费字段) |
| String | 条件存在 | 自动检测出的源语言代码(如 |
4.7.4 ocr —— 文字识别
接口:UADK.ocr(OcrRequest request, UADKCallback<OcrResult> callback)
请求参数(OcrRequest.Builder):
参数 | 类型 | 必填 | 说明 |
| String | 与 | 本地图片路径(须先落盘;白名单 png / jpg / jpeg;SDK 自动上传) |
| String | 与 | 已持有的素材 URL |
| String | 否 |
|
| List<String> | 否 | 语言提示(如 |
| List<Message> | 否 | 补充指令;无诉求时不调用 |
返回(OcrResult):
字段 | 类型 | 保证级 | 说明 |
| String | 恒有 | 识别全文 |
| JSONObject | 勿解析 | 为 |
消费总结:读取 content(识别全文,恒有)即完成本场景消费。
4.7.5 vision —— 视觉理解
接口:UADK.vision(VisionRequest request, UADKCallback<VisionResult> callback)
请求参数(VisionRequest.Builder):
参数 | 类型 | 必填 | 说明 |
| String | 与 | 本地图片路径(须先落盘;白名单 png / jpg / jpeg;SDK 自动上传) |
| String | 与 | 已持有的素材 URL |
| String | 否 |
|
| JSONObject | 否 | 附加选项: |
| List<Message> | 否 | 补充指令;无诉求时不调用 |
返回(VisionResult):本场景无 content,结果经 structured 承载。
字段 | 类型 | 保证级 | 说明 |
| String | 恒有 | 任务回显(与请求 |
| JSONObject | 条件解析 | 按任务的实测形态解析,见下表 |
structured.result 当前版本实际返回形态(基于真机实测):
任务 |
|
|
|
|
|
| IMAGE_CLASSIFICATION | {category, subcategories[ ], confidence} |
返回示例(真机实测):
// FACE_DETECTION
{"task":"FACE_DETECTION","result":{"faces":[
{"boundingBox":{"x":95,"y":0,"width":905,"height":999},"confidence":0.998}
]}}
// OBJECT_DETECTION
{"task":"OBJECT_DETECTION","result":{"objects":[
{"bbox_2d":[28,254,723,894],"category":"laptop"},
{"bbox_2d":[554,454,701,654],"category":"mug"}
]}}
// IMAGE_CLASSIFICATION
{"task":"IMAGE_CLASSIFICATION","result":{
"category":"技术文档",
"subcategories":["人工智能","边缘计算","云原生"],
"confidence":0.95
}}使用须知:
以上形态为当前版本实测参考;服务端正在统一结构化输出,定型后将随版本发布调整,届时以更新后的集成指南为准;
坐标体系:实测坐标取值范围为 0~1000(疑似归一化刻度,非像素坐标),如需叠加绘制请自行标定换算。
消费总结:按上方实测形态表解析 FACE_DETECTION / OBJECT_DETECTION / IMAGE_CLASSIFICATION(当前版本参考)。
4.7.6 asr —— 语音识别(非实时)
接口:UADK.asr(AsrRequest request, UADKCallback<AsrResult> callback)
请求参数(AsrRequest.Builder):
参数 | 类型 | 必填 | 说明 |
| String | 与 | 本地音频路径(须先落盘;白名单 mp3 / wav / m4a / flac / aac / ogg / amr;SDK 自动上传) |
| String | 与 | 已持有的素材 URL |
| String | 否 | 音频格式申报: |
| Integer | 否 | 音频实际采样率(Hz,如 16000) |
| List<String> | 否 | 语种提示(如 |
| List<String> | 否 | 热词(专有名词/术语,提升识别准确率) |
| List<Message> | 否 | 当前无实际语义,不调用 |
返回(AsrResult):
字段 | 类型 | 保证级 | 说明 |
| String | 恒有 | 识别全文(本场景主消费字段) |
| JSONArray | 恒有 | 分句结果,元素结构见下;便捷读取 |
| String | 恒有 | 识别语种代码(如 |
sentences[ ] 元素结构:text(句子文本,恒有)、begin_time(起始毫秒,恒有)、end_time(结束毫秒,恒有)。
4.7.7 tts —— 语音合成(非实时)
接口:UADK.tts(TtsRequest request, UADKCallback<TtsResult> callback)
请求参数(TtsRequest.Builder / TtsRequest.ofText(text)):
参数 | 类型 | 必填 | 说明 |
| List<Message> | 是 | 待合成文本(总长 ≤2000 字符,超限回调 1001);便捷构造见 |
| String | 否 | 音色标识(开放集);无效音色由服务端返回错误 |
| String | 否 |
|
| Integer | 否 | 期望采样率(缺省 22050) |
| Double | 否 | 语速 0.5~2.0(缺省 1.0) |
返回(TtsResult):
字段 | 类型 | 保证级 | 说明 |
| String | 恒有 | OSS 签名音频链接(有效期约 3 天,原样使用即可,无需二次鉴权) |
| audioData
| 恒为 null | 预留字段,本期始终为 null,无需处理 || 恒为 null | 预留字段,本期始终为 null,无需处理 |
| structured.duration_ms | Long | 恒有 | 音频时长(毫秒);便捷读取 getDurationMs() |
第五章:数据模型参考
ChatRequest
字段 | 类型 | 默认值 | 说明 |
model | String |
| 模型名称(非法值由服务端返回错误) |
messages | List<Message> | — | 消息列表(必填) |
sessionId | String | null | 会话 ID(续轮对话时传入首轮返回值) |
enableThinking | boolean | false | 是否开启深度思考模式 |
loadHistory | boolean | true | 是否由服务端拼接历史消息 |
imageParams | ImageParams | null | 文生图参数(仅 image_generation 模型生效) |
Message
字段 | 类型 | 说明 |
role | String | 消息角色( |
content | String | 文本内容 |
构造:new Message(role, content) / Message.ofUser(content)(后者构造用户消息,场景化调用推荐)。
ImageParams
字段 | 类型 | 默认值 | 说明 |
size | String |
| 图片尺寸 |
quality | String |
| 图片质量( |
n | int | 1 | 生成数量(1~4) |
ChatResponse
字段 | 类型 | 说明 |
traceId | String | 本次请求的链路追踪号(可能为 null) |
meta | MetaInfo | 会话元信息 |
content | String | 完整回答文本(文生图时为 Markdown 图链) |
reasoning | String | 思考过程全文(可能为 null) |
usage | UsageInfo | 用量与计费信息 |
rawJson | String | 服务端原始 JSON 字符串 |
MetaInfo
字段 | 类型 | 说明 |
event | String | 事件类型(固定 |
requestId | String | 请求 ID |
sessionId | String | 会话 ID( |
requestedModel | String | 请求使用的模型名 |
actualModel | String | 实际调用的模型名 |
actualUpstreamModel | String | 实际上游调用的模型名 |
isRouted | int | 是否经过路由(1=是,0=否) |
routeLevel | String | 路由级别(仅 auto 路由时有值) |
routeScore | int | 路由评分 |
routeReason | String | 路由原因 |
routerVersion | String | 路由器版本 |
traceId | String | 本次请求的链路追踪号(缺失时为空串) |
rawJson | String | 服务端原始 JSON 字符串 |
DeltaEvent
字段 | 类型 | 说明 |
type | String | 增量类型 |
delta | String | 增量文本内容 |
rawJson | String | 服务端原始 JSON 字符串 |
类型常量:
常量 | 值 | 说明 |
|
| 正文增量(文生图图链也以此类型返回) |
|
| 思考增量 |
UsageInfo
字段 | 类型 | 说明 |
event | String | 事件类型(固定 |
requestId | String | 请求 ID |
finishReason | String | 结束原因(如 |
inputTokens | long | 输入 token 数 |
outputTokens | long | 输出 token 数 |
totalTokens | long | 总 token 数 |
thinkingTokens | long | 思考 token 数 |
cachedTokens | long | 缓存 token 数 |
costCredits | long | 消耗算力点 |
credits | double | 消耗金额 |
pricingTier | String | 定价档位 |
durationMs | long | 请求耗时(毫秒) |
rawJson | String | 服务端原始 JSON 字符串 |
ModelInfo
字段 | 类型 | 说明 |
displayName | String | 对外展示名(即请求时 model 取值) |
actualName | String | 实际上游调用名 |
tier | String | 模型档位(AUTO / FLAGSHIP / BALANCED / LITE) |
supportsThinking | boolean | 是否支持深度思考 |
supportsImage | boolean | 是否支持图片输入 |
modelType | String | 模型类型( |
description | String | 中文描述 |
UADKError
字段 | 类型 | 说明 |
sCode | long | 服务端九位错误码;本地/网络错误时为 0 |
code | int | 分类错误码(服务端 -1~-6,本地 1001~1006) |
message | String | 可展示错误消息 |
source | Source | 错误来源枚举 |
cause | Throwable | 原始异常(可能为 null) |
traceId | String | 服务端链路追踪 ID(本地/网络错误为 null,展示需判空) |
三个 ID 的语义分工
响应中可能出现三个不同层级的 ID,用途各不相同:
ID | 粒度 | 生成方 | 用途 |
| 多轮会话( | 服务端(新会话时生成) | 上下文/历史串联;由接入方从 |
| 单次请求 | 服务端 | 业务单据号:计费、对账、历史回溯 |
| 单次请求 | 服务端 | 全链路排查号(可提供给友盟技术支持用于服务端链路检索) |
requestId 与 traceId 一次请求内同时返回:前者是业务单据号,后者是链路排查号。
第六章:错误处理
6.1 UADKError 结构说明
所有错误路径统一收敛为 UADKError 对象,包含六个核心字段:
sCode:服务端九位错误码(本地/网络错误时为 0)
code:分类错误码
message:可直接展示的错误描述
source:错误来源枚举
cause:原始异常引用(可选)
traceId:服务端链路追踪 ID(本地/网络错误为 null)
6.2 Source 枚举含义
枚举值 | 含义 | 典型场景 |
| 本地校验错误 | 参数非法、SDK 未初始化、SDK 已禁用 |
| 网络传输层错误 | DNS 解析失败、连接超时、IO 异常 |
| 网关业务错误 | 服务端返回业务失败(success=false) |
| SSE error 事件 | 流式传输中服务端推送 error 事件 |
| 凭证异常 | 凭证获取或刷新失败 |
6.3 本地错误码
错误码 | 常量 | 说明 | 处理建议 |
1001 | ERROR_CODE_PARAM | 参数错误 | 检查 messages / 媒体路径等参数是否正确传入,请求的任务是否在上述支持的任务列表中 |
1002 | ERROR_CODE_NOT_INITIALIZED | SDK 未初始化 | 确保 prepare 成功后再调用业务接口 |
1003 | ERROR_CODE_DISABLED | SDK 已禁用 | 服务端配置已关闭,联系管理员 |
1004 | ERROR_CODE_NETWORK | 网络错误 | 检查网络连接,适当重试 |
1005 | ERROR_CODE_CREDENTIAL | 凭证刷新失败 | 检查 appKey 有效性或网络状态 |
1006 | ERROR_CODE_DEVICE_CAPABILITY_UNAVAILABLE | 设备能力不可用(1.1.0 新增) | Android 恒为云端执行,常规情况下不会遇到;如遇到请联系友盟技术支持 |
6.4 错误处理示例
@Override
public void onError(UADKError error) {
switch (error.getSource()) {
case LOCAL:
// 本地校验不通过,检查调用时机和参数
break;
case NETWORK:
// 网络异常,提示用户检查网络
break;
case GATEWAY:
// 服务端业务错误,可通过 sCode 获取详细错误码
long serverCode = error.getSCode();
break;
case SSE:
// SSE 流中断错误
break;
case CREDENTIAL:
// 凭证问题,可能需要重新初始化
break;
}
Log.e("UADK", error.toString());
}第七章:混淆配置
7.1 ADK SDK 内置规则
ADK 产物(Maven 制品 / 本地 AAR)自带 consumer-rules.pro,在接入方 App 开启混淆时自动生效:
# U-ADK consumer 混淆规则(随产物下发,在接入方 App 混淆时生效)
#
# 保证接入方开启混淆后,SDK 对外公开 API 不被移除或改名。
- keep public class com.umeng.adk.* {
public *;
}7.2 OkHttp 混淆规则
OkHttp 3.12.13 自带混淆规则,正常情况下无需额外配置。若遇到问题可补充:
-dontwarn okhttp3.**
-dontwarn okio.**
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
7.3 完整 keep 规则参考
如果上述自动规则不生效(如自定义混淆工具链),可在 proguard-rules.pro 中手动添加:
# U-ADK SDK 公开 API
- keep public class com.umeng.adk.* {
public *;
}
# OkHttp
-dontwarn okhttp3.**
-dontwarn okio.**
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
# 友盟
-keep class com.umeng.** { *; }
-keep class org.repackage.** { *; }
第八章:注意事项
回调线程:所有回调(
InitCallback/ChatCallback/StreamCallback/ModelsCallback)均在后台线程触发,UI 操作必须通过runOnUiThread()或Handler切换至主线程。线程安全:
UADK所有公开静态方法均为线程安全,可在任意线程调用。初始化可重复调用:
UADK.prepare()多次调用安全(已就绪状态下直接回调 onSuccess),无副作用。sessionId 管理:会话 ID 由接入方自行保存和传递。首轮对话不传 sessionId,从
MetaInfo.getSessionId()获取后,后续轮次通过ChatRequest.Builder.sessionId()传入。model 取值:非法模型名由服务端返回错误。推荐使用
listModels获取可用模型的displayName。状态查询:调用业务接口前可通过
UADK.isReady()判断 SDK 是否就绪,避免不必要的错误回调。loadHistory 默认行为:
ChatRequest.Builder中loadHistory默认为true,即服务端会自动拼接同一 session 下的历史消息。若需客户端自行管理上下文,设置为false。enableThinking 兼容性:深度思考模式需模型支持(通过
ModelInfo.isSupportsThinking()判断),对不支持的模型设置此参数无效果。文生图使用约束:文生图仅对
modelType为image_generation的模型生效(通过ModelInfo.getModelType()判断),且必须通过流式接口chatStream调用。rawJson 用途:各响应对象中的
rawJson字段保留服务端原始 JSON,便于读取本文档未列出的扩展字段。