For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegação principal

Shell

Execute comandos de shell em contêineres hospedados ou no seu próprio ambiente de execução local.

A ferramenta shell permite que os modelos trabalhem em um ambiente de terminal completo. Oferecemos suporte ao shell para execução local e hospedada por meio da Responses API.

A ferramenta shell permite que os modelos executem comandos por meio de uma destas opções:

O shell está disponível por meio da Responses API. Ele não está disponível pela API Chat Completions.

Executar comandos arbitrários de shell pode ser perigoso. Sempre execute-os em um ambiente isolado, aplique listas de permissões ou de bloqueios sempre que possível e registre a atividade da ferramenta para auditoria.

Início rápido do shell hospedado

O shell hospedado é uma opção nativa e simplificada para tarefas que precisam de processamento mais completo e determinístico, desde cálculos até o trabalho com multimídia.

Use container_auto quando quiser que a OpenAI provisione e gerencie um contêiner para a requisição.

Ferramenta shell com container_auto
curl -L 'https://api.openai.com/v1/responses' \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-6-astra",
    "tools": [
      { "type": "shell", "environment": { "type": "container_auto" } }
    ],
    "input": [
      {
        "type": "message",
        "role": "user",
        "content": [
          { "type": "input_text", "text": "Execute: ls -lah /mnt/data && python --version && node --version" }
        ]
      }
    ],
    "tool_choice": "auto"
  }'

Detalhes do ambiente de execução hospedado

  • Atualmente, o ambiente de execução é baseado no Debian 12 e pode mudar com o tempo.
  • O diretório de trabalho padrão é /mnt/data.
  • /mnt/data está sempre presente e é o caminho com suporte para artefatos que o usuário pode baixar.
  • O shell hospedado não oferece suporte a sessões TTY interativas.
  • Os comandos do shell hospedado não são executados com sudo.
  • Você pode executar serviços dentro do contêiner quando seu fluxo de trabalho precisar deles.

As linguagens pré-instaladas atualmente incluem:

  • Python 3.11
  • Node.js 22.16
  • Java 17.0
  • PHP 8.2
  • Ruby 3.1
  • Go 1.23

Reutilize um contêiner entre requisições

Se precisar de um ambiente de longa duração para fluxos de trabalho iterativos, crie um contêiner e faça referência a ele nas chamadas seguintes à Responses API.

1. Crie um contêiner

Crie um contêiner reutilizável
curl -L 'https://api.openai.com/v1/containers' \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "name": "analysis-container",
    "memory_limit": "1g",
    "expires_after": { "anchor": "last_active_at", "minutes": 20 }
  }'

2. Faça referência ao contêiner na Responses

Use o shell com container_reference
curl -L 'https://api.openai.com/v1/responses' \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-6-astra",
    "tools": [
      {
        "type": "shell",
        "environment": {
          "type": "container_reference",
          "container_id": "cntr_08f3d96c87a585390069118b594f7481a088b16cda7d9415fe"
        }
      }
    ],
    "input": "List files in the container and show disk usage."
  }'

Anexe habilidades

Habilidades são pacotes reutilizáveis e versionados que você pode montar em ambientes de shell hospedado. Isso define quais habilidades estão disponíveis e, durante a execução do shell, o modelo decide se deve invocá-las.

Consulte o guia de Habilidades para saber mais sobre upload e versionamento.

Crie um contêiner com habilidades anexadas
curl -L 'https://api.openai.com/v1/containers' \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "name": "skill-container",
    "skills": [
      { "type": "skill_reference", "skill_id": "skill_4db6f1a2c9e73508b41f9da06e2c7b5f" },
      { "type": "skill_reference", "skill_id": "openai-spreadsheets", "version": "latest" }
    ]
  }'

Acesso à rede

Por padrão, os contêineres hospedados não têm acesso de saída à rede.

Para habilitá-lo:

  1. Um administrador deve configurar a lista de permissões da sua organização no painel.
  2. Você deve definir explicitamente network_policy no ambiente do contêiner na sua requisição.
