Per impostazione predefinita, Managed Agents esegue strumenti e codice all'interno di sandbox cloud gestite da Anthropic. Le sandbox self-hosted mantengono l'orchestrazione dal lato di Anthropic ma spostano l'esecuzione degli strumenti nell'infrastruttura che controlli, così il codice dell'agente, il filesystem e il traffico di rete in uscita non lasciano mai il tuo ambiente.
L'esecuzione degli strumenti rimane sul tuo host: il filesystem che l'agente legge e scrive, i processi che avvia e la rete che può raggiungere sono tutti sotto il tuo controllo. Gli input e gli output degli strumenti continuano a fluire verso il control plane di Anthropic (dove viene eseguito Claude) in modo che il modello possa vedere i risultati e determinare cosa fare dopo. Consulta il modello di sicurezza per il confine completo del flusso di dati.
Le sandbox self-hosted supportano tutti i modelli Claude disponibili in Managed Agents, incluso Claude Opus 4.8. Il modello è configurato sull'agente, non sull'ambiente.
| Ambiente cloud | Sandbox self-hosted | |
|---|---|---|
| Dove vengono eseguiti gli strumenti | Sandbox gestite da Anthropic | La tua infrastruttura |
| Portata di rete | Controlli di egress di Anthropic | La tua policy di rete |
| Montaggio di file e repository GitHub | Gestito da Anthropic | Gestito da te |
| Ciclo di vita | Gestito da Anthropic | Gestito da te |
Il self-hosting è una buona scelta quando l'agente deve operare su dati che non possono lasciare il confine della tua rete, raggiungere servizi interni che non sono instradabili pubblicamente o essere eseguito sotto i controlli di conformità e audit della tua organizzazione.
Per l'idoneità a Zero Data Retention e HIPAA BAA, consulta API e conservazione dei dati.
Il self-hosting controlla dove viene eseguito il codice dell'agente. I tunnel MCP controllano come Anthropic raggiunge i server MCP nella tua rete. Sono indipendenti: una sessione in esecuzione nelle sandbox cloud di Anthropic può comunque raggiungere server MCP privati attraverso un tunnel, e una sessione self-hosted può usare server MCP sia tramite tunnel che pubblici. Usa entrambi quando vuoi che l'esecuzione e l'accesso agli strumenti rimangano all'interno del tuo confine.
Questa guida descrive come costruire un worker con qualsiasi piattaforma di sandboxing generica. Sono disponibili guide aggiuntive specifiche per piattaforma per AWS Lambda MicroVMs, Blaxel, Cloudflare, Daytona, E2B, GKE Agent Sandbox, Modal, Namespace, Superserve e Vercel.
Un "environment worker" (worker dell'ambiente) è un processo che esegui sulla tua infrastruttura. Riceve richieste di esecuzione degli strumenti da Anthropic e le esegue localmente. L'ambiente self_hosted funge da coda di lavoro: quando una sessione gli viene assegnata, Anthropic accoda la sessione come elemento di lavoro. Il tuo worker rivendica gli elementi di lavoro da quella coda, avvia un contesto di esecuzione per ciascuno, scarica le skill dell'agente (risorse riutilizzabili basate su filesystem che forniscono all'agente competenze specifiche di dominio), esegue le chiamate agli strumenti e pubblica i risultati.
Gli elementi di lavoro vengono rivendicati tramite polling della coda dell'ambiente: o da un worker sempre attivo che esegue il polling continuamente, o da un handler attivato da webhook che si risveglia su session.status_run_started e inizia il polling.
La CLI e l'SDK includono entrambi worker pre-costruiti. La CLI ant supporta solo il pattern sempre attivo; l'SDK supporta sia il pattern sempre attivo che quello attivato da webhook. Entrambi sono configurabili: consulta Worker self-hosted nel riferimento per i flag della CLI, e Helper dell'SDK in questa pagina per le opzioni dell'SDK. Per un maggiore controllo, chiama direttamente gli endpoint Environments Work e implementa il tuo worker.
/workspace: la directory di lavoro predefinita del sistema per l'esecuzione degli strumenti e il download delle skill. Il flag --workdir della CLI ha come valore predefinito la directory corrente; passa --workdir /workspace per corrispondere al valore predefinito del sistema. Le skill vengono scaricate in <workdir>/skills/<name>/. Se usi una directory di lavoro diversa, aggiorna il prompt di sistema del tuo agente in modo che Claude possa individuare i file delle skill./mnt/session/outputs: l'harness del worker istruisce Claude a scrivere qui i deliverable finali. In modalità sandbox, monta una directory dell'host in questo percorso per recuperare gli output dopo la fine della sessione. In modalità in-process, gli strumenti file del worker scrivono invece nella directory di lavoro, quindi questo percorso non si applica.Ti servono:
/bin/bash esattamente in quel percorso. Lo strumento bash del worker lo invoca direttamente, senza consultare PATH. L'SDK TypeScript richiede inoltre unzip e tar nel PATH e Node.js 22 o successivo; gli SDK Python e Go usano le loro librerie standard per l'estrazione degli archivi e non hanno requisiti binari aggiuntivi.ant o un SDK Anthropic (Python, TypeScript o Go) sull'host del worker.Su Claude Platform on AWS, il worker si autentica con AWS IAM (SigV4) o con una chiave API generata nella Console AWS, non con una chiave di ambiente. Collega la policy gestita AnthropicSelfHostedEnvironmentAccess al principal IAM con cui viene eseguito il tuo worker. Le chiavi di ambiente generate nella Claude Console non funzionano con l'endpoint di Claude Platform on AWS.
Crea un ambiente self-hosted
Nella Console: Workspace > Environments > New > Self-hosted
Oppure tramite l'API:
client = anthropic.Anthropic()
environment = client.beta.environments.create(
name="self-hosted", config={"type": "self_hosted"}
)
print(environment.id)Genera una chiave di ambiente
Nella Console, apri l'ambiente e fai clic su Generate environment key. La generazione delle chiavi è disponibile solo nella Console, indipendentemente dal fatto che tu abbia creato l'ambiente tramite la Console o l'API. Quindi esporta l'ID e la chiave dell'ambiente sull'host del worker:
export ANTHROPIC_ENVIRONMENT_KEY="sk-ant-oat01-..."
export ANTHROPIC_ENVIRONMENT_ID="env_..."Le skill possono includere eseguibili che l'agente può eseguire direttamente. I worker della CLI e dell'SDK preservano i permessi di esecuzione registrati nel bundle della skill quando lo estraggono. Se implementi manualmente il download delle skill, sei responsabile dell'impostazione dei permessi di esecuzione.
Scegli sempre attivo per la configurazione più semplice: un processo a lunga esecuzione esegue il polling della coda continuamente e necessita solo di HTTPS in uscita. Scegli attivato da webhook per evitare di eseguire un poller inattivo; richiede un endpoint webhook che Anthropic possa raggiungere (consulta Webhook per la configurazione dell'endpoint e la verifica della firma).
Installa la CLI ant
Esegui questo sull'host del worker.
Per gli ambienti Linux, scarica direttamente il binario di rilascio.
VERSION=1.15.0
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
case $(uname -m) in
x86_64) ARCH=amd64 ;;
aarch64) ARCH=arm64 ;;
esac
curl -fsSL "https://github.com/anthropics/anthropic-cli/releases/download/v${VERSION}/ant_${VERSION}_${OS}_${ARCH}.tar.gz" \
| sudo tar -xz -C /usr/local/bin antPuoi trovare tutte le release nella pagina delle release su GitHub.
Esegui il worker
In-process
ant beta:worker poll rivendica gli elementi di lavoro assegnati all'ambiente, scarica le skill, esegue le chiamate agli strumenti nella directory di lavoro e pubblica i risultati. Legge ANTHROPIC_ENVIRONMENT_KEY e ANTHROPIC_ENVIRONMENT_ID dall'ambiente.
ant beta:worker poll \
--workdir "/workspace"Il worker termina in modo pulito su SIGTERM o SIGINT, completando le chiamate agli strumenti in corso prima di fermarsi.
Sandbox per sessione
Se hai bisogno di un isolamento più forte (un filesystem nuovo, limiti di risorse o controlli di rete per sessione), esegui ogni sessione nella propria sandbox. Costruisci un'immagine con ant installato e ant beta:worker run come entrypoint. L'immagine di base deve fornire /bin/bash; curl viene usato solo in fase di build. Quando una sandbox si avvia, legge i dettagli della sessione dalle variabili d'ambiente, gestisce quella sessione ed esce:
FROM your-base-image
ARG ANT_VERSION=1.15.0
ARG TARGETARCH
RUN ARCH=$([ "$TARGETARCH" = "arm64" ] && echo arm64 || echo amd64) && \
curl -fsSL "https://github.com/anthropics/anthropic-cli/releases/download/v${ANT_VERSION}/ant_${ANT_VERSION}_linux_${ARCH}.tar.gz" \
| tar -xz -C /usr/local/bin ant
WORKDIR /workspace
VOLUME /mnt/session/outputs
ENTRYPOINT ["ant", "beta:worker", "run"]Quindi scrivi uno script di spawn che inoltra i dettagli della sessione in una nuova sandbox. Il poller inietta ANTHROPIC_SESSION_ID, ANTHROPIC_WORK_ID, ANTHROPIC_ENVIRONMENT_ID e ANTHROPIC_ENVIRONMENT_KEY nell'ambiente dello script. ANTHROPIC_BASE_URL è opzionale e viene passato solo se era impostato sull'host del poller; sovrascrive l'endpoint API predefinito. Nell'esempio, /host/outputs è una directory dell'host che scegli tu; viene montata in bind su /mnt/session/outputs della sandbox in modo da poter recuperare i deliverable della sessione dopo che la sandbox è terminata.
#!/bin/bash
# spawn.sh: chiamato una volta per ogni elemento di lavoro rivendicato
mkdir -p "/host/outputs/$ANTHROPIC_SESSION_ID"
exec docker run --rm \
-e ANTHROPIC_SESSION_ID -e ANTHROPIC_ENVIRONMENT_KEY \
-e ANTHROPIC_WORK_ID -e ANTHROPIC_ENVIRONMENT_ID -e ANTHROPIC_BASE_URL \
-v "/host/outputs/$ANTHROPIC_SESSION_ID":/mnt/session/outputs \
your-imageAvvia il poller puntando allo script:
ant beta:worker poll \
--on-work ./spawn.shL'SDK fornisce tre helper a diversi livelli di controllo. EnvironmentWorker copre la maggior parte dei casi d'uso; passa agli helper di livello inferiore quando devi avviare il tuo processo per sessione o eseguire strumenti su una sessione già rivendicata.
EnvironmentWorker: il worker pronto all'uso. Gestisce polling, configurazione ed esecuzione end to end.
.run(): viene eseguito indefinitamente, prendendo in carico le sessioni man mano che arrivano..handle_item(): gestisce un singolo elemento di lavoro rivendicato ed esce. Passa esplicitamente gli identificatori di lavoro, sessione e ambiente, oppure lascia che legga le variabili ANTHROPIC_* che ant beta:worker poll --on-work imposta per il processo che avvia.work.poller(): esegue il polling della coda di lavoro per tuo conto e ti fornisce ogni sessione rivendicata. Usalo quando vuoi decidere cosa succede per ogni sessione, ad esempio avviare una sandbox invece di eseguire gli strumenti in-process.
drain: se interrompere il polling una volta che la coda è vuota invece di attendere nuovo lavoro.block_ms: quanto tempo attendere l'arrivo del lavoro prima di restituire, in millisecondi. Deve essere compreso tra 1 e 999 (attesa per singolo poll; l'helper ripete il polling automaticamente). Passa null (None in Python, param.Null[int64]() in Go) per un controllo non bloccante; omettere il parametro usa il long-poll predefinito di 999 ms.reclaim_older_than_ms: rivendica nuovamente gli elementi di lavoro che sono stati rivendicati ma mai confermati entro questo numero di millisecondi.auto_stop: se pubblicare un segnale di stop per ogni elemento di lavoro una volta che il corpo del tuo loop ha finito con esso. Il poller Go non ha opzione di disattivazione e pubblica sempre il segnale di stop, quindi blocca nel corpo del loop fino al completamento della sessione invece di scollegarti.client.beta.sessions.events.tool_runner(): esegue le chiamate agli strumenti per una singola sessione, dati l'ID della sessione e un elenco di strumenti. Usalo quando hai già rivendicato il lavoro e ti serve solo il livello di esecuzione.Usa direttamente il work poller quando vuoi avviare il tuo processo per sessione, ad esempio avviando una sandbox per ogni sessione rivendicata:
import asyncio
import os
from anthropic import AsyncAnthropic
from anthropic.types.beta.environments import BetaSelfHostedWork
async def launch_container(work: BetaSelfHostedWork) -> None:
# Sostituisci con il tuo launcher di sandbox per sessione. Passa
# ANTHROPIC_ENVIRONMENT_KEY alla sandbox avviata, mai
# la tua chiave API.
print(f"claimed session {work.data.id}")
async def main() -> None:
environment_key = os.environ["ANTHROPIC_ENVIRONMENT_KEY"]
environment_id = os.environ["ANTHROPIC_ENVIRONMENT_ID"]
async with AsyncAnthropic(auth_token=environment_key) as client:
async for work in client.beta.environments.work.poller(
environment_id=environment_id,
environment_key=environment_key,
auto_stop=False, # the launched sandbox owns the stop call
):
await launch_container(work)
asyncio.run(main())AgentToolContext è il contesto di esecuzione per le chiamate agli strumenti. Definisce la directory di lavoro e la policy dei percorsi, e può scaricare le skill della sessione. beta_agent_toolset_20260401(env) prende un AgentToolContext e restituisce le implementazioni standard degli strumenti (bash, read, write, edit, glob, grep).
Con EnvironmentWorker: entrambi sono gestiti automaticamente. Passa una factory tools per personalizzare l'elenco degli strumenti:
EnvironmentWorker(client, ..., tools=lambda env: [beta_bash_tool(env), my_custom_tool])Con work.poller() e tool_runner(): passa un elenco di strumenti come tools a client.beta.sessions.events.tool_runner(). Per costruire quell'elenco, configura tu stesso AgentToolContext e chiama beta_agent_toolset_20260401(env):
from anthropic.lib.tools.agent_toolset import (
AgentToolContext,
beta_agent_toolset_20260401,
)
async with AgentToolContext(
workdir="/workspace", client=client, session_id=work.data.id
) as env:
# skills scaricate in /workspace/skills/<name>/
tools = beta_agent_toolset_20260401(env)Da una shell separata, con ANTHROPIC_API_KEY impostata sulla tua chiave API Claude (non la chiave di ambiente), conferma che workers_polling sia almeno 1:
ant beta:environments:work stats --environment-id "$ANTHROPIC_ENVIRONMENT_ID"Se workers_polling rimane a 0, il worker non sta raggiungendo la coda: conferma che ANTHROPIC_ENVIRONMENT_KEY e ANTHROPIC_ENVIRONMENT_ID siano impostati sull'host del worker. Consulta Leggi la profondità della coda per la risposta completa delle statistiche e gli esempi in altri linguaggi.
Una volta che il tuo worker è in esecuzione, crea una sessione che punta all'ambiente. Imposta AGENT_ID sull'ID agente che hai annotato in Prima di iniziare. La sessione entra nella coda di lavoro dell'ambiente e attende lì finché un worker non la rivendica; se nessun worker è connesso, la sessione rimane in coda invece di fallire.
Anthropic non monta file o repository GitHub nelle sandbox self-hosted. Per rendere disponibili file specifici della sessione, passa riferimenti ai file (come un percorso S3 o uno SHA di commit) nel campo metadata della sessione. Il tuo script di spawn o l'handler --on-work legge quei metadati dall'elemento di lavoro rivendicato (il poller della CLI invia il JSON dell'elemento di lavoro allo stdin dello script, e gli handler dell'SDK possono leggerlo tramite gli endpoint Environments Work) e prepara i file nella directory di lavoro prima che inizi l'esecuzione degli strumenti.
session = client.beta.sessions.create(
agent=agent.id,
environment_id=environment.id,
metadata={"input_file": "s3://my-bucket/data.csv"},
)La memoria non è attualmente supportata con le sandbox self-hosted.
Consulta Worker self-hosted nel riferimento per l'elenco completo dei flag della CLI, e Helper dell'SDK per le opzioni degli helper dell'SDK.
Queste chiamate vengono eseguite dai tuoi strumenti di monitoraggio o operazioni, autenticate con la tua chiave API Claude, per osservare e gestire la flotta di worker. Il loop di claim e keep-alive è gestito all'interno degli helper del worker, quindi non chiami direttamente quegli endpoint.
Questi endpoint si autenticano con la chiave API della tua organizzazione, non con la chiave di ambiente. Chiamali dall'esterno dell'host del worker. Impostare ANTHROPIC_API_KEY sull'host del worker espone una credenziale con ambito organizzazione alle chiamate agli strumenti dell'agente.
work.stats restituisce lo stato della coda per un ambiente:
depth è il numero di elementi in attesa di essere rivendicati. Scala la tua flotta di worker o genera avvisi sul backlog in base a questo valore.pending è il numero di elementi che un worker ha rivendicato e sta attualmente elaborando.oldest_queued_at è il timestamp dell'elemento più vecchio ancora in coda o in elaborazione, oppure null quando non ce n'è nessuno.workers_polling è il numero di worker che hanno eseguito il polling negli ultimi 30 secondi. Usalo per gli avvisi di liveness.import os
import anthropic
client = anthropic.Anthropic()
stats = client.beta.environments.work.stats(os.environ["ANTHROPIC_ENVIRONMENT_ID"])
print(f"depth={stats.depth} pending={stats.pending}"){
"type": "work_queue_stats",
"depth": 0,
"pending": 0,
"oldest_queued_at": null,
"workers_polling": 0
}Usa work.stop per chiedere al worker che gestisce una sessione specifica di arrestarla in modo pulito. Il worker completa qualsiasi chiamata agli strumenti in corso, pubblica uno stato finale e rilascia la sessione. Passa force: true nel corpo della richiesta (con la CLI, passa --force) per interrompere immediatamente invece di attendere il completamento della chiamata allo strumento corrente.
Poiché queste chiamate vengono eseguite dai tuoi strumenti operativi anziché dall'host del worker, ANTHROPIC_WORK_ID non viene impostato automaticamente. Impostalo sull'ID dell'elemento di lavoro di destinazione prima di eseguire gli esempi seguenti. Per trovare l'ID di un elemento di lavoro, elenca gli elementi di lavoro dell'ambiente tramite gli endpoint Environments Work.
import os
import anthropic
client = anthropic.Anthropic()
work = client.beta.environments.work.stop(
os.environ["ANTHROPIC_WORK_ID"],
environment_id=os.environ["ANTHROPIC_ENVIRONMENT_ID"],
)
print(work.state)Modello di responsabilità condivisa per gli ambienti sandbox self-hosted.
Crea una sessione per eseguire il tuo agente e iniziare a eseguire attività.
Connetti in modo sicuro Claude ai server MCP in esecuzione nella tua rete privata senza aprire porte in ingresso o esporre servizi a internet pubblico.
Was this page helpful?