跳转到主要内容
PRODUCT DOCUMENTS

快速找到所需文档,高效完成接入与排障

浏览产品文档与友盟 Skill,展开目录并阅读正文。

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 配置自动就绪,无需其他调用):

方法

说明

UADK.prepare(InitCallback)

异步执行初始化,完成后通过回调通知结果;可重复调用(仅首次生效),失败后可重试

完整示例:

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):

参数

类型

必填

说明

model

String

否

模型名称(缺省 "auto" 自动路由);非法值由服务端返回错误;取值建议经 listModels 的 displayName 获取

messages

List<Message>

是

对话消息列表;元素含 role("user"/"assistant"/"system")与 content(纯文本)

sessionId

String

否

会话 ID(sess- 前缀);多轮会话续轮时传入首轮返回的值(见 4.5)

enableThinking

boolean

否

是否开启深度思考(缺省 false;需模型 supportsThinking 支持)

loadHistory

boolean

否

是否由服务端拼接同会话历史(缺省 true;客户端自管上下文时传 false)

imageParams

ImageParams

否

文生图参数(仅 image_generation 模型生效;须走流式接口,见 4.3)

返回(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 四方法):

回调

参数类型

触发时机与说明

onMeta

MetaInfo

首事件,至多一次;含 sessionId(多轮会话需保存)、actualModel、traceId 等(字段详见第五章)

onDelta

DeltaEvent

零到多次,后台线程按序触发;getType() 区分 TYPE_CONTENT(正文增量)/ TYPE_REASONING(思考增量),getDelta() 为增量文本

onDone

UsageInfo

至多一次,与 onError 互斥;流式完成,携带用量计费信息

onError

UADKError

至多一次,与 onDone 互斥;终态后不再触发任何回调

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 子参数如下:

参数

类型

必填

说明

size

String

否

图片尺寸(缺省 "1024x1024")

quality

String

否

图片质量:"low" / "medium" / "high"(缺省 "low")

n

int

否

生成数量 1~4(缺省 1;越界回退 1)

返回:图链经 onDelta 以 type=content 整段 Markdown 一次性下发(形如 ![生成图片1](<oss-url>))。

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 格式: ![描述](图片URL)
            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>):

字段

类型

说明

displayName

String

对外展示名(即请求时 model 的取值域)

actualName

String

实际上游模型名

tier

String

模型档位(AUTO / FLAGSHIP / BALANCED / LITE)

supportsThinking

boolean

是否支持深度思考

supportsImage

boolean

是否支持图片输入

modelType

String

模型类型(chat / image_generation)

description

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 必填性

文本生成

UADK.text(TextRequest, UADKCallback<TextResult>)

必填

结构化抽取

UADK.nlp(NlpRequest, UADKCallback<NlpResult>)

必填

翻译

UADK.translate(TranslateRequest, UADKCallback<TranslateResult>)

必填(targetLang 亦必填)

OCR

UADK.ocr(OcrRequest, UADKCallback<OcrResult>)

可选

视觉理解

UADK.vision(VisionRequest, UADKCallback<VisionResult>)

无(仅图像输入)

语音识别

UADK.asr(AsrRequest, UADKCallback<AsrResult>)

可选

语音合成

UADK.tts(TtsRequest, UADKCallback<TtsResult>)

必填(待合成文本 ≤2000 字符)

统一结果字段:七场景结果均继承 ScenarioResult 基类,公共字段:

字段

类型

说明

executedBy

ExecutedBy

执行层标注,成功回调时读取;Android 恒为 ExecutedBy.CLOUD(云端执行)

usage

UsageInfo

用量信息(tokens 等);tts 的 characters 经 rawJson 兜底(UsageInfo 零扩展)

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)。

便捷入口——常用参数组合的简化构造:

入口

用途

Message.ofUser(content)

构造用户消息(场景化调用推荐使用)

TextRequest.ofText(text, task)

text 纯文本入口(prompt/maxLength/style/language 等可选参数需 Builder)

NlpRequest.ofText(text, tasks)

nlp 纯文本入口(language 需 Builder)

TranslateRequest.ofText(text, targetLang)

translate 纯文本入口(sourceLang/domain 需 Builder)

TtsRequest.ofText(text)

tts 纯文本入口(voice/format/sampleRate/speed 需 Builder)

