Skip to main content

Eventos del servidor de Qwen-Omni-Realtime

Eventos de servidor para la API Qwen-Omni-Realtime, incluidos eventos de llamada de herramientas (function calling).

Esta página es la referencia de eventos de Qwen-Omni-Realtime. Las definiciones de eventos se basan en la conexión mediante WebSocket. AOQ y WebRTC usan sus respectivos canales de datos para enviar y recibir eventos del modelo, y pistas de medios para transmitir medios. Primero consulte Conexión mediante WebSocket, Conexión mediante WebRTC o Conexión mediante AOQ.
Para usar el SDK de WebSocket, consulte SDK de Python y SDK de Java. Para seleccionar un modelo y un protocolo, consulte Descripción general.

error

Error del servidor.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es error.errorobjectDetalles del error.

Propiedades

typestringEl tipo de error.codestringEl código de error.messagestringEl mensaje de error.paramstringEl parámetro asociado con el error, como session.modalities.
{
  "event_id": "event_RoUu4T8yExPMI37GKwaOC",
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "code": "invalid_value",
    "message": "Invalid modalities: ['audio']. Supported combinations are: ['text'] and ['audio', 'text'].",
    "param": "session.modalities"
  }
}

session.created

Se devuelve cuando un cliente se conecta. Contiene la configuración predeterminada de la sesión.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es session.created.sessionobjectLa configuración de la sesión.

Propiedades

objectstringEste valor siempre es realtime.session.modelstringEl modelo utilizado.modalitiesarrayLas modalidades de salida para el modelo.voicestringLa voz para el audio generado por el modelo.input_audio_formatstringFormato de audio de entrada. Solo se admite pcm (frecuencia de muestreo de 16 kHz).output_audio_formatstringFormato de audio de salida. Solo se admite pcm (frecuencia de muestreo de 24 kHz).input_audio_transcriptionobjectLa configuración de transcripción.

Propiedades

modelstringModelo de transcripción. Siempre qwen3-asr-flash-realtime. No configurable.
turn_detectionobjectLa configuración de detección de actividad de voz (VAD).

Propiedades

typestringEl tipo de VAD. Los valores válidos son server_vad (predeterminado) o semantic_vad. Consulte Eventos del cliente.thresholdfloatEl umbral de detección de VAD.silence_duration_msintegerDuración del silencio (ms) que activa la detección de fin de habla.idle_timeout_msintegerEl tiempo de espera de inactividad en milisegundos. Se devuelve solo en el modo server_vad con los modelos qwen3.5-omni-plus-realtime o qwen3.5-omni-flash-realtime.
enable_searchbooleanSi se debe habilitar la búsqueda web. Compatible con los modelos Qwen3.8-Omni-Flash-Realtime y Qwen3.5-Omni-Realtime.search_optionsobjectLas opciones para la búsqueda web.temperaturefloatEl parámetro de temperatura para el modelo.
El siguiente ejemplo es la sesión predeterminada devuelta por qwen3.8-omni-flash-realtime en la región de Beijing.
{
    "event_id": "event_QQubXbhHMyXmKaSuE6PQ8",
    "type": "session.created",
    "session": {
        "input_audio_format": "pcm",
        "input_audio_transcription": {
            "model": "qwen3-asr-flash-realtime"
        },
        "id": "sess_MjEctgJ4ziXPEioCzSSvK",
        "object": "realtime.session",
        "modalities": [
            "text",
            "audio"
        ],
        "turn_detection": {
            "type": "server_vad",
            "silence_duration_ms": 800,
            "interrupt_response": true,
            "create_response": true,
            "threshold": 0.5,
            "prefix_padding_ms": 300
        },
        "model": "qwen3.8-omni-flash-realtime",
        "voice": "Tina",
        "output_audio_format": "pcm"
    }
}

session.updated

Se devuelve después de una solicitud session.update exitosa. En caso de fallo, se devuelve un evento error en su lugar.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es session.updated.sessionobjectLa configuración de la sesión.

Propiedades

temperaturefloatEl parámetro de temperatura para el modelo.modalitiesarrayLas modalidades de salida para el modelo.voicestringLa voz para el audio generado por el modelo.instructionsstringEl objetivo y rol del modelo.input_audio_formatstringFormato de audio de entrada. Solo se admite pcm (frecuencia de muestreo de 16 kHz).output_audio_formatstringFormato de audio de salida. Solo se admite pcm (frecuencia de muestreo de 24 kHz).input_audio_transcriptionobjectLa configuración de transcripción.

Propiedades

modelstringModelo de transcripción. Siempre qwen3-asr-flash-realtime. No configurable.
turn_detectionobjectLa configuración de detección de actividad de voz (VAD).

Propiedades

typestringEl tipo de VAD. Los valores válidos son server_vad (predeterminado) o semantic_vad. Consulte Eventos del cliente.thresholdfloatEl umbral de detección de VAD.silence_duration_msintegerDuración del silencio (ms) que activa la detección de fin de habla.idle_timeout_msintegerEl tiempo de espera de inactividad en milisegundos. Se devuelve solo en el modo server_vad con los modelos qwen3.5-omni-plus-realtime o qwen3.5-omni-flash-realtime.
enable_searchboolean (opcional)Si se debe habilitar la búsqueda web. Compatible con los modelos Qwen3.8-Omni-Flash-Realtime y Qwen3.5-Omni-Realtime.search_optionsobject (opcional)Las opciones de búsqueda web.toolsarray (opcional)Definiciones de herramientas. Las propiedades a continuación describen herramientas de Function Calling con type="function". Consulte configuración de herramientas del cliente para los campos MCP de Qwen3.8-Omni-Flash-Realtime; los endpoints y credenciales MCP no se reflejan en session.updated.
typestring (obligatorio)Este valor siempre es function.function.namestring (obligatorio)El nombre de la función, como get_current_weather o get_current_time.function.descriptionstring (opcional)Descripción del propósito de la función. El modelo usa esto para decidir si llamar a la función.function.parametersobject (opcional)Esquema de parámetros de entrada. El modelo usa esto para extraer parámetros. Omítalo si la función no toma parámetros.
typestring (obligatorio)Este valor siempre es object.propertiesobject (opcional)Cada clave es un nombre de parámetro asignado a un objeto con type y description.requiredarray (opcional)Especifica qué parámetros de entrada son obligatorios.
top_pfloatEl umbral de probabilidad para el muestreo de núcleo.top_kintegerTamaño del conjunto de candidatos para el muestreo durante la generación.max_tokensintegerNúmero máximo de tokens que el modelo puede devolver para esta solicitud.repetition_penaltyfloatControla la repetición en secuencias consecutivas durante la generación.presence_penaltyfloatControla la repetición en el contenido generado.seedintegerEl grado de consistencia en la salida del modelo por solicitud.
El siguiente ejemplo usa qwen3.8-omni-flash-realtime en la región de Beijing, con salida solo de texto y max_tokens=32.
{
    "event_id": "event_TSBGI9Yj5ecCKjiGO34VB",
    "type": "session.updated",
    "session": {
        "id": "sess_MjEctgJ4ziXPEioCzSSvK",
        "object": "realtime.session",
        "model": "qwen3.8-omni-flash-realtime",
        "modalities": [
            "text"
        ],
        "instructions": "请只回复 OK。",
        "voice": "Tina",
        "input_audio_format": "pcm",
        "output_audio_format": "pcm",
        "input_audio_transcription": {
            "model": "qwen3-asr-flash-realtime"
        },
        "max_tokens": 32
    }
}

