Files y Uploads
Cree, liste, descargue y elimine Files persistentes, o ensamble un File a partir de partes de carga multiparte.
La API de archivos almacena archivos user_data, batch y batch_output inmutables con alcance de cuenta, y devuelve IDs de archivo estables en lugar de URLs de almacenamiento. Usa un ID de archivo cuando una API acepte un recurso File reutilizable, y usa el endpoint de contenido cuando tu aplicación necesite los bytes exactos almacenados.
Elegir un flujo de Upload
- Use
POST /v1/filespara crear un archivo a partir de una única solicitud multiparte. Un archivouser_datacompletado puede contener hasta52,428,800bytes. - Use
POST /v1/filesconpurpose=batchpara una entrada de lote directa de hasta95,000,000bytes. - Use la API de Uploads para enviar partes antes de componer el archivo final.
Cada parte puede contener hasta
67,108,864bytes; un archivouser_datacompletado está limitado a52,428,800bytes y un archivobatchcompletado a209,715,200bytes. Una carga no finalizada expira después de una hora. - Los archivos activos y las reservas en curso comparten un límite de
almacenamiento de cuenta de
5,368,709,120bytes.
POST /api/v1/files es un flujo de carga temporal independiente que devuelve una URL temporal. SDK files.create y CLI runapi files create continúan usando ese flujo. Usa files.createFile o files.create_file, o CLI
runapi files create-file, cuando necesites un objeto File persistente.
Autenticar una solicitud
Files y Uploads utilizan una clave de API estándar de RunAPI. Envíela como token Bearer:
export RUNAPI_API_KEY="runapi_..."
Cada solicitud de File, Upload, Part y contenido está limitada a la cuenta autenticada. Un ID perteneciente a otra cuenta devuelve 404 sin revelar si ese recurso existe.
Crear un File con un cliente compatible
Apunte un cliente compatible con OpenAI a la URL base /v1 de RunAPI. No
se requieren campos de solicitud específicos de RunAPI:
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)
El archivo devuelto nunca contiene un identificador de almacenamiento, un backend ni una URL de portador.
Referencia de la API
- La API de archivos persistentes cubre el objeto File y las operaciones de creación, listado, recuperación, contenido y eliminación.
- La API de Uploads cubre el objeto Upload y las operaciones de creación, adición de parte, finalización y cancelación.
- La API de Batches cubre la creación, el estado, el listado y la cancelación de lotes de moderación.
Ejecutar Moderación en un Batch
Cree un File JSONL de entrada con una solicitud de moderación por línea. Cada
línea utiliza la forma de Batch compatible: custom_id, method, url establecida
en /v1/moderations, y un body que contiene el modelo de moderación y
la entrada. Un File con purpose=batch puede contener hasta 50.000 solicitudes. La
capacidad de Batch acepta actualmente el endpoint /v1/moderations con una
ventana de finalización de 24h.
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"
Usa GET /v1/batches para listar el trabajo, repite GET /v1/batches/{batch_id}
hasta que el estado sea terminal, o llama a POST
/v1/batches/{batch_id}/cancel mientras aún esté en ejecución. La salida completada
y el JSONL de errores se exponen como Files batch_output; recupera
sus metadatos con GET /v1/files/{file_id} y los bytes exactos con GET
/v1/files/{file_id}/content.
Ciclo de vida de carga multiparte
Cree un Upload con el recuento final de bytes, el nombre de archivo, el tipo MIME y
purpose=user_data. Añada una o más partes y pase sus IDs a
complete en el orden de composición. La finalización devuelve el Upload con su
File terminado.
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 un Upload sin terminar con POST /v1/uploads/{upload_id}/cancel.
Repetir la misma intención de finalización o cancelación es seguro; una
finalización, cancelación o vencimiento en competencia devuelve 409
upload_state_conflict cuando otro resultado terminal ya ha prevalecido.
Recursos de CLI y SDK
La CLI expone el ciclo de vida completo:
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 cliente de proveedor expone files y uploads. JavaScript y PHP
usan createFile / deleteFile / addPart; Python y Ruby usan
create_file / delete_file / add_part; Go usa CreateFile /
DeleteFile / AddPart; Java usa createFile / deleteFile /
addPart. List, retrieve, content, create, complete y cancel siguen
la convención de nombres habitual de cada lenguaje. Consulte
SDKs para la instalación de paquetes.
Comportamiento del ciclo de vida
El contenido de un File es inmutable. Eliminar un File lo retira de los listados activos de inmediato y programa la limpieza del almacenamiento. La finalización de la carga combina las partes únicamente en el orden indicado, y una finalización exitosa crea un único File. Conserve el orden original de los IDs de parte al reintentar una respuesta de finalización incierta.