来源:互联网 更新时间:2026-07-15 21:30
在 AgentScope 2.0.0 中,1.x 版本的
ImageBlock、AudioBlock、VideoBlock已被统一替换为DataBlock。新的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。
下表列出了 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(...) 方式) |
该示例演示如何使用
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 ja va.nio.file.Files;
import ja va.util.Base64;
import ja va.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. 创建多模态用户消息,包含文本和图片块
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());
}
}
DataBlock(位于 io.agentscope.core.message 包中)的核心字段如下:
| 字段 | 类型 | 说明 |
|---|---|---|
source | Source | 数据来源,此为必填项 |
mediaType | String | MIME 类型(例如 image/png、audio/mp3、video/mp4、application/pdf) |
name | String | 可选的文件名 |
metadata | Map | 业务方附加的元信息 |
Source 有两种实现:
Base64SourceURLSource音频和视频的 DataBlock 构造方式与图片完全一样,只需更改 mediaType 字段即可。然而,相同的代码在处理图片时能成功运行,但在处理音频和视频时可能会遇到限制。这是因为限制并非来自 DashScope 本身,而是来自 AgentScope 内置的 ChatModel。无论是 OpenAIChatModel 还是 DashScopeChatModel,其底层都通过 REST HTTP 协议发送请求。HTTP 请求体的多模态字段目前只支持 image_url 这一种格式,无法插入 input_audio 和视频帧。
DashScope 本身是能够处理音频的,但需要通过不同的协议通道:
这两种方式虽然可行,但都不在 AgentScope 的 ChatModel 覆盖范围内。如需使用,可以参考第 20 章 TTS 的做法:自行使用 @Tool 包装 DashScope SDK,让 AgentScope 只负责调用工具,而不在框架层处理音频字节。
本章示例将聚焦于图片处理,因为图片是 REST 端点唯一稳定支持的多模态输入,也是绝大多数业务中最常用的多模态场景。
业务方工具可以返回 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,无需手动构造。
ImageBlock、AudioBlock 和 VideoBlock 在 2.0 版本中仍然存在,但已被标记为 @Deprecated:
// 1.x 老代码仍然可以运行
import io.agentscope.core.message.ImageBlock;
ImageBlock oldStyle = new ImageBlock(b64, "image/png"); // 2.0 编译时会显示警告
ImageBlock 内部实际上就是对 DataBlock.builder().mediaType("image/...") 的封装。建议新代码统一使用 DataBlock;对于旧代码,迁移的成本也很低(几乎是 1 行代码替换为 1 行代码)。
小提示:在过渡期间,可以暂时保留旧代码,但应规划逐步迁移到 DataBlock,以享受更统一和未来的 API 支持。
该示例演示如何在一條消息中同时包含两种来源的图片:本地文件使用
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 实时协议。
| 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") (需补充 source) |
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 字段进行区分 |
DataBlock 统一处理图片、音频、视频和文件等多种数据类型。ImageBlock、AudioBlock 和 VideoBlock 虽然仍兼容,但已被弃用,建议优先使用 DataBlock。DataBlock,LLM 会自动将其纳入上下文,简化了多模态工具结果的传递。DataBlock 的 mediaType 字段决定了 LLM 端点的路由(视觉、音频或视频模型),正确设置至关重要。黄金价格不断创新高!黄金稳定币XAU、PAXG市值达11亿美元
新浪机器学习热点小时报丨2026年07月25日18时_今日实时机器学习热点速递
CC币价格预测(2026-2035):Canton币今日价格走势+长期价格预测
新浪互联网热点小时报丨2026年07月26日16时_今日实时互联网热点速递
腾讯ima怎么创建共享知识库?
今日比特币暴涨分析:Metaplanet的比特币BTC投资推动股价上涨17%
腾讯ima怎么把微信内容一键导入知识库?
蚂蚁庄园今日答案7月21日(今日已更新) 蚂蚁庄园今天正确答案是什么呢
2026热门直线加速赛车手游推荐:高人气、爽快加速体验的精品榜单
Intel喜讯连连:18A工艺良率提升到85%、CPU将涨价15%
Windy卫星云图怎么看?云层变化识别技巧
kimi提示词专家使用方法新手指南
新浪人工智能热点小时报丨2026年07月30日18时_今日实时人工智能热点速递
原神霜月三处月灵龛具体位置汇总
《幻兽帕鲁》不触发通缉捕捉传说商人方法
短剧《史上最强洪荒修为》剧情介绍
9条破亿视频,新号涨粉百万,过去半年谁在制造AI爆款?
为什么推特KOL都在BRC20赚钱 我一冲就亏?
抖音怎么取消申请退货退款?抖音上取消退货怎么操作
炼金工房新作或能吃成“良子” 想让女主越吃越丰满
手机号码测吉凶
本站所有软件,都由网友上传,如有侵犯你的版权,请发邮件haolingcc@hotmail.com 联系删除。 版权所有 Copyright@2012-2013 haoling.cc