media 三场景(ocr/vision/asr)

Builder 不调用 .messages() 即等效"无 messages"形态(补充指令无诉求时无需传参)

⚠️ 当前版本限制: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 基类,携带以下公共字段:

字段

类型

保证级

说明

executedBy

ExecutedBy 枚举

恒有

本次结果的执行层;Android 本期恒为 ExecutedBy.CLOUD(云端执行)

usage / meta / traceId / rawJson

对象

恒有

消耗信息 / 模型信息 / 链路追踪 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)):

参数

类型

必填

说明

messages

List<Message>

是

待处理文本;便捷构造见 ofText

task

String

是

TextTask.GENERATE / SUMMARIZE / REWRITE

prompt

String

否

生成指令(task=GENERATE 时用)

maxLength

Integer

否

结果长度上限

style

String

否

摘要:TextStyle.CONCISE/DETAILED/BULLET_POINTS;改写:FORMAL/CASUAL/PROFESSIONAL/CREATIVE;GENERATE 时须为空(组合违例回调 1001)

language

String

否

语言(开放集,如 "zh")

返回(TextResult):

字段

类型

保证级

说明

content

String

恒有

生成/摘要/改写结果文本(本场景唯一消费字段)

structured

JSONObject

勿解析

可能为空,不消费

4.7.2 nlp —— 分词 / NER / 关键词抽取

接口:UADK.nlp(NlpRequest request, UADKCallback<NlpResult> callback)

请求参数(NlpRequest.Builder / NlpRequest.ofText(text, tasks)):

参数

类型

必填

说明

messages

List<Message>

是

待分析文本;便捷构造见 ofText

tasks

List<String>

是(可多选)

NlpTask.TOKENIZATION / NER / KEYWORD_EXTRACTION,多选任务全部执行并合并返回

language

String

否

语言(开放集)

返回(NlpResult):本场景无 content,结果全部经 structured 承载。

structured 字段表:

字段

类型

存在条件

说明

structured.tokens

JSONArray

请求含 TOKENIZATION 时恒有

分词结果,元素结构见下表;便捷读取 getTokens()(缺失返回 null)

structured.entities

JSONArray

请求含 NER 时恒有

命名实体,元素结构见下表;便捷读取 getEntities()(缺失返回 null)

structured.keywords

JSONArray

请求含 KEYWORD_EXTRACTION 时恒有

关键词,元素结构见下表;便捷读取 getKeywords()(缺失返回 null)

tokens[ ] 元素结构:

键

类型

保证级

说明

text

String

恒有

词语原文

startOffset

int

恒有

词语在原文中的起始字符偏移(含)

endOffset

int

恒有

词语在原文中的结束字符偏移(不含)

partOfSpeech

String

恒有

词性代码(如 NR=专有名词、NN=名词、VV=动词)。仅可用于展示,勿在业务逻辑中硬编码判断具体取值(代码集随模型可能扩展)

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)):

参数

类型

必填

说明

messages

List<Message>

是

待翻译文本;便捷构造见 ofText

targetLang

String

是(缺失回调 1001)

目标语言(开放集,如 "en")

sourceLang

String

否

源语言;不填或 "auto" 自动检测

domain

String

否

TranslateDomain.GENERAL / TECHNICAL / CASUAL

返回(TranslateResult):

字段

类型

保证级

说明

content

String

恒有

译文(本场景主消费字段)

structured.detectedLang

String

条件存在

自动检测出的源语言代码(如 "zh");仅当请求未指定 sourceLang 或指定为 "auto" 时返回;便捷读取 getDetectedLang()

4.7.4 ocr —— 文字识别

接口:UADK.ocr(OcrRequest request, UADKCallback<OcrResult> callback)

请求参数(OcrRequest.Builder):

参数

类型

必填

说明

imageFile

String

与 imageUrl 二选一(互斥,违例回调 1001)

本地图片路径(须先落盘;白名单 png / jpg / jpeg;SDK 自动上传)

imageUrl

String

与 imageFile 二选一

已持有的素材 URL

task

String

否

OcrTask.GENERAL / DOCUMENT / TABLE / CARD

languageHints

List<String>

否

语言提示(如 ["zh"])

messages

List<Message>

否

补充指令;无诉求时不调用 .messages() 即可

返回(OcrResult):

字段

类型

保证级

