Paridad con E2B¶
La tabla de alcance de Rayito frente a E2B 2.51 (e2b 2.51.0 y
e2b-code-interpreter 2.10.0), fila a fila: 113 features del SDK, la CLI y
las recetas de la documentación de E2B. Cómo migrar un programa y qué se
comporta distinto está en Compatibilidad con E2B; esta
página sólo dice qué hay y dónde está documentado.
Aceptado contra AWS real
Las filas de 0.3.0 se aceptaron contra AWS real el 2026-09-24: regresión
e2e de Python 62/62, corpus de ejemplos de E2B 18/18 y TypeScript 26/26.
Las filas que dependen de una medida citan su fila de
AWS_API_NOTES.md
(Qnn).
Qué filas cambiaron en cada versión
- 0.8.0: ninguna. El agente de IA (
sbx.agent) no es API de E2B: el shim no lo expone y se usa desde el sandbox nativo (sbx.native.agent, ver Compatibilidad). - 0.7.0: volúmenes EFS (fila 26, experimental:
Volumehace CRUD real de access points yvolume_mounts=monta sobre la imagen opcionalrayito-base-caps-efs) y dominio propio (fila 110,CustomDomain, experimental y sin verificar aún de punta a punta en AWS real). Novedades de 0.7.0. - 0.6.0: templates reales (filas 56, 81, 89) y, como funciones
opcionales en tu cuenta, eventos y webhooks (107), exportación de
telemetría (108), montajes de buckets (111) y tamaño por imagen (82);
gateways=cubre el caso deSecret.fill()en las reglas de red. Novedades de 0.6.0.
Estados¶
| Estado | Qué significa | Filas |
|---|---|---|
| implementado | la feature de E2B funciona con el mismo contrato; "antes de 0.3.0" si ya estaba en 0.2.0 | 72 (24 antes de 0.3.0, 48 en 0.3.0) |
| divergente | funciona, con una diferencia escrita en la nota (una imagen concreta, un bucket, el access token, un tope distinto, una tabla o pila opcional) | 28 |
| fuera por SPEC | se podría construir, pero SPEC.md §4 lo deja fuera o aún no está (kernels R/Java, escritorio); lanza UnimplementedError o no existe |
2 |
| imposible en la plataforma | Lambda MicroVMs no tiene la primitiva; lanza UnimplementedError con el motivo (o se ignora con RayitoCompatWarning) |
11 |
Ninguna fila se aproxima en silencio: lo que no está implementado lanza
UnimplementedError (un NotImplementedError, nunca TypeError ni
AttributeError) con la feature y el motivo; los textos exactos están en
Compatibilidad con E2B.
Qué imagen necesita cada fila¶
La mayoría de las filas de 0.3.0 funcionan en cualquier imagen publicada desde este árbol. Tres familias no:
- política de egress (filas 10–13, 19):
rayito-base-caps; - kernels
bash,javascriptytypescript(filas 94–96):rayito-base-poly; - todo el shim de E2B: una imagen 0.3.0 o posterior (el shim siempre pide el plazo del servidor).
Detalle en Imágenes e IAM.
La tabla¶
Estado dice la versión en la que llegó cada fila ("antes de 0.3.0" si ya estaba en 0.2.0). Doc enlaza la página donde se explica cómo usarlo.
| # | API de E2B | Estado | Nota | Doc |
|---|---|---|---|---|
| 1 | Sandbox.create(template=) |
implementado (antes de 0.3.0) | nombre o ARN de imagen; RAYITO_TEMPLATE sustituye al template por defecto de E2B |
Compatibilidad |
| 2 | Sandbox.create(timeout=) / JS timeoutMs |
divergente (0.3.0) | rayd impone un plazo movible: sale y la VM pasa a TERMINATED ≈ 15 s después (Q58); techo max_lifetime ≤ 28800 s; las 86400 s de E2B Pro son imposibles (el tope cuenta el tiempo suspendido) |
Plazo |
| 3 | Sandbox.create(metadata=, envs=) |
implementado (antes de 0.3.0) | en runHookPayload, 4096 caracteres entre los dos, no secretos |
Compatibilidad |
| 4 | Sandbox.create(secure=) |
implementado (antes de 0.3.0) | E2B también lo ignora; todo RPC exige x-access-token; aviso con secure=False |
Compatibilidad |
| 5 | ApiParams api_key / domain / debug / api_url / sandbox_url / validate_api_key / api_headers |
imposible en la plataforma | no hay API de E2B que configurar; las credenciales son las de AWS; se aceptan y se ignoran con RayitoCompatWarning |
Compatibilidad |
| 6 | ApiParams proxy= |
implementado (0.3.0) | se honra en el canal gRPC (grpc.http_proxy) y en botocore; desde 0.4.0, en una llamada de instancia (sbx.kill()/pause()/connect()) no se aplica y avisa con RayitoCompatWarning |
Compatibilidad |
| 7 | ConnectionConfig request_timeout |
implementado (antes de 0.3.0) | — | Compatibilidad |
| 8 | ConnectionConfig headers / retries / set_integration y sbx.connection_config |
implementado (0.3.0) | headers = metadata gRPC extra (claves reservadas rechazadas); retries a la Config de botocore; set_integration a user_agent_extra; desde 0.4.0, headers/retries en una llamada de instancia no se aplican y avisan con RayitoCompatWarning |
Compatibilidad |
| 9 | Sandbox.create(logger=) / ApiParamsWithLogger |
implementado (0.3.0) | los logs del SDK van al logging.Logger dado; el logging= nativo (CloudWatch) es otra cosa |
Compatibilidad |
| 10 | allow_internet_access=False / JS allowInternetAccess: false |
divergente (0.3.0) | en el guest de rayito-base-caps, o fuera con egress=[conector VPC propio]; en la imagen por defecto el VM se termina y se lanza UnimplementedError (Q60: no existe un conector gestionado sin egress) |
Red saliente |
| 11 | network.allow_out / deny_out con CIDR, IP, ALL_TRAFFIC o selectores invocables |
divergente (0.3.0) | semántica exacta de E2B por rutas de política uidrange, sólo rayito-base-caps |
Red saliente |
| 12 | network.allow_out / deny_out con nombres de host |
divergente (0.3.0) | modo sólo-proxy: el proxy local de rayd filtra por nombre y por IP resuelta y bloquea el egress directo; un cliente que ignora el proxy falla cerrado, mientras que E2B filtra de forma transparente |
Red saliente |
| 13 | network.egress_proxy (SOCKS5) |
divergente (0.3.0) | el proxy local encadena al SOCKS5 del operador tras filtrar; sólo caps; falla cerrado para clientes sin proxy | Red saliente |
| 14 | network.rules / SandboxNetworkRule (inyección de cabeceras, placeholders de IAM) |
imposible en la plataforma | su razón de ser es inyectar credenciales fuera del sandbox; Lambda MicroVMs no tiene gancho de egress en el host, así que el inyector correría en el mismo VM que el código no confiable y necesitaría interceptar TLS | Red saliente |
| 15 | network.allow_public_traffic=True (el valor por defecto de E2B) |
imposible en la plataforma | no hay modo sin autenticar: X-aws-proxy-auth es obligatorio (§3, §7); False es el comportamiento permanente de Rayito. Con CustomDomain (experimental) un puerto responde sin esa cabecera bajo tu dominio, con la distribución CloudFront poniéndola por ti (fila 110) |
Red saliente, Dominio propio |
| 16 | Sandbox.traffic_access_token |
divergente (0.3.0) | devuelve el JWE vigente de x-aws-proxy-auth; rota (TTL ≤ 60 min) y la cabecera se llama distinto |
Compatibilidad |
| 17 | network.mask_request_host |
imposible en la plataforma | el proxy de AWS siempre reenvía Host: <endpoint> (§7) |
Red saliente |
| 18 | network.https_ports |
divergente (0.3.0) | medido (Q67, QE2): el proxy de Lambda MicroVMs no reenvía TLS extremo a extremo a un puerto del guest, así que una lista no vacía es UnimplementedError; get_host(puerto) sirve HTTP en claro |
Red saliente |
| 19 | Sandbox.update_network(network) / update_network(id, network) / JS updateNetwork |
divergente (0.3.0) | NetworkService.UpdateNetwork cambia la política del guest de forma atómica en caps; los conectores de plataforma siguen inmutables (no hay UpdateMicrovm) |
Red saliente |
| 20 | lifecycle.on_timeout='kill' |
implementado (0.3.0) | rayd sale al vencer y la VM termina sin IAM (Q58) |
Plazo |
| 21 | lifecycle.on_timeout='pause' |
divergente (0.3.0) | un SDK vivo suspende al vencer; sin cliente, la política de idle lo hace en max_idle; la carga no se congela entretanto; aplica la suspensión por idle antes del plazo; los pausados siguen muriendo en el tope de 8 h |
Plazo |
| 22 | lifecycle.auto_resume |
implementado (0.3.0) | True = autoResumeEnabled más el mínimo de 5 min de E2B tras reanudar; False lo hace cumplir rayd (un resume suelto sigue vencido hasta connect()) |
Plazo |
| 23 | lifecycle.on_timeout={"action": "pause", "keep_memory": False} y pause(keep_memory=False) |
imposible en la plataforma | suspend-microvm siempre guarda la memoria y un resume de sólo ficheros exigiría el mismo id con arranque en frío (§5); el análogo es checkpoint_files() + kill(), con un id nuevo |
Plazo |
| 24 | Sandbox.create(iam=) + Secret.iam_token (identidad JWT-SVID) |
imposible en la plataforma | los MicroVMs no emiten tokens con audiencia; la única identidad es el execution role por IMDSv2 (§9) y un emisor propio sería un servicio de plano de control (SPEC.md §4) |
Seguridad |
| 25 | Sandbox.create(mcp=) + get_mcp_url() / get_mcp_token() |
imposible en la plataforma | el contrato (URL, token fijo) no se sostiene: cada petición necesita además un JWE en cabecera con TTL ≤ 60 min (§3, §7) y no hay Docker para los servidores del catálogo; Rayito trae rayito-mcp en el cliente |
MCP |
| 26 | Sandbox.create(volume_mounts=) + API Volume/AsyncVolume |
divergente (0.7.0, experimental) | VolumeStore hace CRUD real de access points EFS; volume_id/volumeId es el nombre del volumen; volume_mounts= monta por el volumes= nativo con E2B(volume_store=..., volume_connector_arn=...) sobre la imagen opcional rayito-base-caps-efs (ese sandbox sale sólo por el conector del volumen: un MicroVM admite un conector de egress); las operaciones de contenido del Volume siguen sin plano de datos propio |
Volúmenes EFS |
| 27 | Sandbox.connect(id, timeout=) (forma de clase) |
divergente (0.3.0) | timeout alarga el plazo (AT_LEAST, semántica de E2B); sigue haciendo falta el access token del sandbox |
Plazo |
| 28 | sbx.connect() (forma de instancia) |
implementado (0.3.0) | desde 0.4.0, headers=/proxy=/retries= avisan con RayitoCompatWarning y no se aplican (Sandbox.connect(sandbox_id, ...) sí los aplica) |
Compatibilidad |
| 29 | connect(on_resume='reboot') |
imposible en la plataforma | resume-microvm siempre restaura memoria y disco (§5); el análogo es reincarnate(), con un id nuevo |
Persistencia |
| 30 | Sandbox.kill() / Sandbox.kill(id) → bool |
implementado (antes de 0.3.0) | — | Compatibilidad |
| 31 | sbx.is_running(request_timeout=) |
implementado (antes de 0.3.0) | ahora acepta request_timeout |
Compatibilidad |
| 32 | sbx.set_timeout(timeout) |
implementado (0.3.0) | fija el plazo exacto, puede acortarlo, hasta max_lifetime; más allá, InvalidArgumentException; sustituye a ADR-007 |
Plazo |
| 33 | Sandbox.set_timeout(id, timeout) / JS estático setTimeout |
divergente (0.3.0) | necesita el access token (access_token= o RAYITO_ACCESS_TOKEN) |
Plazo |
| 34 | sbx.get_info() / Sandbox.get_info(id) → SandboxInfo 2.x |
implementado (0.3.0) | sandbox_domain = endpoint; cpu_count/memory_mb según el guest; envd_version = agent_version; lifecycle, network y allow_internet_access rellenos; volume_mounts siempre vacío; end_at = el plazo lógico |
Compatibilidad |
| 35 | JS Sandbox.getFullInfo |
implementado (0.3.0) | — | Compatibilidad |
| 36 | Sandbox.list(limit, next_token) + SandboxPaginator has_next / next_items / next_token |
implementado (0.3.0) | token opaco sobre el nextToken de list-microvms |
Observabilidad |
| 37 | Sandbox.list(order="asc" / "desc") |
implementado (0.3.0) | ordenado en cliente por startedAt sobre todas las páginas: AWS no ordena |
Observabilidad |
| 38 | SandboxQuery.state / started_after / template |
implementado (0.3.0) | filtros en cliente sobre los items | Observabilidad |
| 39 | SandboxQuery.metadata sobre sandboxes RUNNING |
implementado (antes de 0.3.0) | una sonda Health por sandbox RUNNING, O(n) (Q45) |
Observabilidad |
| 40 | SandboxQuery.metadata sobre sandboxes PAUSED |
divergente (0.5.0, pendiente de aceptación en AWS real) | con la extensión index=DynamoDbIndex(...) (TS index: new DynamoDbIndex({...}), también E2B(index=)): una tabla DynamoDB opcional en tu cuenta (infra/metadata-index.yaml, ADR-014, on-demand, ~$0 en reposo); sólo aparecen los sandboxes creados con el índice desde el SDK nativo (rayito.Sandbox.create(index=) o PoolConfig(index=)): el Sandbox.create() del shim (rayito.e2b / rayito/e2b) nunca escribe el índice, así que el flujo PAUSED completo no cabe dentro del shim; el estado sale siempre de list-microvms y no se sondea ni despierta ningún sandbox; sin índice sigue siendo UnimplementedError, con la pista de index= |
Observabilidad, Funciones opcionales |
| 41 | sbx.get_metrics(start, end) → List[SandboxMetrics] con mem_cache |
implementado (0.3.0) | anillo de 5 s en rayd (8 h) con hueco mientras está suspendido |
Observabilidad |
| 42 | Sandbox.get_metrics(id) / JS estático getMetrics |
divergente (0.3.0) | necesita el access token del sandbox | Observabilidad |
| 43 | sbx.pause() → bool / Sandbox.pause(id) |
implementado (0.3.0) | devuelve bool como E2B 2.x (antes str) |
Compatibilidad |
| 44 | sbx.beta_pause() / JS betaPause |
implementado (0.3.0) | Python ya lo tenía; JS lo gana con el shim de TS | Compatibilidad |
| 45 | Sandbox.beta_create(auto_pause=, network=, mcp=) |
implementado (0.3.0) | E2B lo retiró en 2.23.0; se conserva: auto_pause es lifecycle pause y network/mcp siguen sus filas; sólo Python (el shim de TS no tiene betaCreate) |
Plazo |
| 46 | create_snapshot / list_snapshots / delete_snapshot / SnapshotInfo / SnapshotPaginator / create(template=<snapshot_id>) |
imposible en la plataforma | ninguna operación copia la memoria de un MicroVM en marcha (§1, §15); el análogo de sólo ficheros es checkpoint_files; UnimplementedError explícito |
Persistencia |
| 47 | Sandbox.fork(timeout, count) / Sandbox.fork(id) |
imposible en la plataforma | un fork del estado en memoria no tiene primitiva (§1, §15) | Persistencia |
| 48 | sbx.upload_url(path, user, use_signature_expiration) / JS uploadUrl |
divergente (0.3.0) | PUT prefirmado de S3 (form=True da un POST); aterriza de forma asíncrona con la barrera de rayd y ticket.wait(); un solo uso; caducidad siempre fijada; exige un bucket de transferencias; en el shim de TS devuelve la URL como string (sin wait()) |
Ficheros |
| 49 | sbx.download_url(path, user, use_signature_expiration) / JS downloadUrl |
divergente (0.3.0) | GET prefirmado de S3 con Range; sirve una foto tomada al llamar; caducidad siempre fijada; un fichero que falta lanza al momento; exige un bucket de transferencias (S3Staging o RAYITO_TRANSFER_BUCKET) |
Ficheros |
| 50 | get_signature(path, operation, user, envd_access_token, expiration_in_seconds) |
imposible en la plataforma | una firma de envd no autentica en el proxy (JWE sólo en cabecera, §7); las URLs de Rayito se firman en S3 dentro de upload_url/download_url |
Ficheros |
| 51 | sbx.get_host(port) (Python) |
implementado (antes de 0.3.0) | hostname más las cabeceras obligatorias del proxy (HostAccess); la plataforma no tiene URL pública sin cabeceras |
Compatibilidad |
| 52 | JS sandbox.getHost(port): string (síncrono) |
divergente (0.3.0) | el shim de TS devuelve el hostname de forma síncrona; las peticiones siguen necesitando las cabeceras del proxy | Compatibilidad |
| 53 | sbx.sandbox_id / sbx.sandbox_domain |
implementado (antes de 0.3.0) | sandbox_domain es el hostname del endpoint |
Compatibilidad |
| 54 | sbx.envd_api_url / sbx.envd_direct_url |
implementado (0.3.0) | https://<endpoint>; las peticiones necesitan las cabeceras del proxy; sólo Python |
Compatibilidad |
| 55 | with Sandbox() as sbx / async with |
implementado (antes de 0.3.0) | — | Compatibilidad |
| 56 | cliente ligado E2B(api_key, domain, ...) con .Sandbox / .AsyncSandbox / .Template / .Volume / .Secret |
implementado (0.3.0) | liga region/session/control_plane; desde 0.5.0 .Secret/.AsyncSecret funcionan (Secrets Manager con esa region/session; aceptado en AWS real); desde 0.6.0 .Template/.AsyncTemplate son la clase real (build, build_in_background, get_build_status, ver fila 81); desde 0.7.0 .Volume/.AsyncVolume hacen CRUD real con volume_store= (experimental, ver fila 26) y sin él lanzan UnimplementedError |
Compatibilidad |
| 57 | commands.run(cmd, background, envs, user, cwd, on_stdout, on_stderr, stdin, timeout, request_timeout) con argumentos posicionales |
implementado (0.3.0) | la llamada nativa ya funcionaba; el shim acepta ahora el orden posicional de E2B | Compatibilidad |
| 58 | commands.connect / commands.list / ProcessInfo / commands.kill / send_stdin / close_stdin |
implementado (antes de 0.3.0) | — | Compatibilidad |
| 59 | CommandHandle.wait(on_pty, on_stdout, on_stderr) (sync) |
implementado (0.3.0) | — | Compatibilidad |
| 60 | AsyncCommandHandle / CommandResult / CommandExitException |
implementado (antes de 0.3.0) | — | Compatibilidad |
| 61 | tipos Stdout, Stderr, PtyOutput, OutputHandler, AsyncCommandHandle, AsyncWatchHandle, Username |
implementado (0.3.0) | — | Compatibilidad |
| 62 | pty.create / pty.send_stdin / pty.resize / pty.kill |
implementado (antes de 0.3.0) | — | Compatibilidad |
| 63 | pty.connect(pid) |
implementado (0.3.0) | el nativo ya existía; ahora lo expone el shim | Compatibilidad |
| 64 | JS pty.create({cols, rows, onData, user, cwd, envs, timeoutMs}) |
implementado (0.3.0) | cols/rows de primer nivel en el shim de TS |
Compatibilidad |
| 65 | files.read(format text / bytes / stream, user, request_timeout) |
implementado (antes de 0.3.0) | — | Compatibilidad |
| 66 | files.read(gzip=) / files.write(gzip=) |
implementado (0.3.0) | gzip estándar de gRPC; las respuestas lo piden con la cabecera rayito-compress; cruza el proxy de AWS en los dos sentidos: 20 MB de texto pasan de 0,80 a 52,34 MB/s (Q74) |
Ficheros |
| 67 | files.read(stream_idle_timeout=) |
implementado (0.3.0) | — | Ficheros |
| 68 | files.write(metadata=) / write_files(metadata=) + WriteInfo.metadata / EntryInfo.metadata |
implementado (0.3.0) | xattrs user.rayito.*; claves en minúsculas; sobrescribir reemplaza el conjunto (semántica de envd) |
Ficheros |
| 69 | files.write(use_octet_stream=) |
implementado (0.3.0) | se acepta sin efecto: los streams gRPC no tienen formulario multipart | Ficheros |
| 70 | files.write/files.read de ficheros grandes (rendimiento) |
implementado (0.3.0) | van por S3 automáticamente desde un umbral cuando hay S3Staging (Q59: 55–106 MB/s frente a 0,68 MB/s por el proxy); sin S3Staging siguen por gRPC, igual que antes |
Ficheros |
| 71 | files.write_files(List[WriteEntry]) → List[WriteInfo] |
implementado (0.3.0) | el nativo ya existía; ahora lo expone el shim | Compatibilidad |
| 72 | files.list(depth) / exists / get_info / remove / rename / make_dir |
implementado (antes de 0.3.0) | — | Compatibilidad |
| 73 | FileType.FILE / DIR / SYMLINK |
implementado (antes de 0.3.0) | — | Compatibilidad |
| 74 | files.watch_dir(include_entry=) |
implementado (0.3.0) | se pasa a la llamada nativa | Compatibilidad |
| 75 | files.watch_dir(allow_network_mounts=) |
implementado (0.3.0) | se acepta; el sandbox no tiene montajes de red | Compatibilidad |
| 76 | WatchHandle.get_new_events / stop, AsyncWatchHandle.stop, FilesystemEvent, FilesystemEventType |
implementado (antes de 0.3.0) | — | Compatibilidad |
| 77 | JS files.read(format: "blob") |
implementado (0.3.0) | — | Ficheros |
| 78 | JS files.watchDir(path, onEvent, opts) |
implementado (0.3.0) | onEvent posicional en el shim de TS |
Compatibilidad |
| 79 | sandbox.git (clone, init, remote_add, remote_get, status, branches, create_branch, checkout_branch, delete_branch, add, commit, reset, restore, push, pull, set_config, get_config, dangerously_authenticate, configure_user; GitStatus, GitBranches, GitFileStatus, GitResetMode) |
implementado (0.3.0) | envoltorio en cliente sobre commands.run, con git-core en rayito-base; E2B marca el módulo como obsoleto |
Git |
| 80 | Secret / AsyncSecret (create, update, get_info, list, exists, destroy, fill; SecretInfo, SecretPaginator) |
divergente (0.5.0, aceptado en AWS real) | CRUD sobre AWS Secrets Manager en tu cuenta (ADR-014, opcional, $0,40/secreto-mes); secret_id es el ARN, no sec_…; metadata ≤ 2048 caracteres (E2B: 8 KiB), sin tope de 100; sin inyector de network.rules: fill() devuelve el placeholder, que nada resuelve (la entrega es secrets= del SDK nativo, visible para el código del sandbox); iam_token sigue en UnimplementedError (fila 24) |
Secretos, Compatibilidad |
| 81 | API de build de templates (TemplateBase, TemplateBuilder, Template.build, ...) |
divergente (0.6.0) | Template/AsyncTemplate con build, build_in_background y get_build_status: el mismo DSL, compuesto en el cliente sobre una imagen rayito-base publicada (from_base_image en vez de from_docker_image), sin caché de capas y sólo ARM64; alias_exists/assign_tags/remove_tags/get_tags lanzan UnimplementedError; también rayito template build |
Templates |
| 82 | cpu_count / memory_mb por sandbox |
divergente (0.6.0) | por imagen, como E2B por build de template: Template.build(memory_mb=) redondea al tamaño soportado siguiente con RayitoCompatWarning y cpu_count se ignora con aviso (la CPU sale de la memoria, Q87); el SDK nativo añade Sandbox.create(size=), que elige entre las imágenes de cinco tamaños publicadas con rayito image publish --sizes (o una imagen propia por tamaño con --memory-mib); cpu_count/memory_mb de SandboxInfo son la vista del guest (Q68) |
Tamaños, Templates |
| 83 | excepciones AuthenticationException, CommandExitException, InvalidArgumentException, NotFoundException, RateLimitException, SandboxException, TimeoutException |
implementado (antes de 0.3.0) | TimeoutException cubre ahora también sandbox_timeout (m9-server-timeout) |
Compatibilidad |
| 84 | FileNotFoundException / SandboxNotFoundException exportadas desde rayito.e2b |
implementado (0.3.0) | — | Compatibilidad |
| 85 | NotEnoughSpaceException |
implementado (0.3.0) | alias de DiskFullException, que sí se lanza |
Compatibilidad |
| 86 | ServiceBusyException |
implementado (0.3.0) | se lanza ante InsufficientCapacityException |
Compatibilidad |
| 87 | FileUploadException |
implementado (0.3.0) | se lanza cuando falla una importación (m9-file-transfer) |
Compatibilidad |
| 88 | GitAuthException / GitUpstreamException |
implementado (0.3.0) | — | Git |
| 89 | TemplateException / BuildException |
divergente (0.6.0) | los lanza Template.build(): TemplateException ante un template o una imagen base inválidos, BuildException cuando el build falla (con el motivo, incluida la cuota de builds). Las de rayito.e2b y rayito/e2b son las clases nativas, y BuildException es un SandboxException (Compatibilidad) |
Templates |
| 90 | Volume*Exception / Secret*Exception |
divergente (0.5.0, aceptado en AWS real) | SecretException/SecretNotFoundException (TS: SecretError/SecretNotFoundError) existen y los lanza Secret, con la jerarquía de E2B más una diferencia: SecretException hereda de SandboxException (TS: SandboxError) y, en Python, SecretNotFoundException también es NotFoundException; desde 0.7.0, VolumeException/VolumeNotFoundException/VolumePathNotFoundException también existen (las nativas, exportadas por rayito.e2b; en TS, VolumeError/VolumeNotFoundError/VolumePathNotFoundError se importan de rayito) y los lanzan las operaciones de volumen con volume_store= (fila 26) |
Compatibilidad |
| 91 | SandboxState RUNNING / PAUSED |
implementado (antes de 0.3.0) | — | Compatibilidad |
| 92 | paridad completa de AsyncSandbox |
implementado (0.3.0) | los mismos huecos cerrados que en el shim síncrono | Compatibilidad |
| 93 | run_code(code, language / context, on_stdout, on_stderr, on_result, on_error, envs, timeout, request_timeout) → Execution |
implementado (antes de 0.3.0) | — | Compatibilidad |
| 94 | run_code(language="python" / "bash") |
implementado (antes de 0.3.0) | bash sólo en rayito-base-poly |
Kernels |
| 95 | run_code(language="javascript") |
implementado (0.3.0) | kernel de Deno en rayito-base-poly con arranque perezoso (Q61); otras imágenes lanzan UnimplementedError nombrando poly |
Kernels |
| 96 | run_code(language="typescript") |
implementado (0.3.0) | el mismo kernel de Deno, sólo rayito-base-poly |
Kernels |
| 97 | run_code(language="r" / "java") |
fuera por SPEC | SPEC.md §4; medido: R por conda 1,4 GB, R-core 127 MB más dependencias gráficas; Corretto 21 262 MB más un IJava sin mantenimiento |
Kernels |
| 98 | create_code_context(cwd, language, request_timeout) → Context |
implementado (antes de 0.3.0) | javascript/typescript añadidos en poly |
Kernels |
| 99 | list_code_contexts / remove_code_context / restart_code_context |
implementado (0.3.0) | el nativo ya existía; ahora lo expone el shim | Compatibilidad |
| 100 | Execution / Logs / OutputMessage / ExecutionError / Result / charts (ChartType, ScaleType, Chart, PointChart, LineChart, ScatterChart, BarChart, PieChart, BoxAndWhiskerChart, SuperChart, clases de datos) |
implementado (antes de 0.3.0) | — | Compatibilidad |
| 101 | Logs.to_json / ExecutionError.to_json / Context.from_json / Chart2D / MIMEType / RunCodeLanguage / OutputHandler (code-interpreter) |
implementado (0.3.0) | Python (rayito.e2b) |
Compatibilidad |
| 102 | import drop-in de JS (import { Sandbox } from 'e2b' / '@e2b/code-interpreter') |
implementado (0.3.0) | nueva ruta rayito/e2b en exports |
Compatibilidad |
| 103 | JS Sandbox.create(template?, opts) con ConnectionOpts (requestTimeoutMs, retries, logger, headers, proxy, signal) |
implementado (0.3.0) | apiKey/domain ignorados con aviso; el AbortSignal va a las opciones de llamada de Connect; desde 0.4.0, en una llamada de instancia sólo signal (y requestTimeoutMs salvo en kill/pause) se aplica, el resto avisa con RayitoCompatWarning |
Compatibilidad |
| 104 | JS estáticos Sandbox.kill / getInfo / isRunning / connect / pause |
implementado (0.3.0) | formas estáticas en el shim de TS (también getFullInfo, betaPause, setTimeout, getMetrics, list y updateNetwork); el nativo tiene las de instancia |
Compatibilidad |
| 105 | JS Sandbox.list(opts) → SandboxPaginator |
implementado (0.3.0) | la forma del paginador más el filtro de metadatos, como en Python | Observabilidad |
| 106 | superficie camelCase de JS commands / files / runCode / contextos |
implementado (antes de 0.3.0) | el espejo nativo de TS ya coincidía; el shim de TS la reexpone | Compatibilidad |
| 107 | API REST y webhooks de eventos de ciclo de vida (docs) | divergente (0.6.0) | events=LifecycleEvents(...) en create() más la pila opcional events-webhooks en tu cuenta (rayito events deploy, ≈ $0,40/mes): created/paused/resumed/killed guardados en DynamoDB (get_events) y entregados a tus webhooks con la firma de E2B; sin API REST hospedada |
Eventos y webhooks |
| 108 | exportación de telemetría OTel (docs, Enterprise) | divergente (0.6.0) | telemetry=TelemetryExport(...) en create(): rayd exporta 7 métricas de CPU, memoria y disco por OTLP/HTTP (a CloudWatch por defecto; names="e2b" usa los nombres de E2B); sin logs ni trazas del sandbox. Desde 0.5.0, además, spans del lado cliente con tracer_provider=/tracerProvider |
Exportación OTLP, Observabilidad |
| 109 | receta de acceso SSH (sshd + websocat, docs) | divergente (0.3.0) | rayito sandbox connect da una terminal PTY interactiva; una receta con sshd necesita una imagen propia y un cliente que hable la autenticación por subprotocolo WebSocket |
CLI |
| 110 | dominio propio vía proxy inverso (docs) | divergente (0.7.0, experimental) | para desarrollo: rayito sandbox proxy <id> --port N expone un puerto del guest en localhost; un dominio público es CustomDomain (experimental): una distribución CloudFront en tu cuenta (ADR-014) con URLs https://<puerto>-<alias>.<tu-dominio> que registras tú (register()), sin proxy inverso propio; aún no verificado de punta a punta en AWS real y sin cablear a Sandbox.create(domain=) |
Dominio propio, CLI |
| 111 | montajes de buckets s3fs/gcsfuse (docs) | divergente (0.6.0) | mounts={"/mnt/data": S3Mount(...)} en create(): Mountpoint for Amazon S3 (mount-s3), sólo S3 (sin GCS) y sólo en rayito-base-caps, con los buckets permitidos por la imagen (RAYITO_ALLOWED_MOUNT_BUCKETS) y la política de la pila s3-mounts |
Montajes S3 |
| 112 | CLI de E2B (auth, sandbox list/create/connect/exec/kill/metrics, template, snapshots, fork) |
divergente (0.3.0) | añade sandbox create/connect/exec/metrics a los list/kill/logs que ya había; desde 0.6.0 rayito template build/status/logs; auth, snapshots y fork siguen fuera |
CLI |
| 113 | SDK de escritorio (e2b-desktop) |
fuera por SPEC | SPEC.md §4 (Desktop/GUI) |
Compatibilidad |
Qué hacer con lo que no está¶
| Si usabas | En Rayito |
|---|---|
fork, snapshots, pause(keep_memory=False) |
checkpoint_files() + create(persist=) o reincarnate(): sobreviven los ficheros, con un id nuevo (Persistencia) |
Volume, volume_mounts (sin la imagen con amazon-efs-utils) |
persist= (S3) y upload_url/download_url (Ficheros); para un bucket montado, mounts= (Montajes S3); con ella, Volúmenes EFS |
Secret (el CRUD) |
Secret/AsyncSecret del shim o SecretStore, sobre AWS Secrets Manager en tu cuenta (Secretos) |
network.rules con Secret.fill() |
gateways= (0.6.0): una pasarela en loopback dentro del sandbox inyecta la cabecera real hacia un upstream fijo, así el código puede usar el secreto sin leerlo (Pasarela de secretos); o secrets={"ENV": "nombre"}, que lo entrega como variable de entorno visible (Secretos) |
mcp= |
el servidor rayito-mcp, en el cliente |
iam= |
execution_role_arn (IMDSv2); en rayito-base-caps el código del sandbox no ve IMDS (Seguridad) |
R o Java en run_code |
no hay kernel: Python, y bash/JavaScript/TypeScript en rayito-base-poly (Kernels) |