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
Theme

Shell

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

Com a ferramenta de shell, os modelos podem trabalhar em um ambiente de terminal completo. A API Responses oferece suporte à execução de comandos de shell tanto localmente quanto em um ambiente hospedado.

Com essa ferramenta, os modelos podem executar comandos em um dos seguintes ambientes:

A ferramenta de shell está disponível na API Responses. A API chat completions não oferece essa ferramenta.

Executar comandos arbitrários de shell pode ser perigoso. Sempre execute os comandos em um ambiente isolado e registre a atividade da ferramenta para fins de auditoria. Sempre que possível, permita ou bloqueie comandos específicos.

Primeiros passos com o Shell hospedado

O Shell hospedado é uma opção nativa e fácil de usar para tarefas que exigem processamento mais elaborado e determinístico, desde cálculos até o processamento de conteúdo multimídia.

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

Ferramenta de 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

  • O ambiente de execução atualmente usa Debian 12 como base, mas isso pode mudar.
  • O diretório de trabalho padrão é /mnt/data.
  • /mnt/data está sempre disponível e é o caminho com suporte para armazenar artefatos que os usuários podem baixar.
  • O Shell hospedado não oferece suporte a sessões TTY interativas.
  • Os comandos do Shell hospedado são executados sem sudo.
  • Você pode executar serviços dentro do contêiner quando o fluxo de trabalho exigir.

Atualmente, as linguagens pré-instaladas incluem:

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

Reutilize um contêiner em várias solicitações

Se precisar de um ambiente que permaneça ativo durante um fluxo de trabalho iterativo, crie um contêiner e faça referência a ele nas chamadas seguintes à API Responses.

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 API 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. A montagem define quais habilidades ficam disponíveis. Ao executar o shell, o modelo decide se deve invocá-las.

Consulte o guia de habilidades para saber como enviar e versionar esses pacotes.

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 habilitar esse acesso:

  1. Um administrador deve configurar a lista de permissão da sua organização no painel.
  2. Você deve definir explicitamente network_policy no ambiente do contêiner ao fazer a solicitação.
Ferramenta de shell com lista de permissão 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."
      }
    ]
  }'

Incluir domínios na lista de permissão traz riscos de segurança, como a exfiltração de dados por injeção de prompt. Inclua apenas domínios em que você confia e que invasores não possam usar para receber dados roubados. Antes de usar a ferramenta, leia com atenção a seção Riscos e segurança abaixo.

Precedência das políticas de rede

Quando vários controles se aplicam:

  • A lista de permissão da organização define o conjunto completo de domínios que podem constar em allowed_domains.
  • A política network_policy de cada solicitação restringe ainda mais o acesso.
  • A solicitação falha se allowed_domains incluir domínios fora da lista de permissão da organização.

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

Enquanto estiverem ativos, 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, que usa armazenamento efêmero em blocos. Os dados do contêiner são excluídos quando ele expira ou quando você o exclui explicitamente.

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

Baixe artefatos

O Shell hospedado pode gerar arquivos para download. Use as mesmas APIs de contêineres e arquivos do Code Interpreter para recuperar os artefatos gravados em /mnt/data.

Controles adicionais de dados

Para manter o conteúdo e os arquivos disponíveis apenas durante o ciclo de vida do contêiner hospedado, você pode incluir os arquivos diretamente na solicitação e montar no contêiner as habilidades fornecidas também dessa forma.

Use arquivos e habilidades fornecidos diretamente na solicitação
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 solicitações seguintes, passe o mesmo container_id com container_reference. As habilidades montadas e os arquivos existentes no contêiner continuam disponíveis enquanto ele estiver ativo.

Exclua um contêiner antes que ele expire

Ao concluir o trabalho, você pode excluir o contêiner explicitamente, sem 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 lista allowed_domains exigir cabeçalhos de autorização privados, como Authorization: Bearer <token>.

Cada entrada inclui:

  • Domínio de destino
  • Nome descritivo do segredo
  • Valor do segredo

Durante a execução:

  • O modelo e o ambiente de execução veem nomes que representam as credenciais (por exemplo, $API_KEY) em vez das credenciais reais.
  • O componente auxiliar de autenticação substitui esses nomes pelos valores reais dos segredos apenas para destinos aprovados.
  • Os valores reais dos segredos não ficam armazenados nos servidores da API nem aparecem no contexto visível para o modelo.

Assim, o assistente pode chamar serviços protegidos com menor risco de vazamento de credenciais.

