agentscope-ai/agentscope · error · ValueError

Unsupported source type

Error message

Unsupported source type: {type(source)}

What it means

The Gemini formatter's _format_media_source raises ValueError when a media block's source is neither a URLSource nor a Base64Source (the inline_data branch shown handles base64). Gemini's API accepts either inline base64 data or remote URIs, so other source types (e.g. LocalFileSource) are unsupported here.

Solutions

  1. Convert local files to Base64Source (read bytes, base64-encode, set the correct mime_type)
  2. Use a URLSource with a publicly reachable URL (Google can fetch remote URIs)
  3. Pre-validate source types before calling format() and fall back to a textual representation for unsupported ones

Example fix

# before
block = ImageBlock(source=LocalFileSource(path="pic.png"), alt="pic")

# after
import base64
block = ImageBlock(source=Base64Source(data=base64.b64encode(open("pic.png","rb").read()).decode(), media_type="image/png"), alt="pic")
Defensive patterns

Strategy: type-guard

Validate before calling

from agentscope.message import URLSource, Base64Source
assert isinstance(block.source, (URLSource, Base64Source))

Type guard

def is_gemini_media_source(src) -> bool:
    return isinstance(src, (URLSource, Base64Source))

Try / catch

try:
    formatted = formatter.format(msgs)
except ValueError as e:
    if "Unsupported source type" in str(e):
        # drop the media block or convert local file to Base64Source, retry
        ...
    raise

Prevention

When it happens

Trigger: Formatting a Msg containing an ImageBlock/VideoBlock/AudioBlock whose source is a LocalFileSource or a raw path string/bytes with a GeminiChatFormatter.

Common situations: Pointing blocks at local files and expecting the Gemini formatter to upload them; reusing message pipelines built for OpenAI/Ollama formatters that handle local files; passing file-like objects as sources.

Related errors


AI-assisted analysis of agentscope-ai/agentscope@e90f1c7592 (2026-08-28). Data as JSON: /api/errors/ddf6b029d9238377. Report an issue: GitHub.

Appendix: source

Thrown at src/agentscope/formatter/_gemini_formatter.py:108

                return {
                    "inline_data": {
                        "data": data,
                        "mime_type": source.media_type,
                    },
                }
            else:
                # Remote URL - download and convert to base64
                response = requests.get(url, timeout=30)
                response.raise_for_status()
                data = base64.b64encode(response.content).decode("utf-8")
                return {
                    "inline_data": {
                        "data": data,
                        "mime_type": source.media_type,
                    },
                }
        else:
            raise ValueError(f"Unsupported source type: {type(source)}")


class GeminiChatFormatter(_GeminiFormatterBase):
    """The Gemini formatter class for chatbot scenario, where only a user
    and an agent are involved. We use the `role` field to identify different
    entities in the conversation.
    """

    input_types: list[str] = Field(
        default_factory=lambda: [
            "text/plain",
            "image/*",
            "audio/*",
            "video/*",
            "application/pdf",
        ],
        description=(
            'The supported input types. Defaults to ``["text/plain", '

View on GitHub (pinned to e90f1c7592)