Ferramenta shell com lista de permissões de rede
curl -L 'https://api.openai.com/v1/responses' \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-6-astra",
    "tool_choice": "required",
    "tools": [
      {
        "type": "shell",
        "environment": {
          "type": "container_auto",
          "network_policy": {
            "type": "allowlist",
            "allowed_domains": ["pypi.org", "files.pythonhosted.org", "github.com"]
          }
        }
      }
    ],
    "input": [
      {
        "role": "user",
        "content": "In the container, pip install httpx beautifulsoup4, fetch release pages, and write /mnt/data/release_digest.md."
      }
    ]
  }'

Adicionar domínios à lista de permissões introduz riscos de segurança, como a exfiltração de dados por injeção de prompt. Adicione apenas domínios nos quais você confia e que invasores não possam usar para receber dados exfiltrados. Leia atentamente a seção Riscos e segurança abaixo antes de usar esta ferramenta.

Precedência das políticas de rede

Quando houver vários controles:

  • A lista de permissões da sua organização define o conjunto completo de allowed_domains.
  • A configuração network_policy no nível da requisição restringe ainda mais o acesso.
  • As requisições falham se allowed_domains incluir domínios que não estejam na lista de permissões da sua organização.

Retenção de dados e ciclo de vida do contêiner

Os contêineres hospedados usados pelo Shell hospedado e pelo Code Interpreter podem gravar o estado temporário do aplicativo no sistema de arquivos do contêiner (baseado em armazenamento de blocos efêmero) enquanto ele estiver ativo. Os dados do contêiner são excluídos quando ele expira ou é excluído explicitamente.

Para saber mais sobre os controles de dados, consulte ZDR e residência de dados.

Baixe artefatos

O shell hospedado pode produzir arquivos para download. Use as mesmas APIs de container/files usadas pelo Code Interpreter para recuperar artefatos gravados em /mnt/data.

Controles de dados adicionais

Se quiser manter o conteúdo e os arquivos temporários durante o ciclo de vida do ambiente hospedado, você pode incluir arquivos diretamente na requisição e montar habilidades incorporadas no contêiner.

Use arquivos e habilidades incorporados
INLINE_ZIP=$(base64 -i ./csv_insights.zip)
REPORT_CSV=$(base64 -i ./report.csv)

CONTAINER_ID=$(
  curl -sL 'https://api.openai.com/v1/containers' \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $OPENAI_API_KEY" \
    -d '{
      "name": "inline-skill-container",
      "skills": [
        {
          "type": "inline",
          "name": "csv-insights",
          "description": "Summarize CSV files and produce a markdown report.",
          "source": {
            "type": "base64",
            "media_type": "application/zip",
            "data": "'"$INLINE_ZIP"'"
          }
        }
      ]
    }' | jq -r '.id'
)

curl -L 'https://api.openai.com/v1/responses' \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-6-astra",
    "tools": [
      {
        "type": "shell",
        "environment": {
          "type": "container_reference",
          "container_id": "'"$CONTAINER_ID"'"
        }
      }
    ],
    "input": [
      {
        "role": "user",
        "content": [
          {
            "type": "input_file",
            "filename": "report.csv",
            "file_data": "data:text/csv;base64,'"${REPORT_CSV}"'"
          },
          {
            "type": "input_text",
            "text": "Use the csv-insights skill to summarize report.csv."
          }
        ]
      }
    ]
  }'

Nas requisições seguintes, passe o mesmo container_id com container_reference. As habilidades montadas e os arquivos existentes no contêiner permanecem disponíveis enquanto ele estiver ativo.

Exclua um contêiner de forma proativa

Você pode excluir explicitamente o contêiner ao concluir o trabalho, em vez de esperar que ele expire por inatividade.

Exclua um contêiner
curl -L -X DELETE 'https://api.openai.com/v1/containers/container_id' \
  -H "Authorization: Bearer $OPENAI_API_KEY"

Segredos de domínio

Use domain_secrets quando um domínio da sua lista allowed_domains exigir cabeçalhos de autorização privados, como Authorization: Bearer <token>.

Cada entrada de segredo inclui:

  • Domínio de destino
  • Nome amigável do segredo
  • Valor do segredo

