Saltar a contenido

Novedades de 0.11.0

Publicada el 2026-10-13: SDK Python rayito 0.11.0, SDK TypeScript rayito 0.11.0 y rayd 0.11.0.

0.11.0 trae tres cosas:

  1. Las imágenes del agente arrancan antes. AgentTemplate ya no calienta el kernel de run_code y mete los binarios del agente en el snapshot de memoria. create() vuelve en unos 6 s en lugar de unos 19 s. Es un cambio de comportamiento para quien usa run_code con numpy o pandas en la imagen del agente: cómo volver a lo de antes.
  2. Claves de artefacto por ejecución al publicar imágenes (rayito image publish --artifact-run-id), para que dos ejecuciones en paralelo no compartan ni se borren el zip.
  3. El SandboxPool de TypeScript ya no deja salir a Node mientras take() o close() esperan.

No hay cambios que rompan la API. Para aprovechar el punto 1 hay que reconstruir la imagen del agente: ver Cómo actualizar desde 0.10.x.

De un vistazo

Cambio Python TypeScript Necesita imagen nueva
AgentTemplate sin calentar el kernel de run_code por defecto kernel_warmup=False; CLI --kernel-warmup/--no-kernel-warmup kernelWarmup: false sí, la del agente
Binarios de OpenCode y ripgrep dentro del snapshot de memoria AgentTemplate(prefetch=True) (por defecto) prefetch: true (por defecto) sí, la del agente
Claves de artefacto por ejecución rayito image publish --artifact-run-id — (la CLI es de Python) no
take() y close() del pool retienen el proceso — SandboxPool no
rayito doctor conoce la serie 0.11 CLI — —

El agente arranca antes

Cada Sandbox.create() de una imagen del agente restaura un snapshot de memoria. Hasta 0.10, ese snapshot llevaba el kernel de run_code con numpy, pandas, matplotlib, scipy y scikit-learn ya importados, aunque un agente casi nunca los usa, y los binarios de OpenCode y ripgrep había que leerlos del disco en el primer turno. AgentTemplate de 0.11.0 cambia las dos cosas:

  • El kernel de run_code no se calienta (kernel_warmup=False / kernelWarmup: false). La imagen escribe el marcador slim del sidecar, así que el kernel arranca vacío.
  • Los binarios del agente van en el snapshot. El demonio de prefetch los lee una vez durante el build, antes del snapshot, y la plantilla espera a que termine (ready_cmd).

No cambias nada en tu código: basta con reconstruir la imagen.

from rayito import AgentTemplate

info = AgentTemplate(name="rayito-agent").build(bucket="amzn-s3-demo-bucket")
print(info.build_id)  # "<versión de imagen>/<build>"
import { AgentTemplate } from "rayito";

const info = await new AgentTemplate({ name: "rayito-agent" }).build({ bucket: "amzn-s3-demo-bucket" });
console.log(info.buildId); // "<versión de imagen>/<build>"
rayito agent template build --name rayito-agent --bucket amzn-s3-demo-bucket

Medido en AWS real (2026-10-13, us-east-1, Claude Haiku 4.5)

En la aceptación de 0.11.0, con una imagen de AgentTemplate recién construida, el egress cerrado y el modelo por bedrock_gateway, seis arranques de OpenCode (tres desde Python y tres desde TypeScript): create() en 5,9 s de mediana (de 3,2 a 8,9 s) y el primer token en 12,8 s de mediana desde el inicio de create() (de 9,7 a 37,0 s). Coincide con la medida del cambio (AWS_API_NOTES.md Q155 y Q156: 6,4 s frente a 19,1 s con la imagen de 0.10, y un snapshot de memoria 62 MB más pequeño). El primer token varía mucho de una ejecución a otra, así que la mejora robusta es la de create().

Si usas run_code con el stack científico