input_audio_buffer.speech_started

En modo VAD, se devuelve cuando el servidor detecta el inicio del habla en el búfer de audio.
Puede activarse cada vez que se agrega audio al búfer antes de que se detecte el habla.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es input_audio_buffer.speech_started.audio_start_msintegerTiempo (ms) desde que comienza la escritura en el búfer de audio hasta que se detecta el habla por primera vez.item_idstringID del elemento de mensaje de usuario creado cuando se detecta el fin del habla.
Los elementos de mensaje de usuario agregan la entrada del usuario al historial de conversación para la inferencia del modelo.
{
    "event_id": "event_Pvp8nEhsQuGCQbFJ9x58n",
    "type": "input_audio_buffer.speech_started",
    "audio_start_ms": 3647,
    "item_id": "item_YbAiGvK2H7YaS34o4R6Ba"
}

input_audio_buffer.speech_stopped

En modo VAD, se devuelve cuando el servidor detecta el fin del habla en el búfer de audio. También devuelve un evento conversation.item.created con el elemento de mensaje de usuario correspondiente.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es input_audio_buffer.speech_stopped.audio_end_msintegerTiempo (ms) desde el inicio de la sesión hasta que se detecta el fin del habla.item_idstringEl ID del elemento de mensaje del usuario que se creará.
{
    "event_id": "event_UhQiqNVRsgUiq4KUS5Xb5",
    "type": "input_audio_buffer.speech_stopped",
    "audio_end_ms": 4453,
    "item_id": "item_YbAiGvK2H7YaS34o4R6Ba"
}

input_audio_buffer.committed

Se devuelve cuando se confirma el búfer de audio de entrada.
  • En modo VAD, el servidor confirma automáticamente el búfer cuando detecta el fin del habla.
  • En modo Manual, se devuelve después de que el cliente envía un evento input_audio_buffer.commit.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es input_audio_buffer.committed.item_idstringEl ID del elemento de mensaje del usuario que se creará.
{
    "event_id": "event_Iy6sUzL1nmdFgshFYxJEz",
    "type": "input_audio_buffer.committed",
    "item_id": "item_YbAiGvK2H7YaS34o4R6Ba"
}

input_audio_buffer.cleared

Se devuelve después de que el cliente envía un evento input_audio_buffer.clear.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es input_audio_buffer.cleared.
{
  "event_id": "event_RoUu4T8yExPMI37GKwaOC",
  "type": "input_audio_buffer.cleared"
}

conversation.item.created

Devuelto cuando se crea un elemento de conversación.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es conversation.item.created.response_idstring (condicionalmente obligatorio)Se devuelve solo cuando item.type es mcp_approval_request; identifica la Respuesta principal que generó la llamada MCP.item_idstring (condicionalmente obligatorio)Se devuelve solo cuando item.type es mcp_approval_request; el ID del elemento de aprobación, igual a item.id.previous_item_idstring (condicionalmente obligatorio)Se devuelve solo cuando item.type es mcp_approval_request; identifica el elemento mcp_call bajo revisión.itemobjectEl elemento de conversación a agregar.

Propiedades

idstringEl ID único del elemento de conversación.objectstringPara elementos message y function_call, este campo es realtime.item. Para elementos MCP, tiene el mismo valor cuando se devuelve.statusstringCuando se devuelve, este campo indica el estado del elemento de conversación. Un elemento mcp_call inicial lo requiere con el valor in_progress.rolestringPresente solo en elementos de mensaje; identifica el rol del mensaje.contentarray of objectsEl contenido del mensaje, devuelto cuando el tipo es message. Los siguientes campos describen el elemento de matriz en este ejemplo.

Elemento de matriz

typestringEl tipo de parte de contenido; input_audio en este ejemplo.
typestringEl tipo de elemento de conversación incluye message y function_call. Qwen3.8-Omni-Flash-Realtime también devuelve mcp_list_tools, mcp_call y mcp_approval_request; consulte Ejemplos de elementos MCP.namestringEl nombre de la función que se llama cuando el tipo es function_call.call_idstringCuando type es function_call, este es el ID único de la invocación de la función.argumentsstringCuando type es function_call, este parámetro contiene los argumentos para la invocación de la función como una cadena JSON.

type=mcp_list_tools

Para este tipo de elemento, item.id coincide con item_id en los eventos de estado de descubrimiento de herramientas.server_labelstring (obligatorio)Identifica el servidor MCP.toolsarray of objects (obligatorio)Definiciones de herramientas validadas después del filtrado de allowed_tools; vacío si falla el descubrimiento.

Elemento de matriz

