Principal Explicando recursos avançados Como configurar uma conexão WebSocket?

Como configurar uma conexão WebSocket?

Última atualização em Aug 18, 2025

Os WebSockets estabelecem uma conexão contínua entre o cliente e o servidor, permitindo a comunicação bidirecional. O Trino AI utiliza essa conexão para fornecer atualizações em tempo real sobre eventos da plataforma. Para se conectar ao WebSocket do Trino AI, basta fornecer um token e seguir as instruções de configuração descritas neste guia.

Observação : este recurso é experimental e a documentação pode mudar a cada lançamento. Além disso, a compatibilidade com versões anteriores não pode ser garantida, por isso é importante garantir que você esteja usando a versão mais recente da implementação.

Por que devo usar uma conexão WebSocket?

Uma conexão WebSocket permite atualizações de dados em tempo real, tornando-a ideal para clientes como um SDK de cliente Android ou iOS para Trino AI. Isso ajuda a atualizar o painel sem a necessidade de recarregar a página. Portanto, pode aprimorar a experiência do usuário e aumentar a produtividade do agente.

Como configurar uma conexão WebSocket com o Trino AI ?

Para configurar uma conexão WebSocket com o Trino AI, você precisa iniciar uma conexão com o token de autenticação PubSub fornecido pelo Trino AI. A URL para a conexão é  wss://<your-installation-url>/cable.

Um token PubSub é um token usado para autenticar um cliente ao se conectar a um serviço PubSub (publicar-assinar). O cliente deve apresentar esse token ao serviço para estabelecer uma conexão e começar a publicar ou assinar mensagens.

Há dois tipos de tokens PubSub disponíveis no Trino AI, conforme listado abaixo.

  1. Token PubSub do Usuário : Este token tem os privilégios de um agente/administrador e receberá todos os eventos listados posteriormente na página. Você pode obter o token PubSub chamando a  API de Perfil .

  2. Token PubSub de Contato : O Trino AI gera um token PubSub exclusivo para cada sessão de um contato. Este token pode ser usado para se conectar ao WebSocket e receber atualizações em tempo real para a mesma sessão. Quando um contato é criado por meio das APIs públicas, o token é  pubsub_tokenincluído no payload de resposta. Este token concede acesso apenas a eventos relacionados à sessão atual, como conversation.created,   conversation.status_changedmessage.createdmessage.updated,   e  .conversation_typing_onconversation_typing_offpresence.update

Consulte  APIs do cliente  para criar integrações voltadas ao cliente em tempo real usando o Trino AI.

Observação : Este token pode ser rotacionado regularmente, dependendo do seu tipo de instalação. Certifique-se de estar usando o token mais recente.

Como se conectar ao Trino AI WebSocket?

Para se conectar ao Trino AI WebSocket, use o comando subscribe e inclua seus pubSubToken, accountId e userId(se estiver usando um token de usuário) na solicitação de conexão. Aqui está um exemplo de como você pode se conectar ao Trino AI.

// Add a helper method to convert JSON to a string
const stringify = (payload = {}) => JSON.stringify(payload);

const pubSubToken = "<contact/user-pub-sub-token>";
const accountId = "<your-account-id-in-integer>";
const userId = "<user-id-in-integer-if-using-user-token>";
const connection = new WebSocket(
  "wss://app.Trinoai.com/cable"
);

connection.send(
  stringify({
    command: "subscribe",
    identifier: stringify({
      channel: "RoomChannel",
      pubsub_token: pubSubToken,
      account_id: accountId,
      user_id: userId,
    }),
  })
);

// The expected string in connection.send is of the format:
// {"command":"subscribe","identifier":"{\\"channel\\":\\"RoomChannel\\",\\"pubsub_token\\":\\"your-pubsub-token\\",\\"account_id\\": account_id_integer,\\"user_id\\":user_id_integer }"}

Publicação de presença no servidor WebSocket

Para manter o status dos seus usuários online no Trino AI, você pode enviar um evento de atualização de presença para o Trino AI a cada 30 segundos. Essa ação manterá o status do agente/contato online.

Como atualizar a presença de um agente/administrador?

Para atualizar a presença de um agente ou administrador, envie a seguinte carga útil para o servidor:

const userPayload = stringify({
  command: "message",
  identifier: stringify({
    channel: "RoomChannel",
    pubsub_token: "<user-pubsub-token>",
    account_id: accountId,
    user_id: userId,
  }),
  data: stringify({ action: "update_presence" }),
});

