4 4
5# Hospedagem do Agent SDK5# Hospedagem do Agent SDK
6 6
7> Implante o Agent SDK em produção: arquitetura de subprocess, persistência de sessão, escalabilidade, observabilidade e isolamento multi-tenant para Docker, Kubernetes e provedores de sandbox.7> Implante o Agent SDK em produção: arquitetura de subprocess, persistência de sessão, dimensionamento, observabilidade e isolamento multi-tenant para Docker, Kubernetes e provedores de sandbox.
8 8
9O Agent SDK cria e supervisiona um subprocess `claude` CLI que possui um shell, um diretório de trabalho e arquivos de sessão no disco. Hospedá-lo não é como hospedar um wrapper de API sem estado. Cada agente em execução é um processo de longa duração vinculado ao estado local, o que molda como você aloca recursos, persiste sessões e escala entre tenants.9O Agent SDK cria e supervisiona um subprocess `claude` CLI que possui um shell, um diretório de trabalho e arquivos de sessão no disco. Hospedá-lo não é como hospedar um wrapper de API sem estado. Cada agente em execução é um processo de longa duração vinculado ao estado local, o que molda como você aloca recursos, persiste sessões e dimensiona entre tenants.
10 10
11Esta página aborda a auto-hospedagem em sua própria infraestrutura: compreenda [o modelo de subprocess](#the-subprocess-model), [escolha um padrão de sessão](#choose-a-session-pattern), [provisione o container](#provision-the-container) e [trate as preocupações de produção](#handle-production-concerns) como persistência, observabilidade, autenticação e isolamento multi-tenant. Para Dockerfiles implantáveis e manifestos Kubernetes, consulte o [hosting cookbook](https://github.com/anthropics/claude-cookbooks/tree/main/claude_agent_sdk/hosting).11Esta página aborda a auto-hospedagem em sua própria infraestrutura. Para Dockerfiles implantáveis e manifestos Kubernetes, consulte o [hosting cookbook](https://github.com/anthropics/claude-cookbooks/tree/main/claude_agent_sdk/hosting).
12 12
13Se você não precisa de controle de infraestrutura, isolamento personalizado ou seu próprio plano de dados, considere [Managed Agents](https://platform.claude.com/docs/pt/managed-agents/overview) em vez disso: uma API REST hospedada onde a Anthropic executa o agente e o sandbox, para que sua aplicação envie eventos e transmita resultados de volta sem nenhuma infraestrutura de hospedagem para operar.13Se você não precisar de controle de infraestrutura, isolamento personalizado ou seu próprio plano de dados, considere [Managed Agents](https://platform.claude.com/docs/en/managed-agents/overview) em vez disso: uma API REST hospedada onde a Anthropic executa o agente e o sandbox, para que sua aplicação envie eventos e transmita resultados novamente sem nenhuma infraestrutura de hospedagem para operar.
14
15<Info>
16 Para endurecimento de segurança além da sandboxing básica, incluindo controles de rede, gerenciamento de credenciais e opções de isolamento, consulte [Implantação Segura](/pt/agent-sdk/secure-deployment).
17</Info>
18 14
19<h2 id="the-subprocess-model">15<h2 id="the-subprocess-model">
20 O modelo de subprocess16 O modelo de subprocess
21</h2>17</h2>
22 18
23Cada decisão de hospedagem nesta página segue de como o SDK executa o agente. Quando seu código chama `query()`, o SDK spawna um processo CLI `claude` separado e se comunica com ele via stdio. Esse subprocess possui o shell, o diretório de trabalho e os transcripts de sessão JSONL no disco local.19Cada decisão de hospedagem nesta página segue de como o SDK executa o agente. Quando seu código chama `query()`, o SDK gera um processo CLI `claude` separado e se comunica com ele via stdio. Esse subprocess possui o shell, o diretório de trabalho e as transcrições de sessão JSONL no disco local.
20
21<img src="https://mintcdn.com/claude-code/ikqp3_70mqIahteV/images/agent-sdk/hosting-subprocess.svg?fit=max&auto=format&n=ikqp3_70mqIahteV&q=85&s=9dac857ca9d3b1410c3734900c386004" className="dark:hidden" alt="Fluxo de solicitação: cliente para seu aplicativo, que gera um subprocess CLI claude via stdio dentro do contêiner; o subprocess escreve no disco local e chama api.anthropic.com via HTTPS" width="920" height="220" data-path="images/agent-sdk/hosting-subprocess.svg" />
24 22
25<img src="https://mintcdn.com/claude-code/ikqp3_70mqIahteV/images/agent-sdk/hosting-subprocess.svg?fit=max&auto=format&n=ikqp3_70mqIahteV&q=85&s=9dac857ca9d3b1410c3734900c386004" alt="Fluxo de solicitação: cliente para seu aplicativo, que spawna um subprocess CLI claude via stdio dentro do container; o subprocess escreve no disco local e chama api.anthropic.com via HTTPS" width="920" height="220" data-path="images/agent-sdk/hosting-subprocess.svg" />23<img src="https://mintcdn.com/claude-code/_xqph1dUOslCOwsj/images/agent-sdk/hosting-subprocess-dark.svg?fit=max&auto=format&n=_xqph1dUOslCOwsj&q=85&s=3fdeff3d7f44b2b67762668acfbb25f5" className="hidden dark:block" alt="Fluxo de solicitação: cliente para seu aplicativo, que gera um subprocess CLI claude via stdio dentro do contêiner; o subprocess escreve no disco local e chama api.anthropic.com via HTTPS" width="920" height="220" data-path="images/agent-sdk/hosting-subprocess-dark.svg" />
26 24
27Uma sessão de agente mapeia para um subprocess. Executar N sessões concorrentes significa N subprocessos, cada um com sua própria árvore de processos e arquivo de transcript. Por padrão, todos herdam o diretório de trabalho do seu aplicativo, então passe `cwd` em cada chamada `query()` quando as sessões precisarem de sistemas de arquivos separados:25Uma sessão de agente mapeia para um subprocess. Executar N sessões simultâneas significa N subprocessos, cada um com sua própria árvore de processos e arquivo de transcrição. Por padrão, todos herdam o diretório de trabalho do seu aplicativo. Quando as sessões precisam de sistemas de arquivos separados, passe um `cwd` distinto nas opções da chamada `query()` de cada sessão:
28 26
29<CodeGroup>27<CodeGroup>
30 ```typescript TypeScript theme={null}28 ```typescript TypeScript theme={null}
31 query({ prompt, options: { cwd: "/work/session-a" } })29 import { query } from "@anthropic-ai/claude-agent-sdk";
30
31 for await (const message of query({
32 prompt: "Summarize the files in this directory",
33 options: { cwd: "/work/session-a" },
34 })) {
35 console.log(message);
36 }
32 ```37 ```
33 38
34 ```python Python theme={null}39 ```python Python theme={null}
35 query(prompt=prompt, options=ClaudeAgentOptions(cwd="/work/session-a"))40 import asyncio
41
42 from claude_agent_sdk import ClaudeAgentOptions, query
43
44
45 async def main():
46 async for message in query(
47 prompt="Summarize the files in this directory",
48 options=ClaudeAgentOptions(cwd="/work/session-a"),
49 ):
50 print(message)
51
52
53 asyncio.run(main())
36 ```54 ```
37</CodeGroup>55</CodeGroup>
38 56
57Os exemplos de TypeScript nesta página usam `await` de nível superior, portanto salve-os como arquivos `.mts` ou defina `"type": "module"` em `package.json`.
58
39<h3 id="state-that-lives-on-local-disk">59<h3 id="state-that-lives-on-local-disk">
40 Estado que vive no disco local60 Estado que reside no disco local
41</h3>61</h3>
42 62
43Três tipos de estado de agente vivem no sistema de arquivos do container por padrão. Nenhum deles sobrevive a um reinício de container, um scale-down ou uma mudança para um nó diferente.63Três tipos de estado de agente residem no sistema de arquivos do contêiner por padrão. Nenhum deles sobrevive a uma reinicialização de contêiner, uma redução de escala ou uma mudança para um nó diferente.
44 64
45| Estado | Localização padrão |65| Estado | Localização padrão |
46| ---------------------------------- | --------------------------------------------------------------------------------------------------------- |66| ---------------------------------- | --------------------------------------------------------------------------------------------------------- |
47| Transcripts de sessão | `~/.claude/projects/`, ou o diretório `projects/` sob `CLAUDE_CONFIG_DIR` se definido |67| Transcrições de sessão | `~/.claude/projects/`, ou o diretório `projects/` sob `CLAUDE_CONFIG_DIR` se definido |
48| Arquivos de memória `CLAUDE.md` | `~/.claude/CLAUDE.md` para o nível de usuário e o diretório de trabalho da sessão para o nível de projeto |68| Arquivos de memória `CLAUDE.md` | `~/.claude/CLAUDE.md` para o nível de usuário e o diretório de trabalho da sessão para o nível de projeto |
49| Artefatos do diretório de trabalho | O diretório de trabalho da sessão |69| Artefatos do diretório de trabalho | O diretório de trabalho da sessão |
50 70
51Para persistir transcripts entre hosts, configure um adaptador [`SessionStore`](/pt/agent-sdk/session-storage). Arquivos de memória e outros artefatos do diretório de trabalho precisam de sua própria estratégia de armazenamento, como um volume montado ou uma sincronização de object-store.71Para persistir transcrições entre hosts, configure um adaptador [`SessionStore`](/docs/pt/agent-sdk/session-storage). Arquivos de memória e outros artefatos do diretório de trabalho precisam de sua própria estratégia de armazenamento, como um volume montado ou uma sincronização de armazenamento de objetos.
52 72
53Para saber como sessões, retomada e forking funcionam no nível da API, consulte [Sessions](/pt/agent-sdk/sessions).73Para saber como sessões, retomada e bifurcação funcionam no nível da API, consulte [Sessions](/docs/pt/agent-sdk/sessions).
54 74
55<h2 id="choose-a-session-pattern">75<h2 id="choose-a-session-pattern">
56 Escolha um padrão de sessão76 Escolha um padrão de sessão
66 86
67Os exemplos de carga de trabalho incluem investigação e correção de bugs, extração de faturas e recibos, tradução de documentos e transformação de mídia.87Os exemplos de carga de trabalho incluem investigação e correção de bugs, extração de faturas e recibos, tradução de documentos e transformação de mídia.
68 88
69O container executa um ponto de entrada único que chama o SDK e sai. O exemplo abaixo mostra uma versão TypeScript mínima. Salve-o como `entrypoint.mts` ou defina `"type": "module"` em `package.json` para que `await` de nível superior esteja disponível.89O container executa um ponto de entrada único que lê a tarefa da variável de ambiente `TASK_PROMPT`, chama o SDK e sai.
70 90
71```typescript theme={null}91<CodeGroup>
72import { query } from "@anthropic-ai/claude-agent-sdk";92 ```typescript TypeScript theme={null}
93 import { query } from "@anthropic-ai/claude-agent-sdk";
73 94
74const prompt = process.env.TASK_PROMPT!;95 const prompt = process.env.TASK_PROMPT!;
75for await (const message of query({ prompt, options: { maxTurns: 20 } })) {96 for await (const message of query({ prompt, options: { maxTurns: 20 } })) {
76 console.log(message);97 console.log(message);
77}98 }
78```99 ```
100
101 ```python Python theme={null}
102 import asyncio
103 import os
104
105 from claude_agent_sdk import ClaudeAgentOptions, query
106
107
108 async def main():
109 async for message in query(
110 prompt=os.environ["TASK_PROMPT"],
111 options=ClaudeAgentOptions(max_turns=20),
112 ):
113 print(message)
114
115
116 asyncio.run(main())
117 ```
118</CodeGroup>
119
120O script imprime cada mensagem conforme chega, incluindo uma mensagem de resultado cujo `subtype` é `success` quando a tarefa é concluída dentro do limite de turnos. Se a tarefa atingir o limite de 20 turnos, o `subtype` da mensagem de resultado é `error_max_turns` e a chamada `query()` gera um erro após produzi-lo, então envolva o loop em um bloco try se o container precisar sair de forma limpa. Veja [Lidar com o resultado](/docs/pt/agent-sdk/agent-loop#handle-the-result) para os subtipos de erro.
79 121
80<h3 id="long-running-sessions">122<h3 id="long-running-sessions">
81 Sessões de longa duração123 Sessões de longa duração
82</h3>124</h3>
83 125
84Execute instâncias de container persistentes, frequentemente hospedando múltiplos processos SDK por container, para servir trabalho contínuo. Melhor para agentes que tomam ações autônomas, servem conteúdo ou lidam com fluxos de mensagens de alto volume.126Execute instâncias de container persistentes, frequentemente hospedando múltiplos processos SDK por container, para servir trabalho contínuo. Melhor para agentes que tomam ação autônoma, servem conteúdo ou lidam com fluxos de mensagens de alto volume.
85 127
86Os exemplos de carga de trabalho incluem um agente de email que triagem e responde a emails recebidos, um construtor de site que hospeda um site editável por usuário através de portas de container e um chatbot que lida com tráfego contínuo de uma plataforma como Slack.128Os exemplos de carga de trabalho incluem um agente de email que triagem e responde a emails recebidos, um construtor de sites que hospeda um site editável por usuário através de portas de container, e um chatbot que lida com tráfego contínuo de uma plataforma como Slack.
87 129
88O container expõe um endpoint HTTP ou WebSocket e mapeia cada sessão ativa para uma query de longa duração e o subprocesso por trás dela. Em TypeScript, use [`streamInput()`](/pt/agent-sdk/typescript#query-object) para adicionar turnos a uma sessão ativa e [`startup()`](/pt/agent-sdk/typescript#startup) para pré-aquecer subprocessos antes do tráfego recebido. Em Python, use [`ClaudeSDKClient`](/pt/agent-sdk/python#claudesdkclient) para manter uma sessão aberta entre turnos. Dimensione o container para que ele possa manter o número máximo de sessões simultâneas na memória.130O container expõe um endpoint HTTP ou WebSocket e mapeia cada sessão ativa para uma query de longa duração e o subprocesso por trás dela. Em TypeScript, use [`streamInput()`](/docs/pt/agent-sdk/typescript#query-object) para adicionar turnos a uma sessão ativa e [`startup()`](/docs/pt/agent-sdk/typescript#startup) para pré-aquecer subprocessos antes do tráfego recebido. Em Python, use [`ClaudeSDKClient`](/docs/pt/agent-sdk/python#claudesdkclient) para manter uma sessão aberta entre turnos. Dimensione o container para que ele possa manter o número máximo de sessões simultâneas na memória.
89 131
90<h3 id="hybrid-sessions">132<h3 id="hybrid-sessions">
91 Sessões híbridas133 Sessões híbridas
92</h3>134</h3>
93 135
94Containers efêmeros que hidratam de um [`SessionStore`](/pt/agent-sdk/session-storage) na inicialização e persistem atualizações de volta. Melhor para sessões que abrangem muitas interações mas ficam ociosas entre elas. O container desliga durante períodos ociosos e volta a ligar quando o usuário retorna.136Containers efêmeros que hidratam de um [`SessionStore`](/docs/pt/agent-sdk/session-storage) na inicialização e persistem atualizações de volta. Melhor para sessões que abrangem muitas interações mas ficam ociosas entre elas. O container desliga durante períodos ociosos e volta a ligar quando o usuário retorna.
95 137
96Os exemplos de carga de trabalho incluem um gerenciador de projetos pessoais com check-ins intermitentes, pesquisa profunda que pausa e retoma ao longo de horas e um agente de suporte ao cliente que carrega histórico de tickets entre interações.138Os exemplos de carga de trabalho incluem um gerenciador de projetos pessoais com check-ins intermitentes, pesquisa profunda que pausa e retoma ao longo de horas, e um agente de suporte ao cliente que carrega histórico de tickets entre interações.
97 139
98Ajuste o tempo limite de ociosidade do seu provedor para a frequência com que você espera que os usuários retornem. Desligar um container sem um `SessionStore` configurado perde a transcrição com ele, então o store é necessário para este padrão, não opcional.140Ajuste o tempo limite de ociosidade do seu provedor com a frequência que você espera que os usuários retornem. Desligar um container sem um `SessionStore` configurado perde a transcrição com ele, então o store é necessário para este padrão, não opcional.
99 141
100O padrão depende de retomar uma sessão por ID com um store compartilhado anexado:142O padrão depende de retomar uma sessão por ID com um store compartilhado anexado:
101 143
116 ```158 ```
117 159
118 ```python Python theme={null}160 ```python Python theme={null}
119 from claude_agent_sdk import query, ClaudeAgentOptions161 from claude_agent_sdk import query, ClaudeAgentOptions, SessionStore
162 import asyncio
163
164 user_input: str = ...
165 session_id: str = ... # looked up from your database by user
166 session_store: SessionStore = ... # S3, Redis, Postgres, or your own adapter
120 167
168
169 async def main():
121 async for message in query(170 async for message in query(
122 prompt=user_input,171 prompt=user_input,
123 options=ClaudeAgentOptions(172 options=ClaudeAgentOptions(
124 resume=session_id, # looked up from your database by user173 resume=session_id,
125 session_store=session_store, # S3, Redis, Postgres, or your own adapter174 session_store=session_store,
126 ),175 ),
127 ):176 ):
128 ...177 ...
178
179
180 asyncio.run(main())
129 ```181 ```
130</CodeGroup>182</CodeGroup>
131 183
132Veja [Armazenamento de sessão](/pt/agent-sdk/session-storage) para a interface completa `SessionStore` e adaptadores de referência.
133
134<h3 id="multi-agent-container">184<h3 id="multi-agent-container">
135 Container multi-agente185 Container multi-agente
136</h3>186</h3>
137 187
138Execute múltiplos subprocessos SDK dentro de um container. Melhor para agentes que devem colaborar estreitamente, por exemplo simulações multi-agente onde os agentes interagem uns com os outros em um ambiente compartilhado.188Execute múltiplos subprocessos SDK dentro de um container. Melhor para agentes que devem colaborar estreitamente, por exemplo simulações multi-agente onde os agentes interagem uns com os outros em um ambiente compartilhado.
139 189
140Dê a cada agente seu próprio diretório de trabalho para que não sobrescrevam os arquivos uns dos outros e isole o carregamento de configurações para que arquivos `CLAUDE.md` por agente não vazem entre agentes. Veja [Isolamento multi-tenant](#multi-tenant-isolation) para as opções específicas.190Dê a cada agente seu próprio diretório de trabalho para que não sobrescrevam os arquivos uns dos outros, e isole o carregamento de configurações para que arquivos `CLAUDE.md` por agente não vazem entre agentes. Veja [Isolamento multi-tenant](#multi-tenant-isolation) para as opções específicas.
141 191
142<h2 id="provision-the-container">192<h2 id="provision-the-container">
143 Provisionar o container193 Provisionar o contêiner
144</h2>194</h2>
145 195
146<h3 id="container-based-sandboxing">196<h3 id="container-based-sandboxing">
147 Sandboxing baseado em container197 Sandboxing baseado em contêiner
148</h3>198</h3>
149 199
150Execute o SDK dentro de um container seguro para isolamento de processo, limites de recursos, controle de rede e um sistema de arquivos efêmero. Vários provedores se especializam em ambientes de container seguro que se adequam ao modelo do Agent SDK.200Execute o SDK dentro de um contêiner em sandbox para isolamento de processo, limites de recursos, controle de rede e um sistema de arquivos efêmero.
151 201
152Perguntas a responder ao escolher um provedor:202Perguntas a responder ao escolher um provedor:
153 203
154* **Quem executa o sandbox**: um provedor de sandbox-as-a-service opera a infraestrutura para você, enquanto as opções auto-hospedadas fornecem software para você executar em sua própria infraestrutura.204* **Quem executa o sandbox**: um provedor de sandbox-as-a-service opera a infraestrutura para você, enquanto as opções auto-hospedadas fornecem software para você executar em sua própria infraestrutura.
155* **Latência de cold-start**: quanto tempo desde "criar um sandbox" até "pronto para aceitar a primeira solicitação". Padrões efêmeros precisam de inicializações em menos de um segundo. Padrões de longa duração toleram mais.205* **Latência de inicialização a frio**: quanto tempo desde "criar um sandbox" até "pronto para aceitar a primeira solicitação". Padrões efêmeros precisam de inicializações em menos de um segundo. Padrões de longa duração toleram mais.
156* **Armazenamento persistente**: se o provedor oferece volumes duráveis ou apenas disco efêmero. O padrão híbrido precisa de armazenamento durável em algum lugar, seja no sandbox ou ao lado dele.206* **Armazenamento persistente**: se o provedor oferece volumes duráveis ou apenas disco efêmero. O padrão híbrido precisa de armazenamento durável em algum lugar, seja no sandbox ou ao lado dele.
157* **Modelo de preços**: faturamento por segundo, por solicitação ou por hora fixa. Preços por segundo adequam-se a cargas de trabalho efêmeras intermitentes. Preços por hora adequam-se a sessões de longa duração.207* **Modelo de preços**: faturamento por segundo, por solicitação ou por hora fixa. Preços por segundo são adequados para cargas de trabalho efêmeras intermitentes. Preços por hora são adequados para sessões de longa duração.
158* **Rede**: suporte para regras de egresso personalizadas, proxies de saída e peering de VPC privada para ambientes regulados.208* **Rede**: suporte para regras de saída personalizadas, proxies de saída e peering de VPC privada para ambientes regulados.
159
160Provedores a avaliar:
161 209
162* [Modal Sandbox](https://modal.com/docs/guide/sandbox), com uma [implementação de demonstração](https://modal.com/docs/examples/claude-slack-gif-creator)210Para opções auto-hospedadas como Docker, gVisor e Firecracker, e configuração de isolamento detalhada, consulte [Isolation Technologies](/docs/pt/agent-sdk/secure-deployment#isolation-technologies).
163* [Cloudflare Sandboxes](https://github.com/cloudflare/sandbox-sdk)
164* [Daytona](https://www.daytona.io/)
165* [E2B](https://e2b.dev/)
166* [Fly Machines](https://fly.io/docs/machines/)
167* [Vercel Sandbox](https://vercel.com/docs/functions/sandbox)
168
169Para opções auto-hospedadas como Docker, gVisor e Firecracker, e configuração de isolamento detalhada, consulte [Isolation Technologies](/pt/agent-sdk/secure-deployment#isolation-technologies).
170 211
171<h3 id="runtime-dependencies">212<h3 id="runtime-dependencies">
172 Dependências de runtime213 Dependências de tempo de execução
173</h3>214</h3>
174 215
175O container precisa apenas do runtime da linguagem do seu SDK:216O contêiner precisa do tempo de execução de linguagem do seu SDK:
176 217
177* Python 3.10+ para o Python SDK, ou Node.js 18+ para o TypeScript SDK218* Python 3.10+ para o SDK Python, ou Node.js 18+ para o SDK TypeScript
178* Ambos os pacotes SDK incluem um binário Claude Code nativo para a plataforma do host, portanto nenhuma instalação separada de Claude Code ou Node.js é necessária para o CLI gerado219* Tanto o SDK TypeScript quanto o Python agrupam um binário nativo Claude Code para a maioria das instalações, e a CLI gerada não precisa de uma instalação separada do Node.js. Consulte a [nota de instalação do quickstart](/docs/pt/agent-sdk/quickstart) para as instalações que precisam de uma instalação separada do Claude Code nativo.
179 220
180O binário incluído é fixado à versão do pacote SDK, portanto atualizar o SDK é como você atualiza o CLI. O SDK segue semver: aceite releases de patch continuamente e revise o changelog do [TypeScript](https://github.com/anthropics/claude-agent-sdk-typescript/blob/main/CHANGELOG.md) ou [Python](https://github.com/anthropics/claude-agent-sdk-python/blob/main/CHANGELOG.md) antes de aceitar uma versão menor.221O binário agrupado é fixado à versão do pacote SDK, portanto atualizar o SDK é como você atualiza a CLI. O SDK segue semver: aceite versões de patch continuamente e revise o changelog do [TypeScript](https://github.com/anthropics/claude-agent-sdk-typescript/blob/main/CHANGELOG.md) ou [Python](https://github.com/anthropics/claude-agent-sdk-python/blob/main/CHANGELOG.md) antes de aceitar uma versão menor.
181 222
182<h3 id="resources">223<h3 id="resources">
183 Recursos224 Recursos
184</h3>225</h3>
185 226
1861 GiB de RAM, 5 GiB de disco e 1 CPU por agente é um ponto de partida razoável para uma instância recém-iniciada. O uso de memória cresce com a duração da sessão e atividade de ferramentas, portanto dimensione para as durações de sessão e concorrência que você realmente precisa em vez da linha de base ociosa. Consulte [Scaling and concurrency](#scaling-and-concurrency) para saber como calcular agentes por host.2271 GiB de RAM, 5 GiB de disco e 1 CPU por agente é um ponto de partida razoável para uma instância recém-iniciada. O uso de memória cresce com a duração da sessão e a atividade de ferramentas, portanto dimensione para as durações de sessão e concorrência que você realmente precisa, em vez da linha de base ociosa. Consulte [Scaling and concurrency](#scaling-and-concurrency) para saber como calcular agentes por host.
187 228
188<h3 id="network">229<h3 id="network">
189 Rede230 Rede
190</h3>231</h3>
191 232
192O SDK precisa de HTTPS de saída para `api.anthropic.com`, ou para o endpoint regional do seu provedor ao executar no Amazon Bedrock ou na Plataforma de Agentes do Google Cloud. Se seus agentes usarem [MCP servers](/pt/agent-sdk/mcp) ou ferramentas externas, eles também precisam de acesso de saída para esses endpoints. Para produção, roteie o tráfego de saída através de um proxy de egresso que aplique listas de permissão de domínio, injete credenciais e registre solicitações. Consulte [Secure Deployment](/pt/agent-sdk/secure-deployment) para o padrão completo.233O SDK precisa de HTTPS de saída para `api.anthropic.com`, ou para o endpoint regional do seu provedor ao executar no Amazon Bedrock ou na Agent Platform do Google Cloud. Se seus agentes usarem [MCP servers](/docs/pt/agent-sdk/mcp) ou ferramentas externas, eles também precisam de acesso de saída para esses endpoints. Para produção, roteie o tráfego de saída através de um proxy de saída que imponha listas de permissão de domínio, injete credenciais e registre solicitações. Consulte [Secure Deployment](/docs/pt/agent-sdk/secure-deployment) para o padrão completo.
193 234
194Para tráfego de entrada, exponha uma porta HTTP ou WebSocket no container. Sua aplicação manipula solicitações de cliente nessa porta e chama o SDK internamente; o subprocesso em si não escuta na rede.235Para tráfego de entrada, exponha uma porta HTTP ou WebSocket no contêiner. Sua aplicação manipula solicitações de cliente nessa porta e chama o SDK internamente; o subprocesso em si não escuta na rede.
195 236
196<h2 id="handle-production-concerns">237<h2 id="handle-production-concerns">
197 Lidar com preocupações de produção238 Lidar com preocupações de produção
198</h2>239</h2>
199 240
200Trabalhe através dessas decisões antes de enviar um agente auto-hospedado.241Trabalhe através dessas decisões antes de implantar um agente auto-hospedado.
201 242
202<h3 id="session-and-state-persistence">243<h3 id="session-and-state-persistence">
203 Persistência de sessão e estado244 Persistência de sessão e estado
204</h3>245</h3>
205 246
206O disco local padrão é perdido ao reiniciar, reduzir a escala ou mover para um nó diferente. Para qualquer sessão que um usuário espera retomar, espelhe a transcrição para armazenamento durável com um adaptador [`SessionStore`](/pt/agent-sdk/session-storage). Veja [Implementações de referência](/pt/agent-sdk/session-storage#reference-implementations) para adaptadores S3, Redis e Postgres e um conjunto de conformidade para o seu próprio.247O disco local padrão é perdido ao reiniciar, reduzir a escala ou mover para um nó diferente. Para qualquer sessão que um usuário espera retomar, espelhe a transcrição para armazenamento durável com um adaptador [`SessionStore`](/docs/pt/agent-sdk/session-storage). Veja [Implementações de referência](/docs/pt/agent-sdk/session-storage#reference-implementations) para adaptadores S3, Redis e Postgres e um conjunto de conformidade para o seu próprio.
207 248
208Três coisas a saber sobre como `SessionStore` se comporta:249Três coisas a saber sobre como `SessionStore` se comporta:
209 250
210* **Apenas transcrições**: `SessionStore` espelha transcrições, não arquivos de memória `CLAUDE.md` ou outros artefatos do diretório de trabalho. Monte um volume compartilhado ou sincronize-os separadamente.251* **Apenas transcrições**: `SessionStore` espelha transcrições, não arquivos de memória `CLAUDE.md` ou outros artefatos do diretório de trabalho. Monte um volume compartilhado ou sincronize-os separadamente.
211* **Espelho, não substituição**: o subprocess escreve no disco local primeiro, e o armazenamento recebe uma cópia de cada lote. As escritas locais permanecem autoritárias.252* **Espelho, não substituição**: o subprocess escreve no disco local primeiro, e o SDK encaminha uma cópia de cada lote para o armazenamento. A transcrição local de uma sessão nova sobrevive à execução; uma execução retomada do armazenamento exclui sua cópia local no final, então o armazenamento mantém a única cópia durável. Veja [Arquitetura de escrita dupla](/docs/pt/agent-sdk/session-storage#dual-write-architecture).
212* **Mensagens `mirror_error`**: um lote que o armazenamento rejeita é enviado até três vezes no total, com um backoff curto antes de cada tentativa; uma chamada que expira não é retentada. Se o lote ainda falhar, o SDK o descarta, emite uma mensagem `{ type: "system", subtype: "mirror_error" }` e continua a consulta. Alerte sobre essas se a durabilidade do armazenamento for importante.253* **Mensagens `mirror_error`**: quando o SDK não consegue entregar um lote ao armazenamento, ele descarta o lote, emite uma mensagem `{ type: "system", subtype: "mirror_error" }` e continua a consulta. Alerte sobre essas se a durabilidade do armazenamento for importante. Veja [Espelhos de escrita são melhor esforço](/docs/pt/agent-sdk/session-storage#mirror-writes-are-best-effort) para o comportamento de repetição e tempo limite.
213 254
214<h3 id="observability">255<h3 id="observability">
215 Observabilidade256 Observabilidade
216</h3>257</h3>
217 258
218Os agentes do Agent SDK são processos de longa duração que geram chamadas de ferramentas em muitas rodadas de API. Sem telemetria, você não pode ver quais ferramentas foram executadas, quanto tempo levaram ou onde uma sessão travou.259Os agentes do Agent SDK são processos de longa duração que geram chamadas de ferramentas em muitas rodadas de API. Sem telemetria, você não consegue ver quais ferramentas foram executadas, quanto tempo levaram ou onde uma sessão travou.
219 260
220O SDK herda a configuração do OpenTelemetry do ambiente. Defina as variáveis de ambiente OTEL no nível do container ou orquestrador para que cada chamada `query()` exporte spans, métricas e eventos de log para seu coletor. O exemplo abaixo habilita a exportação OTLP para todos os três sinais. `CLAUDE_CODE_ENHANCED_TELEMETRY_BETA` é necessário apenas para rastreamentos; omita-o se você exportar apenas métricas e logs.261O SDK herda a configuração do OpenTelemetry do ambiente. Defina as variáveis de ambiente OTEL no nível do contêiner ou orquestrador para que cada chamada `query()` exporte spans, métricas e eventos de log para seu coletor. O exemplo abaixo ativa a exportação OTLP para todos os três sinais. `CLAUDE_CODE_ENHANCED_TELEMETRY_BETA` é necessário apenas para rastreamentos; omita-o se você exportar apenas métricas e logs.
221 262
222```bash title=".env' theme={null}263```bash title=".env" theme={null}
223CLAUDE_CODE_ENABLE_TELEMETRY=1264CLAUDE_CODE_ENABLE_TELEMETRY=1
224CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1265CLAUDE_CODE_ENHANCED_TELEMETRY_BETA=1
225OTEL_TRACES_EXPORTER=otlp266OTEL_TRACES_EXPORTER=otlp
229OTEL_EXPORTER_OTLP_ENDPOINT=http://collector.example.com:4318270OTEL_EXPORTER_OTLP_ENDPOINT=http://collector.example.com:4318
230```271```
231 272
232O texto do prompt e as entradas de ferramentas não são incluídos nas exportações por padrão. Veja [Controlar dados sensíveis em exportações](/pt/agent-sdk/observability#control-sensitive-data-in-exports) para os sinalizadores de aceitação e [Observabilidade](/pt/agent-sdk/observability) para o catálogo completo de sinais.273O texto do prompt e as entradas de ferramentas não são incluídos nas exportações por padrão. Veja [Controlar dados sensíveis em exportações](/docs/pt/agent-sdk/observability#control-sensitive-data-in-exports) para os sinalizadores de aceitação e [Observabilidade](/docs/pt/agent-sdk/observability) para o catálogo completo de sinais.
233 274
234<h3 id="auth-and-secrets">275<h3 id="auth-and-secrets">
235 Autenticação e segredos276 Autenticação e segredos
237 278
238Três preocupações de autenticação importam no momento da hospedagem:279Três preocupações de autenticação importam no momento da hospedagem:
239 280
240* **API Anthropic**: o subprocess lê `ANTHROPIC_API_KEY` de seu ambiente. Forneça-o do seu gerenciador de segredos ou defina `ANTHROPIC_BASE_URL` para rotear chamadas de modelo através de um proxy que injeta a chave fora do container. Veja [Gerenciamento de credenciais](/pt/agent-sdk/secure-deployment#credential-management) para o padrão de proxy e [Visão geral do SDK](/pt/agent-sdk/overview#get-started) para métodos de autenticação suportados.281* **API Anthropic**: o subprocess lê `ANTHROPIC_API_KEY` de seu ambiente. Forneça-o do seu gerenciador de segredos ou defina `ANTHROPIC_BASE_URL` para rotear chamadas de modelo através de um proxy que injeta a chave fora do contêiner. Veja [Gerenciamento de credenciais](/docs/pt/agent-sdk/secure-deployment#credential-management) para o padrão de proxy e [Configuração no início rápido do SDK](/docs/pt/agent-sdk/quickstart#setup) para métodos de autenticação suportados.
241* **Entrada**: coloque a autenticação em um gateway na frente do container do agente. O agente deve receber solicitações pré-autenticadas e não deve ser o componente que valida tokens de usuário.282* **Entrada**: coloque autenticação em um gateway na frente do contêiner do agente. O agente deve receber solicitações pré-autenticadas e não deve ser o componente que valida tokens de usuário.
242* **Ferramentas de saída**: mantenha as credenciais de ferramentas fora do ambiente do agente. Rotear chamadas de saída através de um proxy que injeta chaves de API depois que a solicitação sai do container. O agente faz a chamada; o proxy adiciona a credencial.283* **Ferramentas de saída**: mantenha as credenciais de ferramentas fora do ambiente do agente. Rotear chamadas de saída através de um proxy que injeta chaves de API após a solicitação sair do contêiner. O agente faz a chamada; o proxy adiciona a credencial.
243 284
244<h3 id="scaling-and-concurrency">285<h3 id="scaling-and-concurrency">
245 Dimensionamento e concorrência286 Dimensionamento e concorrência
255 296
256Meça o limite de RAM por sessão executando uma sessão representativa até seu comprimento alvo sob sua carga de ferramenta esperada e registrando o RSS de pico. O ponto de partida de 1 GiB em [Recursos](#resources) é um piso, não o limite.297Meça o limite de RAM por sessão executando uma sessão representativa até seu comprimento alvo sob sua carga de ferramenta esperada e registrando o RSS de pico. O ponto de partida de 1 GiB em [Recursos](#resources) é um piso, não o limite.
257 298
258O roteamento de escala horizontal depende do seu padrão. Para sessões de longa duração, onde containers mantêm muitas sessões, execute um pool de containers atrás de um balanceador de carga e fixe cada sessão a um container usando hash consistente em `sessionId`. Uma sessão fixada continua atingindo o mesmo container e, portanto, o mesmo subprocess em execução, até que seja despejada ou o container seja reiniciado.299O roteamento de escala horizontal depende do seu padrão. Para sessões de longa duração, onde contêineres mantêm muitas sessões, execute um pool de contêineres atrás de um balanceador de carga e fixe cada sessão a um contêiner usando hash consistente em `sessionId`. Uma sessão fixada continua atingindo o mesmo contêiner e, portanto, o mesmo subprocess em execução, até ser despejada ou o contêiner reiniciar.
259
260Grandes fanouts de [subagentes](/pt/agent-sdk/subagents) concorrentes de uma única sessão podem atingir limites de taxa de API. Divida o trabalho em lotes menores em vez de emitir um dispatch amplo.
261 300
262<h3 id="cost">301<h3 id="cost">
263 Custo302 Custo
264</h3>303</h3>
265 304
266O custo de token Anthropic normalmente domina o custo da infraestrutura do container por uma ordem de magnitude ou mais. Um container minimamente provisionado custa aproximadamente \$0,05 por hora, enquanto uma única sessão de agente longo pode gastar dólares em tokens. Veja [Rastreamento de custo](/pt/agent-sdk/cost-tracking) para contabilidade de tokens por sessão.305O custo de token do Anthropic normalmente domina o custo da infraestrutura do contêiner por uma ordem de magnitude ou mais. Um contêiner minimamente provisionado custa aproximadamente \$0,05 por hora, enquanto uma única sessão de agente longo pode gastar dólares em tokens. Veja [Rastreamento de custo](/docs/pt/agent-sdk/cost-tracking) para contabilidade de token por sessão.
267 306
268<h3 id="multi-tenant-isolation">307<h3 id="multi-tenant-isolation">
269 Isolamento multi-tenant308 Isolamento multi-inquilino
270</h3>309</h3>
271 310
272O comportamento padrão do SDK lê configurações e arquivos de memória `CLAUDE.md` do sistema de arquivos. Em um container compartilhado que serve múltiplos tenants, esses arquivos podem vazar o contexto de um tenant para a sessão de outro tenant.311O comportamento padrão do SDK lê configurações e arquivos de memória `CLAUDE.md` do sistema de arquivos. Em um contêiner compartilhado que serve múltiplos inquilinos, esses arquivos podem vazar o contexto de um inquilino para a sessão de outro inquilino.
273 312
274Para isolar tenants dentro de um container compartilhado:313Para isolar inquilinos dentro de um contêiner compartilhado:
275 314
276* Passe `settingSources: []` em TypeScript ou `setting_sources=[]` em Python para que nenhuma configuração do sistema de arquivos seja carregada.315* Passe `settingSources: []` em TypeScript ou `setting_sources=[]` em Python para pular configurações de usuário, projeto e local.
277* Defina `CLAUDE_CODE_DISABLE_AUTO_MEMORY=1` em `env`. [Auto memory](/pt/memory#auto-memory) em `~/.claude/projects/<project>/memory/` é carregada no prompt do sistema independentemente de `settingSources`. Veja [O que settingSources não controla](/pt/agent-sdk/claude-code-features#what-settingsources-does-not-control) para as outras entradas que são carregadas incondicionalmente.316* Defina `CLAUDE_CODE_DISABLE_AUTO_MEMORY=1` em `env`. [Memória automática](/docs/pt/memory#auto-memory) em `~/.claude/projects/<project>/memory/` carrega no prompt do sistema independentemente de `settingSources`. Veja [O que settingSources não controla](/docs/pt/agent-sdk/claude-code-features#what-settingsources-does-not-control) para as outras entradas que carregam incondicionalmente.
278* Aponte `CLAUDE_CONFIG_DIR` para um diretório por tenant para que os tenants não compartilhem a configuração global `~/.claude.json`.317* Aponte `CLAUDE_CONFIG_DIR` para um diretório por inquilino para que os inquilinos não compartilhem a configuração global `~/.claude.json`. Quando cada diretório de configuração serve um diretório de trabalho e você não compartilha um [`SessionStore`](/docs/pt/agent-sdk/session-storage) entre inquilinos, você também pode definir [`CLAUDE_CODE_PROJECT_DIR_NAME`](/docs/pt/sessions#name-the-project-directory-yourself) em `env` para manter os caminhos de transcrição sob ele curtos. Requer Agent SDK TypeScript v0.3.234 ou posterior, ou Agent SDK Python v0.2.140 ou posterior.
279* Use um diretório de trabalho por tenant. Passe `cwd` explicitamente em cada chamada `query()`.318* Use um diretório de trabalho por inquilino. Passe `cwd` explicitamente em cada chamada `query()`.
280* Aplique regras de saída por tenant em seu proxy, como IPs de saída distintos, credenciais ou listas de permissão de domínio, para que um tenant comprometido não possa exfiltrar dados através da política de saída de outro tenant.319* Aplique regras de saída por inquilino em seu proxy, como IPs de saída distintos, credenciais ou listas de permissão de domínio, para que um inquilino comprometido não possa exfiltrar dados através da política de saída de outro inquilino.
281 320
282O exemplo abaixo aplica as quatro opções de nível SDK juntas. Construa `tenantDir` e `configDir` para que cada tenant obtenha um caminho que nenhum outro tenant possa ler. Em TypeScript, `env` substitui o ambiente do subprocess, então espalhe `...process.env` para manter variáveis herdadas como `PATH` e `ANTHROPIC_API_KEY`. Em Python, `env` é mesclado no topo do ambiente herdado.321O exemplo abaixo aplica as opções de configurações, memória automática, diretório de configuração e diretório de trabalho juntas. Construa `tenantDir` e `configDir` para que cada inquilino obtenha um caminho que nenhum outro inquilino possa ler. Em TypeScript, `env` substitui o ambiente do subprocess, então espalhe `...process.env` para manter variáveis herdadas como `PATH` e `ANTHROPIC_API_KEY`. Em Python, `env` é mesclado no topo do ambiente herdado.
283 322
284<CodeGroup>323<CodeGroup>
285 ```typescript TypeScript theme={null}324 ```typescript TypeScript theme={null}
307 346
308 ```python Python theme={null}347 ```python Python theme={null}
309 from claude_agent_sdk import query, ClaudeAgentOptions348 from claude_agent_sdk import query, ClaudeAgentOptions
349 import asyncio
310 350
351 prompt: str = ...
352 tenant_dir: str = ...
353 config_dir: str = ...
354
355
356 async def main():
311 async for message in query(357 async for message in query(
312 prompt=prompt,358 prompt=prompt,
313 options=ClaudeAgentOptions(359 options=ClaudeAgentOptions(
320 ),366 ),
321 ):367 ):
322 ...368 ...
369
370
371 asyncio.run(main())
323 ```372 ```
324</CodeGroup>373</CodeGroup>
325 374
326Para controles de rede por tenant, veja [Implantação Segura](/pt/agent-sdk/secure-deployment).
327
328<h2 id="known-limitations">375<h2 id="known-limitations">
329 Limitações conhecidas376 Limitações conhecidas
330</h2>377</h2>
332Planeje em torno destas em seu design de implantação.379Planeje em torno destas em seu design de implantação.
333 380
334| Limitação | O que fazer |381| Limitação | O que fazer |
335| --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |382| --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
336| Sem tempo limite de sessão de nível superior | Uma sessão não expira por conta própria. Defina `maxTurns` em `Options` para limitar quantas rodadas de uso de ferramentas o agente realiza antes de parar. |383| Sem timeout de sessão de nível superior | Uma sessão não expira por conta própria. Defina `maxTurns` em TypeScript ou `max_turns` em Python para limitar quantas rodadas de uso de ferramentas o agente realiza antes de parar. |
337| Crescimento de memória em sessões longas | Limite o comprimento da sessão ou recicle subprocessos periodicamente. Veja [Scaling and concurrency](#scaling-and-concurrency). |384| Crescimento de memória em sessões longas | Limite o comprimento da sessão ou recicle subprocessos periodicamente. Veja [Scaling and concurrency](#scaling-and-concurrency). |
338| Grandes fanouts de subagentes paralelos podem atingir limites de taxa | Divida o trabalho em lotes menores em vez de emitir um dispatch amplo. |385| Grandes fanouts de subagentos paralelos podem atingir limites de taxa | Divida o trabalho em lotes menores em vez de emitir um dispatch amplo. |
339| Sem prazo de wall-clock por subagente | Limite cada [subagent](/pt/agent-sdk/subagents) com `maxTurns` em sua `AgentDefinition`. Apenas para subagentes em background, `CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS` define um watchdog de travamento que dispara quando um subagente `run_in_background` para de produzir saída; não é um prazo de tempo total de execução. |386| Sem deadline de wall-clock por subagentos | Limite cada [subagent](/docs/pt/agent-sdk/subagents) com `maxTurns` em sua `AgentDefinition`. `CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS` define um watchdog de travamento que dispara quando um subagentos para de produzir saída; não é um deadline de tempo total de execução. |
387
388<h2 id="troubleshoot-deployment-failures">
389 Solucionar falhas de implantação
390</h2>
391
392Use esta seção quando um agente que funciona em sua máquina falha em um serviço implantado. Cada item abaixo nomeia uma falha e vincula a entrada que a cobre:
393
394* **CLI não encontrado no início do serviço**: em Python, um contêiner ou gerenciador de serviço executa sua aplicação com um `PATH` diferente do seu shell, portanto uma instalação que funciona localmente não é visível para o processo. Em TypeScript, a compilação da imagem pulou as dependências opcionais do SDK, ou `pathToClaudeCodeExecutable` aponta para um arquivo que não existe na imagem. Consulte [Claude Code não encontrado](/docs/pt/agent-sdk/troubleshooting#clinotfounderror-claude-code-not-found).
395* **CLI presente na imagem mas não será iniciado**: Claude Code não pode ser iniciado a partir de um binário que não corresponde à arquitetura ou libc do contêiner, ou a partir de um arquivo que perdeu sua permissão de execução na compilação da imagem. Consulte [Falha ao iniciar Claude Code](/docs/pt/agent-sdk/troubleshooting#cliconnectionerror-failed-to-start-claude-code).
396* **Processo Claude Code sai durante a execução**: o erro que sua aplicação recebe depende da linguagem do SDK e se a CLI relatou um resultado de erro primeiro. As entradas em [Saída do processo CLI](/docs/pt/agent-sdk/troubleshooting#cli-process-exit) cobrem cada mensagem.
340 397
341<h2 id="next-steps">398<h2 id="next-steps">
342 Próximas etapas399 Próximas etapas
343</h2>400</h2>
344 401
345* [Guia de hospedagem](https://github.com/anthropics/claude-cookbooks/blob/main/claude_agent_sdk/07_Hosting_the_agent.ipynb): passo a passo do notebook com [código implantável](https://github.com/anthropics/claude-cookbooks/tree/main/claude_agent_sdk/hosting) para Docker, Modal e Kubernetes.402* [Guia de hospedagem](https://github.com/anthropics/claude-cookbooks/blob/main/claude_agent_sdk/07_Hosting_the_agent.ipynb): passo a passo do notebook com [código implantável](https://github.com/anthropics/claude-cookbooks/tree/main/claude_agent_sdk/hosting) para Docker, Modal e Kubernetes.
346* [Armazenamento de sessão](/pt/agent-sdk/session-storage): persistir transcrições entre hosts com um adaptador `SessionStore`.403* [Armazenamento de sessão](/docs/pt/agent-sdk/session-storage): persistir transcrições entre hosts com um adaptador `SessionStore`.
347* [Observabilidade](/pt/agent-sdk/observability): exportar rastreamentos OTEL, métricas e logs para seu coletor.404* [Observabilidade](/docs/pt/agent-sdk/observability): exportar rastreamentos OTEL, métricas e logs para seu coletor.
348* [Implantação segura](/pt/agent-sdk/secure-deployment): controles de rede, gerenciamento de credenciais e endurecimento de isolamento.405* [Implantação segura](/docs/pt/agent-sdk/secure-deployment): controles de rede, gerenciamento de credenciais e endurecimento de isolamento.
349* [Rastreamento de custos](/pt/agent-sdk/cost-tracking): contabilidade de tokens e custos por sessão.406* [Rastreamento de custos](/docs/pt/agent-sdk/cost-tracking): contabilidade de tokens e custos por sessão.