Skip to main content
Uma sessão ao vivo permite transmitir uma consulta enquanto ela acontece. Você cria a sessão com uma chamada REST, recebe uma URL de WebSocket, envia o áudio enquanto o médico fala e recebe o registro médico gerado quando a consulta termina. Use isto quando capturar áudio em tempo real. Quando você já tiver uma gravação finalizada, use o fluxo de Consultas.

Como funciona

  1. POST /v1/scribe-sessions/live devolve uma URL de WebSocket.
  2. Conecte-se a essa URL e transmita o áudio conforme ele é capturado.
  3. Envie stop_recording quando a consulta terminar.
  4. O webhook scribe_session.completed (webhooks) avisa que o registro está pronto.
  5. Busque o registro em Documentos de Registro Médico.

O que a chave de API precisa ter

A chave usada aqui precisa das três condições abaixo, ou a chamada falha com 403:
  • A permissão scribe:write, concedida de forma explícita. Uma chave antiga sem o claim de permissões funciona em outros endpoints, mas é recusada aqui; gere a chave de novo para obter uma válida.
  • O papel doctor.
  • Um vínculo com uma instituição.

Criar uma sessão

O corpo da requisição carrega o contexto da consulta: qual é a consulta, qual modelo será preenchido, a qual paciente ela pertence e o contexto escrito que você já tiver.
Resposta:
Trate live.url como opaca e trate-a como um segredo. Conecte-se exatamente à URL devolvida e não a construa por conta própria: o host, o caminho e a credencial mudam sem aviso. A credencial é verificada apenas quando o socket abre. Uma conexão estabelecida antes de expiresAt continua transmitindo depois desse instante, e uma conexão tentada depois é recusada, então peça uma sessão nova em vez de reutilizar uma URL vencida.

Campos da requisição

Escolher o modelo

template aceita um id ou o próprio JSON do modelo. Envie exatamente um dos dois. Enviar os dois, ou nenhum, devolve 400 com param igual a template. A forma em linha:
O modelo em linha é armazenado na primeira vez que você o envia e reutilizado depois: seções idênticas resolvem para o mesmo modelo por hash de conteúdo, então enviá-lo em toda consulta não cria duplicatas. O formato das seções é o mesmo documentado em Smart Templates, incluindo objetos aninhados, arrays e enums.

Identificar o paciente

patient também aceita um id ou a identidade em linha. Envie exatamente um.
A forma em linha cria o paciente quando ele ainda não existe, então você não precisa chamar antes a API de Pacientes.

Repetir a mesma consulta

Chamar o endpoint de novo com o mesmo consultation.id enquanto a sessão ainda está gravando devolve a mesma sessão com uma URL nova. Essa é a forma suportada de se recuperar de uma conexão perdida. Não compare as duas URLs entre si e não armazene a primeira. Depois que a gravação para, o mesmo id devolve 409.

Enviar áudio

Conecte-se a live.url. O servidor envia uma mensagem ready quando está pronto para receber áudio. Envie o áudio como frames binários de WebSocket. Dois formatos são aceitos:
O PCM bruto não é inspecionado. Se você enviar outra taxa de amostragem ou número de canais, o áudio é aceito e transcrito de forma incorreta, sem erro. Um arquivo WAV é aceito do mesmo jeito: o cabeçalho dele não é lido, então os primeiros bytes viram um ruído curto e o restante é transcrito normalmente. Envie apenas as amostras, sem o cabeçalho.
Envie cerca de 100 ms de áudio por frame, no ritmo em que ele é capturado. Uma carga PCM menor que 1024 bytes (cerca de 32 ms) é mantida na gravação, mas não é encaminhada ao reconhecedor ao vivo, então frames muito pequenos atrasam o texto que você vê em vez de perder áudio.

Manter a conexão viva

Envie {"type": "ping", "data": {}} quando quiser confirmar que o socket está saudável; o servidor responde com {"type": "pong", "data": {}}. Qualquer frame recebido, inclusive áudio, conta como atividade. Uma sessão que não recebe nada por 15 minutos é fechada pelo servidor, então envie áudio continuamente, ou faça ping durante pausas longas.
Um socket por sessão. Abrir uma segunda conexão para a mesma sessão expulsa a primeira: o socket anterior para de receber transcrições. Reconecte depois de uma queda, mas nunca transmita a mesma consulta de dois lugares ao mesmo tempo.

Mensagens que você recebe

Toda mensagem é JSON com um campo type e um campo data. Uma correction substitui o que um transcript informou para o mesmo segmento. Quando exibir texto para um médico, aplique as correções conforme elas chegam. reconnect carrega dois motivos. server_draining significa que o servidor está reiniciando: reconecte e continue transmitindo. resume_upload significa que a parada chegou antes de todo o áudio: reconecte e envie o áudio que falta.

Encerrar a sessão

Envie esta mensagem quando a consulta terminar:
O servidor termina de processar o áudio que possui, envia scribe_completed com data.status igual a processing e fecha a conexão.
stop_recording é a única coisa que produz um registro. Se o socket simplesmente fechar sem ele, o áudio é preservado mas nada é gerado, nenhum webhook dispara e a consulta fica inacabada. Envie sempre, inclusive quando o médico cancela.
O socket não entrega o registro médico. scribe_completed significa que a geração começou, não que terminou. Aguarde o webhook scribe_session.completed e então busque o registro.

Receber o registro

O webhook scribe_session.completed carrega consultationInternalId, o mesmo consultation.id que você enviou. Busque o registro com ele:
A conclusão costuma chegar dentro do minuto seguinte ao stop_recording. A geração acontece em parte enquanto o áudio é transmitido, então uma consulta mais longa não demora proporcionalmente mais para terminar.
O webhook dispara alguns segundos antes de o documento ficar disponível para consulta. Se a primeira leitura devolver uma lista vazia, aguarde 5 segundos e leia novamente.

Perda de conexão

Reconectar é esperado e seguro.
  • O socket cai durante a gravação. Chame POST /v1/scribe-sessions/live de novo com o mesmo consultation.id e conecte-se à URL devolvida. O áudio já recebido é preservado.
  • live.url chega ao expiresAt. Peça uma sessão nova com o mesmo consultation.id. Um socket já aberto não é afetado.
  • Fechamento 1013. Repetível: o servidor está ocupado ou reiniciando. Aguarde um momento e reconecte.
  • Fechamento 1003. O áudio não pôde ser decodificado. A sessão vai para estado de erro, então reconectar não a recupera. Corrija o codificador e comece uma consulta nova.
  • Fechamento 1008. Terminal: a credencial ou a sessão não é válida. Não reconecte; repetir devolve o mesmo resultado.

Erros

Veja Erros para o envelope completo de resposta.