Pular para o conteúdo
Recursos para Desenvolvedores
Recursos para Desenvolvedores

Files e Uploads

Crie, liste, baixe e exclua Files persistentes, ou monte um File a partir de partes de Upload multipart.

A API de Arquivos armazena arquivos imutáveis com escopo de Conta — user_data, batch e batch_output — e retorna IDs de arquivo estáveis em vez de URLs de armazenamento. Use um ID de arquivo quando uma API aceitar um recurso de arquivo reutilizável e use o endpoint de conteúdo quando a sua aplicação precisar dos bytes exatos armazenados.

Escolher um fluxo de upload

  • Use POST /v1/files para criar um File a partir de uma única requisição multipart. Um File user_data concluído pode conter até 52,428,800 bytes.
  • Use POST /v1/files com purpose=batch para uma entrada de batch direta de até 95,000,000 bytes.
  • Use a Uploads API para enviar Parts antes de compor o File final. Cada Part pode conter até 67,108,864 bytes; um File user_data concluído é limitado a 52,428,800 bytes e um File batch concluído a 209,715,200 bytes. Um Upload inacabado expira após uma hora.
  • Files ativos e reservas em andamento compartilham um limite de armazenamento de Conta de 5,368,709,120 bytes.

POST /api/v1/files é um fluxo de upload temporário separado que retorna uma URL temporária. O SDK files.create e a CLI runapi files create continuam a usar esse fluxo. Use files.createFile ou files.create_file, ou a CLI runapi files create-file, quando precisar de um objeto File persistente.

Autenticar uma requisição

Files e Uploads usam uma Chave de API RunAPI padrão. Envie-a como um token Bearer:

SHELL
export RUNAPI_API_KEY="runapi_..."

Cada File, Upload, Part e requisição de conteúdo tem escopo para a Conta autenticada. Um ID pertencente a outra Conta retorna 404 sem revelar se esse recurso existe.

Criar um File com um cliente compatível

Aponte um cliente compatível com OpenAI para a URL base /v1 do RunAPI. Nenhum campo de solicitação específico do RunAPI é necessário:

PYTHON
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["RUNAPI_API_KEY"],
    base_url="https://runapi.ai/v1",
)

with open("knowledge.pdf", "rb") as source:
    file = client.files.create(file=source, purpose="user_data")

metadata = client.files.retrieve(file.id)
client.files.content(file.id).write_to_file("knowledge-copy.pdf")
client.files.delete(file.id)

O arquivo retornado nunca contém um identificador de armazenamento, backend ou URL de bearer.

Referência da API

  • API de Files Persistentes abrange o objeto File e as operações de criação, listagem, recuperação, conteúdo e exclusão.
  • Uploads API abrange o objeto Upload e as operações de criação, adição de parte, conclusão e cancelamento.
  • Batches API abrange a criação, o status, a listagem e o cancelamento de Moderation Batch.

Executar Moderação em um Batch

Crie um File JSONL de entrada com uma requisição de moderação por linha. Cada linha usa o formato de Batch compatível: custom_id, method, url definida como /v1/moderations, e um body contendo o modelo de moderação e a entrada. Um File com purpose=batch pode conter até 50.000 requisições. A capacidade de Batch atualmente aceita o endpoint /v1/moderations com uma janela de conclusão de 24h.

SHELL
INPUT_FILE_ID=$(curl -sS https://runapi.ai/v1/files \
  -H "Authorization: Bearer $RUNAPI_API_KEY" \
  -F purpose=batch \
  -F [email protected] | jq -r .id)

BATCH_ID=$(curl -sS https://runapi.ai/v1/batches \
  -H "Authorization: Bearer $RUNAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --arg file "$INPUT_FILE_ID" '{input_file_id:$file,endpoint:"/v1/moderations",completion_window:"24h"}')" \
  | jq -r .id)

curl -sS "https://runapi.ai/v1/batches/$BATCH_ID" \
  -H "Authorization: Bearer $RUNAPI_API_KEY"

Use GET /v1/batches para listar os trabalhos, repita GET /v1/batches/{batch_id} até que o status seja terminal, ou chame POST /v1/batches/{batch_id}/cancel enquanto ainda estiver em execução. A saída completa e os erros em JSONL são expostos como Files batch_output; recupere seus metadados com GET /v1/files/{file_id} e os bytes exatos com GET /v1/files/{file_id}/content.

Ciclo de vida do Multipart Upload

Crie um Upload com a contagem final de bytes, nome do arquivo, tipo MIME e purpose=user_data. Adicione uma ou mais Parts e passe seus IDs para complete na ordem de composição. A conclusão retorna o Upload com seu File finalizado.

SHELL
UPLOAD_ID=$(curl -sS https://runapi.ai/v1/uploads \
  -H "Authorization: Bearer $RUNAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"bytes":1048576,"filename":"archive.bin","mime_type":"application/octet-stream","purpose":"user_data"}' \
  | jq -r .id)

PART_ID=$(curl -sS "https://runapi.ai/v1/uploads/$UPLOAD_ID/parts" \
  -H "Authorization: Bearer $RUNAPI_API_KEY" \
  -F [email protected] | jq -r .id)

curl -sS "https://runapi.ai/v1/uploads/$UPLOAD_ID/complete" \
  -H "Authorization: Bearer $RUNAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"part_ids\":[\"$PART_ID\"]}"

Cancele um Upload inacabado com POST /v1/uploads/{upload_id}/cancel. Repetir a mesma intenção de conclusão ou cancelamento é seguro; uma conclusão, cancelamento ou expiração concorrente retorna 409 upload_state_conflict quando outro resultado terminal já foi definido.

Recursos de CLI e SDK

A CLI expõe o ciclo de vida completo:

SHELL
runapi files create-file knowledge.pdf
runapi files list --order desc
runapi files retrieve file_123
runapi files content file_123 --output knowledge-copy.pdf
runapi files delete file_123

runapi uploads create --bytes 1048576 --filename archive.bin --mime-type application/octet-stream
runapi uploads add-part upload_123 archive.part-01
runapi uploads complete upload_123 --part-id part_123
runapi uploads cancel upload_123

Cada Provider Client expõe files e uploads. JavaScript e PHP usam createFile / deleteFile / addPart; Python e Ruby usam create_file / delete_file / add_part; Go usa CreateFile / DeleteFile / AddPart; Java usa createFile / deleteFile / addPart. List, retrieve, content, create, complete e cancel seguem a convenção de nomenclatura normal de cada linguagem. Consulte SDKs para instalação de pacotes.

Comportamento do ciclo de vida

O conteúdo do File é imutável. Excluir um File o remove das listagens ativas imediatamente e agenda a limpeza do armazenamento. A conclusão de um Upload compõe as Parts apenas na ordem fornecida, e uma conclusão bem-sucedida cria um File. Mantenha a ordem original dos IDs de Part ao repetir uma resposta de conclusão incerta.