namestring (obligatorio)Nombre original de la herramienta, de 1 a 64 caracteres usando letras, dígitos, guiones bajos, puntos o guiones.descriptionstring (opcional)Descripción de la herramienta del servidor MCP.input_schemaobject (obligatorio)JSON Schema del servidor MCP. El servicio no realiza una validación semántica completa de JSON Schema; el servidor MCP valida los argumentos en última instancia.

Propiedades

typestring (obligatorio)El valor raíz debe ser object.propertiesobject (opcional)Liste cada parámetro bajo su nombre personalizado. Por ejemplo, city en el ejemplo de mcp_list_tools es un nombre de parámetro; sus type y description describen el tipo de datos y el propósito. El servidor MCP define el JSON Schema de cada parámetro.requiredarray of strings (opcional)Nombres de los parámetros obligatorios.Otros campos estándar de JSON Schema, incluidos additionalProperties, $defs, oneOf, anyOf y allOf, se transfieren desde el esquema original.
annotationsobject (opcional)ToolAnnotations del servidor MCP. Los siguientes campos de sugerencia estándar de MCP son opcionales; el servidor determina qué campos devuelve.

Propiedades

titlestring (opcional)Nombre para mostrar de la herramienta.readOnlyHintboolean (opcional)Indica si la herramienta es de solo lectura.destructiveHintboolean (opcional)Indica si la herramienta puede realizar cambios destructivos.idempotentHintboolean (opcional)Indica si las llamadas repetidas no tienen ningún efecto adicional.openWorldHintboolean (opcional)Indica si la herramienta puede interactuar con sistemas externos. Estos campos son indicaciones y no deben usarse como garantía de seguridad.
errorobject (opcional)Devuelto en caso de fallo de descubrimiento.

Propiedades

typestring (obligatorio)Debe ser tool_execution_error.messagestring (obligatorio)Una descripción segura para el cliente sin contenido sensible de la respuesta ascendente.

type=mcp_call (elemento inicial)

objectstring (obligatorio)Debe ser realtime.item.statusstring (obligatorio)Inicialmente in_progress.server_labelstring (obligatorio)Identifica el servidor MCP que ejecuta la herramienta.namestring (obligatorio)Nombre original de la herramienta.call_idstring (obligatorio)ID único de esta llamada.argumentsstring (obligatorio)Generalmente vacío al principio; use eventos posteriores y el elemento final para obtener los argumentos completos.

type=mcp_approval_request

Copie el item.id de este elemento de aprobación sin cambios en approval_request_id al responder.server_labelstring (obligatorio)Identifica el servidor MCP para la herramienta pendiente.namestring (obligatorio)Nombre original de la herramienta pendiente.argumentsstring (obligatorio)Cadena JSON completa de argumentos en espera de aprobación.call_idstring (obligatorio)ID de la llamada en espera de aprobación.
Ejemplo:
{
    "event_id": "event_JEfkrr9gO3Ny7Xcv9bGVd",
    "type": "conversation.item.created",
    "item": {
        "id": "item_YbAiGvK2H7YaS34o4R6Ba",
        "object": "realtime.item",
        "type": "message",
        "status": "in_progress",
        "role": "assistant",
        "content": [
            {
                "type": "input_audio"
            }
        ]
    }
}
// Tool calling scenario
{
    "event_id": "event_S1hkaIQgcuQD8OEdOpGHQ",
    "type": "conversation.item.created",
    "item": {
        "id": "item_FEG9qJGNkPcdf4et3p7BV",
        "object": "realtime.item",
        "type": "function_call",
        "status": "in_progress",
        "call_id": "call_bc0a7fb7235840f69ecfe4",
        "name": "get_current_weather",
        "arguments": ""
    }
}

conversation.item.input_audio_transcription.delta

Se envía frecuentemente mientras el usuario habla cuando la transcripción de audio de entrada está habilitada. Proporciona resultados de transcripción intermedios en tiempo real. Concatene text + stash para obtener la vista previa de oración más completa en cualquier momento.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es conversation.item.input_audio_transcription.delta.item_idstringEl ID del elemento de conversación asociado.content_indexintegerEl índice de la parte de contenido que contiene el audio.textstringPrefijo de texto confirmado: la parte que el modelo ha finalizado y no cambiará.stashstringSufijo de texto preliminar: un borrador temporal que sigue a la parte confirmada, sujeto a revisión.languagestringEl idioma detectado del audio reconocido.emotionstringLa emoción detectada del audio reconocido. Valores válidos: neutral, happy, sad, angry, surprised, disgusted, fearful.
{
    "event_id": "event_C7jzoeSFuiwOZS6tR14yx",
    "type": "conversation.item.input_audio_transcription.delta",
    "item_id": "item_ThVYhLHOdeXb4bBSvzSFF",
    "content_index": 0,
    "text": "",
    "stash": "How is the weather today?",
    "language": "en",
    "emotion": "neutral",
    "obfuscation": "ABEXGYmxdmc97u"
}
Para obtener la vista previa de oración más completa en cualquier momento, concatene estos dos campos: vista previa en tiempo real = text + stash.
Suponga que el usuario dice: "El clima está agradable hoy, soleado y cálido".Lo siguiente muestra el flujo de eventos que podría recibir y cómo interpretarlos:

Hora

Progreso del habla del usuario

Respuesta de API (texto y stash)

Visualización de la interfaz de usuario del cliente (texto + stash)

T1

"El clima..."

text: ""

stash: "El clima"

El clima

T2

"...es agradable..."

text: ""

stash: "El clima es agradable"

El clima es agradable

T3

"...hoy,"

text: "El clima"

stash: " es agradable hoy,"

The weather is nice today,

("El clima" ha sido confirmado y movido al texto)

T4

(pausa breve)

text: "El clima es agradable hoy, "

stash: ""

The weather is nice today,

(primera cláusula totalmente confirmada)

T5

"soleado..."

text: "El clima es agradable hoy, "

stash: "soleado"

El clima es agradable hoy, soleado

T6

"...y cálido."

text: "El clima es agradable hoy, "

stash: "soleado y cálido."

El clima es agradable hoy, soleado y cálido.

T7

(deja de hablar)

-

Use la transcripción de conversation.item.input_audio_transcription.completed como resultado final.