Durante a execução:

  • O modelo e o ambiente de execução veem nomes de placeholders (por exemplo, $API_KEY) em vez das credenciais reais.
  • O sidecar de tradução de autenticação aplica os valores reais dos segredos apenas aos destinos aprovados.
  • Os valores reais dos segredos não são persistidos nos servidores da API nem aparecem no contexto visível para o modelo.

Isso permite que o assistente chame serviços protegidos, reduzindo o risco de vazamento.

Ferramenta shell com domain_secrets
curl -L 'https://api.openai.com/v1/responses' \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-6-astra",
    "input": [
      {
        "role": "user",
        "content": "Use curl to call https://httpbin.org/headers with header Authorization: Bearer $API_KEY. Tell me what you see in the final text response."
      }
    ],
    "tool_choice": "required",
    "tools": [
      {
        "type": "shell",
        "environment": {
          "type": "container_auto",
          "network_policy": {
            "type": "allowlist",
            "allowed_domains": ["httpbin.org"],
            "domain_secrets": [
              {
                "domain": "httpbin.org",
                "name": "API_KEY",
                "value": "debug-secret-123"
              }
            ]
          }
        }
      }
    ]
  }'

Fluxos de trabalho com múltiplos turnos

Para continuar o trabalho no mesmo ambiente hospedado, reutilize o contêiner e passe previous_response_id.

Continue um fluxo de trabalho com shell
curl -L 'https://api.openai.com/v1/responses' \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-6-astra",
    "previous_response_id": "resp_2a8e5c9174d63b0f18a4c572de9f64a1b3c76d508e12f9ab47",
    "tools": [
      {
        "type": "shell",
        "environment": {
          "type": "container_reference",
          "container_id": "cntr_f19c2b51e4a06793d82d54a7be0fc9154d3361ab28ce7f6041"
        }
      }
    ],
    "input": "Read /mnt/data/top5.csv and report the top candidate."
  }'

Saída do shell na Responses

O shell hospedado e o shell local usam os mesmos tipos de itens de saída. As execuções do shell são representadas por pares de itens de saída:

  • shell_call: comandos solicitados pelo modelo.
  • shell_call_output: saída dos comandos e resultados do encerramento.
Exemplo de item shell_call
{
  "type": "shell_call",
  "call_id": "call_9d14ac6f2b73485e91c0f4da6e1b27c8",
  "action": {
    "commands": ["ls -l"],
    "timeout_ms": 120000,
    "max_output_length": 4096
  },
  "status": "in_progress"
}

Modo shell local

Você também pode executar comandos de shell no seu próprio ambiente de execução local, executando ações shell_call e enviando shell_call_output de volta ao modelo.

Use esse modo quando precisar de controle total sobre o ambiente de execução, o acesso ao sistema de arquivos ou as ferramentas internas existentes.

Requisição de shell local
curl -L 'https://api.openai.com/v1/responses' \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-6-astra",
    "instructions": "The local bash shell environment is on Mac.",
    "input": "find me the largest pdf file in ~/Documents",
    "tools": [{ "type": "shell", "environment": { "type": "local" } }]
  }'

Ao receber itens de saída shell_call:

  • Execute os comandos solicitados no seu ambiente de execução.
  • Capture stdout, stderr e o resultado da execução.
  • Retorne os resultados como shell_call_output na próxima requisição.
Exemplo de executor de shell local
@dataclass
class CmdResult:
    stdout: str
    stderr: str
    exit_code: int | None
    timed_out: bool


class ShellExecutor:
    def __init__(self, default_timeout: float = 60):
        self.default_timeout = default_timeout

    def run(self, cmd: str, timeout: float | None = None) -> CmdResult:
        t = timeout or self.default_timeout
        p = subprocess.Popen(
            cmd,
            shell=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
        )
        try:
            out, err = p.communicate(timeout=t)
            return CmdResult(out, err, p.returncode, False)
        except subprocess.TimeoutExpired:
            p.kill()
            out, err = p.communicate()
            return CmdResult(out, err, p.returncode, True)
Exemplo de payload de shell_call_output
{
  "type": "shell_call_output",
  "call_id": "call_3ef1b8c79a4d6520f9e3ab7d41c68f25",
  "max_output_length": 4096,
  "output": [
    {
      "stdout": "...",
      "stderr": "...",
      "outcome": {
        "type": "exit",
        "exit_code": 0
      }
    },
    {
      "stdout": "...",
      "stderr": "...",
      "outcome": {
        "type": "timeout"
      }
    }
  ]
}

