For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navegação principal
Theme

Controles no servidor

Controle a sessão e execute ferramentas privadas no seu servidor.

Escolha a API para ver como se conectar e quais eventos a sessão oferece.

Controle uma sessão do GPT-Live pelo servidor

Conecte o servidor do aplicativo a uma sessão WebRTC ou SIP do GPT-Live já em andamento quando o servidor precisar receber eventos da conversa, executar ferramentas privadas ou atualizar a conversa. Essa segunda conexão é chamada de WebSocket auxiliar. As duas conexões compartilham a mesma sessão, enquanto o WebRTC ou o SIP transporta o áudio principal.

O canal auxiliar transmite eventos e comandos. Cabe ao aplicativo executar as ferramentas, verificar as autorizações e aplicar as regras de negócio. Mantenha as chaves de API e as credenciais das ferramentas no servidor.

Avalie se você precisa de um canal auxiliar

Em aplicativos que rodam no navegador, use o canal de dados WebRTC para exibir legendas e atualizar a interface localmente. Use um canal auxiliar quando o servidor processar a transcrição, por exemplo, para fazer verificações de segurança, analisar sentimentos ou chamar ferramentas de forma especulativa. O servidor pode receber eventos e controlar diretamente a mesma sessão enquanto o navegador continua transmitindo áudio por WebRTC. Consulte Reaja a fragmentos da transcrição para ver exemplos.

Se o backend transmite áudio pela conexão WebSocket principal, use essa conexão para receber eventos e enviar comandos.

A delegação com a API Responses também funciona sem um canal auxiliar. O navegador pode encaminhar eventos de chamada de função do canal de dados para que um backend autenticado execute as funções. As ferramentas hospedadas pela OpenAI são executadas por meio do backend que recebe a delegação, sem exigir que o aplicativo implemente um executor de ferramentas.

Conecte o servidor à sessão existente

  1. Salve o ID da sessão que o backend vai controlar. Para WebRTC ou uma chamada SIP de saída, use session.id da resposta JSON a POST /v1/live/sessions. Para SIP de entrada, primeiro aceite a chamada recebida e depois use data.session_id do webhook correspondente. Armazene o ID junto ao registro do usuário e da conversa no aplicativo.

  2. No servidor, abra uma conexão WebSocket com a URL abaixo, usando o ID exatamente como foi salvo. Autentique-se com Authorization: Bearer $OPENAI_API_KEY usando as credenciais do projeto que criou ou aceitou a sessão. Inclua os mesmos cabeçalhos de conexão exigidos na criação da sessão.

    wss://api.openai.com/v1/live/sessions/{session_id}/attach
  3. Receba eventos e envie comandos pelo socket conectado à sessão. A sessão já está em andamento. Não envie session.start novamente.

Use o ID da sessão sem alterações, inclusive o prefixo, e verifique se o aplicativo tem autorização para acessar essa sessão.

Monitore eventos e envie comandos

Tarefa Eventos ou comandos
Acompanhar a conversa Receba trechos incrementais das transcrições do usuário e do assistente, eventos de delegação e eventos aninhados da API Responses.
Atualizar a configuração do backend Use session.update para alterar as configurações compatíveis com o modo de delegação atual. As configurações de inicialização, como o modelo do frontend e a configuração de áudio, permanecem fixas.
Fornecer contexto Use session.instructions.append para instruções, session.thinking.append para contexto que não deve ser verbalizado e session.commentary.append para atualizações que podem ser comunicadas em voz alta.
Retornar resultados de ferramentas Com a delegação pela API Responses, envie response.item.create e depois response.create para que o backend continue o trabalho.
Controlar a entrada do microfone Use session.input_audio.mute e session.input_audio.unmute. Silenciar a entrada não interrompe o áudio do assistente.
Encerrar a sessão Envie session.close e aguarde session.closed antes de se desconectar.

Os comandos seguem as mesmas regras de validação e delegação da conexão principal. Ao acrescentar contexto geral à sessão, use delegation_id: null. Um ID não nulo deve identificar uma delegação existente do cliente. Consulte Delegação e ferramentas para saber como configurar a delegação e executar funções e para ver exemplos de como acrescentar contexto.

Em sessões no navegador, mantenha a entrada do microfone e a saída para os alto-falantes na faixa de mídia negociada pelo WebRTC. Use o canal auxiliar para receber eventos e controlar a conversa. Acompanhe a reprodução no player de áudio.

Receba cópias do áudio

O canal auxiliar também recebe cópias do áudio de entrada e de saída transmitido após a conexão, enquanto a conexão principal transporta a mídia ao vivo.

