REDA One Centro de ajuda
PT
Idioma
English EN Español ES Português PT Italiano em breve Français FR Deutsch em breve العربية em breve
reda.one ↗
Início / REDA AI / Administração / Referência da API da comunidade

Referência da API da comunidade

Contrato REST do Portal Seis endpoints POST alimentam o chatbot do portal do Experience Cloud. Eles se parecem com a API do widget externo, mas usam a sessão autenticada do usuário do portal em vez de uma chave de API, persistem conversas por usuário do portal e repassam as permissões desse usuário em cada operação.

Em que difere da API do widget externo

A API da comunidade e a API do widget externo atendem superfícies diferentes e têm modelos de segurança distintos:

Aspecto API do widget externo API da comunidade
Autenticação Chave de API (por agente) Sessão autenticada do usuário do portal (sem chave de API)
Identidade Usuário Convidado anônimo Usuário real do portal Salesforce
Modelo de sessão Token de sessão opaco retornado por /init Conversas vinculadas ao usuário do portal; retomáveis em /init
CORS Lista de permissões de origem via Allowed Origins Requisições do portal de mesma origem; sem configuração de CORS
Limite diário de créditos Limite Diário de Créditos Externo Limite Diário de Créditos da Comunidade
Permissões Perfil do Usuário Convidado O próprio perfil e as regras de compartilhamento do usuário do portal

Use esta API quando o chatbot estiver atrás de um login do Salesforce Experience Cloud. Use a API do widget externo quando o chatbot estiver em um site público.

URL Base

Disponibilizada a partir do seu site do Experience Cloud, no caminho /services/apexrest/redaai/chat/community/v1/:

https://<sua-comunidade>.my.site.com/<caminho-do-site>/services/apexrest/redaai/chat/community/v1/

O host exato depende da configuração do seu Experience Cloud. Chamadas feitas de dentro do portal naturalmente usam o cookie de sessão do portal para autenticação.

Autenticação

Não há chave de API. O endpoint confia no cookie de sessão do Experience Cloud para identificar o usuário do portal que está chamando. Duas consequências:

  • Chamadas feitas em um contexto convidado (não autenticado) são rejeitadas com AUTH_REQUIRED.
  • Chamadas vindas de fora do portal que não carregam o cookie de sessão também são rejeitadas.

É por isso que a API da comunidade é naturalmente de mesma origem: o cookie de sessão padrão do Experience Cloud não acompanha requisições de origem cruzada para o domínio do portal.

Endpoints

Cinco endpoints, todos POST:

Caminho Finalidade
POST /chat/community/v1/initInicia uma nova conversa com um agente, ou retoma uma existente recente.
POST /chat/community/v1/newForça o início de uma nova conversa, ignorando qualquer conversa recente existente.
POST /chat/community/v1/messageEnvia uma mensagem do usuário e recebe a resposta do agente.
POST /chat/community/v1/actionExecuta uma ação confirmada que o agente propôs.
POST /chat/community/v1/historyObtém as mensagens de uma conversa.
POST /chat/community/v1/continuePeça ao agente que narre o resultado das ações que ele executou automaticamente no turno anterior. Nenhuma nova mensagem do usuário é enviada.

POST /chat/community/v1/init

Resolve o agente e retoma a conversa mais recente do usuário do portal com esse agente (quando existe uma dentro do tempo limite de sessão do agente) ou cria uma nova.

Corpo da requisição

{
  "agentName": "support-assistant"
}

Resposta (200 OK)

{
  "conversationId":   "a0Q…",
  "agentName":        "support-assistant",
  "displayName":      "Support Assistant",
  "welcomeMessage":   "Hi! How can I help today?",
  "mascotImage":      "https://…/mascot.png",
  "maxMessageLength": 2000,
  "messages": [
    { "role": "user",      "content": "…", "timestamp": "…" },
    { "role": "assistant", "content": "…", "timestamp": "…" }
  ]
}

Quando a resposta inclui um array messages não vazio, a conversa foi retomada; renderize os turnos anteriores para preservar a continuidade. Caso contrário, a conversa é totalmente nova.

Janela de retomada

