> For the complete documentation index, see [llms.txt](https://docs.neuron-ai.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.neuron-ai.dev/neuron-v3-es/flujo-de-trabajo/middleware.md).

# Middleware

### ¿Qué es un middleware?

Middleware proporciona una forma de interceptar la ejecución del flujo de trabajo y, por lo tanto, también Agent y RAG, ya que ellos también son flujos de trabajo.

La ejecución central del Workflow implica llamar a nodos según los eventos devueltos por otros nodos. Middleware expone ganchos para intervenir en `antes` y `después` la ejecución de los nodos:

<figure><img src="/files/cf30ee03864f344b367c4ff4912646c38c57e6b2" alt=""><figcaption></figcaption></figure>

### ¿Qué puede hacer el middleware?

<table data-view="cards"><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><strong>Controlar</strong></td><td>Transformar prompts, la selección de herramientas y el formato de salida.</td></tr><tr><td><strong>Salvaguardas</strong></td><td>Añadir reintentos, límites de tasa, implementar guardrails, rechazo de prompts.</td></tr><tr><td><strong>Monitorizar</strong></td><td>Rastrear el comportamiento del agente con registro, analíticas y depuración.</td></tr></tbody></table>

### Creación de middleware

Puedes usar el siguiente comando para crear una clase de middleware:

{% tabs %}
{% tab title="Unix" %}

```bash
vendor/bin/neuron make:middleware CustomMiddleware
```

{% endtab %}

{% tab title="Windows" %}

```powershell
.\vendor\bin\neuron make:middleware CustomMiddleware
```

{% endtab %}
{% endtabs %}

Se creará una nueva clase en tu proyecto con la estructura predeterminada de middleware:

```php
<?php

namespace App\Neuron\Middleware;

class CustomMiddleware implements WorkflowMiddleware
{
    /**
     * Se ejecuta antes de que el nodo se ejecute.
     */
    public function before(NodeInterface $node, Event $event, WorkflowState $state): void
    {
        // ...
    }
    
    /**
     * Se ejecuta después de que el nodo se ejecute.
     */
    public function after(NodeInterface $node, Event $result, WorkflowState $state): void
    {
        // ...
    }
}
```

### Registro de middleware

Si deseas asignar middleware a nodos específicos, puedes sobrescribir el `middleware` método al definir el flujo de trabajo:

```php
class MyWorkflow extends Workflow
{
    /**
     * Define el middleware de los nodos.
     */
    protected function middleware(): array
    {
        return [
            NodeOne::class => new CustomMiddleware(),
        ];
    }
}
```

También puedes asignar varios middleware a un nodo, definiendo un arreglo:

```php
class MyWorkflow extends Workflow
{
    /**
     * Define el middleware de los nodos.
     */
    protected function middleware(): array
    {
        return [
            NodeOne::class => [
                new CustomMiddleware(),
                new AnotherMiddleware(),
            ]
        ];
    }
}
```

### Middleware global

Si quieres que el middleware se ejecute antes y después de cada nodo, puedes añadirlo a la pila global de middleware en el flujo de trabajo:

```php
class MyWorkflow extends Workflow
{
    /**
     * Define el middleware global.
     */
    protected function globalMiddleware(): array
    {
        return [
            new CustomMiddleware(),
        ];
    }
}
```

### Ejemplos

Neuron proporciona middleware preconstruido para casos de uso comunes, como la aprobación de herramientas o la resumición de contexto. Puedes verlos en la sección Agent:

{% content-ref url="/pages/b17ff1200828767959e6ec06f777645020907a3a" %}
[Middleware](/neuron-v3-es/agente/middleware.md)
{% endcontent-ref %}