Para ver detalhes sobre a migração da versão legada, consulte o guia anterior de shell local.

Use o shell local com o Agents SDK

Se estiver usando o Agents SDK, você pode passar sua própria implementação de executor de shell para a função auxiliar da ferramenta shell.

Use o shell local com o Agents SDK
import { Agent, run, withTrace, shellTool } from "@openai/agents";

class LocalShell {
  async run(action) {
    return {
      output: [
        {
          stdout: "Shell is not available. Needs to be implemented first.",
          stderr: "",
          outcome: {
            type: "exit",
            exitCode: 1,
          },
        },
      ],
      maxOutputLength: action.maxOutputLength,
    };
  }
}

const shell = new LocalShell();

const agent = new Agent({
  name: "Shell Assistant",
  model: "gpt-6-astra",
  instructions:
    "You can execute shell commands to inspect the repository. Keep responses concise and include command output when helpful.",
  tools: [
    shellTool({
      shell,
      needsApproval: true,
      onApproval: async (_ctx, _approvalItem) => {
        return { approve: true };
      },
    }),
  ],
});

await withTrace("shell-tool-example", async () => {
  const result = await run(agent, "Show the Node.js version.");
  console.log(`\nFinal response:\n${result.finalOutput}`);
});

Você encontra exemplos funcionais nos repositórios do SDK.

Exemplo da ferramenta shell - TypeScript

Exemplo em TypeScript da ferramenta shell no Agents SDK.

Exemplo da ferramenta shell - Python

Exemplo em Python da ferramenta shell no Agents SDK.

Como lidar com erros comuns

  • Se um comando exceder o tempo limite de execução, retorne um resultado que indique isso e inclua a saída parcial capturada.
  • Se max_output_length estiver presente em shell_call, inclua-o em shell_call_output.
  • Não dependa de comandos interativos; a execução da ferramenta shell deve ser não interativa.
  • Preserve as saídas de comandos com código de saída diferente de zero para que o modelo possa raciocinar sobre as etapas de recuperação.

Riscos e segurança

Habilitar o acesso à rede na Containers API é um recurso poderoso e introduz riscos significativos à segurança e à governança de dados. Por padrão, o acesso à rede não está habilitado. Quando habilitado, o acesso de saída deve permanecer estritamente limitado aos domínios confiáveis necessários para a tarefa.

Contêineres com acesso à rede podem interagir com serviços de terceiros e registros de pacotes. Isso cria riscos como vazamento de dados, uso indevido de ferramentas induzido por injeção de prompt e acesso acidental além dos limites previstos. Esses riscos aumentam quando as políticas são amplas, estáticas ou aplicadas de forma inconsistente.

Entenda os riscos de injeção de prompt em conteúdo obtido pela rede

Qualquer conteúdo externo obtido pela rede pode conter instruções ocultas destinadas a manipular o comportamento do modelo. Trate o conteúdo não confiável da rede como potencialmente adversarial e exija cuidado adicional em ações que possam modificar dados ou sistemas.

Conecte-se apenas a destinos confiáveis

Permita apenas domínios em que você confia e cuja manutenção realiza ativamente. Tenha cuidado com intermediários e agregadores que atuam como proxy para outros serviços e revise suas práticas de tratamento e retenção de dados antes de adicioná-los à sua lista de domínios permitidos.

Inclua revisões antes e depois da execução das requisições

Revise o comando da ferramenta shell e a saída da execução, fornecidos na resposta da Responses API. Registre os hosts solicitados e os destinos reais das conexões de saída de cada sessão. Revise os logs periodicamente para verificar se os padrões de acesso correspondem ao esperado, detectar desvios e identificar comportamentos suspeitos.

Valide os requisitos de residência e retenção de dados

Os controles de dados da OpenAI se aplicam dentro dos limites da OpenAI. No entanto, os dados transmitidos a serviços de terceiros por conexões de rede estão sujeitos às políticas de retenção de dados desses serviços. Garanta que os endpoints externos atendam aos seus requisitos de residência, retenção e conformidade.