A elegibilidade para retomada é regida pelo campo Session Timeout Minutes (Tempo Limite de Sessão em Minutos) da definição do agente (padrão de 30). A plataforma localiza a conversa mais recentemente ativa do usuário do portal com esse agente, verifica se a última atividade está dentro da janela de tempo limite e a retoma, se for o caso.

POST /chat/community/v1/new

Força uma nova conversa mesmo que exista uma recente. Útil para controles de interface do tipo “Começar de novo”.

Corpo da requisição

{
  "agentName": "support-assistant"
}

Resposta (200 OK)

{
  "conversationId":   "a0Q…",
  "agentName":        "support-assistant",
  "displayName":      "Support Assistant",
  "welcomeMessage":   "Hi! How can I help today?",
  "mascotImage":      "…",
  "maxMessageLength": 2000
}

Nenhum array messages é retornado porque a conversa ainda não tem histórico.

POST /chat/community/v1/message

Envia uma única mensagem do usuário para o agente e retorna a resposta.

Corpo da requisição

{
  "conversationId": "<de /init ou /new>",
  "message":        "What's open on my case 00012345?"
}

A plataforma valida que o usuário do portal que está chamando é o proprietário da conversa. O acesso entre usuários diferentes é rejeitado.

Resposta (200 OK)

{
  "response":            "<texto da resposta do agente>",
  "creditsUsed":         1.42,
  "conversationId":      "a0Q…",
  "continuationPending": false,
  "continuationDepth":   0
}

continuationPending é o sinalizador sobre o qual seu cliente precisa agir. Quando o agente executou uma ou mais ações durante este turno, ele retorna true: há um resultado que ainda não foi narrado. Chame /continue para obter essa narração. Ignorar o sinalizador deixa o usuário diante de uma resposta que para antes do resultado do que acabou de acontecer.

POST /chat/community/v1/action

Executa uma ação confirmada. Somente ferramentas de Ação atribuídas ao agente e com escopo no canal Community são aceitas.

Corpo da requisição

{
  "conversationId": "<de /init>",
  "actionTool":     "create_record",
  "params": {
    "object_name":  "Case",
    "field_values": { "Subject": "Issue with login", "…": "…" }
  }
}

Resposta (200 OK)

{
  "success": true,
  "result":  "<resultado da execução da ferramenta, serializado em JSON>"
}

POST /chat/community/v1/continue

Pede ao agente que narre o resultado real das ações que ele executou automaticamente no turno /message anterior. Nenhuma nova mensagem do usuário é enviada. Chame-o sempre que a resposta anterior tiver retornado continuationPending: true.

Corpo da requisição

{
  "conversationId":    "a0Q…",
  "continuationDepth": 0
}

Devolva o continuationDepth que você recebeu na resposta anterior. Omiti-lo é tratado como 0.

Resposta (200 OK)

{
  "response":            "<narração do agente sobre o que aconteceu>",
  "creditsUsed":         0.68,
  "conversationId":      "a0Q…",
  "continuationPending": false,
  "continuationDepth":   1
}

continuationPending continua true se o agente encadeou outra ação enquanto narrava — então isto é um laço, não uma única chamada de acompanhamento. Continue chamando /continue, devolvendo a cada vez o continuationDepth retornado, até que ele volte como false. A configuração Profundidade máxima de continuação do agente limita a cadeia, de modo que o laço sempre termina.

Uma continuação é uma chamada real ao modelo. Ela consome créditos e é verificada contra exatamente as mesmas barreiras que /message — limite de taxa por sessão, limite de taxa por hora do agente e teto diário de créditos da comunidade — portanto pode retornar 429 com RATE_LIMITED ou CREDIT_LIMIT. Trate-os da mesma forma que em /message.

POST /chat/community/v1/history

Retorna as mensagens da conversa para o usuário do portal ativo. Útil quando a página do portal é recarregada e precisa restaurar o fluxo visível.

Corpo da requisição

{
  "conversationId": "a0Q…"
}

Resposta (200 OK)

{
  "messages": [
    { "role": "user",      "content": "…", "timestamp": "…" },
    { "role": "assistant", "content": "…", "timestamp": "…" }
  ]
}

Respostas de Erro

Mesmo formato da API do widget externo:

