> ## Documentation Index
> Fetch the complete documentation index at: https://docs.inagent.inconcertcx.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Crear sesión EventStream

> Inicia una sesión con un asistente de Inagent y recibe eventos en tiempo real por SSE.

Inicia una nueva sesión de inferencia con un asistente o `crew`. La respuesta permanece abierta como stream SSE mientras la sesión esté activa.

## Endpoint

```http theme={null}
POST /assistants-channel/api/v1/channel/api/eventstream/{crewId}
```

## Autenticación

<ParamField header="apikey" type="string" required>
  API Key proporcionada para tu integración.
</ParamField>

## Parámetros de ruta

<ParamField path="crewId" type="string" required>
  Identificador único del `crew` o asistente con el que se desea interactuar.

  **Ejemplo:** `mi-asistente-abc123`
</ParamField>

## Body

<ParamField body="arguments" type="object">
  Contexto inicial libre que se pasa a la sesión. Puede contener cualquier par clave-valor que el `crew` necesite para funcionar.
</ParamField>

<ParamField body="outbound" type="object">
  Configuración opcional de mensaje saliente inicial. Si se incluye, el asistente envía un primer mensaje sin esperar el primer mensaje del usuario.
</ParamField>

```json Request theme={null}
{
  "arguments": {
    "nombre": "Juan"
  },
  "outbound": {
    "type": "static",
    "parameters": {
      "text": "Hola, ¿en qué puedo ayudarte?",
      "applyModifiers": true
    }
  }
}
```

## Outbound

La configuración `outbound` controla el primer mensaje que el asistente envía al iniciar la sesión.

<ParamField body="outbound.type" type="string" required>
  Define cómo se genera el primer mensaje saliente. Valores permitidos: `static` o `dynamic`.
</ParamField>

<ParamField body="outbound.parameters" type="object" required>
  Parámetros específicos según el tipo de `outbound`.
</ParamField>

### Static

El modo `static` envía un texto predefinido como primer mensaje. Es útil para saludos o instrucciones iniciales controladas.

<ParamField body="outbound.parameters.text" type="string" required>
  Texto literal que el asistente envía como primer mensaje.
</ParamField>

<ParamField body="outbound.parameters.applyModifiers" type="boolean">
  Indica si se deben aplicar los modificadores de personalidad o estilo configurados en el `crew`.
</ParamField>

```json Static outbound theme={null}
{
  "type": "static",
  "parameters": {
    "text": "Hola, soy tu asistente. ¿En qué puedo ayudarte?",
    "applyModifiers": true
  }
}
```

### Dynamic

El modo `dynamic` genera el primer mensaje a partir de un historial previo. Es útil para retomar una conversación o entregar contexto antes de que el asistente responda.

<ParamField body="outbound.parameters.previousWhisperedMessages" type="Message[]" required>
  Array de mensajes previos que se inyectan como contexto.
</ParamField>

<ParamField body="previousWhisperedMessages[].text" type="string" required>
  Contenido del mensaje previo.
</ParamField>

<ParamField body="previousWhisperedMessages[].author" type="string" required>
  Rol del emisor del mensaje. Valores permitidos: `system`, `agent` o `user`.
</ParamField>

```json Dynamic outbound theme={null}
{
  "type": "dynamic",
  "parameters": {
    "previousWhisperedMessages": [
      {
        "text": "Necesito saber el estado de mi pedido #1234",
        "author": "user"
      },
      {
        "text": "Claro, déjame verificar.",
        "author": "agent"
      }
    ]
  }
}
```

## Ejemplos

<CodeGroup>
  ```bash cURL theme={null}
  curl -N -X POST "https://api.backend.inconcertcc.com/assistants-channel/api/v1/channel/api/eventstream/{crewId}" \
    -H "Content-Type: application/json" \
    -H "apikey: tu-api-key-aqui" \
    -d '{"arguments":{"nombre":"Juan"}}'
  ```

  ```javascript JavaScript theme={null}
  const crewId = "mi-asistente-abc123";

  const response = await fetch(
    `https://api.backend.inconcertcc.com/assistants-channel/api/v1/channel/api/eventstream/${crewId}`,
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        apikey: process.env.INCONCERT_API_KEY
      },
      body: JSON.stringify({
        arguments: {
          nombre: "Juan"
        }
      })
    }
  );

  const reader = response.body.getReader();
  const decoder = new TextDecoder();

  while (true) {
    const { value, done } = await reader.read();
    if (done) break;
    console.log(decoder.decode(value, { stream: true }));
  }
  ```

  ```python Python theme={null}
  import os
  import requests

  crew_id = "mi-asistente-abc123"
  url = f"https://api.backend.inconcertcc.com/assistants-channel/api/v1/channel/api/eventstream/{crew_id}"

  headers = {
      "Content-Type": "application/json",
      "apikey": os.environ["INCONCERT_API_KEY"]
  }

  payload = {
      "arguments": {
          "nombre": "Juan"
      }
  }

  with requests.post(url, headers=headers, json=payload, stream=True, timeout=60) as response:
      response.raise_for_status()
      for line in response.iter_lines(decode_unicode=True):
          if line:
              print(line)
  ```
</CodeGroup>

## Respuesta

La respuesta es un stream SSE con `Content-Type: text/event-stream`.

<ResponseExample>
  ```http Response theme={null}
  id: 1
  event: Initialized
  data: {"sessionId":"uuid-de-sesion","consumerId":"uuid-del-consumer"}

  id: 2
  event: hearthbeat
  data: {"minutes":0.5}
  ```
</ResponseExample>

## Códigos de respuesta

| Código | Descripción                                                         |
| ------ | ------------------------------------------------------------------- |
| `200`  | Stream SSE abierto exitosamente.                                    |
| `400`  | Error en la petición, usuario no encontrado o parámetros inválidos. |
| `429`  | Límite de sesiones simultáneas alcanzado.                           |

<Tip>
  Guarda el `sessionId` y el `consumerId` del evento `Initialized`; los necesitarás para enviar mensajes con el endpoint **Talk**.
</Tip>
