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

# Actualizar asistente

> Actualiza la configuración de un asistente de IA existente

<Warning>
  **API de Famulor 1.0 (legado).** Esta página se aplica únicamente a Famulor 1.0 (`app.famulor.de`) y se conserva por compatibilidad. Para la plataforma actual, usa la [referencia de la API de Famulor 2.0](/es/api-reference/introduction).
</Warning>

Este endpoint te permite actualizar la configuración de un asistente de IA existente. Todos los campos son opcionales: solo se actualizan los campos que proporciones. Para descripciones detalladas de los campos y sus opciones, consulta [Crear asistente](/es/api-v1/assistants/create).

### Parámetro de ruta

<ParamField path="id" type="integer" required>
  El identificador único del asistente que se va a actualizar
</ParamField>

### Cuerpo de la solicitud

#### Campos principales

<ParamField body="name" type="string">
  El nombre del asistente (máx. 255 caracteres)
</ParamField>

<ParamField body="voice_id" type="integer">
  El ID de voz que usará el asistente. Usa el endpoint [Obtener voces](/es/api-v1/assistants/voices) con el parámetro `mode` para obtener voces compatibles con tu modo de motor.
</ParamField>

<ParamField body="language_id" type="integer">
  El ID de idioma del asistente. Usa el endpoint [Obtener idiomas](/es/api-v1/assistants/languages) para obtener los idiomas disponibles.
</ParamField>

<ParamField body="type" type="string">
  El tipo de asistente. Opciones: `inbound`, `outbound`
</ParamField>

<ParamField body="mode" type="string">
  El modo del motor. Opciones: `pipeline`, `multimodal`, `dualplex`

  <Warning>
    Cambiar el modo restablece los ajustes específicos del modo a sus valores predeterminados para el nuevo modo.
  </Warning>
</ParamField>

<ParamField body="timezone" type="string">
  La zona horaria del asistente (p. ej., "Europe/Berlin", "America/New\_York")
</ParamField>

<ParamField body="initial_message" type="string">
  El mensaje inicial que dirá el asistente al comienzo de la llamada (máx. 200 caracteres)
</ParamField>

<ParamField body="system_prompt" type="string">
  El prompt de sistema que define el comportamiento y la personalidad del asistente
</ParamField>

#### Campos específicos del modo

<ParamField body="llm_model_id" type="integer">
  El ID del modelo LLM a usar. Solo aplicable en modo `pipeline`.

  Usa el endpoint [Obtener modelos](/es/api-v1/assistants/models) para obtener los modelos disponibles.
</ParamField>

<ParamField body="multimodal_model_id" type="integer">
  El ID del modelo multimodal. Aplicable solo en los modos `multimodal` y `dualplex`.

  Usa el endpoint [Obtener modelos](/es/api-v1/assistants/models) para obtener los modelos multimodales disponibles.
</ParamField>

<ParamField body="chat_llm_fallback_id" type="integer">
  ID del modelo LLM de respaldo para llamadas a herramientas en los modos multimodal/dualplex. Se establece en `null` para eliminarlo.
</ParamField>

<ParamField body="turn_detection_threshold" type="number">
  Sensibilidad de la detección de turnos de habla para los modos multimodal/dualplex (0-1). Se establece en `null` para automático.
</ParamField>

#### Idiomas secundarios

<ParamField body="secondary_language_ids" type="integer[]">
  Array de IDs de idiomas adicionales que el asistente puede hablar. Reemplaza los idiomas secundarios existentes. Pasa un array vacío `[]` para eliminar todos los idiomas secundarios.

  ```json theme={null} theme={null}
  "secondary_language_ids": [2, 3, 4]
  ```
</ParamField>

#### Ajustes de base de conocimiento

<ParamField body="knowledgebase_id" type="integer">
  El ID de la base de conocimiento a vincular. Se establece en `null` para eliminarla.
</ParamField>