connection.send(userPayload);
// The expected string in connection.send is of the format:
// {"command":"message","identifier":"{\\"channel\\":\\"RoomChannel\\",\\"pubsub_token\\":\\"your-pubsub-token\\",\\"account_id\\": account_id_integer,\\"user_id\\":user_id_integer ","data":"{\\"action\\":\\"update_presence\\"}"}

Como atualizar a presença de um contato?

Para atualizar a presença de um contato, envie a seguinte carga útil para o servidor:

const agentPayload = stringify({
  command: "message",
  identifier: stringify({
    channel: "RoomChannel",
    pubsub_token: "<user-pubsub-token>",
  }),
  data: stringify({ action: "update_presence" }),
});

connection.send(agentPayload);
// The expected string in connection.send is of the format:
// {"command":"message","identifier":"{\\"channel\\":\\"RoomChannel\\",\\"pubsub_token\\":\\"your-pubsub-token\\","data":"{\\"action\\":\\"update_presence\\"}"}

Carga útil do WebSocket

Objetos

Um evento pode conter qualquer um dos seguintes objetos como carga útil. Os diferentes tipos de objetos suportados no Trino AI são os seguintes:

Conversa

A seguinte carga útil será retornada para uma conversa.

{
  "additional_attributes": {
    "browser": {
      "device_name": "string",
      "browser_name": "string",
      "platform_name": "string",
      "browser_version": "string",
      "platform_version": "string"
    },
    "referer": "string",
    "initiated_at": {
      "timestamp": "iso-datetime"
    }
  },
  "can_reply": "boolean",
  "channel": "string",
  "id": "integer",
  "inbox_id": "integer",
  "contact_inbox": {
    "id": "integer",
    "contact_id": "integer",
    "inbox_id": "integer",
    "source_id": "string",
    "created_at": "datetime",
    "updated_at": "datetime",
    "hmac_verified": "boolean"
  },
  "messages": ["Array of message objects"],
  "meta": {
    "sender": {
      // Contact Object
    },
    "assignee": {
      // User Object
    }
  },
  "status": "string",
  "unread_count": "integer",
  "agent_last_seen_at": "unix-timestamp",
  "contact_last_seen_at": "unix-timestamp",
  "timestamp": "unix-timestamp",
  "account_id": "integer"
}

Contato

A seguinte carga útil será retornada para um contato.

{
  "additional_attributes": "object",
  "custom_attributes": "object",
  "email": "string",
  "id": "integer",
  "identifier": "string or null",
  "name": "string",
  "phone_number": "string or null",
  "thumbnail": "string"
}

Usuário

A seguinte carga útil será retornada para um agente/administrador.

{
  "id": "integer",
  "name": "string",
  "available_name": "string",
  "avatar_url": "string",
  "availability_status": "string",
  "thumbnail": "string"
}

Mensagem

A seguinte carga útil será retornada para uma mensagem.

{
  "id": "integer",
  "content": "string",
  "account_id": "integer",
  "inbox_id": "integer",
  "message_type": "integer",
  "created_at": "unix-timestamp",
  "updated_at": "datetime",
  "private": "boolean",
  "status": "string",
  "source_id": "string / null",
  "content_type": "string",
  "content_attributes": "object",
  "sender_type": "string",
  "sender_id": "integer",
  "external_source_ids": "object",
  "sender": {
    "type": "string - contact/user"
    // User or Contact Object
  }
}

Notificação

A seguinte carga útil será retornada para uma notificação.

{
  "id": "integer",
  "notification_type": "string",
  "primary_actor_type": "string",
  "primary_actor_id": "integer",
  "primary_actor": {
    "can_reply": "boolean",
    "channel": "string",
    "id": "integer",
    "inbox_id": "integer",
    "meta": {
      "assignee": {
        "id": "integer",
        "name": "string",
        "available_name": "string",
        "avatar_url": "string",
        "type": "user",
        "availability_status": "string",
        "thumbnail": "string"
      },
      "hmac_verified": "boolean"
    },
    "agent_last_seen_at": "unix-timestamp",
    "contact_last_seen_at": "unix-timestamp",
    "timestamp": "unix-timestamp",
  },
  "read_at": "unix-timestamp",
  "secondary_actor": "object/null",
  "created_at":"unix-timestamp",
  "account_id": "integer",
  "push_message_title": "string"
}

Identificador

Cada evento terá um  identifier atributo no seguinte formato.

{
  "identifier": "{\\"channel\\":\\"RoomChannel\\",\\"pubsub_token\\":\\"token\\",\\"account_id\\":id,\\"user_id\\":user_id}"
}

Mensagem