conversation.item.input_audio_transcription.completed

Indica que el audio del usuario ha sido transcrito por el modelo de reconocimiento de voz integrado (qwen3-asr-flash-realtime). No es configurable.
El texto transcrito del modelo de reconocimiento de voz puede diferir de la interpretación generada por el modelo Qwen-Omni-Realtime. La transcripción es solo para referencia.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es conversation.item.input_audio_transcription.completed.item_idstringEl ID del elemento de mensaje del usuario.content_indexintegerEste valor siempre es 0.transcriptstringEl texto transcrito.
{
    "event_id": "event_FrrZcxiDfTB9LD9p4pVng",
    "type": "conversation.item.input_audio_transcription.completed",
    "item_id": "item_YbAiGvK2H7YaS34o4R6Ba",
    "content_index": 0,
    "transcript": "Hello."
}

conversation.item.input_audio_transcription.failed

Devuelto cuando la transcripción de audio de entrada está habilitada y la transcripción falla. Independiente del evento error; ayuda a los clientes a identificar fallos de transcripción específicamente.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es conversation.item.input_audio_transcription.failed.item_idstringEl ID del elemento de mensaje del usuario.content_indexintegerEste valor siempre es 0.errorobjectLa información del error.

Propiedades

code stringEl código de error.message stringEl mensaje de error.param stringEl parámetro relacionado con el error.
{
  "type": "conversation.item.input_audio_transcription.failed",
  "item_id": "<item_id>",
  "content_index": 0,
  "error": {
    "code": "<code>",
    "message": "<message>",
    "param": "<param>"
  }
}

response.created

Se devuelve cuando el servidor comienza a generar una nueva respuesta.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es response.created.responseobjectEl objeto de respuesta.

Propiedades

id stringEl ID único de la respuesta.conversation_id stringEl ID único de la sesión actual.object stringEl tipo de objeto. Para este evento, este valor siempre es realtime.response.status stringEl estado de la respuesta. Los valores válidos son completed, failed, in_progress, or incomplete.modalities arrayLas modalidades de respuesta.voice stringLa voz para el audio generado por el modelo.output arrayEste campo está vacío para este evento.
{
    "event_id": "event_XuDavMzQN3KKepqGu3KRh",
    "type": "response.created",
    "response": {
        "id": "resp_HaVOPdbmX6vifiV5pAfJY",
        "object": "realtime.response",
        "conversation_id": "conv_FjJaccpnvwHNo9cPVuzGc",
        "status": "in_progress",
        "modalities": [
            "text",
            "audio"
        ],
        "voice": "Cherry",
        "output_audio_format": "pcm",
        "output": []
    }
}

response.done

Se devuelve después de que la respuesta se genera completamente. El objeto response incluye todos los elementos de salida excepto los datos de audio sin procesar.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es response.done.responseobjectEl objeto de respuesta.

Propiedades

id stringEl ID único de la respuesta.conversation_id stringEl ID único de la sesión actual.object stringEl tipo de objeto. Para este evento, este valor siempre es realtime.response.status stringEl estado de la respuesta.modalities arrayLas modalidades de respuesta.voice stringLa voz para el audio generado por el modelo.output arrayLos elementos de salida de la respuesta. Cada elemento de la matriz es un objeto de elemento de conversación.

Elemento de matriz

id stringEl ID de la salida de la respuesta.type stringEl tipo de elemento de salida. Los valores incluyen message y function_call. Qwen3.8-Omni-Flash-Realtime también admite mcp_call; consulte Ejemplos de elementos MCP.object stringPara elementos message y function_call, este campo es realtime.item. Para elementos MCP, tiene el mismo valor cuando se devuelve.status stringEl estado del elemento de salida.role stringPresente solo en elementos de mensaje; identifica el rol del mensaje.content arrayEl contenido del elemento de salida, devuelto solo cuando type es message. Cada elemento de la matriz es un objeto de parte de contenido.

Elemento de matriz

type stringEl tipo de contenido. El valor puede ser text para salida de texto sin formato o audio para salida de audio.text stringLa salida de texto.transcript stringLa transcripción de texto del audio.
name stringEl nombre de la función que se invoca cuando el tipo es function_call.call_id stringCuando type es function_call, este es el ID único de la invocación de la función.arguments stringCuando type es function_call, este campo contiene los argumentos completos para la llamada a la función como una cadena JSON.

type=mcp_call (elemento final)

statusstring (obligatorio)completed o failed.server_labelstring (obligatorio)Identifica el servidor MCP que ejecutó la herramienta.namestring (obligatorio)Nombre original de la herramienta.call_idstring (obligatorio)ID único de esta llamada.argumentsstring (obligatorio)Cadena JSON completa de argumentos.outputstring (opcional)Una cadena JSON serializada desde MCP tools/call.result. También puede aparecer en algunos casos de fallo.errorobject (opcional)Devuelto en caso de fallo.

Propiedades