<ParamField body="knowledgebase_mode" type="string">
  Cómo se usa la base de conocimiento. Opciones:

  * `function_call` - La IA llama a una función para buscar (obligatorio para multimodal/dualplex)
  * `prompt` - El conocimiento se inyecta en el prompt (solo pipeline)
</ParamField>

#### Organización

<ParamField body="folder_id" type="integer">
  ID de una [carpeta](/es/api-v1/folders/create) a la que mover este asistente. Debe pertenecer a tu cuenta. Se establece en `null` para dejarlo sin categorizar. Se omite para dejar la carpeta sin cambios.
</ParamField>

<ParamField body="label_ids" type="integer[]">
  Array de IDs de [etiquetas](/es/api-v1/labels/create) para este asistente. Cada etiqueta debe pertenecer a tu cuenta. Si se proporciona, **reemplaza** las etiquetas actuales del asistente. Se omite para dejar las etiquetas sin cambios; se envía `[]` para eliminarlas todas.

  ```json theme={null} theme={null}
  "label_ids": [3, 5]
  ```
</ParamField>

#### Número de teléfono

<ParamField body="phone_number_id" type="integer">
  El ID de un número de teléfono a asignar. Se establece en `null` para desasignarlo. Debe pertenecer a tu cuenta.

  <Warning>
    Para los asistentes `inbound`, el número de teléfono no puede ser de tipo identificador de llamadas y no debe estar ya asignado a otro asistente entrante.
  </Warning>
</ParamField>

#### Herramientas personalizadas durante la llamada

<ParamField body="tool_ids" type="integer[]">
  Array de IDs de herramientas personalizadas durante la llamada que se van a sincronizar. **Reemplaza todas las asignaciones de herramientas existentes.** Pasa un array vacío `[]` para eliminar todas las herramientas. Cada herramienta debe pertenecer a tu cuenta.

  ```json theme={null} theme={null}
  "tool_ids": [1, 5, 12]
  ```
</ParamField>

#### Herramientas integradas

