For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegación principal

Shell

Ejecuta comandos de shell en contenedores alojados o en tu propio entorno de ejecución local.

La herramienta shell permite a los modelos trabajar en un entorno de terminal completo. Admitimos la ejecución de shell tanto localmente como en entornos alojados a través de la API Responses.

La herramienta shell permite a los modelos ejecutar comandos mediante cualquiera de estas opciones:

Shell está disponible a través de la API Responses. No está disponible a través de la API para completar chats.

Ejecutar comandos de shell arbitrarios puede ser peligroso. Ejecuta siempre los comandos en un sandbox, aplica listas de permitidos o bloqueados cuando sea posible y registra la actividad de la herramienta para realizar auditorías.

Inicio rápido de la terminal alojada en la nube

La terminal alojada en la nube es una opción nativa y sencilla para tareas que requieren un procesamiento determinista con más capacidades, desde realizar cálculos hasta trabajar con contenido multimedia.

Usa container_auto cuando quieras que OpenAI aprovisione y administre un contenedor para la solicitud.

Herramienta shell con 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"
  }'

Detalles del entorno de ejecución alojado

  • El entorno de ejecución se basa actualmente en Debian 12 y puede cambiar con el tiempo.
  • El directorio de trabajo predeterminado es /mnt/data.
  • /mnt/data siempre está presente y es la ruta admitida para los artefactos que los usuarios pueden descargar.
  • La terminal alojada en la nube no admite sesiones TTY interactivas.
  • Los comandos de la terminal alojada en la nube no se ejecutan con sudo.
  • Puedes ejecutar servicios dentro del contenedor cuando tu flujo de trabajo los necesite.

Los lenguajes preinstalados actualmente incluyen:

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

Reutiliza un contenedor entre solicitudes

Si necesitas un entorno de larga duración para flujos de trabajo iterativos, crea un contenedor y luego haz referencia a él en las llamadas posteriores a la API Responses.

1. Crea un contenedor

Crea un contenedor reutilizable
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. Haz referencia al contenedor en Responses

Usa shell con 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."
  }'

Adjunta habilidades

Las habilidades son paquetes reutilizables con versiones que puedes montar en entornos de terminal alojada en la nube. Esto define las habilidades disponibles y, al ejecutar shell, el modelo decide si las invoca.

Consulta la guía de habilidades para obtener detalles sobre cómo cargarlas y gestionar sus versiones.

Crea un contenedor con habilidades adjuntas
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" }
    ]
  }'

Acceso a la red

Los contenedores alojados no tienen acceso de salida a la red de forma predeterminada.

Para habilitarlo:

  1. Un administrador debe configurar la lista de permitidos de tu organización en el panel.
  2. Debes configurar explícitamente network_policy en el entorno del contenedor en tu solicitud.
Herramienta shell con lista de permitidos de red
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 dominios en una lista de permitidos introduce riesgos de seguridad, como la exfiltración de datos mediante inyección de prompts. Incluye únicamente dominios en los que confíes y que los atacantes no puedan usar para recibir datos exfiltrados. Revisa detenidamente la sección Riesgos y seguridad más adelante antes de usar esta herramienta.

Precedencia de las políticas de red

Cuando hay varios controles:

  • La lista de permitidos de tu organización define el conjunto completo de allowed_domains.
  • La configuración de network_policy de cada solicitud restringe aún más el acceso.
  • Las solicitudes fallan si allowed_domains incluye dominios que no están en la lista de permitidos de tu organización.

Retención de datos y ciclo de vida del contenedor

Los contenedores alojados que utilizan la terminal alojada en la nube y el intérprete de código pueden escribir el estado temporal de la aplicación en el sistema de archivos del contenedor (basado en almacenamiento efímero en bloques) mientras el contenedor está activo. Los datos del contenedor se eliminan cuando este caduca o se elimina explícitamente.

Para obtener más detalles sobre los controles de datos, consulta ZDR y residencia de datos.

Descarga artefactos

La terminal alojada en la nube puede generar archivos descargables. Usa las mismas API de contenedores y archivos que el intérprete de código para recuperar los artefactos escritos en /mnt/data.

Controles de datos adicionales

Si quieres que el contenido y los archivos sean efímeros durante el ciclo de vida del entorno alojado, puedes incluir los archivos directamente en la solicitud y montar habilidades incluidas directamente en el contenedor.

Usar archivos y habilidades incluidos directamente
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."
          }
        ]
      }
    ]
  }'

Para las solicitudes posteriores, pasa el mismo container_id con container_reference. Las habilidades montadas y los archivos existentes en el contenedor permanecen disponibles mientras el contenedor esté activo.

Eliminar un contenedor de forma anticipada

Puedes eliminar explícitamente el contenedor cuando termines el trabajo, en lugar de esperar a que expire por inactividad.

Eliminar un contenedor
curl -L -X DELETE 'https://api.openai.com/v1/containers/container_id' \
  -H "Authorization: Bearer $OPENAI_API_KEY"

Secretos de dominio

Usa domain_secrets cuando un dominio de tu lista allowed_domains requiera encabezados de autorización privados, como Authorization: Bearer <token>.