Ferramenta de 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 várias interações

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

Dê continuidade a um fluxo de trabalho de 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 API Responses

O Shell hospedado e o shell local usam os mesmos tipos de itens de saída. Cada execução do shell é representada por um par de itens de saída:

  • shell_call: comandos solicitados pelo modelo.
  • shell_call_output: saída dos comandos e informações sobre como a execução terminou.
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 de shell local

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

Use esse modo quando precisar controlar o sistema de arquivos ou acessar ferramentas internas. Defina o tipo da ferramenta como shell e o tipo de ambiente da ferramenta como local. Se estiver migrando da ferramenta descontinuada local_shell, atualize a solicitação e trate os itens shell_call e shell_call_output no loop de execução.

Solicitaçã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 do tipo shell_call:

  • Examine cada comando antes de executá-lo. Use uma lista de comandos permitidos e exija aprovação para comandos destrutivos ou que acessem dados sensíveis.
  • Execute os comandos aprovados em um ambiente isolado, com limites explícitos de acesso ao sistema de arquivos e à rede, de uso de memória e de tempo de execução. Aplique seu próprio limite de tempo mesmo que o modelo sugira um.
  • Registre os comandos e seus resultados para fins de auditoria.
  • Capture stdout, stderr e o resultado da execução.
  • Retorne os resultados como shell_call_output na solicitação seguinte.
Exemplo de executor de shell local
from contextlib import suppress
from dataclasses import dataclass
import os
import signal
import subprocess


@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 = self.default_timeout if timeout is None else timeout
        p = subprocess.Popen(
            cmd,
            shell=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
            start_new_session=True,
        )
        try:
            out, err = p.communicate(timeout=t)
            return CmdResult(out, err, p.returncode, False)
        except subprocess.TimeoutExpired:
            # Stop the shell and its children before draining their output pipes.
            with suppress(ProcessLookupError):
                os.killpg(p.pid, signal.SIGKILL)
            out, err = p.communicate()
            return CmdResult(out, err, p.returncode, True)

Estes exemplos exigem Linux ou macOS. Quando o tempo limite de execução de um comando se esgota, o código encerra todo o grupo de processos desse comando.

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"
      }
    }
  ]
}

Se um comando falhar ou exceder o tempo limite, retorne o resultado da execução para que o modelo possa decidir se deve tentar novamente. Consulte o aviso de desativação da ferramenta anterior.

Use o shell local com o SDK de Agentes

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

Use o shell local com o SDK de Agentes
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}`);
});

Os repositórios do SDK contêm exemplos que você pode executar.

Exemplo da ferramenta de shell em TypeScript

Exemplo em TypeScript de como usar a ferramenta de shell no SDK de Agentes.

Exemplo da ferramenta de shell em Python

Exemplo em Python de como usar a ferramenta de shell no SDK de Agentes.

Como tratar erros comuns

  • Se um comando exceder o tempo limite de execução, retorne um resultado que indique que o tempo se esgotou e inclua a saída parcial capturada.
  • Se max_output_length estiver presente em shell_call, inclua esse campo em shell_call_output.
  • Não dependa de comandos interativos. A ferramenta de shell deve executar os comandos sem interação.
  • Preserve a saída dos comandos que terminarem com um código diferente de zero para que o modelo possa avaliar como se recuperar do erro.

Riscos e segurança

Habilitar o acesso à rede na API de Contêineres amplia o que os contêineres podem fazer e traz riscos significativos para a segurança e a governança de dados. Por padrão, o acesso à rede fica desabilitado. Se você o habilitar, restrinja o acesso de saída 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 traz riscos como vazamento de dados, uso indevido de ferramentas 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 maneira 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 que tentam manipular o comportamento do modelo. Trate o conteúdo de rede de fontes não confiáveis como potencialmente malicioso e exija cuidado redobrado 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 você faz ativamente. Tenha cuidado com intermediários e agregadores que encaminham solicitações a outros serviços. Antes de incluí-los na lista de domínios permitidos, verifique como eles tratam e retêm os dados.

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

Revise o comando da ferramenta de shell e a saída da execução. Ambos aparecem na resposta da API Responses. Registre, em cada sessão, os hosts solicitados e os destinos reais das conexões de saída. 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. Já os dados transmitidos pela rede a serviços de terceiros estão sujeitos às políticas de retenção desses serviços. Verifique se os endpoints externos atendem aos seus requisitos de residência, retenção e conformidade.