typestring (obligatorio)Debe ser tool_execution_error.messagestring (obligatorio)Una descripción segura para el cliente sin contenido sensible de la respuesta ascendente.
Si el servidor MCP devuelve isError=true, el estado final es failed y el output original también puede estar presente.
usage objectDetalles de uso de tokens para esta respuesta.
total_tokens integerTotal de tokens utilizados en esta respuesta.input_tokens integerNúmero de tokens de entrada.output_tokens integerNúmero de tokens de salida.input_tokens_details objectDetalles sobre el uso de tokens de entrada, incluyendo text_tokens y audio_tokens.output_tokens_details objectDetalles sobre el uso de tokens de salida, incluyendo text_tokens y audio_tokens.plugins object (opcional)Métricas de uso de complementos. Se devuelve cuando la búsqueda web (enable_search) está habilitada.
search objectDatos de medición de búsqueda.
count integerEl número de búsquedas.strategy stringLa estrategia de búsqueda.
Ejemplo:
{
    "event_id": "event_CSaxRRYLvbrfexDXAEuDG",
    "type": "response.done",
    "response": {
        "id": "resp_HaVOPdbmX6vifiV5pAfJY",
        "object": "realtime.response",
        "conversation_id": "conv_FjJaccpnvwHNo9cPVuzGc",
        "status": "completed",
        "modalities": [
            "text",
            "audio"
        ],
        "voice": "Cherry",
        "output_audio_format": "pcm",
        "output": [
            {
                "id": "item_Ls6MtCUWO7LM4E59QziNv",
                "object": "realtime.item",
                "type": "message",
                "status": "completed",
                "role": "assistant",
                "content": [
                    {
                        "type": "audio",
                        "transcript": "Hello! How can I help you?"
                    }
                ]
            }
        ],
        "usage": {
            "total_tokens": 377,
            "input_tokens": 336,
            "output_tokens": 41,
            "input_tokens_details": {
                "text_tokens": 228,
                "audio_tokens": 108
            },
            "output_tokens_details": {
                "text_tokens": 9,
                "audio_tokens": 32
            },
            "plugins": {
                "search": {
                    "count": 1,
                    "strategy": "agent"
                }
            }
        }
    }
}
// Tool calling scenario
{
    "event_id": "event_T1EFAJp43X2DWtDRmxTtx",
    "type": "response.done",
    "response": {
        "id": "resp_TucN5QgymL5MA8vkJvFlS",
        "object": "realtime.response",
        "conversation_id": "conv_SEDZESRlefT8WvLSmEn6E",
        "status": "completed",
        "modalities": ["text", "audio"],
        "voice": "Ethan",
        "output_audio_format": "pcm",
        "output": [
            {
                "id": "item_FEG9qJGNkPcdf4et3p7BV",
                "object": "realtime.item",
                "type": "function_call",
                "status": "completed",
                "call_id": "call_bc0a7fb7235840f69ecfe4",
                "name": "get_current_weather",
                "arguments": " {\"location\": \"Hangzhou\"}"
            }
        ],
        "usage": {
            "total_tokens": 567,
            "input_tokens": 524,
            "output_tokens": 43,
            "input_tokens_details": {
                "text_tokens": 487,
                "audio_tokens": 37
            },
            "output_tokens_details": {
                "text_tokens": 43
            }
        }
    }
}

response.text.delta

Se devuelve cuando la modalidad de salida es solo texto y el modelo genera nuevo texto incrementalmente.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es response.text.delta.deltastringTexto incremental generado por el modelo.response_idstringEl ID de respuesta.item_idstringEl ID del elemento de mensaje.output_indexintegerEl índice del elemento de salida en la respuesta. Este valor siempre es 0.content_indexintegerEl índice de la parte interna dentro del elemento de salida. Este valor siempre es 0.
{
    "delta": "Hello",
    "event_id": "event_TH49MauuPmRo1RGaMSlP7",
    "type": "response.text.delta",
    "response_id": "resp_PrRSvPVpnCExdUOGHHLuP",
    "item_id": "item_L8IRm9kRXFpxoOjDqDC96",
    "output_index": 0,
    "content_index": 0
}

response.text.done

Se devuelve cuando la modalidad de salida es solo texto y el modelo termina de generar texto.
También se devuelve si la respuesta se interrumpe, está incompleta o se cancela.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es response.text.done.response_idstringEl ID de respuesta.item_idstringEl ID del elemento de mensaje.output_indexintegerEl índice del elemento de salida en la respuesta.content_indexintegerEl índice del elemento de salida en la respuesta.text stringEl texto completo generado por el modelo.
{
  "event_id": "event_B1lIeE2Nac33zn5V7h2mm",
  "type": "response.text.done",
  "response_id": "resp_B1lIdtjF4Noqpn5NOjznj",
  "item_id": "item_B1lIdJsAJlJiFs8ztWpJt",
  "output_index": 0,
  "content_index": 0,
  "text": "How can I assist you today?"
}

response.audio.delta

Para la conexión mediante WebSocket, el servidor devuelve este evento cuando las modalidades de salida incluyen audio y el modelo genera datos de audio nuevos de forma incremental. Para la conexión mediante WebRTC, el audio se transmite mediante pistas de audio RTP y este evento no se devuelve.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es response.audio.delta.response_idstringEl ID de respuesta.item_idstringEl ID del elemento de mensaje.output_indexintegerEl índice del elemento de salida en la respuesta.content_indexintegerEl índice del elemento de salida en la respuesta.delta stringDatos de audio incrementales, codificados en Base64.
{
  "event_id": "event_B1osWMZBtrEQbiIwW0qHQ",
  "type": "response.audio.delta",
  "response_id": "resp_P79OOMs8LnrXVpiIHUCKR",
  "item_id": "item_OFaPGtzfWCPyGzxnuEX9i",
  "output_index": 0,
  "content_index": 0,
  "delta": "{base64 audio}"
}

response.audio.done

Se devuelve cuando la modalidad de salida incluye audio y el modelo termina de generar datos de audio.
También se devuelve si la respuesta se interrumpe, está incompleta o se cancela.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es response.audio.done.response_idstringEl ID de respuesta.item_idstringEl ID del elemento de mensaje.output_indexintegerEl índice del elemento de salida en la respuesta.content_indexintegerEl índice del elemento de salida en la respuesta.
{
    "event_id": "event_Le1TDl7VfyHQxl47DtGxI",
    "type": "response.audio.done",
    "response_id": "resp_HaVOPdbmX6vifiV5pAfJY",
    "item_id": "item_Ls6MtCUWO7LM4E59QziNv",
    "output_index": 0,
    "content_index": 0
}

response.audio_transcript.delta

Devuelto cuando la modalidad de salida incluye audio y el modelo genera nuevo texto de transcripción response.audio_transcript.delta de forma incremental.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es response.audio_transcript.delta.response_idstringEl ID de respuesta.item_idstringEl ID del elemento de mensaje.output_indexintegerEl índice del elemento de salida en la respuesta.content_indexintegerEl índice del elemento de salida en la respuesta.deltastringEl texto incremental.
{
    "event_id": "event_BksW7fOwnyavZdDxIzZYM",
    "type": "response.audio_transcript.delta",
    "response_id": "resp_HaVOPdbmX6vifiV5pAfJY",
    "item_id": "item_Ls6MtCUWO7LM4E59QziNv",
    "output_index": 0,
    "content_index": 0,
    "delta": "What"
}