说明

content

String

恒有

识别全文

structured

JSONObject

勿解析

为 {task, result} 结构,但 result 内部子结构当前版本未定型(服务端统一中),请勿解析其内部子键。TABLE / CARD 任务的表格 / 卡证结构化将在服务端定型后随版本发布提供

消费总结:读取 content(识别全文,恒有)即完成本场景消费。

4.7.5 vision —— 视觉理解

接口:UADK.vision(VisionRequest request, UADKCallback<VisionResult> callback)

请求参数(VisionRequest.Builder):

参数

类型

必填

说明

imageFile

String

与 imageUrl 二选一(互斥,违例回调 1001)

本地图片路径(须先落盘;白名单 png / jpg / jpeg;SDK 自动上传)

imageUrl

String

与 imageFile 二选一

已持有的素材 URL

task

String

否

VisionTask.FACE_DETECTION / OBJECT_DETECTION / IMAGE_CLASSIFICATION。本版本未提供的任务经回调返回错误码 1001(不发起网络请求)

options

JSONObject

否

附加选项:maxFaces(整数)、confidenceThreshold(0~1 浮点)

messages

List<Message>

否

补充指令;无诉求时不调用 .messages() 即可

返回(VisionResult):本场景无 content,结果经 structured 承载。

字段

类型

保证级

说明

structured.task

String

恒有

任务回显(与请求 task 一致);便捷读取 getTask()

structured.result

JSONObject

条件解析

按任务的实测形态解析,见下表

structured.result 当前版本实际返回形态(基于真机实测):

任务

structured.result 实测形态

FACE_DETECTION

faces 数组,元素 {boundingBox:{x,y,width,height}, confidence}

OBJECT_DETECTION

objects 数组,元素 {bbox_2d:[x1,y1,x2,y2], category}(两点式:左上、右下)

| 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):

参数

类型

必填

说明

audioFile

String

与 audioUrl 二选一(互斥,违例回调 1001)

本地音频路径(须先落盘;白名单 mp3 / wav / m4a / flac / aac / ogg / amr;SDK 自动上传)

audioUrl

String

与 audioFile 二选一

已持有的素材 URL

audioFormat

String

否

音频格式申报:wav/mp3/m4a/flac/aac/ogg/amr(建议与文件实际格式一致)

sampleRate

Integer

否

音频实际采样率(Hz,如 16000)

languageHints

List<String>

否

语种提示(如 ["zh-CN"])

hotwords

List<String>

否

热词(专有名词/术语,提升识别准确率)

messages

List<Message>

否

当前无实际语义,不调用 .messages() 即可

返回(AsrResult):

字段

类型

保证级

说明

content

String

恒有

识别全文(本场景主消费字段)

structured.sentences

JSONArray

恒有

分句结果,元素结构见下;便捷读取 getSentences()

structured.language

String

恒有

识别语种代码(如 "zh");便捷读取 getLanguage()

sentences[ ] 元素结构:text(句子文本,恒有)、begin_time(起始毫秒,恒有)、end_time(结束毫秒,恒有)。

4.7.7 tts —— 语音合成(非实时)

接口:UADK.tts(TtsRequest request, UADKCallback<TtsResult> callback)

请求参数(TtsRequest.Builder / TtsRequest.ofText(text)):

参数

类型

必填

说明

messages

List<Message>

是

待合成文本(总长 ≤2000 字符,超限回调 1001);便捷构造见 ofText

voice

String

否

音色标识(开放集);无效音色由服务端返回错误

format

String

否

TtsFormat.MP3("mp3")/ WAV("wav")/ PCM("pcm")

sampleRate

Integer

否

期望采样率(缺省 22050)

speed

Double

否

语速 0.5~2.0(缺省 1.0)

返回(TtsResult):

字段

类型

保证级

说明

audioUrl

String

恒有

OSS 签名音频链接(有效期约 3 天,原样使用即可,无需二次鉴权)

| audioData

| 恒为 null | 预留字段,本期始终为 null,无需处理 || 恒为 null | 预留字段,本期始终为 null,无需处理 |

| structured.duration_ms | Long | 恒有 | 音频时长(毫秒);便捷读取 getDurationMs() |


第五章:数据模型参考

ChatRequest

字段

类型

默认值

说明

model

String

"auto"

