Spaces:
Paused
Paused
| # -*- 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()) | |