Límites¶
Cuotas y límites de Lambda MicroVMs tal como los ve el SDK. Fuente:
AWS_API_NOTES.md §2, §6 y §11 (medidos en la cuenta de desarrollo el
2026-09-15) y limits.json, del que se generan _limits.py (Python) y
limits.ts (TypeScript), donde el SDK los valida en cliente.
| Límite | Valor | Qué hace el SDK |
|---|---|---|
Vida máxima de un sandbox (timeout, o max_lifetime) |
28 800 s (8 h), running + suspended, no ajustable | SandboxLifetimeException por encima; el tope no se puede extender después |
| Regiones con Lambda MicroVMs | us-east-1, us-east-2, us-west-2, eu-west-1, eu-central-1, eu-north-1, ap-northeast-1, ap-south-1, ap-southeast-1, ap-southeast-2 |
rayito doctor avisa (WARN) fuera de ellas |
Auto-suspensión (IdlePolicy.max_idle_seconds) |
≥ 60 s y menor que timeout (o max_lifetime) |
InvalidArgumentException si la pasas tú; sin idle, la de 300 s por defecto se desactiva si no cabe (60 s en modo pause) |
Plazo lógico (timeout con max_lifetime/on_timeout) |
≥ 1 s y como mucho max_lifetime − 60 s desde el arranque (max_lifetime 120–28 800 s, por defecto timeout + 60; 3600 en el shim) |
set_timeout por encima del tope: InvalidArgumentException con el plazo intacto |
| Historial de métricas | una muestra cada 5 s mientras corre; anillo de 5 760 muestras (8 h), ≈ 350 KB por respuesta completa | max_points ≥ 1 reduce la serie |
| URLs de transferencia | 3600 s por defecto, tope S3Staging.max_expires_in (86 400) y 604 800 s (7 días de SigV4) |
InvalidArgumentException con use_signature_expiration <= 0 |
| Ficheros por S3 | desde threshold_bytes (8 MiB; mínimo 1 MiB); exportación multiparte desde 5 GiB, ≤ 1 000 partes de ≥ 8 MiB; PUT único ≤ 5 GiB |
el SDK elige la ruta |
| Transferencias por sandbox | 16 activas, 2 moviendo bytes a la vez, 64 terminadas retenidas 30 min | RateLimitException (RESOURCE_EXHAUSTED) |
| Metadatos por fichero | ≤ 64 claves y ≤ 4 000 B en total (xattrs user.rayito.*) |
InvalidArgumentException antes de llamar |
| Política de egress | ≤ 256 entradas por lista, ≤ 64 nombres de host, ≤ 4 096 prefijos por familia tras restar | InvalidArgumentException |
Persistencia (persist=S3Prefix(...)) |
prefijo de clave ≤ 900 bytes, ≤ 64 patrones en exclude; restauración automática con plazo de 600 s (persist_timeout / persistTimeoutMs) |
InvalidArgumentException antes de llamar |
runHookPayload (envs + metadata + hash del token) |
4096 caracteres | InvalidArgumentException antes de llamar a AWS, nombrando envs y metadata |
| Conexiones concurrentes por MicroVM | 8 (1 vCPU), 16, 32, 64, 128 | ≤ 2 canales HTTP/2 por sandbox: unarios y streams |
| Ancho de banda del endpoint | 1 / 2 / 4 / 8 / 16 MB/s por tamaño | medido: 0,65 MB/s escritura, 6,71 MB/s lectura a 2 GB |
list-microvms |
50 items por página | pagina por dentro; list(metadata=) añade una sonda por sandbox |
| Procesos + PTYs vivos por sandbox | 256 (impuesto por rayd) |
RateLimitException (RESOURCE_EXHAUSTED) |
| Kernels (contextos de código) por sandbox | 8 (impuesto por rayd) |
RateLimitException |
| JWE del proxy | 60 min | renovado a los 45 min por un hilo/task del SDK |
create-microvm-auth-token |
50 TPS | token bucket por proceso alineado con la cuota |
run-microvm / resume / suspend / terminate |
5 / 5 / 2 / 10 TPS | token bucket por proceso alineado con la cuota |
get-microvm |
100 TPS | token bucket por proceso |
Conectores de red por run-microvm |
10 | InvalidArgumentException |
envs de un comando |
como variables de entorno del proceso | sin límite propio; el payload de creación sí |
| Salida retenida por proceso | 64 × 32 KiB por suscriptor; output_truncated si nadie lee en 30 s |
SandboxException("output_truncated: ...") |
Tamaño de un result de run_code |
> 12 MiB recortado a rayito/omitted |
aparece en Result.extra |
| Salida guardada de un comando o PTY (desde 0.7.0) | 64 MiB por descriptor (COMMAND_OUTPUT_MAX_BYTES); se conserva el final |
truncated en el resultado; ajustable con max_output_bytes / maxOutputBytes (Comandos) |
| Volúmenes EFS por sandbox (desde 0.7.0, experimental) | de 1 a 4, y como mucho 4 entre mounts= y volumes=; exactamente un conector de egress propio (AWS_API_NOTES.md §16 Q131); ConfigureSandbox con plazo de 65 s |
InvalidArgumentException antes de lanzar (Volúmenes EFS) |
| Access token propio (desde 0.7.0) | al menos 16 bytes decodificados (ACCESS_TOKEN_MIN_BYTES) |
InvalidArgumentException |
Agente de IA (AgentLimits, desde 0.8.0) |
por defecto 50 pasos (max_steps), 1 000 000 tokens (max_total_tokens; None/null lo desactiva), 600 s (timeout_seconds / timeoutMs: 600_000) y 16 MiB de salida (max_output_bytes, como mucho 64 MiB) |
AgentException con reason max_steps, token_budget o timeout (Errores) |
| Línea de evento del agente | ≤ 4 MiB; una más larga se descarta y cuenta en dropped_lines |
— |
Memoria de una imagen de agente (AgentTemplate) |
≥ 2048 MiB | InvalidArgumentException |
Las cuotas TPS son por cuenta y región (AWS_API_NOTES.md §11); cuentas
nuevas pueden empezar con valores menores.
Tamaño (CPU/RAM)¶
El tamaño (memoria y vCPU) es propiedad de la imagen
(resources[0].minimumMemoryInMiB en create-microvm-image,
AWS_API_NOTES.md §4). Es la misma forma que usa E2B: el tamaño se fija
por build de template, con Template.build(cpu_count=, memory_mb=)
(e2b template create --cpu-count --memory-mb).
Desde 0.6.0, Sandbox.create(size="4gb") (TypeScript: { size: "4gb" })
elige entre un catálogo cerrado de cinco tamaños (512mb, 1gb, 2gb, 4gb,
8gb): el SDK lo resuelve en el cliente, sin ninguna llamada a AWS, al
nombre de la imagen de ese tamaño (rayito-base-4gb). Esa imagen tiene que
estar publicada antes con rayito image publish --sizes 4gb; size= no
cambia la memoria de una imagen ni de un sandbox en marcha. Sin size= se
lanza la imagen de siempre. Ver Tamaños;
Template.build(memory_mb=) construye además una imagen propia del tamaño
que quieras (Templates).
Tabla de la documentación de AWS (AWS_API_NOTES.md §4; ancho de banda
del endpoint, entrada + salida), con el coste de la hora en baseline
derivado de los precios de §12 (AWS_API_NOTES.md §12 / Precios):
nada de esta tabla salvo lo marcado está medido en una cuenta real.
minimumMemoryInMiB |
baseline | pico (4x) | disco | ancho de banda | $/h en baseline |
|---|---|---|---|---|---|
| 512 | 0.5 GB / 0.25 vCPU | 2 GB / 1 vCPU | 8 GB | 1 MB/s | $0.0315 |
| 1024 | 1 GB / 0.5 vCPU | 4 GB / 2 vCPU | 8 GB | 2 MB/s | $0.0631 |
2048 (default de rayito image publish) |
2 GB / 1 vCPU | 8 GB / 4 vCPU | 8 GB | 4 MB/s (medido 4.54 MB/s bajando 16 MiB, AWS_API_NOTES.md §7) |
$0.1261 |
| 4096 | 4 GB / 2 vCPU | 16 GB / 8 vCPU | 16 GB | 8 MB/s | $0.2522 |
| 8192 | 8 GB / 4 vCPU | 32 GB / 16 vCPU | 32 GB | 16 MB/s | $0.5044 |
Lo único de esta tabla verificado en una cuenta real (AWS_API_NOTES.md
§7 y Q68) es la fila de 2048: el ancho de banda medido (4.54 MB/s bajando 16
MiB) y lo que ve el guest (cpu_count=4, memory_mb=8016, el pico del
rango, no el baseline). El resto de la tabla —baseline, pico, disco y ancho
de banda de los otros cuatro tamaños— viene tal cual de la documentación de
AWS, sin medir; el $/h es aritmética sobre esos números y los precios
verificados de §12, no una factura observada. Otros valores de
minimumMemoryInMiB fuera de esta tabla no están documentados ni medidos
(RES-1): no los publiques sin medirlos tú mismo antes en tu cuenta.
Cómo elegir tamaño hoy: publica una imagen por tamaño, con un nombre que lo diga, y crea sandboxes contra esa imagen:
rayito image publish --artifact image/rayito-image.zip --base-image-version 1 \
--bucket amzn-s3-demo-bucket --image-name myimg-4gb --memory-mib 4096
import { Sandbox } from "rayito";
await using sbx = await Sandbox.create({ template: "myimg-4gb" });
La CLI no valida --memory-mib contra la tabla de arriba (los valores no
medidos podrían ser válidos igualmente): un valor fuera de lo verificado
simplemente no tiene número de referencia aquí todavía.
Coste: mientras el sandbox está RUNNING, AWS factura por segundo al
vCPU/GB de baseline de la columna de arriba (columna $/h en baseline,
precios en Precios); si el sandbox consume por encima del
baseline (hasta el pico 4x), ese exceso se factura aparte, a los vCPU/GB
realmente consumidos (AWS_API_NOTES.md §12), no al precio del tamaño
siguiente de la tabla. Cada versión de imagen publicada, sea cual sea su
tamaño, cuesta además el storage del snapshot (mínimo 1 semana de
retención, ver Precios e Imágenes e IAM).
Lo que ve el guest no es la línea base: SandboxInfo.cpu_count y
SandboxInfo.memory_mb informan la vista del guest (nproc y MemTotal),
no minimumMemoryInMiB. Con una imagen de 2048 MiB, get_info() midió
cpu_count=4 y memory_mb=8016 — el pico del rango, no el baseline
(AWS_API_NOTES.md Q68). Código que decide su paralelismo mirando nproc
o la memoria total puede sobrepasar la línea base contratada — y, por el
párrafo anterior, eso no es sólo una cuestión de rendimiento: ese exceso
se paga a los vCPU/GB consumidos por encima del baseline, no sólo corre
más rápido gratis.
Versionado y soporte¶
Rayito sigue SemVer 2.0.0 y publica tres
componentes con la misma serie MAJOR.MINOR: el SDK de Python y el de
TypeScript (rayito en PyPI y npm) y el agente rayd (asset firmado de la
GitHub Release rayd-v* y binario dentro de la imagen). Cada uno tiene su
changelog en formato Keep a Changelog
(Changelog).
- Qué es la API pública: lo que exportan
rayitoyrayito.e2b(Python),rayitoyrayito/e2b(TypeScript) sin guion bajo inicial, la CLIrayito, las herramientas derayito-mcpy el contratoproto/rayito/v1/. Los módulos_privados, los tipos generados y los scripts del repositorio no lo son. - Mientras sea 0.x (hoy,
Development Status :: 3 - Alpha): una subida de MINOR puede romper compatibilidad y lo dice: commitfeat!:oBREAKING CHANGE:y entrada enChangedoRemoveddel changelog. Un PATCH nunca rompe la API pública. Desde 1.0.0, sólo un MAJOR rompe. - Obsolescencia: antes de retirar algo de la API pública se marca como
obsoleto (
DeprecationWarningen Python,@deprecateden TypeScript) y se anota enDeprecateddel changelog al menos una MINOR antes de quitarlo. Las excepciones son que AWS retire la capacidad de la plataforma que lo sostiene o que lo exija una corrección de seguridad; las dos se explican en las notas de la release. - Soporte: sólo la última línea
MAJOR.MINORrecibe correcciones, de seguridad incluidas (SECURITY.md, "Versiones soportadas"). El SDK y la imagen deben ser de la misma serie: la tabla de abajo fija elraydmínimo de cada SDK yrayito doctorla comprueba. - Las versiones de imagen no son versiones de Rayito:
rayito-baseN.0 es un contador de builds que asigna AWS en cada cuenta (ver abajo).
Compatibilidad SDK ↔ rayd ↔ imagen¶
Los SDKs (Python y TypeScript) y rayd avanzan MAJOR.MINOR en lockstep
(el patch puede divergir); cada fila fija el agent_version mínimo que trae
las funciones que ese SDK usa. La versión de imagen (imageVersion) no es
un criterio: es el contador de builds de cada imagen en cada cuenta
(rayito-base 17.0, rayito-base-poly 3.0 y la primera imagen de una cuenta
nueva, 1.0, llevan el mismo rayd), y agent_version sale del binario dentro
de la imagen, así que ya prueba de qué tag se construyó. rayito doctor
evalúa esta tabla en su comprobación compatibility (y muestra la versión de
imagen sólo a título informativo) y rayito.cli._compat.COMPATIBILITY es la
misma tabla en código: un test (tests/unit/cli/test_compat.py) impide que
diverjan, y una release que suba un mínimo añade la fila en los dos sitios.
| SDK | rayd mínimo | Nota |
|---|---|---|
0.1 |
0.1.0 |
M6: imds_blocked, hook_anomalies y metadata exigen el rayd del tag rayd-v0.1.0 |
0.2 |
0.2.0 |
M7: Checkpoint/Restore (persist=) y language= exigen el rayd del tag rayd-v0.2.0 |
0.3 |
0.3.0 |
M9: max_lifetime/on_timeout, set_timeout, get_metrics_history, network= y los kernels Deno exigen el rayd del tag rayd-v0.3.0 |
0.4 |
0.4.0 |
0.4: UnimplementedError único, SetTimeout validado en el dominio y mensajes del agente en español exigen el rayd del tag rayd-v0.4.0 |
0.5 |
0.5.0 |
0.5: /suspend con sync acotado por sistema de ficheros y las funciones opcionales (secretos, índice, OTel) se validan con el rayd del tag rayd-v0.5.0 |
0.6 |
0.6.0 |
0.6: ConfigureSandbox y las funciones 0.6 (montajes S3, eventos, OTLP, pasarela de secretos, start/ready de templates) exigen el rayd del tag rayd-v0.6.0 |
0.7 |
0.7.0 |
0.7: los volúmenes EFS (create(volumes=)) y el endurecimiento del agente (hooks aislados, persistencia ligada al /run) exigen el rayd del tag rayd-v0.7.0 |
0.8 |
0.8.0 |
0.8: el agente de IA (sbx.agent, AgentTemplate y el warmup de los pools) se valida con el rayd del tag rayd-v0.8.0 |
0.9 |
0.9.0 |
0.9: connect() recupera sbx.gateways desde ConfigureStatus y el arranque rápido del agente sin la opción D se validan con el rayd del tag rayd-v0.9.0 |
0.10 |
0.10.0 |
0.10: el timeout y abort() del agente paran todo el árbol de procesos (kill_tree) y los proveedores del agente se validan con el rayd del tag rayd-v0.10.0 |