<ParamField body="tools" type="array">
  Array de herramientas integradas. **Reemplaza todas las herramientas integradas existentes.** Pasa un array vacío `[]` para eliminar todas las herramientas.

  <Expandable title="Tipos de herramienta">
    **call\_transfer** - Transferir la llamada a otro número de teléfono

    * `phone_number` (obligatorio): Número de teléfono al que transferir
    * `description`: Cuándo transferir la llamada
    * `custom`: Si es true, la IA puede determinar el número de transferencia dinámicamente
    * `timezone`: Zona horaria para la disponibilidad de la transferencia
    * `warm_transfer`: Enviar un mensaje al cliente antes de transferir (predeterminado: `false`)
    * `warm_transfer_message`: Prompt que indica a la IA qué decir antes de transferir (p. ej., "Dile al cliente que la llamada se está transfiriendo").

    **warm\_call\_transfer** - Transferencia asistida con briefing al supervisor

    * `supervisor_phone` (obligatorio): Número de teléfono al que llamar para la transferencia asistida (p. ej., "+14155552001"). Si `custom_sip` está activado, esto es una dirección SIP o una extensión interna en su lugar.
    * `outbound_phone_id` (obligatorio): ID del número de teléfono usado para llamar al supervisor. Consulta [Obtener números de teléfono](/es/api-v1/assistants/phone-numbers).
    * `description` (obligatorio): Cuándo transferir — describe cuándo debe iniciar la IA la transferencia asistida (p. ej., "Transferir la llamada a un supervisor humano cuando el cliente pida hablar con una persona real").
    * `custom_sip`: Actívalo para introducir una dirección SIP o una extensión interna personalizadas en lugar de un número de teléfono (predeterminado: `false`)
    * `caller_id_mode`: Qué número ve el supervisor al recibir la llamada. Opciones: `outbound_number` (predeterminado — muestra el número saliente), `customer_number` (muestra el número del interlocutor), `custom` (muestra un número personalizado)
    * `custom_caller_id`: Número de teléfono personalizado mostrado al supervisor. Solo se usa cuando `caller_id_mode` es `custom`.
    * `hold_music`: Audio reproducido al interlocutor mientras espera. Opciones: `hold_music` (predeterminado — reproduce la música de espera predeterminada), `none` (silencio, sin música)
    * `hold_music_volume`: Nivel de volumen de la música de espera, 0–100 (predeterminado: `80`)
    * `hold_message`: Mensaje que se dice al interlocutor antes de ponerlo en espera (predeterminado: "Por favor, espere mientras le conecto con un supervisor").
    * `summary_instructions`: Instrucciones sobre cómo debe informar la IA al supervisor sobre la llamada (predeterminado: "Introduce la conversación desde tu perspectiva:\n- QUIÉN llama (nombre, empresa si se menciona)\n- POR QUÉ ha llamado (su objetivo o problema)\n- POR QUÉ se necesita a una persona en este punto\n\nSé breve (2-3 frases).")
    * `briefing_initial_message`: El primer mensaje que dice la IA al supervisor cuando responde (predeterminado: "¡Hola! Tengo a un interlocutor en la línea que necesita tu ayuda. ¿Puedo ponerte al día sobre la situación?")
    * `connected_message`: Mensaje que se dice al interlocutor después de conectar con el supervisor (predeterminado: "Ya está conectado con un supervisor. Le dejo con él.")

    **end\_call** - Finalizar la llamada de forma programática

    * `description`: Cuándo debe finalizar la IA la llamada

    **dtmf\_input** - Enviar tonos DTMF (entrada de teclado)

    * `description`: Cuándo usar la entrada DTMF (para navegación por IVR)

    **collect\_keypad** - Recoger la entrada de teclado del interlocutor

    * `timeout`: Segundos de espera para la entrada, 1–30 (predeterminado: `5`)
    * `stop_key`: Tecla que finaliza la entrada. Opciones: `#` (predeterminado), `*`

    **calendar\_integration** - Programar citas a través de Cal.com

    * `calcom_api_key` (obligatorio): Tu clave de API de Cal.com
    * `calcom_event_slug` (obligatorio): El slug del tipo de evento de Cal.com
    * `calcom_team_slug`: Slug del equipo si el evento pertenece a un equipo de Cal.com
    * `calcom_endpoint`: Región de la API de Cal.com. Opciones: `us` (predeterminado — `https://api.cal.com`), `eu` (`https://api.cal.eu`), `custom` (usa `calcom_custom_endpoint`)
    * `calcom_custom_endpoint`: URL base personalizada de la API de Cal.com. Solo se usa cuando `calcom_endpoint` es `custom` (p. ej., `https://my-calcom-instance.com`).
    * `calcom_booking_fields`: Array de campos de reserva personalizados para el evento. Cada campo tiene: `slug` (obligatorio), `type` (obligatorio, p. ej. "text", "email", "phone", "select"), `label` (obligatorio), `required` (predeterminado: `false`), `options` (array de opciones para campos de tipo select)
    * `description`: Cuándo ofrecer la programación de citas

    **assistant\_transfer** - Ceder la conversación a otro asistente de IA en mitad de la llamada (intercambia voz, LLM y STT por los del asistente de destino)

    * `assistant_id` (obligatorio): ID del asistente de destino. Debe pertenecer a tu cuenta y no puede ser el asistente que se está actualizando (no se permite la autotransferencia).
    * `description`: Cuándo transferir (máx. 500 caracteres, predeterminado: "Transferir la conversación a este asistente cuando sea apropiado.")
    * `message_before_transfer`: Mensaje opcional que dice la IA antes de cambiar al asistente de destino (máx. 500 caracteres).
    * `speak_transfer_greeting`: Si es true, el asistente de destino dice su mensaje inicial configurado después de completar la transferencia (predeterminado: `true`)
  </Expandable>

  ```json theme={null} theme={null}
  "tools": [
    {
      "type": "dtmf_input",
      "description": "Navigate IVR when needed"
    },
    {
      "type": "warm_call_transfer",
      "supervisor_phone": "+1234567890",
      "outbound_phone_id": 7,
      "description": "Transfer the call to a human supervisor when the customer requests to speak with a real person.",
      "custom_sip": false,
      "caller_id_mode": "outbound_number",
      "hold_music": "hold_music",
      "hold_music_volume": 80,
      "hold_message": "Please hold while I connect you with a supervisor.",
      "summary_instructions": "Introduce the conversation from your perspective:\n- WHO is calling (name, company if mentioned)\n- WHY they called (their goal or problem)\n- WHY a human is needed at this point\n\nKeep it brief (2-3 sentences).",
      "briefing_initial_message": "Hello! I have a caller on the line who needs your assistance. May I brief you on the situation?",
      "connected_message": "You are now connected with a supervisor. I'll leave you to it."
    },
    {
      "type": "collect_keypad",
      "timeout": 5,
      "stop_key": "#"
    },
    {
      "type": "assistant_transfer",
      "assistant_id": 14765,
      "description": "Transfer to the Support Assistant when the customer needs technical help.",
      "message_before_transfer": "Sure — let me transfer you to our support specialist.",
      "speak_transfer_greeting": true
    },
    {
      "type": "end_call",
      "description": "End call when done"
    }
  ]
  ```

  <Note>
    Cuando [listas asistentes](/es/api-v1/assistants/list), cada herramienta configurada se devuelve como `{ "type": "...", "data": { ... } }`, con los mismos nombres de campo anidados bajo `data` (no en el nivel superior).
  </Note>
