> 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/persistence.md).

# Persistencia

Cuando hablamos de persistencia en Neuron, hablamos de la capacidad del sistema para capturar y preservar el estado completo de un flujo de trabajo en ejecución en cualquier momento. Esto incluye:

* **Todas las variables y sus valores actuales**
* **La posición exacta de ejecución** – qué nodo está activo, cuáles se han completado, cuáles están en espera
* **Contexto y metadatos** – marcas de tiempo, información del usuario, historial de decisiones
* **Estados de error y contadores de reintentos** – para que los fallos puedan gestionarse con elegancia

Piensa en ello como una sofisticada función de "guardar partida", pero para procesos empresariales. En cualquier momento, cuando se solicita una interrupción desde un nodo, Neuron crea una instantánea del estado de tu flujo de trabajo y la almacena en la capa de persistencia. Más tarde, ya sean segundos, horas o semanas, el flujo de trabajo puede restaurarse exactamente a ese momento y continuar como si nada hubiera ocurrido.

Como es habitual en Neuron, la capa de persistencia del Workflow se construye sobre una interfaz común, por lo que es extensible e intercambiable. A continuación, la capa de persistencia compatible.

### Cuándo usar la persistencia

La persistencia entra en juego cuando tienes previsto usar interrupciones (p. ej. [Aprobación de herramientas](/neuron-v3-es/agente/middleware.md#tool-approval-human-in-the-loop)).

### InMemoryPersistence

Mantiene los datos en memoria solo durante el ciclo de ejecución actual.

```php
use NeuronAI\Workflow\Persistence\InMemoryPersistence;

$workflow = new WorkflowAgent(
    new InMemoryPersistence()
);
```

### FilePersistence

Almacenará los datos y el estado del Workflow en un archivo local.

```php
use NeuronAI\Workflow\Persistence\FilePersistence;

$workflow = new WorkflowAgent(
    new FilePersistence(__DIR__), 
);
```

### Base de datos

Para persistir la interrupción del flujo de trabajo en la base de datos, necesitas pasar una `PDO` instancia. Si estás trabajando sobre un framework, puedes obtenerla fácilmente del ORM de la misma manera que la [SQLChatHistory](/neuron-v3-es/agente/chat-history-and-memory.md#sqlchathistory).

```php
use NeuronAI\Workflow\Persistence\DatabasePersistence;

$workflow = new WorkflowAgent(
    new DatabasePersistence(
        pdo: new \PDO(...),
        table: 'workflow_interrupts'
    ), 
);
```

Aquí están los scripts SQL para crear la tabla:

{% tabs %}
{% tab title="MySQL/MariaDB" %}

```sql
CREATE TABLE IF NOT EXISTS workflow_interrupts (
    workflow_id VARCHAR(255) PRIMARY KEY,
    interrupt LONGBLOB NOT NULL,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NOT NULL,
    
    INDEX idx_workflow_id (workflow_id),
    INDEX idx_updated_at (updated_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```

{% endtab %}

{% tab title="PostgreSQL" %}

```sql
CREATE TABLE workflow_interrupts (
    workflow_id VARCHAR(255) PRIMARY KEY,
    interrupt BYTEA NOT NULL,
    created_at TIMESTAMP NOT NULL,
    updated_at TIMESTAMP NOT NULL
);

CREATE INDEX idx_workflow_id ON workflow_interrupts(workflow_id);
CREATE INDEX idx_updated_at ON workflow_interrupts(updated_at);
```

{% endtab %}

{% tab title="SQLite" %}

```sql
CREATE TABLE workflow_interrupts (
    workflow_id TEXT PRIMARY KEY,
    interrupt BLOB NOT NULL,
    created_at TEXT NOT NULL,
    updated_at TEXT NOT NULL
);

CREATE INDEX idx_workflow_id ON workflow_interrupts(workflow_id);
CREATE INDEX idx_updated_at ON workflow_interrupts(updated_at);
```

{% endtab %}
{% endtabs %}

### Eloquent

Deberías crear tu propio modelo Eloquent y pasar la cadena de la clase como argumento del constructor. El modelo puede tener relaciones, scopes, atributos, etc. personalizados, pero la estructura básica debe basarse en este script de migración:

```bash
php artisan make:migration create_workflow_interrupts_table --create=workflow_interrupts
```

```php
Schema::create('workflow_interrupts', function (Blueprint $table) {
    $table->id();
    $table->string('workflow_id')->unique();
    $table->longText('interrupt')->charset('binary');
    $table->timestamps();
});
```

#### Modelo WorkflowInterrupt

Esta es la estructura mínima requerida:

```php
class WorkflowInterrupt extends Model
{    
    protected $fillable = ['workflow_id', 'interrupt'];
}
```

Uso con Workflow:

```php
use App\Models\WorkflowInterrupt;
use NeuronAI\Workflow\Persistence\EloquentPersistence;

// Creando un flujo de trabajo
$workflow = WorkflowAgent(
    persistence: new EloquentPersistence(WorkflowInterrupt::class)
);
```
