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

# Multimodal Inputs

> Compare how text, images, files, audio, and documents are represented across the supported APIs.

Multimodal inputs let a model read more than plain text. NagaAI supports images, files, and audio across multiple generation APIs, but each public surface represents those inputs differently.

## Support Matrix

| API                | Images                   | Files / PDFs                | Audio input                              | Notes                                           |
| ------------------ | ------------------------ | --------------------------- | ---------------------------------------- | ----------------------------------------------- |
| `Responses`        | `input_image` parts      | `input_file` parts          | `input_audio` parts                      | Best starting point for new multimodal LLM work |
| `Chat Completions` | `image_url` blocks       | `file` blocks               | `input_audio` blocks on supported models | Use for existing OpenAI-style chat clients      |
| `Messages`         | Anthropic `image` blocks | Anthropic `document` blocks | model- and provider-dependent            | Use for Anthropic-style content-block tooling   |

## Shape At A Glance

<Tree>
  <Tree.Folder name="Responses" defaultOpen>
    <Tree.Folder name="input[]" defaultOpen>
      <Tree.Folder name="message" defaultOpen>
        <Tree.Folder name="content[]" defaultOpen>
          <Tree.File name="input_text" />

          <Tree.File name="input_image" />

          <Tree.File name="input_file" />

          <Tree.File name="input_audio" />
        </Tree.Folder>
      </Tree.Folder>
    </Tree.Folder>
  </Tree.Folder>

  <Tree.Folder name="Chat Completions" defaultOpen>
    <Tree.Folder name="messages[]" defaultOpen>
      <Tree.Folder name="content[]" defaultOpen>
        <Tree.File name="text" />

        <Tree.File name="image_url" />

        <Tree.File name="file" />

        <Tree.File name="input_audio" />
      </Tree.Folder>
    </Tree.Folder>
  </Tree.Folder>

  <Tree.Folder name="Messages" defaultOpen>
    <Tree.Folder name="messages[]" defaultOpen>
      <Tree.Folder name="content[]" defaultOpen>
        <Tree.File name="text" />

        <Tree.File name="image" />

        <Tree.File name="document" />
      </Tree.Folder>
    </Tree.Folder>
  </Tree.Folder>
</Tree>

The main difference is not just which input types are supported, but how each
API nests those inputs inside the request payload.

## When To Use It

* image or PDF analysis inside an LLM workflow
* ask-and-answer over screenshots, receipts, or scanned documents
* audio understanding inside a conversational model flow

## Recommended Example

<CodeGroup>
  ```python Python theme={null}
  from openai import OpenAI

  client = OpenAI(
      base_url="https://api.naga.ac/v1",
      api_key="YOUR_API_KEY",
  )

  response = client.responses.create(
      model="gpt-4.1",
      input=[
          {
              "type": "message",
              "role": "user",
              "content": [
                  {
                      "type": "input_text",
                      "text": "Summarize the key obligations in this policy PDF.",
                  },
                  {
                      "type": "input_file",
                      "filename": "policy.pdf",
                      "file_data": "https://example.com/policy.pdf",
                  },
              ],
          }
      ],
  )

  print(response.output_text)
  ```

  ```javascript Node.js theme={null}
  import OpenAI from 'openai';

  const client = new OpenAI({
    baseURL: 'https://api.naga.ac/v1',
    apiKey: 'YOUR_API_KEY',
  });

  const response = await client.responses.create({
    model: 'gpt-4.1',
    input: [
      {
        type: 'message',
        role: 'user',
        content: [
          {
            type: 'input_text',
            text: 'Summarize the key obligations in this policy PDF.',
          },
          {
            type: 'input_file',
            filename: 'policy.pdf',
            file_data: 'https://example.com/policy.pdf',
          },
        ],
      },
    ],
  });

  console.log(response.output_text);
  ```

  ```bash cURL theme={null}
  curl https://api.naga.ac/v1/responses \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "model": "gpt-4.1",
      "input": [
        {
          "type": "message",
          "role": "user",
          "content": [
            {
              "type": "input_text",
              "text": "Summarize the key obligations in this policy PDF."
            },
            {
              "type": "input_file",
              "filename": "policy.pdf",
              "file_data": "https://example.com/policy.pdf"
            }
          ]
        }
      ]
    }'
  ```
</CodeGroup>

## Important Boundaries

* `Responses` accepts typed multimodal parts, but support still depends on the selected model
* use the direct [Images API](/api/images) for image generation and image edits
* use the direct [Audio API](/api/audio) for transcription, translation, and text-to-speech

## Common Pitfalls

* assuming endpoint support automatically means model support
* using a direct generation API when you actually need multimodal understanding inside an LLM turn
* relying on opaque file references when a page documents inline URLs or data payloads instead

## Related Docs

* [Responses Multimodal Inputs](/api/responses/multimodal-inputs)
* [Chat Completions Multimodal Content](/api/chat-completions/multimodal-content)
* [Messages Documents and PDFs](/api/messages/documents-and-pdfs)