{
  "error": "<mensagem localizada voltada ao usuário>",
  "code":  "<código legível por máquina>"
}
HTTP Código Significado
403DISABLEDA chave geral do Community Bot está desativada.
401AUTH_REQUIREDO chamador não está autenticado (convidado). É necessário fazer login no portal.
429RATE_LIMITEDO limite de taxa por sessão de usuário ou por agente foi excedido.
429MAX_MESSAGESA conversa atingiu o limite de Max Session Messages (Máximo de Mensagens por Sessão).
429CREDIT_LIMITO Limite Diário de Créditos da Comunidade da organização está esgotado, ou o orçamento de créditos da licença está.
400INVALID_INPUTParâmetro do corpo ausente, mensagem longa demais, ferramenta de ação desconhecida, ou conversa que não pertence ao chamador.
404GENERIC_ERRORSubcaminho desconhecido em /chat/community/v1/.
500GENERIC_ERRORUm erro inesperado. Registrado no Registro de incidentes de IA; a resposta intencionalmente oculta os detalhes.

Limites de Taxa

Mesmos controles da API do widget externo, com duas diferenças:

  • Os limites por sessão são rastreados por usuário do portal, não por token de sessão opaco.
  • O limite diário de créditos é a configuração de plataforma Limite Diário de Créditos da Comunidade, não o limite Externo.
Limite Origem Padrão
Por sessão (por usuário do portal) Definição de Agente › Rate Limit Per Session (Limite de Taxa por Sessão) 10 chamadas por sessão
Por hora (por agente) Definição de Agente › Rate Limit Per Hour (Limite de Taxa por Hora) 500 chamadas
Limite diário de créditos Configuração de Plataforma › Limite Diário de Créditos da Comunidade 2000 créditos
Máximo de mensagens por sessão Definição de Agente › Max Session Messages (Máximo de Mensagens por Sessão) 50 mensagens

Para remover completamente o teto diário de créditos, deixe Community Daily Credit Cap em branco ou defina como 0 — ambos significam ilimitado. Ele é deliberadamente uma configuração separada do teto do widget externo, para que um widget público movimentado nunca esgote o orçamento do qual os membros do seu portal dependem.

Propriedade da Conversa

As conversas pertencem ao usuário do portal que as iniciou. A plataforma valida a propriedade em cada chamada /message, /action e /history — chamar com um conversationId pertencente a outro usuário é rejeitado com INVALID_INPUT.

Esse é o limite de segurança que permite que a API da comunidade funcione sem chaves de API: as próprias permissões e a propriedade do usuário do portal governam o que ele pode ver e fazer.

O Contato do usuário do portal é fornecido ao agente automaticamente. Usuários do Experience Cloud são vinculados a um registro de Contato por meio de User.ContactId. Quando /init ou /new criam uma conversa, a REDA AI resolve esse Contato e o armazena como o registro de contexto da conversa, injetando-o no prompt do sistema em cada turno seguinte. Assim, o agente sabe com quem está falando — nome, conta e quaisquer outros campos de Contato que você tenha configurado como contexto — sem que o cliente envie qualquer dado identificador e sem configuração adicional por agente.

Um usuário do portal sem Contato (raro, mas possível em alguns tipos de licença do Experience Cloud) simplesmente obtém uma conversa sem registro de contexto. Nada falha.

Configuração Necessária no Agente

Campo Finalidade
Channel (Canal)Deve incluir Community para que o agente fique acessível a partir do endpoint do portal.
Max Message Length (Comprimento Máximo da Mensagem)Limite do tamanho da mensagem do usuário, em caracteres.
Session Timeout Minutes (Tempo Limite de Sessão em Minutos)Janela na qual /init retoma uma conversa recente em vez de criar uma nova.
Rate Limit Per Session (Limite de Taxa por Sessão)Limite de chamadas por usuário do portal.
Rate Limit Per Hour (Limite de Taxa por Hora)Limite por hora, por agente, entre todos os usuários do portal.
Max Session Messages (Máximo de Mensagens por Sessão)Limite rígido de mensagens por conversa.
External Welcome Message (Mensagem de Boas-vindas Externa)Exibida ao usuário do portal no início da conversa. Mesmo campo do canal widget externo.
Mascot Image (Imagem do Mascote)Avatar exibido no chat do portal.

