> ## Documentation Index
> Fetch the complete documentation index at: https://docs.agno.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Multimodal I/O

> Pass images, audio, video, and files to agents.

Agents can process images, audio, video, and files as input and return generated images or audio. Model support varies by modality.

## Media Classes

| Class   | Content Sources                          | Common Metadata                                  |
| ------- | ---------------------------------------- | ------------------------------------------------ |
| `Image` | `url`, `filepath`, `content`             | `format`, `mime_type`, `detail`                  |
| `Audio` | `url`, `filepath`, `content`             | `format`, `mime_type`, `sample_rate`, `channels` |
| `Video` | `url`, `filepath`, `content`             | `format`, `mime_type`, `duration`                |
| `File`  | `url`, `filepath`, `content`, `external` | `filename`, `format`, `mime_type`                |

## Quickstart

<Tabs>
  <Tab title="Input">
    <Tabs>
      <Tab title="Image">
        Pass images via URL, file path, or raw bytes:

        ```python theme={null}
        from agno.agent import Agent
        from agno.media import Image
        from agno.models.openai import OpenAIResponses

        agent = Agent(model=OpenAIResponses(id="gpt-5.2"))

        # From URL
        agent.run(
            "What's in this image?",
            images=[Image(url="https://example.com/photo.jpg")]
        )

        # From file
        agent.run(
            "Describe this image",
            images=[Image(filepath="./photo.jpg")]
        )

        # Multiple images
        agent.run(
            "Compare these two images",
            images=[
                Image(url="https://example.com/photo1.jpg"),
                Image(url="https://example.com/photo2.jpg")
            ]
        )
        ```
      </Tab>

      <Tab title="Audio">
        Pass audio files for transcription or analysis:

        ```python theme={null}
        from agno.agent import Agent
        from agno.media import Audio
        from agno.models.openai import OpenAIChat

        agent = Agent(
            model=OpenAIChat(id="gpt-audio", modalities=["text"])
        )

        # From file
        agent.run(
            "What is being said in this audio?",
            audio=[Audio(filepath="./recording.wav")]
        )

        # From bytes
        with open("recording.wav", "rb") as f:
            audio_bytes = f.read()

        agent.run(
            "Transcribe this audio",
            audio=[Audio(content=audio_bytes, format="wav")]
        )
        ```
      </Tab>

      <Tab title="Video">
        Pass video files for analysis:

        ```python theme={null}
        from agno.agent import Agent
        from agno.media import Video
        from agno.models.google import Gemini

        agent = Agent(model=Gemini(id="gemini-3.5-flash"))

        agent.run(
            "Describe what happens in this video",
            videos=[Video(filepath="./clip.mp4")]
        )
        ```

        <Note>
          Video input is currently supported by Gemini and AWS Bedrock models.
        </Note>
      </Tab>

      <Tab title="File">
        Pass documents like PDFs:

        ```python theme={null}
        from agno.agent import Agent
        from agno.media import File
        from agno.models.anthropic import Claude

        agent = Agent(model=Claude(id="claude-sonnet-4-5"))

        # From URL
        agent.run(
            "Summarize this document",
            files=[File(url="https://example.com/report.pdf")]
        )

        # From file path
        agent.run(
            "What are the key points in this PDF?",
            files=[File(filepath="./report.pdf")]
        )
        ```
      </Tab>
    </Tabs>
  </Tab>

  <Tab title="Output">
    <Tabs>
      <Tab title="Image">
        Generate images with `OpenAITools` and GPT Image 2:

        ```python theme={null}
        import base64

        from agno.agent import Agent
        from agno.models.openai import OpenAIChat
        from agno.tools.openai import OpenAITools
        from agno.utils.media import save_base64_data

        agent = Agent(
            model=OpenAIChat(id="gpt-4o"),
            tools=[OpenAITools(image_model="gpt-image-2")],
        )

        response = agent.run("Generate an image of a sunset over mountains")

        if response.images and response.images[0].content:
            image_base64 = base64.b64encode(
                response.images[0].content
            ).decode("utf-8")
            save_base64_data(
                image_base64,
                "tmp/sunset.png",
            )
        ```
      </Tab>

      <Tab title="Audio">
        Generate audio responses:

        ```python theme={null}
        from agno.agent import Agent
        from agno.models.openai import OpenAIChat
        from agno.utils.audio import write_audio_to_file

        agent = Agent(
            model=OpenAIChat(
                id="gpt-audio",
                modalities=["text", "audio"],
                audio={"voice": "alloy", "format": "wav"},
            ),
        )

        response = agent.run("Tell me a short story")

        # Save audio response
        if response.response_audio:
            write_audio_to_file(
                audio=response.response_audio.content,
                filename="story.wav"
            )
        ```
      </Tab>
    </Tabs>
  </Tab>

  <Tab title="Combined I/O">
    Process audio input and generate audio output:

    ```python theme={null}
    from agno.agent import Agent
    from agno.media import Audio
    from agno.models.openai import OpenAIChat
    from agno.utils.audio import write_audio_to_file

    agent = Agent(
        model=OpenAIChat(
            id="gpt-audio",
            modalities=["text", "audio"],
            audio={"voice": "alloy", "format": "wav"},
        ),
    )

    response = agent.run(
        "Respond to this message",
        audio=[Audio(filepath="./question.wav")]
    )

    if response.response_audio:
        write_audio_to_file(
            audio=response.response_audio.content,
            filename="response.wav"
        )
    ```
  </Tab>
</Tabs>

## Learn More

See [Multimodal](/multimodal/overview) for more examples.