</ParamField>

#### Ajustes de voz y TTS

<ParamField body="tts_emotion_enabled" type="boolean">
  Si la síntesis de voz emocional está activada
</ParamField>

<ParamField body="voice_stability" type="number">
  Ajuste de estabilidad de voz (0-1). Más alto = voz más consistente
</ParamField>

<ParamField body="voice_similarity" type="number">
  Ajuste de similitud de voz (0-1). Más alto = más cercano a la voz original
</ParamField>

<ParamField body="speech_speed" type="number">
  Multiplicador de velocidad de habla (0.7-1.2)
</ParamField>

<ParamField body="llm_temperature" type="number">
  Ajuste de temperatura del LLM (0-1). Más bajo = más determinista
</ParamField>

<ParamField body="synthesizer_provider_id" type="integer">
  ID de proveedor de TTS personalizado. Se establece en `null` para usar la voz predeterminada del sistema. Consulta [Obtener proveedores de síntesis de voz](/es/api-v1/assistants/synthesizer-providers).
</ParamField>

<ParamField body="transcriber_provider_id" type="integer">
  ID de proveedor de STT personalizado. Solo en modo pipeline. Se establece en `null` para usar la voz predeterminada del sistema. Consulta [Obtener proveedores de transcripción](/es/api-v1/assistants/transcriber-providers).
</ParamField>

#### Ajustes de comportamiento de la llamada

<ParamField body="allow_interruptions" type="boolean">
  Si se permiten las interrupciones del interlocutor.

  <Warning>No se puede desactivar en los modos `multimodal` y `dualplex`.</Warning>
</ParamField>

<ParamField body="fillers" type="boolean">
  Si se debe usar audio de relleno durante el procesamiento.

  <Warning>Disponible únicamente en modo `pipeline`.</Warning>
</ParamField>

<ParamField body="filler_config" type="object">
  Perfiles de relleno personalizados por categoría. Reemplaza la configuración de relleno existente. Cada categoría es un array de frases cortas.

  * `positive`: Rellenos para respuestas afirmativas
  * `negative`: Rellenos para respuestas negativas/neutras
  * `question`: Rellenos al procesar una pregunta
  * `neutral`: Rellenos para confirmaciones neutras

  ```json theme={null} theme={null}
  "filler_config": {
    "positive": ["Great!", "Perfect!"],
    "negative": ["Hmm.", "Understood."],
    "question": ["Good question.", "One moment."],
    "neutral": ["Okay.", "Noted."]
  }
  ```
</ParamField>

<ParamField body="record" type="boolean">
  Si la llamada debe grabarse