Este es el cambio de comportamiento. En una imagen del agente construida con 0.11.0, la primera celda de run_code que importe numpy, pandas, matplotlib, scipy o scikit-learn paga esa importación; las siguientes no. Las imágenes que ya tenías no cambian.

Si tu agente o tu código usan esas librerías nada más arrancar, vuelve al comportamiento de 0.10 al construir la imagen:

from rayito import AgentTemplate

AgentTemplate(name="rayito-agent", kernel_warmup=True).build(bucket="amzn-s3-demo-bucket")
import { AgentTemplate } from "rayito";

await new AgentTemplate({ name: "rayito-agent", kernelWarmup: true }).build({ bucket: "amzn-s3-demo-bucket" });
rayito agent template build --name rayito-agent --bucket amzn-s3-demo-bucket --kernel-warmup

Con kernel_warmup=True, create() vuelve a tardar lo de 0.10 y el snapshot de memoria vuelve a su tamaño anterior. Detalle en Templates de agente.

Claves de artefacto por ejecución

rayito image publish sube el zip de la imagen a una clave por contenido (rayito/images/rayd-<sha>.zip). Si dos ejecuciones publicaban el mismo commit a la vez (dos e2e en paralelo, o una aceptación), compartían ese objeto, y la limpieza de una podía borrar el de la otra. Con --artifact-run-id, el zip va a una clave propia de la ejecución:

rayito --json image publish --artifact rayito-image.zip --base-image-version 1 \
  --bucket amzn-s3-demo-bucket --image-name rayito-e2e-base --artifact-run-id e2e-42
# sube a rayito/images/runs/e2e-42/rayd-<sha>.zip

El resumen --json añade artifactUploaded: true si esta invocación subió el objeto. Al limpiar, borra sólo rayito/images/runs/<id>/ o, sin id, sólo los artefactos con artifactUploaded: true. Desde el repositorio, make image-publish* pasa el flag si exportas RAYITO_E2E_RUN_ID o ARTIFACT_RUN_ID. Sin el flag nada cambia. Detalle en CLI.

El pool de TypeScript ya no deja salir a Node

En TypeScript, todos los temporizadores del SandboxPool y de sus calentamientos iban sin referencia, para que un pool ocioso no mantenga vivo el proceso. El efecto secundario: un script cuyo único trabajo pendiente era await pool.take({ waitMs }) (con el pool vacío) o await pool.close() (con un relleno en marcha) salía con la promesa sin resolver (unsettled top-level await, código 13) y dejaba vivos los MicroVM que se estaban calentando.

Desde 0.11.0, take() y close() retienen el proceso mientras corren. Un pool ocioso sigue sin mantenerlo vivo. No tienes que cambiar tu código:

import { SandboxPool } from "rayito";

const pool = await new SandboxPool({ size: 1, template: "rayito-base" }).start();
const sbx = await pool.take({ waitMs: 60_000 }); // espera a la primera plaza sin que Node salga
console.log((await sbx.runCode("1 + 1")).text);
await sbx.kill();
await pool.close(); // termina las plazas aparcadas antes de salir

El SDK de Python no tenía el problema.

Otros cambios

  • rayito doctor conoce la serie 0.11: exige el rayd del tag rayd-v0.11.0 para el SDK 0.11 (Compatibilidad).
  • rayd 0.11.0 no cambia: versión en paso con los SDK.

Cómo actualizar desde 0.10.x

  1. Actualiza el SDK.

    pip install -U "rayito[cli]"
    
    pnpm add rayito@latest
    
  2. Republica tu imagen sobre rayd 0.11.0 (Imágenes). rayito doctor exige el rayd del tag rayd-v0.11.0 para el SDK 0.11 y da FAIL en la comprobación compatibility con una imagen 0.10.

  3. Si usas el agente, reconstruye su imagen con AgentTemplate o rayito agent template build para que arranque antes. Si tu código usa el stack científico en run_code, pasa kernel_warmup=True (arriba).

No hay cambios incompatibles en la API pública de 0.10.x.