【AgentScope Java新手村系列】(19)多模态-图像音频视频

简介: 多模态 — 废弃 ImageBlock/AudioBlock/VideoBlock,统一用 DataBlock + Base64Source 内联或 URLSource 远程引用图片。一条消息可拼多个 Block,REST 端点仅稳定支持图片。

第十九章 多模态:图像、音频、视频——ImageBlock 统一替换为 DataBlock

1.x 的 ImageBlock / AudioBlock / VideoBlock 在 2.0.0中被统一替换为 DataBlock,通过 mediaType 字段区分类型。

旧代码里 new ImageBlock(...) / new AudioBlock(...) 在 2.0 中仍然兼容(标 @Deprecated),但新代码请统一用 DataBlock

本章先给旧 API 对照,再讲 DataBlock 的统一用法。

依赖:多模态模型需通过 OpenAI 兼容端点调用,依赖 agentscope-extensions-model-openai
DashScope 专有协议暂不支持多模态——示例使用 OpenAIChatModel + DashScope 兼容地址
https://dashscope.aliyuncs.com/compatible-mode/v1

19.1 1.x 与 2.0 对照

1.x 2.0
ImageBlock DataBlock.builder().mediaType("image/png")
AudioBlock DataBlock.builder().mediaType("audio/mp3")
VideoBlock DataBlock.builder().mediaType("video/mp4")
Base64Source Base64Source(保留,但走 DataBlock.source(...)
URLSource URLSource(保留,走 DataBlock.source(...)

19.2 第一个多模态消息

这个例子在演示什么?

DataBlock 把一张本地图片(PNG 文件)编码为 Base64,和文本拼成一条多模态消息发给 Agent。Agent 收到的不再是纯文本,而是"文字 + 图片"——它能看到图片内容并给出描述。

import io.agentscope.core.agent.RuntimeContext;
import io.agentscope.core.message.Base64Source;
import io.agentscope.core.message.DataBlock;
import io.agentscope.core.message.TextBlock;
import io.agentscope.core.message.UserMessage;
import io.agentscope.extensions.model.openai.OpenAIChatModel;
import io.agentscope.harness.HarnessAgent;

import java.nio.file.Files;
import java.util.Base64;
import java.util.List;

public class Chapter19_Multimodal {
   

    public static void main(String[] args) throws Exception {
   
        // 1. 读图片并编码 base64
        byte[] bytes = Files.readAllBytes(Path.of("./cat.png"));
        String b64 = Base64.getEncoder().encodeToString(bytes);

        // 2. 构造 DataBlock
        DataBlock imageBlock = DataBlock.builder()
                .source(Base64Source.builder()
                        .data(b64)
                        .mediaType("image/png")
                        .build())
                .build();

        // 3. 多模态 user 消息
        UserMessage msg = new UserMessage(
                "user",
                TextBlock.builder().text("这张图片里有什么?").build(),
                imageBlock);

        // 4. agent 调用
        HarnessAgent agent = HarnessAgent.builder()
                .name("vision_bot")
                .sysPrompt("你是一个视觉助理,详细描述图片。")
                .model(OpenAIChatModel.builder()
                        .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                        .modelName("qwen3-omni-flash")
                        .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                        .stream(true)
                        .formatter(new OpenAIChatFormatter())
                        .build())
                .workspace(Path.of("./workspace"))
                .build();

        System.out.println(agent.call(List.of(msg), RuntimeContext.empty()).block().getTextContent());
    }
}

19.3 DataBlock 字段

DataBlockio.agentscope.core.message)核心字段:

字段 类型 说明
source Source 数据来源,必填
mediaType String MIME 类型(image/png / audio/mp3 / video/mp4 / application/pdf
name String 可选文件名
metadata Map 业务方附加元信息

Source 有两种:

  • Base64Source —— 内联 base64 编码数据
  • URLSource —— 远程 URL,agent 自动下载

19.4 音频 / 视频

视频和音频的 DataBlock 构造和图片一模一样,换个 mediaType 就行。但同样的代码,图片能跑、音频和视频跑不了。

限制不在 DashScope 本身,在 AgentScope 的内置 ChatModel。OpenAIChatModel 也好、DashScopeChatModel 也好,底层全部走 REST HTTP 协议。HTTP 请求体的多模态字段只支持 image_url 这一种格式,input_audio 和视频帧都塞不进去。

DashScope 自己是能处理音频的,只是需要走不同的协议通道:

  • WebSocket 实时流。Qwen-Omni 实时对话、语音识别都是 WebSocket 长连接,双向推流。AgentScope 没有内置 WebSocket 客户端。
  • DashScope 原生 HTTP 多模态格式。ONE-PEACE、Qwen-VL 这些模型支持 HTTP 传入音频 URL,但走的是 DashScope 自有协议,不是 OpenAI 兼容格式。

两条路都能通,但都不在 AgentScope 的 ChatModel 覆盖范围内。想用的话,学第 20 章 TTS 的做法:自己用 @Tool 包装 DashScope SDK,AgentScope 只负责调工具、不在框架层处理音频字节。

本章示例聚焦图片。图片是 REST 端点唯一稳定支持的多模态输入,也是绝大多数业务最常用的多模态场景。

19.5 与 Tool 的协作

业务方工具可以返回 DataBlock —— 适合 OCR / 截图 / 渲染结果:

@Tool(name = "screenshot_page", description = "截图某个 URL")
public DataBlock screenshot(
        @ToolParam(name = "url") String url) throws Exception {
   

    // 调 puppeteer / playwright 拿 png
    byte[] png = playwright.screenshot(url);
    String b64 = Base64.getEncoder().encodeToString(png);

    return DataBlock.builder()
            .source(Base64Source.builder()
                    .data(b64)
                    .mediaType("image/png")
                    .build())
            .name("screenshot.png")    // name 挂在 DataBlock 上,不是 Base64Source
            .build();
}

LLM 看到工具返回 DataBlock 会自动把它纳入上下文——框架内部会把 DataBlock 包装成 ToolResultBlock 再发给 LLM,无需手动构造。

19.6 1.x 旧代码的兼容路径

ImageBlock / AudioBlock / VideoBlock 在 2.0 仍存在(标 @Deprecated):

// 1.x 老代码仍能跑
import io.agentscope.core.message.ImageBlock;

ImageBlock oldStyle = new ImageBlock(b64, "image/png");   // 2.0 编译会出 warning

ImageBlock 内部就是 DataBlock.builder().mediaType("image/...")。建议新代码统一用 DataBlock;老代码改起来很便宜(1 行换 1 行)。

19.7 完整可运行示例

这个例子在演示什么?

一条消息里同时拼了两种来源的图片:本地文件走 Base64Source(内联编码)、远程 URL 走 URLSource(引用地址)。Agent 一次性拿到两张图,可以对比分析。这就是多模态的本质——不限制 Block 数量,需要几个拼几个。

public class Chapter19_FullMultimodal {
   

    public static void main(String[] args) throws Exception {
   
        // 方式一:本地文件 Base64 内联
        DataBlock fromFile = DataBlock.builder()
                .source(Base64Source.builder()
                        .data(Base64.getEncoder().encodeToString(
                                Files.readAllBytes(Path.of("./cat.png"))))
                        .mediaType("image/png")
                        .build())
                .build();

        // 方式二:远程 URL 引用
        DataBlock fromUrl = DataBlock.builder()
                .source(URLSource.builder()
                        .url("https://example.com/dog.jpg")
                        .mimeType("image/jpeg")
                        .build())
                .build();

        UserMessage msg = new UserMessage(
                "user",
                TextBlock.builder().text("对比这两张图片有什么不同。").build(),
                fromFile,
                fromUrl);

        HarnessAgent agent = HarnessAgent.builder()
                .name("multimodal_bot")
                .sysPrompt("你是多模态助理,可以理解图片内容。")
                .model(OpenAIChatModel.builder()
                        .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                        .modelName("qwen3-omni-flash")
                        .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                        .stream(true)
                        .formatter(new OpenAIChatFormatter())
                        .build())
                .workspace(Path.of("./workspace"))
                .build();

        System.out.println(agent.call(List.of(msg), RuntimeContext.empty()).block().getTextContent());
    }
}

音频/视频的 DataBlock 构造方式和图片完全一样,只需改 mediaType。是否能被模型理解取决于模型端点的协议支持——大部分 REST HTTP 端点仅支持图片多模态,音频/视频输入需要 WebSocket 实时协议。

19.8 最小迁移清单(1.x ImageBlock → 2.0 DataBlock)

1.x 用法 2.0 等价
new ImageBlock(b64, "image/png") DataBlock.builder().source(Base64Source.builder().data(b64).mediaType("image/png").build()).build()
new AudioBlock(b64, "audio/mp3") DataBlock.builder().mediaType("audio/mp3")
new VideoBlock(url, "video/mp4") DataBlock.builder().source(URLSource.builder().url(url).mimeType("video/mp4").build())
msg.getContentBlocks(ImageBlock.class) msg.getContentBlocks(DataBlock.class) 后按 mediaType 区分

19.9 本章小结

  • 2.0 用 DataBlock 统一图片 / 音频 / 视频 / 文件。
  • ImageBlock / AudioBlock / VideoBlock 仍兼容但被弃用。
  • 工具可返回 DataBlock —— LLM 自动纳入上下文。
  • mediaType 字段决定 LLM 端路由(视觉 / 音频 / 视频模型)。
目录
相关文章
|
5天前
|
缓存 人工智能 安全
GPT-5.6 Terra与GPT-5.5性能实测:成本减半后的跑分对比与快速迁移指南
GPT-5.6 Terra 的定价为每百万 token 输入 2.50/输出 15。GPT-5.5 则是 5/ 30。Terra 的每一项费率,包括 $0.25/M 的缓存读取,都恰好是 GPT-5.5 的一半,因此在任何工作负载组合下,Terra 都固定 便宜 2.0x。以每天 10 万次请求、3K token 提示词计算,大约是 Terra 每天 2,000,GPT−5.5每天 4,000,即每月约 60,000对 120,000。问题在于:OpenAI 没有发布任何针对 Terra 的编码基准。那个著名的 91.9% Terminal-Bench 数字是 Sol 在 Ul
|
12天前
|
存储 关系型数据库 MySQL
云数据库自研存储引擎:阿里云 PolarDB 相比开源 MySQL 性能提升数倍
云数据库自研存储引擎已成为云原生数据库竞争的核心技术高地。阿里云 PolarDB 通过 X-Engine 高压缩存储、PolarStore 用户态 IO + RDMA、IMCI 列存 HTAP 三大自研引擎组合,配合物理日志、跨节点 Buffer Pool 共享、Parallel Query 五大优化,实现写性能 6 倍、压缩 3-5 倍、AP 加速 100 倍、IO 延迟 -80% 的全面超越,让客户存储成本下降 65%、DBA 人力节省 80%。
453 114
|
5天前
|
人工智能 缓存 JSON
刚刚 GPT-5.6 发布,吊打 Claude 5 和 Grok 4.5?一手实测来啦!
GPT-5.6 刚发布,跑分号称超越 Fable 5,真的假的?附一手实测,让 3 个最强 AI 编程模型 GPT-5.6 Sol、Claude Fable 5、Grok 4.5 在 Cursor 里同时一把梭开发网页游戏,看看最新模型到底谁更能打。
311 0
|
5天前
|
存储 人工智能 JSON
Qwen 本地部署搭配 ComfyUI 生成 AI 漫剧完整实操指南(小白零基础可落地,零成本无限生成+角色一致性天花板)
2026全网最优本地漫剧流水线:零成本、离线运行、角色统一、低配(8G显卡)可跑。融合Qwen本地大模型+ComfyUI双引擎,实现剧本生成→分镜绘图→动态成片全自动,隐私安全、无审核限流,新手30分钟上手,日更无忧。(239字)
|
12天前
|
人工智能 编解码 物联网
2026 最新Stable Diffusion 本地部署教程 下载安装使用详细图解(含官网安装包)
Stable Diffusion(SD)是2022年发布的开源文生图模型,由Stability AI等联合开发。支持文生图、图生图、局部重绘等,依托VAE降低算力需求,可在消费级显卡运行。本文提供秋葉aaaki制作的Windows整合包(含图形界面与插件),开箱即用,零配置启动。
|
28天前
|
Linux 程序员 数据格式
【2026最新】Notepad++下载、安装和使用一篇搞定(附中文版安装包)
Notepad++ 是一款免费开源、轻量高效的 Windows 文本编辑器,支持 C/Python/HTML 等 80+ 语言语法高亮、代码折叠、正则替换、编码转换及插件扩展,专为程序员与文本处理用户打造,完美替代系统记事本。(239字)
|
1天前
|
缓存 UED 开发者
Codex109天重置23次,明天还要再送一次
Codex近109天完成23次额度重置,7月14日将迎来第24次。Tibo高频响应用户反馈:优化GPT-5.6高消耗问题、补发失效福利、调整重置时间——形成“反馈→回应→修复→补偿”正向闭环,彰显以用户为中心的产品哲学。(239字)
415 11

热门文章

最新文章