Postura de Segurança

  • A autenticação é a do portal. Nenhuma chave de API para emitir, rotacionar ou vazar. Cada chamada herda a sessão do usuário do portal.
  • As permissões são as do usuário do portal. As regras de CRUD, FLS e compartilhamento do perfil do usuário do portal governam o que o agente e quaisquer ferramentas podem ler ou gravar — incluindo quais registros eles podem ver no histórico da conversa.
  • A propriedade é aplicada em cada chamada. Um usuário do portal não consegue ler as conversas de outro usuário do portal, mesmo que obtenha o ID da conversa.
  • O escopo de canal das ferramentas se aplica. Somente ferramentas de Ação cujos Canais incluem Community podem ser usadas aqui.
  • O limite diário de créditos é a rede de segurança. O Limite Diário de Créditos da Comunidade impede que um bot do portal fora de controle esgote o orçamento de créditos da licença.
  • Mensagens de erro genéricas. Os detalhes de erros internos nunca são reproduzidos na resposta; as falhas são registradas no Registro de incidentes de IA para investigação do administrador.

Boas práticas

Use o componente de ponte de comunidade já disponibilizado. O componente Lightning para o Experience Cloud cuida das chamadas de API, da retomada de sessão e da renderização da interface. Construir um cliente personalizado só faz sentido para contextos fora do portal.

Retome em vez de reiniciar. Chamar /init no início de cada visualização de página é o padrão correto — a plataforma retomará a conversa recente de forma transparente. Reserve /new para controles de interface do tipo “Começar de novo” acionados explicitamente pelo usuário.

Defina um Session Timeout (Tempo Limite de Sessão) sensato. Muito curto e os usuários perdem contexto entre carregamentos de página; muito longo e conversas obsoletas são retomadas quando os usuários pretendiam um novo começo. O padrão de 30 minutos é um ponto de partida razoável.

Monitore o Limite Diário de Créditos da Comunidade. Ele é independente do limite Externo e ajustável conforme o volume de usuários do portal autenticados que você atende.

Confirme o escopo de canal das ferramentas. Uma ferramenta de Ação atribuída apenas a Internal não será acionada por uma chamada do portal — mesmo que o agente esteja configurado para isso.

Revisar a continuidade das conversas

Janela de conversa (horas) em branco passa a usar o padrão da organização, inicialmente 30 minutos. Um valor positivo define a janela do agente; 0 desativa a retomada automática. A correspondência depende do canal: API usa agente e registro; Interno/MCP autenticado usa agente, usuário e contexto de registro relevante. Comunidade usa o ajuste compartilhado em vez do timeout da sessão externa. O chat na página inicial, páginas de aplicativo e barra de utilitários pode retomar conversas elegíveis. IDs explícitos continuam sujeitos aos controles de acesso da rota. Use 0 quando dependia de branco para iniciar outra conversa. As permissões empacotadas também corrigem acesso à continuidade Interna e Comunidade.

Perguntas frequentes

Não. O endpoint depende do cookie de sessão do Experience Cloud. Usuários do portal autenticados podem chamá-lo diretamente; usuários convidados não podem.

O endpoint retorna AUTH_REQUIRED para qualquer chamador não autenticado. Se o seu portal permite navegação como convidado, oculte a interface do chatbot para usuários não autenticados; alternativamente, implante o widget externo para cenários de convidados.

A conversa persiste. Quando o mesmo usuário faz login novamente dentro da janela de Session Timeout Minutes (Tempo Limite de Sessão em Minutos), /init a retoma. Fora dessa janela, uma nova conversa é criada.

Não. Cada conversa pertence ao usuário que a iniciou, e a propriedade é aplicada em cada chamada. Um usuário do portal não consegue ler a conversa de outro usuário do portal, mesmo com o ID da conversa.

Ele retorna mensagens anteriores somente quando retoma uma conversa existente dentro da janela de Session Timeout (Tempo Limite de Sessão). Para uma conversa totalmente nova, o array messages fica vazio.

Não. São dois limites independentes, configurados separadamente nas Configurações da Plataforma.

Adicione um botão que chama /new em vez de /init. O novo endpoint força uma conversa nova independentemente de qualquer conversa recente existente.

Próximos passos

Leia Configuração do Agente de Comunidade para o passo a passo de implantação, ou Referência da API do widget externo para a contraparte não autenticada.