Evento Campo de áudio Informações de tempo
session.input_audio.append audio Sem marcas de tempo.
session.output_audio.delta delta start_ms e end_ms delimitam o trecho de áudio de saída na linha do tempo da sessão.

Ambos os eventos contêm áudio bruto mono em PCM16LE a 24 kHz, codificado em base64, independentemente do formato de áudio usado no transporte principal. Nenhum dos eventos tem um event_id. A cópia da entrada contém o áudio recebido antes da aplicação do controle que silencia a entrada. Receber essa cópia não confirma que o modelo processou as amostras. Os intervalos de áudio copiados da saída podem apresentar lacunas quando há descarte de quadros e não indicam quando a pessoa na chamada ouviu o áudio.

Envie o áudio do microfone somente pela conexão principal. Use o canal auxiliar para receber cópias do áudio.

Defina um único responsável por cada ação

Para cada ação, decida se a responsabilidade é do navegador ou do backend. Se as duas conexões receberem um evento de chamada de função, execute a função apenas uma vez. Aplique a mesma regra às atualizações de contexto e às solicitações para que o backend continue o trabalho.

Conecte o canal auxiliar logo no início se o backend precisar acompanhar toda a conversa. Armazene as transcrições e o estado das ferramentas no aplicativo, inclusive o histórico coletado antes da conexão do canal auxiliar.

O navegador continua podendo receber eventos da sessão quando o canal auxiliar está conectado. Mantenha as credenciais confidenciais das ferramentas e as decisões de autorização no backend. Retorne apenas o contexto necessário para a conversa.

Aplique medidas de proteção à conversa

Use o WebSocket principal ou o canal auxiliar do servidor para monitorar a conversa e verificar se as solicitações atendem às políticas do aplicativo. O aplicativo executa as verificações, bloqueia as ações afetadas e envia instruções corretivas quando uma verificação detecta um problema.

Execute as verificações durante a conversa

Uma das aplicações do processamento de fragmentos da transcrição à medida que chegam é verificar se a conversa respeita as políticas do aplicativo. Enquanto essas verificações são executadas, o mesmo fluxo de eventos pode iniciar uma consulta especulativa ou atualizar a interface.

  1. Monitore as transcrições. Acumule fragmentos de session.input_transcript.delta para identificar tentativas de jailbreak, informações confidenciais ou violações de políticas nas solicitações do usuário. Use session.output_transcript.delta para identificar afirmações sem fundamento ou respostas fora do escopo do aplicativo na fala do assistente. Mantenha cada verificação associada à transcrição e à solicitação do aplicativo que ela avaliou.
  2. Execute as verificações em paralelo. Um modelo rápido e leve pode avaliar as solicitações enquanto a conversa continua. Retorne um resultado estruturado e conciso, como {"triggered": true}, com base no qual o aplicativo possa agir. Só execute ações que exigem aprovação depois que elas passarem pelas verificações. Mantenha essas ações bloqueadas se uma verificação falhar ou exceder o tempo limite.
  3. Bloqueie as ações afetadas. Quando uma verificação detectar um problema, marque a solicitação como bloqueada no estado do aplicativo. Consulte esse estado antes de executar uma ferramenta ou efetivar uma alteração, inclusive para tarefas que já estão na fila.
  4. Interrompa as tarefas relacionadas. Cancele as tarefas sob controle do aplicativo quando o backend permitir o cancelamento. Descarte resultados que chegarem tarde para solicitações bloqueadas ou substituídas. Se usar delegação pela API Responses, interrompa a execução das funções personalizadas afetadas e não envie response.create para dar continuidade a tarefas bloqueadas. Isso não cancela uma resposta hospedada já em andamento nem interrompe a fala no frontend.
  5. Registre a decisão e redirecione a conversa. Registre a decisão junto com os IDs da solicitação e da delegação afetadas. Em seguida, envie uma instrução corretiva.

Consulte Trechos incrementais da transcrição para saber como coletar fragmentos e Delegação e ferramentas para manter os resultados do backend alinhados à tarefa atual.

Redirecione a conversa

Use session.instructions.append para orientar a conversa quando uma verificação detectar um problema. Esse comando pode interromper a fala em andamento e aplicar uma nova instrução. Por exemplo, depois que o aplicativo bloquear uma solicitação, envie o comando a seguir.

export function sendUpdate(connection) {
  connection.send({
    type: "session.instructions.append",
    event_id: "guardrail_block_17",
    delegation_id: null,
    content:
      "Stop speaking immediately. Do not continue or act on the last request. Refuse briefly, then wait.",
  });
}

