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

# Multimodal Capabilities

> Send images, PDFs, and audio to Anannas

Anannas supports **multiple input modalities beyond text**, so you can send images, PDFs, and audio files to compatible models through the same `/chat/completions` endpoint.  This enables rich, multimodal interactions with minimal integration overhead.

### Supported Modalities

* **Images** - Send images to vision-enabled models for tasks like analysis, captioning, OCR, and visual Q\&A. Supports: **URL-based images**, **base64-encoded images**\
  [Read More about Image Inputs ->](/Features/Multimodality/Images)

* **PDFs** - Process PDF documents seamlessly. Anannas extracts text and handles both **text-based PDFs** and **scanned files**. Accepted formats: **URL** or **base64-encoded**.\
  [Read More about PDF processing ->](/Features/Multimodality/PDFs)

* **Audio** - Send audio files to models with audio processing capabilities for tasks like transcription, translation, and multimodal analysis. Supports: **base64-encoded audio** (URLs not supported).\
  [Read More about Audio Input ->](/Features/Multimodality/audio)

### Getting Started

All multimodal inputs use `/chat/completions` with the `messages` array.  \
Specify the content type for each input:

1. **Images** -> `image_url`
2. **PDFs** -> `file`
3. **Audio** -> `input_audio`

You can combine multiple inputs in a single request. The maximum number of files depends on the model/provider.

### Model Compatibility

<Card title="Check Multimodal Support" icon="book">
  For models that support images, PDFs, and other modalities, visit [anannas.ai/models](https://anannas.ai/models) to see capabilities by model.
</Card>

1. **Images** -> Supported (URL + base64)
2. **PDFs** -> Supported (URL + base64)
3. **Audio** -> Supported (base64 only)

You can combine multiple modalities in a single request, and the number of files you can send varies by provider and model.

### Input Format Support

**URLs (Recommended for public content)**

1. Images: `https://example.com/image.jpg`
2. PDFs: `https://example.com/document.pdf`
3. Audio: ❌ Not supported (base64 only)

**Base64 Encoding (Required for local/private files)**

1. Images: `data:image/jpeg;base64,{base64_data}`
2. PDFs: `data:application/pdf;base64,{base64_data}`
3. Audio: Base64-encoded with format specification

<Note>
  URLs are preferred for large files since they avoid payload bloat.

  Use base64 encoding when working with local or private files.
</Note>

### FAQs

<AccordionGroup>
  <Accordion title="Can I send both images and PDFs in one request?">
    Yes. You can mix text, images, and PDFs in the same request. The model will process them together.
  </Accordion>

  <Accordion title="What happens if I send audio to a model that doesn't support it?">
    Audio inputs are only processed by models with audio input modality. If you send audio to a model that doesn't support it, the audio will be ignored silently (no error will be thrown).
  </Accordion>

  <Accordion title="Which models support audio?">
    Models with audio input modality support audio processing. Check the [Models page](https://anannas.ai/models) and filter by audio input modality to see which models support audio.
  </Accordion>
</AccordionGroup>

<div
  style={{ 
marginTop: '2rem',
display: 'flex',
alignItems: 'center',
gap: '0.75rem',
fontSize: '14px',
color: '#6b7280'
}}
>
  <span>Was this page helpful?</span>

  <button
    id="feedback-yes-btn"
    onClick={() => {
  console.log('Positive feedback');
  document.getElementById('feedback-yes-btn').style.background = 'rgba(156, 163, 175, 0.1)';
  document.getElementById('feedback-yes-btn').style.backdropFilter = 'blur(10px)';
  document.getElementById('feedback-yes-btn').style.border = '1px solid rgba(156, 163, 175, 0.2)';
  document.getElementById('feedback-no-btn').style.background = 'transparent';
  document.getElementById('feedback-no-btn').style.backdropFilter = 'none';
  document.getElementById('feedback-no-btn').style.border = 'none';
}}
    style={{
  background: 'transparent',
  border: 'none',
  cursor: 'pointer',
  padding: '6px 12px',
  fontSize: '14px',
  borderRadius: '8px',
  transition: 'all 0.2s ease',
  display: 'flex',
  alignItems: 'center',
  gap: '6px',
  color: '#6b7280'
}}
  >
    <span style={{ fontSize: '16px' }}>👍</span>
    Yes
  </button>

  <button
    id="feedback-no-btn"
    onClick={() => {
  console.log('Negative feedback');
  document.getElementById('feedback-no-btn').style.background = 'rgba(156, 163, 175, 0.1)';
  document.getElementById('feedback-no-btn').style.backdropFilter = 'blur(10px)';
  document.getElementById('feedback-no-btn').style.border = '1px solid rgba(156, 163, 175, 0.2)';
  document.getElementById('feedback-yes-btn').style.background = 'transparent';
  document.getElementById('feedback-yes-btn').style.backdropFilter = 'none';
  document.getElementById('feedback-yes-btn').style.border = 'none';
}}
    style={{
  background: 'transparent',
  border: 'none',
  cursor: 'pointer',
  padding: '6px 12px',
  fontSize: '14px',
  borderRadius: '8px',
  transition: 'all 0.2s ease',
  display: 'flex',
  alignItems: 'center',
  gap: '6px',
  color: '#6b7280'
}}
  >
    <span style={{ fontSize: '16px' }}>👎</span>
    No
  </button>
</div>