模型名称(非法值由服务端返回错误)

messages

List<Message>

—

消息列表(必填)

sessionId

String

null

会话 ID(续轮对话时传入首轮返回值)

enableThinking

boolean

false

是否开启深度思考模式

loadHistory

boolean

true

是否由服务端拼接历史消息

imageParams

ImageParams

null

文生图参数(仅 image_generation 模型生效)

Message

字段

类型

说明

role

String

消息角色("user" / "assistant" / "system")

content

String

文本内容

构造:new Message(role, content) / Message.ofUser(content)(后者构造用户消息,场景化调用推荐)。

ImageParams

字段

类型

默认值

说明

size

String

"1024x1024"

图片尺寸

quality

String

"low"

图片质量(low / medium / high)

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

事件类型(固定 "start")

requestId

String

请求 ID

sessionId

String

会话 ID(sess- 前缀)

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 字符串

类型常量:

常量

值

说明

DeltaEvent.TYPE_CONTENT

"content"

正文增量(文生图图链也以此类型返回)

DeltaEvent.TYPE_REASONING

"reasoning"

思考增量

UsageInfo

字段

类型

说明

event

String

事件类型(固定 "done")

requestId

String

请求 ID

finishReason

String

结束原因(如 "stop")

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

模型类型(chat / image_generation)

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

粒度

生成方

用途

sessionId

多轮会话(sess- 前缀)

服务端(新会话时生成)

上下文/历史串联;由接入方从 MetaInfo.sessionId 取出保存并在续轮时传入

requestId

单次请求

服务端

业务单据号:计费、对账、历史回溯

traceId

单次请求

服务端

全链路排查号(可提供给友盟技术支持用于服务端链路检索)

requestId 与 traceId 一次请求内同时返回:前者是业务单据号,后者是链路排查号。


第六章:错误处理

6.1 UADKError 结构说明

所有错误路径统一收敛为 UADKError 对象,包含六个核心字段:

  • sCode:服务端九位错误码(本地/网络错误时为 0)

  • code:分类错误码

  • message:可直接展示的错误描述

  • source:错误来源枚举

  • cause:原始异常引用(可选)

  • traceId:服务端链路追踪 ID(本地/网络错误为 null)

6.2 Source 枚举含义

枚举值

含义

典型场景

LOCAL

本地校验错误

参数非法、SDK 未初始化、SDK 已禁用

NETWORK

网络传输层错误

DNS 解析失败、连接超时、IO 异常

GATEWAY

网关业务错误

服务端返回业务失败(success=false)

SSE

SSE error 事件

流式传输中服务端推送 error 事件

CREDENTIAL

凭证异常

凭证获取或刷新失败

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.** { *; }

第八章:注意事项

  1. 回调线程:所有回调(InitCallback / ChatCallback / StreamCallback / ModelsCallback)均在后台线程触发,UI 操作必须通过 runOnUiThread() 或 Handler 切换至主线程。

  2. 线程安全:UADK 所有公开静态方法均为线程安全,可在任意线程调用。

  3. 初始化可重复调用:UADK.prepare() 多次调用安全(已就绪状态下直接回调 onSuccess),无副作用。

  4. sessionId 管理:会话 ID 由接入方自行保存和传递。首轮对话不传 sessionId,从 MetaInfo.getSessionId() 获取后,后续轮次通过 ChatRequest.Builder.sessionId() 传入。

  5. model 取值:非法模型名由服务端返回错误。推荐使用 listModels 获取可用模型的 displayName。

  6. 状态查询:调用业务接口前可通过 UADK.isReady() 判断 SDK 是否就绪,避免不必要的错误回调。

  7. loadHistory 默认行为:ChatRequest.Builder 中 loadHistory 默认为 true,即服务端会自动拼接同一 session 下的历史消息。若需客户端自行管理上下文,设置为 false。

  8. enableThinking 兼容性:深度思考模式需模型支持(通过 ModelInfo.isSupportsThinking() 判断),对不支持的模型设置此参数无效果。

  9. 文生图使用约束:文生图仅对 modelType 为 image_generation 的模型生效(通过 ModelInfo.getModelType() 判断),且必须通过流式接口 chatStream 调用。

  10. rawJson 用途:各响应对象中的 rawJson 字段保留服务端原始 JSON,便于读取本文档未列出的扩展字段。