Puertos y host¶
sbx.get_host(port) te da la dirección pública de un puerto del sandbox:
arranca un servidor dentro y llega a él por HTTPS a través del proxy de AWS.
Cuándo usarlo¶
- Previsualizar una app web que el agente acaba de generar.
- Llamar desde tu backend a una API que corre dentro del sandbox.
- Para usarlo desde un navegador o con
curlsin cabeceras, el proxy local de la CLI.
Ejemplo rápido¶
import urllib.request
from rayito import Sandbox
with Sandbox.create() as sbx:
sbx.commands.run("python3 -m http.server 3000", background=True, timeout=None)
host = sbx.get_host(3000) # (1)!
request = urllib.request.Request(f"https://{host}/", headers=host.headers) # (2)!
with urllib.request.urlopen(request) as response:
print(response.status) # 200
- Un
strcon el hostname del sandbox, como en E2B, másurl,portyheaders. - Toda petición necesita las cabeceras del proxy de AWS
(
X-aws-proxy-authyX-aws-proxy-port).
import asyncio
import urllib.request
from rayito import AsyncSandbox
async def main() -> None:
async with await AsyncSandbox.create() as sbx:
await sbx.commands.run("python3 -m http.server 3000", background=True, timeout=None)
host = await sbx.get_host(3000)
request = urllib.request.Request(f"https://{host}/", headers=host.headers)
with await asyncio.to_thread(urllib.request.urlopen, request) as response:
print(response.status) # 200
asyncio.run(main())
import { Sandbox } from "rayito";
await using sbx = await Sandbox.create();
await sbx.commands.run("python3 -m http.server 3000", { background: true, timeoutMs: 0 });
const host = await sbx.getHost(3000);
const response = await fetch(host.url, { headers: host.headers });
console.log(response.status); // 200
import urllib.request
from rayito.e2b import Sandbox
with Sandbox.create() as sbx:
sbx.commands.run("python3 -m http.server 3000", background=True, timeout=None)
host = sbx.get_host(3000) # (1)!
request = urllib.request.Request(f"https://{host}/", headers=host.headers)
with urllib.request.urlopen(request) as response:
print(response.status) # 200
- El mismo
HostAccessque el SDK nativo. En el shim de TypeScript,getHost(port)devuelve sólo el hostname y las cabeceras salen deawait sbx.getHostHeaders(port).
Paso a paso¶
- El servidor del sandbox debe escuchar en un puerto libre. Dos están
ocupados por
rayd: el 8080 (su gRPC, por donde habla el SDK) y el 9000 (los hooks de Lambda).get_host()sólo rechaza el 9000; unget_host(8080)llega arayd, no a tu aplicación. Puede escuchar en127.0.0.1o en0.0.0.0: el proxy de AWS corre dentro del MicroVM. get_host(port)acuña un token del proxy para ese puerto (un JWE que dura 60 min) y lo renueva solo a los 45 min mientras el handle viva.host.headerssiempre devuelve el token vigente: léelo en cada petición, no lo guardes.- La conexión es HTTPS hasta el proxy de AWS, que habla HTTP en claro (o HTTP/2 sin TLS) con tu servidor. Un servidor HTTPS dentro del sandbox no funciona detrás del proxy.
Las cabeceras son una credencial
Quien tenga host.headers puede llegar a ese puerto mientras el token
sea válido. No las envíes a un navegador de terceros ni las registres en
logs. Para compartir una previsualización, pon tu propio proxy con
autenticación delante.
Opciones¶
| Python | TypeScript | Qué hace |
|---|---|---|
get_host(port) → HostAccess |
getHost(port) → HostAccess |
hostname, url, port y headers del proxy |
create(allowed_ports=[...]) |
create({ allowedPorts: [...] }) |
puertos extra del token principal del sandbox (8080 siempre); get_host no lo necesita: acuña un token por puerto |
Errores y solución de problemas¶
| Síntoma | Causa | Qué hacer |
|---|---|---|
403 del proxy |
faltan las cabeceras o el token caducó | usa host.headers en cada petición |
502 del proxy |
nada escucha en ese puerto todavía, o el sandbox está terminando | espera a que el servidor arranque; comprueba con commands.run("curl -s localhost:3000") |
InvalidArgumentException / InvalidArgumentError |
puerto fuera de 1–65535 o el 9000 | usa otro puerto (y tampoco el 8080, que es de rayd) |
| el sandbox estaba suspendido | la primera petición lo despierta (auto-resume) | normal: tarda ≈ 0,7 s más |
Diferencias con E2B¶
- E2B da una URL pública sin cabeceras; en Rayito toda petición lleva las
cabeceras del proxy de AWS. En el shim de TypeScript,
getHost(port)es síncrono y devuelve sólo el hostname; las cabeceras salen deawait sbx.getHostHeaders(port). https_portsde E2B (un servidor HTTPS en el sandbox) no existe: el proxy no reenvía TLS hasta el sandbox.
Ver también¶
- Proxy local
- Dominio propio (experimental, opcional y con coste): una URL de tu dominio delante de un puerto del sandbox
- Comandos: arrancar el servidor en segundo plano
- Seguridad