Use uma instrução escrita pelo próprio aplicativo. Não copie texto não confiável do usuário para a instrução como se fosse uma orientação. Use delegation_id: null para aplicar a correção à sessão inteira e limite content a 500 tokens.

Associe session.instructions.appended ao comando por meio de client_event_id. A confirmação chega após o momento estimado da inserção da instrução no contexto. Para impedir que o áudio chegue à pessoa na chamada, use os controles de reprodução descritos a seguir.

Use instruções também para comunicados que precisam ser lidos em voz alta com uma redação específica. Consulte Transmita um comunicado para ver um exemplo e saber o que considerar na reprodução.

Controle a reprodução quando necessário

Se o aplicativo precisar bloquear o áudio do modelo, controle a reprodução no cliente ou no retransmissor de mídia. Silencie ou descarte temporariamente a saída, descarte o áudio na fila local e envie a instrução corretiva. Depois de limpar o áudio desatualizado, retome a reprodução de acordo com a política de recuperação do aplicativo. A confirmação de recebimento da instrução não é um sinal para retomar a reprodução. O canal auxiliar, por si só, não controla a reprodução, e as instruções corretivas não podem desfazer o que a pessoa na chamada já ouviu.

session.input_audio.mute controla a entrada do microfone da pessoa na chamada. Esse comando não silencia a saída do modelo nem cancela tarefas delegadas.

Verifique a fala antes da reprodução

Na maioria dos aplicativos, monitore as transcrições do usuário e do assistente enquanto a conversa continua. Quando uma verificação detectar um problema, o aplicativo pode bloquear as ações afetadas ou enviar instruções corretivas.

Se o aplicativo precisar verificar a fala do assistente antes de reproduzi-la, armazene o áudio em um buffer no player ou na ponte de mídia antes de enviá-lo à pessoa na chamada. Continue recebendo eventos de áudio e transcrição durante a verificação e leia as transcrições independentemente da reprodução.

  1. Colete o áudio e a transcrição correspondente. Para identificar possíveis segmentos de fala, implemente a detecção de atividade de voz (VAD) na saída do aplicativo ou use um filtro de ruído por limiar fornecido pelo framework de mídia. O GPT-Live não fornece VAD de saída nem filtro de ruído por limiar para esse fluxo. Aguarde a transcrição necessária para verificar cada segmento.
  2. Libere o áudio aprovado. Quando um segmento passar na verificação, coloque o áudio original armazenado no buffer na fila de reprodução. Se a verificação falhar ou exceder o tempo limite, ou se a transcrição estiver ausente, descarte o segmento e use uma alternativa segura definida pelo aplicativo.
  3. Trate as interrupções. Associe o áudio, a transcrição, o resultado da verificação e o estado da reprodução a um ID gerado pelo aplicativo. Se uma interrupção cancelar essa fala, remova o áudio correspondente do buffer e da fila e ignore qualquer aprovação posterior desse trecho.

Uma pausa pode delimitar um possível segmento de fala enquanto o modelo ainda está formulando a resposta. Se a política exigir a verificação de uma resposta completa, defina como o aplicativo vai determinar que a resposta terminou. A detecção de atividade de voz, por si só, não permite concluir que a resposta terminou por completo.

O uso do buffer aumenta a latência. A fala descartada permanece no contexto da conversa do modelo. Por isso, teste como a conversa prossegue quando um trecho de áudio não é reproduzido ou quando o aplicativo recorre à alternativa segura.

Teste a intervenção

Teste solicitações permitidas e bloqueadas, falsos positivos, verificações lentas ou com falha, acionamentos das medidas de proteção durante a fala ou a execução de uma ferramenta e resultados tardios de tarefas canceladas. Verifique separadamente o bloqueio das ações, o estado do aplicativo, a fala corretiva e o áudio efetivamente reproduzido. Se você controla a saída, inclua no teste o áudio na fila e a retomada da reprodução. Use o guia do Cookbook sobre avaliação de agentes de voz para comparar o sucesso na execução das tarefas e o tempo de resposta por voz.

Encerre a sessão de forma ordenada

Continue recebendo eventos enquanto as ferramentas concluem a execução e a sessão informa os dados finais de uso. Registre o manipulador de session.closed antes de enviar session.close e mantenha a conexão WebRTC, o canal de dados e o canal auxiliar abertos até a conclusão das tarefas pendentes. Antes de liberar os recursos, salve os dados finais de uso da sessão e todos os dados de uso do backend recebidos nos eventos da API Responses. Se a conexão falhar antes da chegada do evento final, registre o encerramento como incompleto. Consulte Gerenciamento de sessões para ver a sequência de encerramento.