response.audio_transcript.done

Devuelto como un evento response.audio_transcript.done cuando la modalidad de salida incluye audio y el modelo completa la transcripción de audio.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es response.audio_transcript.done.response_idstringEl ID de respuesta.item_idstringEl ID del elemento de mensaje.output_indexintegerEl índice del elemento de salida en la respuesta.content_indexintegerEl índice del elemento de salida en la respuesta.transcriptstringEl texto completo de la transcripción.
{
    "event_id": "event_X49tL2WerT4WjxcmH16lS",
    "type": "response.audio_transcript.done",
    "response_id": "resp_HaVOPdbmX6vifiV5pAfJY",
    "item_id": "item_Ls6MtCUWO7LM4E59QziNv",
    "output_index": 0,
    "content_index": 0,
    "transcript": "Hello! How can I help you?"
}

response.function_call_arguments.delta

Devuelto a medida que el modelo transmite argumentos de llamada de función. Concatene los campos delta para construir la cadena de argumentos. El contenido completo se proporciona en el evento response.function_call_arguments.done subsiguiente.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es response.function_call_arguments.delta.response_idstringEl ID de respuesta.item_idstringEl ID del elemento de mensaje.output_indexintegerEl índice del elemento de salida en la respuesta.call_idstringEl ID único para esta invocación de función. Esto es consistente con el evento done en el mismo turno.deltastringNuevo segmento de la cadena de argumentos. Concatene los segmentos en orden.
{
    "event_id": "event_SlKoJyEbPEqLq14DSM1u5",
    "type": "response.function_call_arguments.delta",
    "response_id": "resp_JnTOsWXlFhKcFohZbtfz6",
    "item_id": "item_Rhcms7CauTNsQprV5S4Hr",
    "output_index": 0,
    "call_id": "call_2be200f4cafe419b9530dd",
    "delta": " {\"location\": \"Beijing\"}"
}

response.function_call_arguments.done

Indica que los argumentos de llamada de función se han generado completamente. El campo arguments contiene la cadena de argumentos completa. Utilice los arguments de este evento —no los resultados concatenados de delta— para analizar y llamar a la función local.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es response.function_call_arguments.done.response_idstringEl ID de respuesta.item_idstringEl ID del elemento de mensaje.output_indexintegerEl índice del elemento de salida en la respuesta.call_idstringEl ID único para esta invocación de función.namestringEl nombre de la función que fue llamada.argumentsstringArgumentos completos de la llamada a la función como una cadena JSON.
{
    "event_id": "event_X6suLyuL5agdH7r6koesM",
    "type": "response.function_call_arguments.done",
    "response_id": "resp_JnTOsWXlFhKcFohZbtfz6",
    "item_id": "item_Rhcms7CauTNsQprV5S4Hr",
    "output_index": 0,
    "name": "get_current_weather",
    "call_id": "call_2be200f4cafe419b9530dd",
    "arguments": " {\"location\": \"Beijing\"}"
}

response.output_item.added

Devuelto cuando se crea un nuevo elemento durante la generación de respuesta. El tipo de elemento puede ser message o function_call; Qwen3.8-Omni-Flash-Realtime también admite mcp_call; consulte Ejemplos de elementos MCP.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es response.output_item.added.response_idstringEl ID de respuesta.output_indexintegerEl índice del elemento de salida en la respuesta.itemobjectInformación sobre el elemento de salida.

Propiedades

idstringEl ID único del elemento de salida.objectstringPara elementos message y function_call, este campo es realtime.item. Para elementos MCP, tiene el mismo valor cuando se devuelve.statusstringEl estado del elemento de salida.rolestringPresente solo en elementos de mensaje; identifica el rol del mensaje.contentarrayEl contenido del mensaje, devuelto cuando el tipo es message. La matriz está inicialmente vacía en este ejemplo; consulte el elemento completado en el ejemplo de response.output_item.done.typestringEl tipo de elemento de salida. Los valores incluyen message y function_call. Qwen3.8-Omni-Flash-Realtime también admite mcp_call; consulte Ejemplos de elementos MCP.namestringEl nombre de la función a llamar cuando type es function_call.call_idstringEl ID único de la invocación de función actual cuando el tipo es function_call.argumentsstringArgumentos de llamada a la función como una cadena JSON cuando type es function_call. Inicialmente una cadena vacía en eventos added.

type=mcp_call (elemento inicial)

objectstring (obligatorio)Debe ser realtime.item.statusstring (obligatorio)Inicialmente in_progress.server_labelstring (obligatorio)Identifica el servidor MCP que ejecuta la herramienta.namestring (obligatorio)Nombre original de la herramienta.call_idstring (obligatorio)ID único de esta llamada.argumentsstring (obligatorio)Generalmente vacío al principio; use response.mcp_call_arguments.done y el elemento final para obtener los argumentos completos.
{
    "event_id": "event_DsCO341DEVtiATtCB6BUY",
    "type": "response.output_item.added",
    "response_id": "resp_HaVOPdbmX6vifiV5pAfJY",
    "output_index": 0,
    "item": {
        "id": "item_Ls6MtCUWO7LM4E59QziNv",
        "object": "realtime.item",
        "type": "message",
        "status": "in_progress",
        "role": "assistant",
        "content": []
    }
}
// Tool calling scenario
{
    "event_id": "event_HXmKt5pGoiRtXx7Hq7zpN",
    "type": "response.output_item.added",
    "response_id": "resp_TucN5QgymL5MA8vkJvFlS",
    "output_index": 0,
    "item": {
        "id": "item_FEG9qJGNkPcdf4et3p7BV",
        "object": "realtime.item",
        "type": "function_call",
        "status": "in_progress",
        "call_id": "call_bc0a7fb7235840f69ecfe4",
        "name": "get_current_weather",
        "arguments": ""
    }
}

response.output_item.done

Devuelto cuando un elemento de salida se genera completamente.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es response.output_item.done.response_idstringEl ID de respuesta.output_indexintegerEl índice del elemento de salida en la respuesta.itemobjectLa información del elemento de salida.

Propiedades