</ParamField>

<ParamField body="enable_noise_cancellation" type="boolean">
  Si la cancelación de ruido debe estar activada
</ParamField>

<ParamField body="wait_for_customer" type="boolean">
  Si es true, el asistente espera a que el cliente hable primero
</ParamField>

#### Ajustes de tiempos

<ParamField body="max_duration" type="integer">
  Duración máxima de la llamada en segundos (20-1200)
</ParamField>

<ParamField body="max_silence_duration" type="integer">
  Duración máxima de silencio antes de la reactivación, en segundos (1-360)
</ParamField>

<ParamField body="max_initial_silence_duration" type="integer">
  Silencio máximo al inicio de la llamada antes de finalizarla (1-120 segundos). Se establece en `null` para desactivarlo.
</ParamField>

<ParamField body="ringing_time" type="integer">
  Tiempo máximo de timbrado antes de abortar (1-60 segundos)
</ParamField>

#### Ajustes de reactivación

<ParamField body="reengagement_interval" type="integer">
  Intervalo de reactivación en segundos (7-600)
</ParamField>

<ParamField body="reengagement_prompt" type="string">
  Prompt personalizado para los mensajes de reactivación (máx. 1000 caracteres). Se establece en `null` para usar el predeterminado.
</ParamField>

#### Ajustes de buzón de voz

<ParamField body="end_call_on_voicemail" type="boolean">
  Si la llamada debe finalizar cuando se detecta un buzón de voz
</ParamField>

<ParamField body="voice_mail_message" type="string">
  Mensaje que se deja en el buzón de voz antes de colgar (máx. 1000 caracteres). Se establece en `null` para desactivarlo.
</ParamField>

#### Detección de fin de intervención

<ParamField body="endpoint_type" type="string">
  Tipo de detección de actividad de voz. Opciones: `vad`, `ai`
</ParamField>

<ParamField body="endpoint_sensitivity" type="number">
  Nivel de sensibilidad de fin de intervención (0-5)
</ParamField>

<ParamField body="interrupt_sensitivity" type="number">
  Nivel de sensibilidad a las interrupciones (0-5)
</ParamField>

<ParamField body="min_interrupt_words" type="integer">
  Número mínimo de palabras antes de permitir una interrupción (0-10). Se establece en `null` para desactivarlo.
</ParamField>

#### Sonido ambiental

<ParamField body="ambient_sound" type="string">
  Sonido ambiental de fondo. Opciones: `off`, `office`, `city`, `forest`, `crowded_room`, `cafe`, `nature`
</ParamField>

<ParamField body="ambient_sound_volume" type="number">
  Volumen del sonido ambiental (0-1)
</ParamField>

#### Configuración de webhook

<ParamField body="is_webhook_active" type="boolean">
  Si las notificaciones por webhook están activadas
</ParamField>

<ParamField body="webhook_url" type="string">
  La URL del webhook para las notificaciones posteriores a la llamada. Se establece en `null` para eliminarla.
</ParamField>

<ParamField body="send_webhook_only_on_completed" type="boolean">
  Si los webhooks deben enviarse solo para las llamadas completadas correctamente (no en caso de fallo/sin respuesta)
</ParamField>

<ParamField body="include_recording_in_webhook" type="boolean">
  Si la URL de la grabación debe incluirse en el payload del webhook
</ParamField>

#### Evaluación posterior a la llamada

<ParamField body="post_call_evaluation" type="boolean">
  Si la evaluación posterior a la llamada basada en IA está activada
</ParamField>

<ParamField body="post_call_schema" type="array">
  Definición del esquema para extraer datos posteriores a la llamada. Reemplaza el esquema existente.

  <Expandable title="Propiedades de post_call_schema">
    <ParamField body="name" type="string" required>
      Nombre del campo (3-16 caracteres, en minúsculas, solo alfanumérico y guiones bajos)
    </ParamField>

    <ParamField body="type" type="string" required>
      Tipo de dato. Opciones: `string`, `number`, `bool`
    </ParamField>

    <ParamField body="description" type="string" required>
      Descripción de lo que representa este campo (3-255 caracteres)
    </ParamField>
  </Expandable>
