Conversa

Imagens, PDFs, áudio e vídeo como entrada

Inclua imagens, PDFs, áudio e vídeo numa mensagem para os modelos que os conseguem ler. Envie o próprio ficheiro (base64) ou uma ligação: obtemos os ficheiros através das ligações, pelo que funciona qualquer ligação pública https para um ficheiro até 20 MB.

Resumo

Para enviar/v1/chat/completions (every model)/v1/messages (Claude)Formatos
Uma imagemParte image_urlBloco imagePNG, JPEG, WebP, GIF
Um PDFParte fileBloco documentPDF
Uma gravaçãoParte input_audioO Claude não ouve áudioWAV, MP3
Um vídeoParte video_urlClaude não vê vídeosMP4, MOV, WebM
Texto, código, CSV, Word, ExcelO próprio texto, na mensagemUm bloco text ou um document de texto simplesTexto

Cada parte aceita uma ligação pública https ou o próprio ficheiro como um URL de dados em base64, como data:application/pdf;base64,JVBERi0.... Uma mensagem pode incluir vários ficheiros, em qualquer combinação que o modelo consiga ler.

O que cada modelo consegue ler

Todos os modelos de chat leem texto. Esta tabela é atualizada em tempo real: mostra o que cada modelo consegue ler hoje. Se um modelo receber algo que não consegue ler, rejeita-o de imediato com unsupported_content, pelo que nunca responde sobre um ficheiro que não viu.

Imagens

Adicione uma parte image_url com uma ligação ou um URL de dados. PNG, JPEG, WebP e GIF. Todos os modelos que leem imagens aceitam várias imagens numa só mensagem.

import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.zurelay.com/v1",
api_key=os.environ["ZURELAY_API_KEY"],
)
response = client.chat.completions.create(
model="gemini-3.7-flash",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "What's in this picture? One sentence."
},
{
"type": "image_url",
"image_url": {
"url": "https://zurelay.com/examples/gpt-image-2.5-flare/watch-800.webp"
}
}
]
}
],
)
print(response.choices[0].message.content)

Para enviar um ficheiro do disco, codifique-o em base64 num URL de dados:

import base64, os
from openai import OpenAI
client = OpenAI(base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"])
with open("receipt.jpg", "rb") as f:
data_url = "data:image/jpeg;base64," + base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="claude-sonnet-5-5",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "What's the total on this receipt?"},
{"type": "image_url", "image_url": {"url": data_url}},
],
}],
)
print(response.choices[0].message.content)

detail (low, high, auto) é encaminhado sem alterações para os modelos que o utilizam.

PDFs

Adicione uma parte file com o PDF como URL de dados em file_data e o nome do ficheiro. Os modelos leem o texto e, quando possível, as páginas como imagens (gráficos, digitalizações, tabelas). Também pode usar uma ligação pública em file_data.

import base64, os
from openai import OpenAI
client = OpenAI(base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"])
with open("contract.pdf", "rb") as f:
pdf = "data:application/pdf;base64," + base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="gemini-3.7-flash",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Who are the parties, and how can the contract be ended?"},
{"type": "file", "file": {"filename": "contract.pdf", "file_data": pdf}},
],
}],
)
print(response.choices[0].message.content)

Os PDFs longos consomem tokens de entrada por página (consulte a secção de faturação abaixo), por isso envie apenas as páginas de que precisa. Para fazer perguntas sobre vários documentos de uma só vez, adicione uma parte file para cada um, com nomes que os distingam.

Word, Excel, texto e código

Os modelos leem PDFs, não ficheiros Word, Excel ou PowerPoint. Insira texto, CSV, JSON, Markdown ou código diretamente na mensagem como texto: é faturado como tokens de entrada normais e é o formato que o modelo lê melhor. Quando a disposição dos elementos importa (tabelas, gráficos, digitalizações), exporte o ficheiro para PDF e envie-o nesse formato. Um URL de dados de qualquer outro tipo, como text/plain, é rejeitado com um erro que indica o motivo.

import os
from pathlib import Path
from openai import OpenAI
client = OpenAI(base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"])
notes = Path("meeting-notes.md").read_text()
sales = Path("sales.csv").read_text()
response = client.chat.completions.create(
model="deepseek-v4.1-flash",
messages=[{
"role": "user",
"content": f"Summarize the notes, then total the sales by region.\n\n"
f"<notes>\n{notes}\n</notes>\n\n<sales>\n{sales}\n</sales>",
}],
)
print(response.choices[0].message.content)

Áudio

Para modelos que ouvem áudio (consulte a tabela): uma parte input_audio com o áudio em base64 e o respetivo formato, wav ou mp3. input_audio aceita o próprio áudio; para uma ligação, use uma parte file com a ligação em file_data. As gravações feitas num navegador são normalmente WebM, que é lido como vídeo: converta-as para MP3 ou WAV para modelos que apenas ouvem áudio.

import base64, os
from openai import OpenAI
client = OpenAI(base_url="https://api.zurelay.com/v1", api_key=os.environ["ZURELAY_API_KEY"])
with open("call.mp3", "rb") as f:
audio = base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="gemini-3.7-flash",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Transcribe this call, then list the action items."},
{"type": "input_audio", "input_audio": {"data": audio, "format": "mp3"}},
],
}],
)
print(response.choices[0].message.content)

Vídeo