idstringEl ID único del elemento de salida.objectstringPara elementos message y function_call, este campo es realtime.item. Para elementos MCP, tiene el mismo valor cuando se devuelve.statusstringEl estado del elemento de salida.rolestringPresente solo en elementos de mensaje; identifica el rol del mensaje.contentarray of objectsEl contenido del mensaje, devuelto cuando el tipo es message. Los siguientes campos describen el elemento de matriz en este ejemplo.

Elemento de matriz

typestringEl tipo de parte de contenido; audio en este ejemplo.textstringContenido de texto en este ejemplo.
typestringEl tipo de elemento de salida. Los valores incluyen message y function_call. Qwen3.8-Omni-Flash-Realtime también admite mcp_call; consulte Ejemplos de elementos MCP.namestringEl nombre de la función que se llama cuando el tipo es function_call.call_idstringCuando type es function_call, este es el ID único para la invocación de la función.argumentsstringCuando type es function_call, contiene los argumentos completos de la llamada a la función como una cadena JSON.

type=mcp_call (elemento final)

statusstring (obligatorio)completed o failed.server_labelstring (obligatorio)Identifica el servidor MCP que ejecutó la herramienta.namestring (obligatorio)Nombre original de la herramienta.call_idstring (obligatorio)ID único de esta llamada.argumentsstring (obligatorio)Cadena JSON completa de argumentos.outputstring (opcional)Una cadena JSON serializada desde MCP tools/call.result. También puede aparecer en algunos casos de fallo.errorobject (opcional)Devuelto en caso de fallo.

Propiedades

typestring (obligatorio)Debe ser tool_execution_error.messagestring (obligatorio)Una descripción segura para el cliente sin contenido sensible de la respuesta ascendente.
Si el servidor MCP devuelve isError=true, el estado final es failed y el output original también puede estar presente.
{
    "event_id": "event_MEu5nlLw1LsOguHiehIP8",
    "type": "response.output_item.done",
    "response_id": "resp_HaVOPdbmX6vifiV5pAfJY",
    "output_index": 0,
    "item": {
        "id": "item_Ls6MtCUWO7LM4E59QziNv",
        "object": "realtime.item",
        "type": "message",
        "status": "completed",
        "role": "assistant",
        "content": [
            {
                "type": "audio",
                "text": "Hello! How can I help you?"
            }
        ]
    }
}
// Tool calling scenario
{
    "event_id": "event_FHspdfAnCyjuME3mmAwSY",
    "type": "response.output_item.done",
    "response_id": "resp_TucN5QgymL5MA8vkJvFlS",
    "output_index": 0,
    "item": {
        "id": "item_FEG9qJGNkPcdf4et3p7BV",
        "object": "realtime.item",
        "type": "function_call",
        "status": "completed",
        "call_id": "call_bc0a7fb7235840f69ecfe4",
        "name": "get_current_weather",
        "arguments": " {\"location\": \"Hangzhou\"}"
    }
}

response.content_part.added

Se devuelve cuando se agrega una nueva parte de contenido a un elemento de mensaje del asistente durante la generación de la respuesta.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es response.content_part.added.response_idstringEl ID de respuesta.item_idstringEl ID del elemento de mensaje.output_indexintegerEl índice del elemento de salida en la respuesta. Este valor siempre es 0.content_indexintegerEl índice de la parte interna dentro del elemento de salida. Este valor siempre es 0.partobjectLa información del elemento de salida.

Propiedades

typestringEl tipo de la parte de contenido.textstringEl texto de la parte de contenido.
{
    "event_id": "event_AVBOmrgY3C8bjlRajfSUT",
    "type": "response.content_part.added",
    "response_id": "resp_HaVOPdbmX6vifiV5pAfJY",
    "item_id": "item_Ls6MtCUWO7LM4E59QziNv",
    "output_index": 0,
    "content_index": 0,
    "part": {
        "type": "audio",
        "text": ""
    }
}

response.content_part.done

Se devuelve cuando finaliza la transmisión de una parte de contenido dentro de un elemento de mensaje del asistente.
event_idstringUn identificador único para este evento.typestringEl tipo de evento. Este valor siempre es response.content_part.done.response_idstringEl ID de respuesta.item_idstringEl ID del elemento de mensaje.output_indexintegerEl índice del elemento de salida en la respuesta. Este valor siempre es 0.content_indexintegerEl índice de la parte de contenido en la matriz de contenido. Este valor siempre es 0.partobjectLa información del elemento de salida.

Propiedades

typestringEl tipo de la parte de contenido.textstringEl texto de la parte de contenido.
{
    "event_id": "event_Il8HD19v58Qr5IBkw7LtN",
    "type": "response.content_part.done",
    "response_id": "resp_HaVOPdbmX6vifiV5pAfJY",
    "item_id": "item_Ls6MtCUWO7LM4E59QziNv",
    "output_index": 0,
    "content_index": 0,
    "part": {
        "type": "audio",
        "text": "Hello! How can I help you?"
    }
}

Eventos de MCP

Esta sección describe eventos y campos de WebSocket para qwen3.8-omni-flash-realtime. Otros eventos y campos base utilizan el protocolo común documentado anteriormente. Los campos obligatorios son necesarios cuando su objeto contenedor está presente. Los IDs son cadenas opacas; no confíe en sus longitudes, prefijos o reglas de generación. arguments y output son cadenas cuyo contenido requiere análisis JSON. Las conexiones MCP, el descubrimiento y las llamadas están sujetos a cuotas de servicio y tiempos de espera.

mcp_list_tools.*

Tipo de eventoCuándo se emite
mcp_list_tools.in_progressComienza el descubrimiento de herramientas para un servidor MCP.
mcp_list_tools.completedEl descubrimiento tiene éxito y allowed_tools el filtrado se completa.
mcp_list_tools.failedEl descubrimiento falla, excede el tiempo de espera o supera los límites del servicio.
Los tres requieren los campos de cadena event_id (ID de evento único), type (tipo de evento anterior) y item_id (elemento mcp_list_tools asociado). in_progress puede llegar antes que session.updated. Para completed y failed, conversation.item.created que contiene la lista final de herramientas o error llega primero, seguido por el evento de estado con el mismo item_id.
{
  "event_id": "opaque_event_id",
  "type": "mcp_list_tools.completed",
  "item_id": "opaque_item_id"
}