</ParamField>

#### Variables

<ParamField body="variables" type="object">
  Pares clave-valor para variables personalizadas. **Reemplaza todas las variables existentes.**

  ```json theme={null} theme={null}
  "variables": {
    "company_name": "Acme Corp",
    "product": "Premium Widget"
  }
  ```
</ParamField>

***

## Ejemplos de solicitudes

### Actualizar ajustes básicos

```json theme={null} theme={null}
{
  "name": "Updated Assistant Name",
  "initial_message": "Hello! How can I help you today?",
  "max_duration": 900
}
```

### Cambiar a modo multimodal

```json theme={null} theme={null}
{
  "mode": "multimodal",
  "voice_id": 41,
  "multimodal_model_id": 1,
  "chat_llm_fallback_id": 2,
  "knowledgebase_mode": "function_call"
}
```

### Actualizar herramientas y base de conocimiento

```json theme={null} theme={null}
{
  "tool_ids": [1, 5, 12],
  "knowledgebase_id": 3,
  "knowledgebase_mode": "prompt"
}
```

### Actualizar reactivación y buzón de voz

```json theme={null} theme={null}
{
  "reengagement_interval": 15,
  "reengagement_prompt": "Are you still there? I'm here to help.",
  "end_call_on_voicemail": true,
  "voice_mail_message": "Hello, please call us back at your earliest convenience."
}
```

### Eliminar ajustes opcionales

```json theme={null} theme={null}
{
  "phone_number_id": null,
  "webhook_url": null,
  "tool_ids": [],
  "secondary_language_ids": []
}
```

***

## Respuesta

<ResponseField name="message" type="string">
  Mensaje de éxito que confirma la actualización del asistente
</ResponseField>

<ResponseField name="data" type="object">
  <Expandable title="Propiedades">
    <ResponseField name="id" type="integer">
      El ID único del asistente actualizado
    </ResponseField>

    <ResponseField name="name" type="string">
      El nombre del asistente
    </ResponseField>

    <ResponseField name="status" type="string">
      El estado actual del asistente
    </ResponseField>

    <ResponseField name="type" type="string">
      El tipo (`inbound` u `outbound`)
    </ResponseField>

    <ResponseField name="mode" type="string">
      El modo del motor (`pipeline`, `multimodal` o `dualplex`)
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseExample>
  ```json 200 Success theme={null} theme={null}
  {
    "message": "Assistant updated successfully",
    "data": {
      "id": 789,
      "name": "Updated Sales Assistant",
      "status": "active",
      "type": "outbound",
      "mode": "pipeline"
    }
  }
  ```

  ```json 404 Not Found theme={null} theme={null}
  {
    "message": "Assistant not found"
  }
  ```

  ```json 422 Validation Error theme={null} theme={null}
  {
    "message": "Validation failed",
    "errors": {
      "speech_speed": ["Speech speed must be between 0.7 and 1.2."],
      "voice_id": ["The selected voice is not compatible with the selected engine type."],
      "allow_interruptions": ["Interruptions cannot be disabled in multimodal or dualplex mode."]
    }
  }
  ```
</ResponseExample>

***

## Notas

* Solo se actualizan los campos que proporciones en el cuerpo de la solicitud
* Para eliminar campos opcionales, establécelos explícitamente en `null`
* Para vaciar arrays (herramientas, idiomas secundarios), pasa un array vacío `[]`
* El asistente debe pertenecer al usuario autenticado
* Usa el endpoint [Obtener voces](/es/api-v1/assistants/voices) con el parámetro `mode` para obtener voces compatibles
* Para los modos multimodal/dualplex, `knowledgebase_mode` debe establecerse en `function_call`
* En los modos multimodal/dualplex, las interrupciones (`allow_interruptions`) no se pueden desactivar
* Cambiar el modo restablece los ajustes específicos del modo (modelo LLM, modelo multimodal, proveedores)