Para modelos que veem vídeo: uma parte video_url com uma ligação ou um URL de dados (uma parte file também funciona). MP4, MOV e WebM. Os modelos que suportam áudio também leem a faixa de áudio, pelo que pode perguntar o que é dito.

import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.zurelay.com/v1",
api_key=os.environ["ZURELAY_API_KEY"],
)
response = client.chat.completions.create(
model="gemini-3.7-flash",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "Describe what happens, and transcribe anything that's said."
},
{
"type": "video_url",
"video_url": {
"url": "https://example.com/clip.mp4"
}
}
]
}
],
)
print(response.choices[0].message.content)

Um vídeo do disco é enviado da mesma forma, como URL de dados:

Python
with open("clip.mp4", "rb") as f:
video = "data:video/mp4;base64," + base64.b64encode(f.read()).decode()
content = [
{"type": "text", "text": "What happens in this clip?"},
{"type": "video_url", "video_url": {"url": video}},
]

Um formato à entrada, o formato certo à saída

Os laboratórios aceitam conteúdos multimédia em formatos diferentes (um vídeo pode ser uma parte video_url, image_url ou file, consoante a documentação que consultar). Envie qualquer um deles: entregamos os conteúdos a cada modelo no formato que consegue ler.

Vários ficheiros numa só mensagem

Adicione uma parte para cada ficheiro, pela ordem em que pretende que sejam lidos, e refira-os no texto pela ordem ou pelo nome (“a segunda imagemm”, “contract.pdf”). Pode combinar imagens, PDFs, áudio e vídeo, desde que o modelo consiga ler cada tipo. Pode inserir partes de texto entre os ficheiros para os identificar.

  • As ligações têm de ser URLs https públicos. Seguimos até três redirecionamentos e aguardamos até 20 segundos.
  • Se não for possível descarregar o conteúdo de uma ligação, esta é rejeitada de imediato com invalid_url e o código de estado recebido, antes de qualquer modelo ser chamado.
  • As ligações assinadas (S3, Cloud Storage, as nossas próprias ligações de imagens) funcionam enquanto forem válidas.

Formato da Anthropic

Em /v1/messages, os modelos Claude aceitam os blocos da Anthropic: image e document, com uma origem base64 ou url. Alguns modelos Claude só leem PDFs através de /v1/chat/completions; se enviar um para /v1/messages, o erro indica para onde o deve enviar.

Blocos de conteúdo
[
{ "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": "iVBORw0KGgo..." } },
{ "type": "document", "source": { "type": "url", "url": "https://example.com/report.pdf" } },
{ "type": "document", "source": { "type": "base64", "media_type": "application/pdf", "data": "JVBERi0..." } },
{ "type": "text", "text": "Compare the chart with the report's conclusion." }
]

Limites

LimiteValor
Um ficheiro20 MB
Todos os conteúdos multimédia num pedido30 MB
Corpo do pedido (base64 acrescenta cerca de um terço)25 MB
Partes multimédia por pedido100
Ligações por pedido20

Para ficheiros maiores, envie uma ligação: não conta para o corpo do pedido. Os ficheiros carregados para a Files API de um laboratório (file_id) não podem ser usados; envie o ficheiro ou uma ligação.

Erros

EstadoErroQuando
400unsupported_contentO modelo não lê esse tipo de ficheiro. Escolha um que o leia na tabela acima.
400invalid_urlNão foi possível descarregar uma ligação. A mensagem indica o motivo (o estado, o tempo limite excedido, não ser um ficheiro multimédia).
400invalid_request_errorUma parte não é um URL de dados nem uma ligação https, está vazia ou é de um tipo que os modelos não leem (Word, texto simples).
413invalid_request_errorUm ficheiro com mais de 20 MB, mais de 30 MB de conteúdo multimédia ou um corpo de pedido com mais de 25 MB.

Os dois primeiros correspondem a code do erro; os restantes, a type, com uma mensagem que indica o que alterar. Todos são devolvidos antes de se chamar qualquer modelo, pelo que não têm qualquer custo. Consulte Erros para conhecer os restantes.

Como é faturado o conteúdo multimédia

Os modelos convertem o conteúdo multimédia em tokens de entrada, faturados ao preço de entrada do modelo. Cada laboratório tem o seu método de contagem; estes são valores típicos que medimos:

ClaudeGPTGemini
Uma imagem de 1024 × 1024cerca de 1,400 tokenscerca de 1,250 a 1,650cerca de 1,100
Uma fotografia grande (12 MP)até cerca de 4,800varia com o número de píxeiscerca de 1,100 a 1,200
Uma página de PDFcerca de 1,600 a 2,500o texto da páginacerca de 560
Um segundo de áudionão lênão lêcerca de 25
Um segundo de vídeonão lênão lêcerca de 100 a 300

O registo de pedidos mostra exatamente o que foi contabilizado em cada pedido. Reduzir as imagemns ao tamanho necessário é a forma mais simples de poupar: a maioria dos modelos lê uma imagem de 1024 px tão bem como uma de 4000 px.

Envia a mesma imagemm ou documento em vários pedidos? Coloque-o no início da conversa e mantenha esse prefixo igual: os modelos com cache de prompts faturam a entrada repetida ao preço de entrada em cache.

Tem dúvidas ou falta alguma coisa? Contacte a nossa equipa de apoio e responderemos por email, normalmente num minuto.