Cada evento incluirá um  message atributo que retorna o nome do evento, bem como os dados associados a ele. Para ver a lista de eventos, consulte a documentação abaixo.

Tipos de Eventos

conversa.criada

Este evento é acionado quando uma nova conversa é iniciada. Se você estiver assinando o token PubSub do contato, este evento incluirá apenas dados relacionados à sessão específica associada ao token PubSub.

Disponível para : agente/administrador, contato

{
  "message": {
    "event": "conversation.created",
    "data": {
      // Conversation object will be available here
    }
  }
}

conversa.ler

Este evento é acionado e enviado aos agentes/administradores que têm acesso à caixa de entrada quando um contato lê uma mensagem.

Disponível para : agente/administrador

{
  "message": {
    "event": "conversation.read",
    "data": {
      // Conversation object will be available here
    }
  }
}

mensagem.criada

Este evento é acionado e enviado aos agentes, administradores e contatos quando uma nova mensagem é criada em uma conversa à qual eles têm acesso.

Disponível para : agente/administrador, contato

{
  "message": {
    "event": "message.created",
    "data": {
      // Message object will be available here
    }
  }
}

mensagem.atualizada

Este evento é acionado e enviado aos agentes, administradores e contatos quando uma mensagem é atualizada em uma conversa à qual eles têm acesso.

Disponível para : agente/administrador, contato

{
  "message": {
    "event": "message.updated",
    "data": {
      // Message object will be available here
    }
  }
}

conversa.status_alterado

Este evento é enviado aos agentes, administradores e contatos quando o status de uma conversa é atualizado.

Disponível para : agente/administrador, contato

{
  "message": {
    "event": "conversation.status_changed",
    "data": {
      // Conversation object will be available here
    }
  }
}

conversa.digitando_em

Este evento é enviado aos agentes, administradores e contatos quando um contato ou agente começa a digitar uma resposta.

Disponível para : agente/administrador, contato

{
  "message": {
    "event": "conversation.typing_on",
    "data": {
      "conversation": {
        // Conversation object will be available here
      },
      "user": {
        // Contact / Agent,Admin User object will be available here.
      },
      "is_private": "boolean", // Shows whether the agent is typing a private note or not.
      "account_id": "integer"
    }
  }
}

conversa.digitação_desligada

Este evento é enviado aos agentes, administradores e contatos quando um contato ou agente termina de digitar uma resposta.

Disponível para : agente/administrador, contato

{
  "message": {
    "event": "conversation.typing_off",
    "data": {
      "conversation": {
        // Conversation object will be available here
      },
      "user": {
        // Contact / User object will be available here.
      },
      "account_id": "integer"
    }
  }
}

cessionário.alterado

Este evento é enviado aos agentes/administradores com acesso a uma caixa de entrada quando o agente atribuído é alterado.

Disponível para : agente/administrador

{
  "message": {
    "event": "assignee.changed",
    "data": {
      // Conversation object will be available here
    }
  }
}

equipe.alterada

Este evento é enviado aos agentes/administradores com acesso a uma caixa de entrada quando a equipe atribuída é alterada.

Disponível para : agente/administrador

{
  "message": {
    "event": "team.changed",
    "data": {
      // Conversation object will be available here
    }
  }
}

conversa.contato_alterado

Este evento é enviado aos agentes/administradores quando dois contatos são mesclados e todas as suas conversas são consolidadas em um único contato.

Disponível para : agente/administrador

{
  "message": {
    "event": "conversation.contact_changed",
    "data": {
      // Conversation object will be available here
    }
  }
}

contato.criado

Este evento é enviado aos agentes/administradores quando um contato é criado.

Disponível para : agente/administrador

{
  "message": {
    "event": "contact.created",
    "data": {
      // Contact object will be available here
    }
  }
}

contato.atualizado

Este evento é enviado aos agentes/administradores quando um contato é atualizado.

Disponível para : agente/administrador

{
  "message": {
    "event": "contact.updated",
    "data": {
      // Contact object will be available here
    }
  }
}

presença.atualização

Disponível tanto para o agente quanto para o contato, este evento fornece atualizações em tempo real sobre o status de disponibilidade dos usuários no sistema. O evento enviado aos contatos não incluirá informações sobre o status de disponibilidade de outros contatos.

Disponível para : agente/administrador

{
  "message": {
    "event": "presence.update",
    "data": {
      "account_id": "integer",
      "users": {
        "user-id": "string"
      },
      "contacts": {
        "contact-id": "string"
      }
    }
  }
}

notificação_criada

Este evento é enviado aos agentes/administradores quando uma notificação é criada.

Disponível para : agente/administrador