c3bf08ac8d
K8s Workspace Integration Tests / k8s-workspace-tests (push) Waiting to run
Pre-commit / run (ubuntu-latest) (push) Waiting to run
Python Unittest Coverage / test (macos-15, 3.11) (push) Waiting to run
Python Unittest Coverage / test (ubuntu-latest, 3.11) (push) Waiting to run
Python Unittest Coverage / test (windows-latest, 3.11) (push) Waiting to run
Web UI / check (push) Waiting to run
232 lines
5.8 KiB
Python
232 lines
5.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Example of DashScope model multimodal (vision) calls using DataBlock."""
|
|
import asyncio
|
|
import base64
|
|
import os
|
|
from pathlib import Path
|
|
|
|
from _utils import stream_and_collect
|
|
from agentscope.message import (
|
|
Msg,
|
|
TextBlock,
|
|
DataBlock,
|
|
URLSource,
|
|
Base64Source,
|
|
)
|
|
from agentscope.model import DashScopeChatModel
|
|
from agentscope.credential import DashScopeCredential
|
|
|
|
# A publicly accessible test image
|
|
TEST_IMAGE_URL = (
|
|
"https://help-static-aliyun-doc.aliyuncs.com/file-manage"
|
|
"-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"
|
|
)
|
|
|
|
# A publicly accessible test video
|
|
TEST_VIDEO_URL = (
|
|
"https://help-static-aliyun-doc.aliyuncs.com/file-manage"
|
|
"-files/zh-CN/20241115/cqqkru/1.mp4"
|
|
)
|
|
|
|
# A publicly accessible test audio
|
|
TEST_AUDIO_URL = (
|
|
"https://help-static-aliyun-doc.aliyuncs.com/file-manage"
|
|
"-files/zh-CN/20250211/tixcef/cherry.wav"
|
|
)
|
|
|
|
|
|
async def example_image_url() -> None:
|
|
"""Call qwen3.5-plus with an image URL and ask what is in the image."""
|
|
model = DashScopeChatModel(
|
|
credential=DashScopeCredential(
|
|
api_key=os.environ["DASHSCOPE_API_KEY"],
|
|
),
|
|
model="qwen3.5-plus",
|
|
stream=True,
|
|
context_size=1_000_000,
|
|
parameters=DashScopeChatModel.Parameters(thinking_enable=True),
|
|
)
|
|
|
|
image_block = DataBlock(
|
|
source=URLSource(
|
|
url=TEST_IMAGE_URL,
|
|
media_type="image/jpeg",
|
|
),
|
|
)
|
|
|
|
msgs = [
|
|
Msg(
|
|
name="user",
|
|
content=[
|
|
TextBlock(
|
|
text="What animal is in this image? Describe it briefly.",
|
|
),
|
|
image_block,
|
|
],
|
|
role="user",
|
|
),
|
|
]
|
|
|
|
print("=== Multimodal Call (Image URL) ===")
|
|
await stream_and_collect(await model(msgs))
|
|
|
|
|
|
def _build_model() -> DashScopeChatModel:
|
|
"""Build and return a DashScopeChatModel instance."""
|
|
return DashScopeChatModel(
|
|
credential=DashScopeCredential(
|
|
api_key=os.environ["DASHSCOPE_API_KEY"],
|
|
),
|
|
model="qwen3.5-plus",
|
|
stream=True,
|
|
context_size=1_000_000,
|
|
parameters=DashScopeChatModel.Parameters(thinking_enable=True),
|
|
)
|
|
|
|
|
|
async def example_image_local_path() -> None:
|
|
"""Call qwen3.5-plus with a local image using a ``file://`` URL.
|
|
|
|
The formatter reads the file from disk and converts it to a base64 data
|
|
URI.
|
|
"""
|
|
model = _build_model()
|
|
|
|
abs_path = str(Path(__file__).parent / "test.jpeg")
|
|
image_block = DataBlock(
|
|
source=URLSource(
|
|
url=f"file://{abs_path}",
|
|
media_type="image/jpeg",
|
|
),
|
|
)
|
|
|
|
msgs = [
|
|
Msg(
|
|
name="user",
|
|
content=[
|
|
TextBlock(
|
|
text="What is happening in this image? Describe it "
|
|
"briefly.",
|
|
),
|
|
image_block,
|
|
],
|
|
role="user",
|
|
),
|
|
]
|
|
|
|
print("=== Local Path Call (file://) ===")
|
|
await stream_and_collect(await model(msgs))
|
|
|
|
|
|
async def example_image_base64() -> None:
|
|
"""Call qwen3.5-plus with a local image using explicit base64 encoding.
|
|
|
|
Use ``Base64Source`` when you already have the binary data in memory or
|
|
want full control over the encoding step.
|
|
"""
|
|
model = _build_model()
|
|
|
|
with open(Path(__file__).parent / "test.jpeg", "rb") as f:
|
|
data = base64.b64encode(f.read()).decode("utf-8")
|
|
|
|
image_block = DataBlock(
|
|
source=Base64Source(
|
|
data=data,
|
|
media_type="image/jpeg",
|
|
),
|
|
)
|
|
|
|
msgs = [
|
|
Msg(
|
|
name="user",
|
|
content=[
|
|
TextBlock(
|
|
text="What is happening in this image? Describe it "
|
|
"briefly.",
|
|
),
|
|
image_block,
|
|
],
|
|
role="user",
|
|
),
|
|
]
|
|
|
|
print("=== Explicit Base64 Call ===")
|
|
await stream_and_collect(await model(msgs))
|
|
|
|
|
|
async def example_video() -> None:
|
|
"""Call qwen3.5-plus with a video URL and ask what is in the video."""
|
|
model = _build_model()
|
|
|
|
video_block = DataBlock(
|
|
source=URLSource(
|
|
url=TEST_VIDEO_URL,
|
|
media_type="video/mp4",
|
|
),
|
|
)
|
|
|
|
msgs = [
|
|
Msg(
|
|
name="user",
|
|
content=[
|
|
TextBlock(
|
|
text="What is happening in this video? "
|
|
"Describe it briefly.",
|
|
),
|
|
video_block,
|
|
],
|
|
role="user",
|
|
),
|
|
]
|
|
|
|
print("=== Multimodal Call (Video URL) ===")
|
|
await stream_and_collect(await model(msgs))
|
|
|
|
|
|
async def example_audio() -> None:
|
|
"""Call qwen3.5-omni-plus with an audio URL.
|
|
|
|
Audio understanding requires an Omni model (qwen3.5-omni-plus or
|
|
Qwen3-Omni-Flash). Omni models also require stream=True and the
|
|
``modalities`` parameter.
|
|
"""
|
|
model = DashScopeChatModel(
|
|
credential=DashScopeCredential(
|
|
api_key=os.environ["DASHSCOPE_API_KEY"],
|
|
),
|
|
model="qwen3.5-omni-plus",
|
|
stream=True,
|
|
context_size=1_000_000,
|
|
)
|
|
|
|
audio_block = DataBlock(
|
|
source=URLSource(
|
|
url=TEST_AUDIO_URL,
|
|
media_type="audio/wav",
|
|
),
|
|
)
|
|
|
|
msgs = [
|
|
Msg(
|
|
name="user",
|
|
content=[
|
|
TextBlock(text="What is being said in this audio clip?"),
|
|
audio_block,
|
|
],
|
|
role="user",
|
|
),
|
|
]
|
|
|
|
print("=== Multimodal Call (Audio URL - Omni) ===")
|
|
await stream_and_collect(
|
|
await model(msgs, modalities=["text", "audio"]),
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(example_image_url())
|
|
asyncio.run(example_image_local_path())
|
|
asyncio.run(example_image_base64())
|
|
asyncio.run(example_video())
|
|
asyncio.run(example_audio())
|