response.mcp_call_arguments.delta

CampoTipoObligatorioSignificado
event_idstringSíID de evento único.
typestringSíresponse.mcp_call_arguments.delta
response_idstringSíID de Response principal.
item_idstringSíActual mcp_call ID de elemento.
output_indexintegerSíÍndice basado en cero en la matriz de salida Response principal.
deltastringSíFragmento de cadena JSON incremental; concatene en orden de evento.
obfuscationstringNoCadena de ofuscación opcional; ignore al ensamblar y analizar argumentos.
{
  "event_id": "opaque_event_id",
  "type": "response.mcp_call_arguments.delta",
  "response_id": "opaque_response_id",
  "item_id": "opaque_item_id",
  "output_index": 0,
  "delta": "{\"city\":\"杭",
  "obfuscation": "opaque-value"
}

response.mcp_call_arguments.done

Requiere event_id, type, response_id y item_id (cadenas), output_index (entero, mismo significado que arriba) y arguments (cadena). type es response.mcp_call_arguments.done. arguments contiene los argumentos completos codificados en JSON y es autoritativo.
{
  "event_id": "opaque_event_id",
  "type": "response.mcp_call_arguments.done",
  "response_id": "opaque_response_id",
  "item_id": "opaque_item_id",
  "output_index": 0,
  "arguments": "{\"city\":\"杭州\"}"
}

response.mcp_call.*

Tipo de eventoCuándo se emite
response.mcp_call.in_progressLos argumentos están completos y la aprobación se ha concedido o no es necesaria; comienza la llamada MCP.
response.mcp_call.completedLa llamada MCP tiene éxito.
response.mcp_call.failedError de conexión, protocolo o negocio de herramienta; rechazo de aprobación o tiempo de espera agotado; tiempo de espera de llamada agotado; o cancelación.
Los tres requieren event_id, type y item_id (cadenas), y output_index (entero). item_id identifica el mcp_call actual; output_index es su índice en la matriz de salida Response principal.
{
  "event_id": "opaque_event_id",
  "type": "response.mcp_call.in_progress",
  "item_id": "opaque_item_id",
  "output_index": 0
}

Elementos de conversación MCP

Estos objetos son tipos del campo item en eventos, aplicables a Qwen3.8-Omni-Flash-Realtime.

Elemento mcp_list_tools

Devuelto como conversation.item.created.item; consulte la rama type=mcp_list_tools en conversation.item.created para ver sus campos. Ejemplo:
{
  "event_id": "opaque_event_id",
  "type": "conversation.item.created",
  "item": {
    "id": "opaque_item_id",
    "type": "mcp_list_tools",
    "server_label": "amap",
    "tools": [
      {
        "name": "maps_weather",
        "description": "查询天气",
        "input_schema": {
          "type": "object",
          "properties": {
            "city": {
              "type": "string",
              "description": "城市名"
            }
          },
          "required": ["city"]
        }
      }
    ]
  }
}

Elemento mcp_call inicial

Cuando el modelo selecciona una herramienta MCP, este elemento aparece en response.output_item.added.item y también puede aparecer en conversation.item.created.item; consulte las ramas correspondientes de item bajo response.output_item.added y conversation.item.created. Ejemplo de response.output_item.added:
{
  "event_id": "opaque_event_id",
  "type": "response.output_item.added",
  "response_id": "opaque_response_id",
  "output_index": 0,
  "item": {
    "id": "opaque_item_id",
    "object": "realtime.item",
    "type": "mcp_call",
    "status": "in_progress",
    "call_id": "opaque_call_id",
    "server_label": "amap",
    "name": "maps_weather",
    "arguments": ""
  }
}

Elemento mcp_approval_request

Devuelto en conversation.item.created; consulte conversation.item.created para los campos de evento y aprobación item. Ejemplo:
{
  "event_id": "opaque_event_id",
  "type": "conversation.item.created",
  "response_id": "opaque_response_id",
  "item_id": "opaque_approval_id",
  "previous_item_id": "opaque_item_id",
  "item": {
    "id": "opaque_approval_id",
    "type": "mcp_approval_request",
    "server_label": "amap",
    "name": "maps_weather",
    "arguments": "{\"city\":\"杭州\"}",
    "call_id": "opaque_call_id"
  }
}

Elemento mcp_call final

Después de que una llamada alcanza un estado terminal, el elemento aparece en response.output_item.done.item y en la instantánea final principal de response.done.response.output; consulte las ramas correspondientes bajo response.output_item.done y response.done. Llamada exitosa:
{
  "event_id": "opaque_event_id",
  "type": "response.output_item.done",
  "response_id": "opaque_response_id",
  "output_index": 0,
  "item": {
    "id": "opaque_item_id",
    "type": "mcp_call",
    "status": "completed",
    "call_id": "opaque_call_id",
    "server_label": "amap",
    "name": "maps_weather",
    "arguments": "{\"city\":\"杭州\"}",
    "output": "{\"content\":[{\"type\":\"text\",\"text\":\"...\"}],\"isError\":false}"
  }
}
Llamada fallida:
{
  "event_id": "opaque_event_id",
  "type": "response.output_item.done",
  "response_id": "opaque_response_id",
  "output_index": 0,
  "item": {
    "id": "opaque_item_id",
    "type": "mcp_call",
    "status": "failed",
    "call_id": "opaque_call_id",
    "server_label": "amap",
    "name": "maps_weather",
    "arguments": "{\"city\":\"杭州\"}",
    "error": {
      "type": "tool_execution_error",
      "message": "MCP tool call failed (call_timeout)."
    }
  }
}

Errores de MCP

Los errores de MCP pueden ocurrir durante el descubrimiento de herramientas o la ejecución de herramientas. Para errores de descubrimiento, consulte error bajo la rama mcp_list_tools de conversation.item.created; para errores de ejecución, consulte la rama mcp_call de response.output_item.done.
Consulte Qwen-Omni-Realtime.