{"meta":{"title":"Dirección y puesta en cola","intro":"Dos patrones de interacción permiten a los usuarios enviar mensajes mientras el agente ya está funcionando: redirección redirige al agente a mitad del turno, y poner en cola los mensajes para el procesamiento secuencial tras completar el turno actual.","product":"GitHub Copilot","breadcrumbs":[{"href":"/es/enterprise-cloud@latest/copilot","title":"GitHub Copilot"},{"href":"/es/enterprise-cloud@latest/copilot/how-tos","title":"Procedimientos"},{"href":"/es/enterprise-cloud@latest/copilot/how-tos/copilot-sdk","title":"SDK de Copilot"},{"href":"/es/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features","title":"Características"},{"href":"/es/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features/steering-and-queueing","title":"Dirección y puesta en cola"}],"documentType":"article"},"body":"# Dirección y puesta en cola\n\nDos patrones de interacción permiten a los usuarios enviar mensajes mientras el agente ya está funcionando: redirección redirige al agente a mitad del turno, y poner en cola los mensajes para el procesamiento secuencial tras completar el turno actual.\n\n<!-- markdownlint-disable GHD046 GHD005 -->\n\n<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->\n\n## Visión general\n\nCuando una sesión procesa activamente un turno, los mensajes entrantes se pueden entregar en uno de los dos modos a través del `mode` campo en `MessageOptions`:\n\n| Modo                         | Comportamiento                                                         | Caso de uso                                                       |\n| ---------------------------- | ---------------------------------------------------------------------- | ----------------------------------------------------------------- |\n| `\"immediate\"` (dirección)    | Insertado en el turno LLM **actual**                                   | De hecho, no cree ese archivo, sino que use un enfoque diferente. |\n| `\"enqueue\"` (puesta en cola) | Puesto en cola y procesado **después** de que finalice el turno actual | \"Después de esto, también corrija las pruebas\"                    |\n\n![Diagrama: diagrama de secuencia que muestra el proceso descrito.](/assets/images/help/copilot/copilot-sdk/features-steering-and-queueing-diagram-0.png)\n\n## Dirección (modo inmediato)\n\nEl sistema de control envía un mensaje que se inserta directamente en el turno actual del agente. El agente ve el mensaje en tiempo real y ajusta su respuesta en consecuencia, útil para corregir el curso sin anular el turno.\n\n<div class=\"ghd-codetabs\">\n<div class=\"ghd-codetab\" data-lang=\"typescript\" data-label=\"TypeScript\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">TypeScript</div>\n\n```typescript\nimport { CopilotClient } from \"@github/copilot-sdk\";\n\nconst client = new CopilotClient();\nawait client.start();\n\nconst session = await client.createSession({\n    model: \"gpt-5.4\",\n    onPermissionRequest: async () => ({ kind: \"approve-once\" }),\n});\n\n// Start a long-running task\nconst msgId = await session.send({\n    prompt: \"Refactor the authentication module to use sessions\",\n});\n\n// While the agent is working, steer it\nawait session.send({\n    prompt: \"Actually, use JWT tokens instead of sessions\",\n    mode: \"immediate\",\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"python\" data-label=\"Python\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Python</div>\n\n```python\nfrom copilot import CopilotClient, PermissionDecisionApproveOnce\n\nasync def main():\n    client = CopilotClient()\n    await client.start()\n\n    session = await client.create_session(\n        on_permission_request=lambda req, inv: PermissionDecisionApproveOnce(),\n        model=\"gpt-5.4\",\n    )\n\n    # Start a long-running task\n    msg_id = await session.send(\n        \"Refactor the authentication module to use sessions\",\n    )\n\n    # While the agent is working, steer it\n    await session.send(\n        \"Actually, use JWT tokens instead of sessions\",\n        mode=\"immediate\",\n    )\n\n    await client.stop()\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"go\" data-label=\"Go\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Go</div>\n\n```golang\npackage main\n\nimport (\n    \"context\"\n    \"log\"\n    copilot \"github.com/github/copilot-sdk/go\"\n    \"github.com/github/copilot-sdk/go/rpc\"\n)\n\nfunc main() {\n    ctx := context.Background()\n    client := copilot.NewClient(nil)\n    if err := client.Start(ctx); err != nil {\n        log.Fatal(err)\n    }\n    defer client.Stop()\n\n    session, err := client.CreateSession(ctx, &copilot.SessionConfig{\n        Model: \"gpt-5.4\",\n        OnPermissionRequest: func(req copilot.PermissionRequest, inv copilot.PermissionInvocation) (rpc.PermissionDecision, error) {\n            return &rpc.PermissionDecisionApproveOnce{}, nil\n        },\n    })\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    // Start a long-running task\n    _, err = session.Send(ctx, copilot.MessageOptions{\n        Prompt: \"Refactor the authentication module to use sessions\",\n    })\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    // While the agent is working, steer it\n    _, err = session.Send(ctx, copilot.MessageOptions{\n        Prompt: \"Actually, use JWT tokens instead of sessions\",\n        Mode:   \"immediate\",\n    })\n    if err != nil {\n        log.Fatal(err)\n    }\n}\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"dotnet\" data-label=\".NET\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">.NET</div>\n\n```csharp\nusing GitHub.Copilot;\nusing GitHub.Copilot.Rpc;\n\nawait using var client = new CopilotClient();\nawait using var session = await client.CreateSessionAsync(new SessionConfig\n{\n    Model = \"gpt-5.4\",\n    OnPermissionRequest = (req, inv) =>\n        Task.FromResult(PermissionDecision.ApproveOnce()),\n});\n\n// Start a long-running task\nvar msgId = await session.SendAsync(new MessageOptions\n{\n    Prompt = \"Refactor the authentication module to use sessions\"\n});\n\n// While the agent is working, steer it\nawait session.SendAsync(new MessageOptions\n{\n    Prompt = \"Actually, use JWT tokens instead of sessions\",\n    Mode = \"immediate\"\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"java\" data-label=\"Java\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Java</div>\n\n```java\nimport com.github.copilot.CopilotClient;\nimport com.github.copilot.rpc.*;\n\ntry (var client = new CopilotClient()) {\n    client.start().get();\n\n    var session = client.createSession(\n        new SessionConfig()\n            .setModel(\"gpt-5.4\")\n            .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)\n    ).get();\n\n    // Start a long-running task\n    session.send(new MessageOptions()\n        .setPrompt(\"Refactor the authentication module to use sessions\")\n    ).get();\n\n    // While the agent is working, steer it\n    session.send(new MessageOptions()\n        .setPrompt(\"Actually, use JWT tokens instead of sessions\")\n        .setMode(\"immediate\")\n    ).get();\n}\n```\n\n</div>\n\n</div>\n\n### Funcionamiento interno del sistema de dirección\n\n1. El mensaje se añade a la cola de ejecución del entorno de `ImmediatePromptProcessor`\n2. Antes de la siguiente solicitud LLM dentro del turno actual, el procesador inserta el mensaje en la conversación.\n3. El agente ve el mensaje de dirección como un nuevo mensaje de usuario y ajusta su respuesta.\n4. Si el turno se completa antes de que se procese el mensaje de control, se mueve automáticamente a la cola habitual para el siguiente turno.\n\n> \\[!NOTE]\n> Los mensajes de dirección son el mejor esfuerzo dentro del turno actual. Si el agente ya se ha comprometido con una llamada de herramienta, el control surte efecto después de que se complete esa llamada, pero aún dentro del mismo turno.\n\n## Puesta en cola (modo de puesta en cola)\n\nPoner en cola los mensajes que se van a procesar secuencialmente después de que finalice el turno actual. Cada mensaje en cola inicia su propio turno completo. Este es el modo predeterminado: si omite `mode`, el SDK usa `\"enqueue\"`.\n\n<div class=\"ghd-codetabs\">\n<div class=\"ghd-codetab\" data-lang=\"typescript\" data-label=\"TypeScript\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">TypeScript</div>\n\n```typescript\nimport { CopilotClient } from \"@github/copilot-sdk\";\n\nconst client = new CopilotClient();\nawait client.start();\n\nconst session = await client.createSession({\n    model: \"gpt-5.4\",\n    onPermissionRequest: async () => ({ kind: \"approve-once\" }),\n});\n\n// Send an initial task\nawait session.send({ prompt: \"Set up the project structure\" });\n\n// Queue follow-up tasks while the agent is busy\nawait session.send({\n    prompt: \"Add unit tests for the auth module\",\n    mode: \"enqueue\",\n});\n\nawait session.send({\n    prompt: \"Update the README with setup instructions\",\n    mode: \"enqueue\",\n});\n\n// Messages are processed in FIFO order after each turn completes\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"python\" data-label=\"Python\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Python</div>\n\n```python\nfrom copilot import CopilotClient, PermissionDecisionApproveOnce\n\nasync def main():\n    client = CopilotClient()\n    await client.start()\n\n    session = await client.create_session(\n        on_permission_request=lambda req, inv: PermissionDecisionApproveOnce(),\n        model=\"gpt-5.4\",\n    )\n\n    # Send an initial task\n    await session.send(\"Set up the project structure\")\n\n    # Queue follow-up tasks while the agent is busy\n    await session.send(\n        \"Add unit tests for the auth module\",\n        mode=\"enqueue\",\n    )\n\n    await session.send(\n        \"Update the README with setup instructions\",\n        mode=\"enqueue\",\n    )\n\n    # Messages are processed in FIFO order after each turn completes\n    await client.stop()\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"go\" data-label=\"Go\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Go</div>\n\n```golang\n// Send an initial task\nsession.Send(ctx, copilot.MessageOptions{\n    Prompt: \"Set up the project structure\",\n})\n\n// Queue follow-up tasks while the agent is busy\nsession.Send(ctx, copilot.MessageOptions{\n    Prompt: \"Add unit tests for the auth module\",\n    Mode:   \"enqueue\",\n})\n\nsession.Send(ctx, copilot.MessageOptions{\n    Prompt: \"Update the README with setup instructions\",\n    Mode:   \"enqueue\",\n})\n\n// Messages are processed in FIFO order after each turn completes\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"dotnet\" data-label=\".NET\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">.NET</div>\n\n```csharp\n// Send an initial task\nawait session.SendAsync(new MessageOptions\n{\n    Prompt = \"Set up the project structure\"\n});\n\n// Queue follow-up tasks while the agent is busy\nawait session.SendAsync(new MessageOptions\n{\n    Prompt = \"Add unit tests for the auth module\",\n    Mode = \"enqueue\"\n});\n\nawait session.SendAsync(new MessageOptions\n{\n    Prompt = \"Update the README with setup instructions\",\n    Mode = \"enqueue\"\n});\n\n// Messages are processed in FIFO order after each turn completes\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"java\" data-label=\"Java\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Java</div>\n\n```java\nimport com.github.copilot.CopilotClient;\nimport com.github.copilot.rpc.*;\n\ntry (var client = new CopilotClient()) {\n    client.start().get();\n\n    var session = client.createSession(\n        new SessionConfig()\n            .setModel(\"gpt-5.4\")\n            .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)\n    ).get();\n\n    // Send an initial task\n    session.send(new MessageOptions().setPrompt(\"Set up the project structure\")).get();\n\n    // Queue follow-up tasks while the agent is busy\n    session.send(new MessageOptions()\n        .setPrompt(\"Add unit tests for the auth module\")\n        .setMode(\"enqueue\")\n    ).get();\n\n    session.send(new MessageOptions()\n        .setPrompt(\"Update the README with setup instructions\")\n        .setMode(\"enqueue\")\n    ).get();\n\n    // Messages are processed in FIFO order after each turn completes\n}\n```\n\n</div>\n\n</div>\n\n### Funcionamiento interno del sistema de colas\n\n1. El mensaje se agrega a la sesión `itemQueue` como `QueuedItem`\n2. Cuando se completa el turno actual y la sesión deja de estar inactiva, `processQueuedItems()` se ejecuta\n3. Los elementos se quitan en orden FIFO: cada mensaje desencadena un ciclo completo de acción del agente\n4. Si un mensaje de dirección estaba pendiente cuando finalizó el turno, se mueve al frente de la cola\n5. El procesamiento continúa hasta que la cola está vacía y la sesión emite un evento inactivo.\n\n## Combinación de encaminamiento y gestión de colas\n\nPuede usar ambos patrones juntos en una sola sesión. La dirección afecta al turno actual mientras los mensajes en cola esperan sus propios turnos:\n\n<div class=\"ghd-codetabs\">\n<div class=\"ghd-codetab\" data-lang=\"typescript\" data-label=\"TypeScript\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">TypeScript</div>\n\n```typescript\nconst session = await client.createSession({\n    model: \"gpt-5.4\",\n    onPermissionRequest: async () => ({ kind: \"approve-once\" }),\n});\n\n// Start a task\nawait session.send({ prompt: \"Refactor the database layer\" });\n\n// Steer the current work\nawait session.send({\n    prompt: \"Make sure to keep backwards compatibility with the v1 API\",\n    mode: \"immediate\",\n});\n\n// Queue a follow-up for after this turn\nawait session.send({\n    prompt: \"Now add migration scripts for the schema changes\",\n    mode: \"enqueue\",\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"python\" data-label=\"Python\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Python</div>\n\n```python\nsession = await client.create_session(\n    on_permission_request=lambda req, inv: PermissionDecisionApproveOnce(),\n    model=\"gpt-5.4\",\n)\n\n# Start a task\nawait session.send(\"Refactor the database layer\")\n\n# Steer the current work\nawait session.send(\n    \"Make sure to keep backwards compatibility with the v1 API\",\n    mode=\"immediate\",\n)\n\n# Queue a follow-up for after this turn\nawait session.send(\n    \"Now add migration scripts for the schema changes\",\n    mode=\"enqueue\",\n)\n```\n\n</div>\n\n</div>\n\n## Elección entre la dirección y la cola\n\n| Escenario                                                  | Pattern                                                      | Por qué |\n| ---------------------------------------------------------- | ------------------------------------------------------------ | ------- |\n| El agente va por la ruta incorrecta                        |                                                              |         |\n| **Dirección**                                              | Redirige el turno actual sin perder el progreso.             |         |\n| Pensaste en algo que el agente también debería hacer       |                                                              |         |\n| **Cola**                                                   | No interrumpe el trabajo actual; se ejecuta a continuación   |         |\n| El agente está a punto de cometer un error                 |                                                              |         |\n| **Dirección**                                              | Interviene antes de cometer el error                         |         |\n| Quiere encadenar varias tareas                             |                                                              |         |\n| **Cola**                                                   | La ordenación de FIFO garantiza una ejecución predecible     |         |\n| Quiere agregar contexto a la tarea actual.                 |                                                              |         |\n| **Dirección**                                              | El agente lo incorpora en su razonamiento actual             |         |\n| Usted quiere agrupar solicitudes no relacionadas por lotes |                                                              |         |\n| **Cola**                                                   | Cada uno obtiene su propio ciclo completo con contexto claro |         |\n\n## Creación de una interfaz de usuario con control y gestión de colas\n\nEste es un patrón para crear una interfaz de usuario interactiva que admita ambos modos:\n\n```typescript\nimport { CopilotClient, CopilotSession } from \"@github/copilot-sdk\";\n\ninterface PendingMessage {\n    prompt: string;\n    mode: \"immediate\" | \"enqueue\";\n    sentAt: Date;\n}\n\nclass InteractiveChat {\n    private session: CopilotSession;\n    private isProcessing = false;\n    private pendingMessages: PendingMessage[] = [];\n\n    constructor(session: CopilotSession) {\n        this.session = session;\n\n        session.on((event) => {\n            if (event.type === \"session.idle\") {\n                this.isProcessing = false;\n                this.onIdle();\n            }\n            if (event.type === \"assistant.message\") {\n                this.renderMessage(event);\n            }\n        });\n    }\n\n    async sendMessage(prompt: string): Promise<void> {\n        if (!this.isProcessing) {\n            this.isProcessing = true;\n            await this.session.send({ prompt });\n            return;\n        }\n\n        // Session is busy — let the user choose how to deliver\n        // Your UI would present this choice (e.g., buttons, keyboard shortcuts)\n    }\n\n    async steer(prompt: string): Promise<void> {\n        this.pendingMessages.push({\n            prompt,\n            mode: \"immediate\",\n            sentAt: new Date(),\n        });\n        await this.session.send({ prompt, mode: \"immediate\" });\n    }\n\n    async enqueue(prompt: string): Promise<void> {\n        this.pendingMessages.push({\n            prompt,\n            mode: \"enqueue\",\n            sentAt: new Date(),\n        });\n        await this.session.send({ prompt, mode: \"enqueue\" });\n    }\n\n    private onIdle(): void {\n        this.pendingMessages = [];\n        // Update UI to show session is ready for new input\n    }\n\n    private renderMessage(event: unknown): void {\n        // Render assistant message in your UI\n    }\n}\n```\n\n## Referencia de las API\n\n### Opciones de Mensaje\n\n| Language | Campo  | Tipo                              | Predeterminado | Description                 |\n| -------- | ------ | --------------------------------- | -------------- | --------------------------- |\n| Node.js  | `mode` | `\"enqueue\" \\| \"immediate\"`        | `\"enqueue\"`    | Modo de entrega de mensajes |\n| Python   | `mode` | `Literal[\"enqueue\", \"immediate\"]` | `\"enqueue\"`    | Modo de entrega de mensajes |\n| Ir       | `Mode` | `string`                          | `\"enqueue\"`    | Modo de entrega de mensajes |\n| .NET     | `Mode` | `string?`                         | `\"enqueue\"`    | Modo de entrega de mensajes |\n\n### Modos de entrega\n\n| Modo          | Efecto                      | Durante el turno activo                     | Durante el tiempo de inactividad     |\n| ------------- | --------------------------- | ------------------------------------------- | ------------------------------------ |\n| `\"enqueue\"`   | Cola para el próximo turno  | Espera en la cola FIFO                      | Inicia un nuevo turno inmediatamente |\n| `\"immediate\"` | Insertar en el turno actual | Insertado antes de la siguiente llamada LLM | Inicia un nuevo turno inmediatamente |\n\n> \\[!NOTE]\n> Cuando la sesión está inactiva (no se procesa), ambos modos se comportan de forma idéntica: el mensaje inicia un nuevo turno inmediatamente.\n\n## procedimientos recomendados\n\n1. **Valor predeterminado para poner en cola**: use `\"enqueue\"` (o omita `mode`) para la mayoría de los mensajes. Es predecible y no corre el riesgo de interrumpir el trabajo en curso.\n\n2. **Reserva la dirección para correcciones**: Use `\"immediate\"` cuando el agente esté haciendo activamente lo incorrecto y usted necesite redirigirlo antes de que vaya más allá.\n\n3. **Mantener los mensajes de dirección concisos**: el agente debe comprender rápidamente la corrección del curso. Los mensajes de dirección complejos largos pueden confundir el contexto actual.\n\n4. **No sobregire**—varios mensajes rápidos de dirección pueden degradar la calidad del giro. Si necesita cambiar significativamente la dirección, considere la posibilidad de anular el turno e iniciarlo de nuevo.\n\n5. **Mostrar el estado de la cola en la interfaz de usuario**: muestra el número de mensajes en cola para que los usuarios sepan lo que está pendiente. Monitoree los eventos inactivos para limpiar la pantalla.\n\n6. **Manejar el mecanismo de encaminamiento a cola**: si llega un mensaje de encaminamiento después de que el turno se complete, se mueve automáticamente a la cola. Diseñe la interfaz de usuario para reflejar esta transición.\n\n## Consulte también\n\n* [Crea tu primera aplicación con tecnología Copilot](/es/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/getting-started): Configuración de una sesión y envío de mensajes\n* [Agentes personalizados y orquestación de subagentes](/es/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features/custom-agents): Definir agentes especializados con herramientas de alcance definido\n* [Enlaces de sesión](/es/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/hooks/hooks-overview): Reaccionar a eventos del ciclo de vida de la sesión\n* [Reanudación y persistencia de sesión](/es/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features/session-persistence): Reanudar sesiones entre reinicios"}