Cada entrada de secreto incluye:

  • Dominio de destino
  • Nombre descriptivo del secreto
  • Valor del secreto

Durante la ejecución:

  • El modelo y el entorno de ejecución ven nombres de marcadores de posición (por ejemplo, $API_KEY) en lugar de las credenciales reales.
  • El sidecar de traducción de autenticación aplica los valores reales de los secretos solo para los destinos aprobados.
  • Los valores reales de los secretos no se conservan en los servidores de la API ni aparecen en el contexto visible para el modelo.

Esto permite que el asistente llame a servicios protegidos y reduce el riesgo de filtraciones.

Herramienta Shell con 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"
              }
            ]
          }
        }
      }
    ]
  }'

Flujos de trabajo de varios turnos

Para continuar el trabajo en el mismo entorno alojado, reutiliza el contenedor y pasa previous_response_id.

Continuar un flujo de trabajo 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."
  }'

Salida de Shell en Responses

La terminal alojada en la nube y el shell local usan los mismos tipos de elementos de salida. Las ejecuciones de Shell se representan mediante pares de elementos de salida:

  • shell_call: comandos solicitados por el modelo.
  • shell_call_output: salida de los comandos y resultados de su finalización.
Ejemplo de elemento 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

También puedes ejecutar comandos de shell en tu propio entorno de ejecución local: ejecuta las acciones shell_call y envía shell_call_output de vuelta al modelo.

Usa este modo cuando necesites control total sobre el entorno de ejecución, el acceso al sistema de archivos o las herramientas internas existentes.

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

Cuando recibas elementos de salida shell_call:

  • Ejecuta los comandos solicitados en tu entorno de ejecución.
  • Captura stdout, stderr y el resultado.
  • Devuelve los resultados como shell_call_output en la siguiente solicitud.
Ejemplo de ejecutor 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)
Ejemplo de carga útil 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 conocer los detalles de la migración desde la versión anterior, consulta la guía de shell local anterior.

Usar shell local con Agents SDK

Si usas Agents SDK, puedes pasar tu propia implementación del ejecutor de shell a la función auxiliar de la herramienta Shell.

Usar shell local con 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}`);
});

Puedes encontrar ejemplos funcionales en los repositorios del SDK.

Ejemplo de la herramienta Shell - TypeScript

Ejemplo en TypeScript de la herramienta Shell en Agents SDK.

Ejemplo de la herramienta Shell - Python

Ejemplo en Python de la herramienta Shell en Agents SDK.

Manejo de errores comunes

  • Si un comando supera el tiempo de espera de ejecución, devuelve un resultado que indique que se agotó el tiempo e incluye la salida parcial capturada.
  • Si max_output_length está presente en shell_call, inclúyelo en shell_call_output.
  • No dependas de comandos interactivos; la ejecución de la herramienta shell debe ser no interactiva.
  • Conserva las salidas de los comandos que terminan con un código de salida distinto de cero para que el modelo pueda razonar sobre los pasos de recuperación.

Riesgos y seguridad

Habilitar el acceso a la red en la API Containers ofrece una capacidad potente e introduce riesgos significativos para la seguridad y la gobernanza de datos. De forma predeterminada, el acceso a la red no está habilitado. Cuando se habilita, el acceso saliente debe limitarse estrictamente a los dominios de confianza necesarios para la tarea.

Los contenedores con acceso a la red pueden interactuar con servicios de terceros y registros de paquetes. Esto genera riesgos como la filtración de datos, el uso indebido de herramientas provocado por la inyección de prompts y el acceso accidental más allá de los límites previstos. Estos riesgos aumentan cuando las políticas son amplias, estáticas o se aplican de manera inconsistente.

Comprende los riesgos de inyección de prompts en el contenido obtenido de la red

Cualquier contenido externo obtenido a través de la red puede contener instrucciones ocultas destinadas a manipular el comportamiento del modelo. Trata el contenido de red que no sea de confianza como potencialmente malicioso y exige mayor precaución en las acciones que puedan modificar datos o sistemas.

Conéctate solo a destinos de confianza

Permite solo dominios en los que confíes y cuyo mantenimiento realices activamente. Ten precaución con los intermediarios y agregadores que actúan como proxy de otros servicios, y revisa sus prácticas de manejo y retención de datos antes de agregarlos a tu lista de dominios permitidos.

Incorpora revisiones antes y después de ejecutar las solicitudes

Revisa el comando de la herramienta shell y la salida de su ejecución, que se incluyen en la respuesta de la API Responses. Registra los hosts solicitados y los destinos reales de las conexiones salientes de cada sesión. Revisa periódicamente los registros para verificar que los patrones de acceso coincidan con lo esperado, detectar desviaciones e identificar comportamientos sospechosos.

Valida los requisitos de residencia y retención de datos

Los controles de datos de OpenAI se aplican dentro de los límites de OpenAI. Sin embargo, los datos transmitidos a servicios de terceros a través de conexiones de red están sujetos a las políticas de retención de datos de esos servicios. Asegúrate de que los puntos de acceso externos cumplan tus requisitos de residencia, retención y cumplimiento.