Experimentos
Um experimento é uma implantação em toda a instância (rollout) que um operador configura. Para cada conta, o Decoding Chat determina a partir dessa configuração se a conta está no rollout e quais configurações a conta recebe. A única rota nesta página resolve todos os experimentos que o servidor define e os retorna em um único envelope, juntamente com a cadência de sondagem que eles compartilham. Este servidor define voice_noise_suppression, cuja localização é definida pelo protocolo Voz.
Toda atribuição é um conselho. Um cliente que a ignora se comporta como faria com a implantação desligada, e nenhuma rota e nenhum evento de Gateway relata o que um cliente realmente executou.
Objeto de atribuições de experimentos
Seção intitulada “Objeto de atribuições de experimentos”Uma resolução de cada experimento definido para uma conta. Todos os campos estão presentes em todas as respostas.
Estrutura
Seção intitulada “Estrutura”| Campo | Tipo | Descrição |
|---|---|---|
| poll_interval_seconds | integer | Segundos a esperar antes de revalidar, de 60 a 86400 |
| poll_jitter_percent | integer | O maior desvio aleatório adicionado ou subtraído da espera, como uma porcentagem da espera, de 0 a 50 |
| assignments | objeto assignment map | Uma entrada para cada experimento que o servidor define |
Cada conta na instância recebe os mesmos poll_interval_seconds e poll_jitter_percent. Uma única requisição atualiza todos os experimentos.
Objeto de mapa de atribuição
Seção intitulada “Objeto de mapa de atribuição”Uma entrada por experimento. O envelope relata este objeto mesmo quando ele está vazio.
Estrutura
Seção intitulada “Estrutura”| Campo | Tipo | Descrição |
|---|---|---|
| voice_noise_suppression? | objeto noise suppression assignment | A atribuição de supressão de ruído de quem chamou |
Ignore os experimentos desconhecidos e trate um experimento ausente como desativado.
Esta versão do servidor escreve voice_noise_suppression em cada resposta, inclusive enquanto uma implantação está desativada. O valor desativado é o primeiro resultado de resolução abaixo, que relata enabled como false e o config_version armazenado, de modo que um cliente que compara o config_version com o valor de sua resposta anterior pode ver que um operador salvou a configuração, mesmo enquanto o rollout permanece desativado, e não precisa de uma segunda solicitação para isso.
Backends de supressão de ruído
Seção intitulada “Backends de supressão de ruído”A supressão de ruído é executada no cliente, na trilha do microfone, antes dessa trilha ser publicada. O Decoding Chat não processa áudio para isso. O registro é fechado, e um backend fora dele não é um valor que esta API produz ou aceita.
| Valor | Descrição |
|---|---|
| none | Sem processamento |
| standard | O supressor do navegador ou da plataforma que o cliente já possui |
| gate | Um noise gate baseado no nível de entrada |
| speex | O pré-processador Speex |
| rnnoise | O modelo recorrente RNNoise |
| gtcrn | O modelo GTCRN |
| deep_filter | O modelo DeepFilterNet |
Um cliente DEVE tratar um backend ausente de enabled_backends como indisponível, incluindo um nomeado por backend ou por uma substituição de guilda.
Objeto de atribuição de supressão de ruído
Seção intitulada “Objeto de atribuição de supressão de ruído”Uma resolução da implantação da supressão de ruído da instância contra uma conta. Todo campo está presente sempre que a chave é escrita.
Estrutura
Seção intitulada “Estrutura”| Campo | Tipo | Descrição |
|---|---|---|
| enabled | boolean | Se a implantação (rollout) está em execução nesta instância |
| config_version | integer | A revisão da configuração da instância a partir da qual esta atribuição foi resolvida |
| user_targeted | boolean | Se o usuário está dentro da implantação |
| backend | ?string | O backend que o usuário aplica e null quando o usuário não é o alvo |
| source | ?string | Qual regra direcionou o usuário, sendo user_rule ou canary, e null quando o usuário não é o alvo |
| guild_overrides | array[objeto guild override] | Substituições de backend por guilda que se aplicam ao usuário |
| enabled_backends | array[string] | Os backends que o cliente PODE executar |
| allow_user_override | boolean | Se a própria escolha armazenada da conta substitui o backend |
| stereo_enabled | boolean | Se o cliente publica uma trilha de microfone estéreo |
| suppression_strength | integer | Força da supressão de 0 a 100, que apenas um backend que a lê aplica |
config_version identifica a revisão da configuração. Ele pode mudar sem alterar a atribuição de quem chamou.
Resultados da resolução
Seção intitulada “Resultados da resolução”Os resultados abaixo definem user_targeted como false, e diferem no que mais eles relatam.
- A implantação está desativada.
enabledé false,enabled_backendseguild_overridesestão vazios, eallow_user_overrideestereo_enabledsão false. - O operador excluiu quem chamou.
enabledé true, e todos os outros campos são como no primeiro resultado. - Quem chamou não foi sorteado.
enabledé true, eenabled_backends,guild_overrides,allow_user_override, estereo_enabledmantêm todos os seus valores configurados.
Quem chamou é sorteado seja pela lista de permissões do operador, que define source como user_rule, ou pela fatia amostrada da população de contas, que define source como canary. Um usuário que é sorteado enquanto seu backend está ausente de enabled_backends é relatado como não sorteado, com user_targeted falso e tanto backend quanto source nulos.
Um cliente ramifica em user_targeted em vez de enabled_backends, porque o terceiro resultado mantém a matriz (array) preenchida. Uma entrada guild_overrides é aplicada em sua guilda, independentemente de quem chamou ter sido sorteado.
config_version relata a revisão armazenada em todos os resultados, incluindo quando a implantação está desativada.
Objeto de substituição de guilda para supressão de ruído
Seção intitulada “Objeto de substituição de guilda para supressão de ruído”Uma substituição de backend com escopo em uma guilda. Enquanto quem chamou estiver conectado a um canal de voz dessa guilda, o backend da substituição assume o lugar do backend da atribuição.
Estrutura
Seção intitulada “Estrutura”| Campo | Tipo | Descrição |
|---|---|---|
| guild_id | snowflake | A guilda na qual a substituição se aplica |
| backend | string | O backend para executar naquela guilda |
Uma substituição nomeando um backend que está ausente de enabled_backends é descartada antes da resposta ser escrita, então cada entrada é executável.
Obter atribuições de experimento
Seção intitulada “Obter atribuições de experimento”GET/v1/experimentsResolve cada experimento definido para quem chamou e retorna um objeto experiment assignments. A resposta é derivada por conta, portanto, nunca é compartilhada entre contas.
Corpo da resposta
Seção intitulada “Corpo da resposta”Objeto experiment assignments.
Resposta
Seção intitulada “Resposta”| Status | Corpo | Condição |
|---|---|---|
| 200 | corpo da resposta | O envelope foi resolvido |
| 304 | vazio | A solicitação enviou um If-None-Match correspondente |
Cabeçalhos da solicitação
Seção intitulada “Cabeçalhos da solicitação”| Campo | Tipo | Descrição |
|---|---|---|
| If-None-Match? | string | Uma ETag de uma resposta anterior a esta rota |
Um cliente envia a ETag que recebeu pela última vez. O Decoding Chat a compara com a tag do envelope que acabou de resolver e responde 304 sem corpo em caso de correspondência. * corresponde a qualquer tag atual. Uma comparação fraca é usada, de modo que um prefixo W/ em ambos os lados não anula a correspondência.
Cabeçalhos da resposta
Seção intitulada “Cabeçalhos da resposta”| Campo | Tipo | Descrição |
|---|---|---|
| ETag | string | Uma tag forte sobre o corpo do envelope, enviada em 200 e em 304 |
| Cache-Control | string | O valor literal private, no-cache |
| Vary | string | O valor literal Authorization, substituído por Origin quando a política de origem cruzada (cross-origin) repassou uma origem permitida |
A ETag muda quando a resposta muda. Trate-a como um valor opaco.
ETag é listada em Access-Control-Expose-Headers e If-None-Match em Access-Control-Allow-Headers, para que um cliente de origem cruzada leia a tag e revalide com ela.
Sondagem (Polling)
Seção intitulada “Sondagem (Polling)”Um cliente lê esta rota uma vez por sessão e, em seguida, novamente a cada poll_interval_seconds, deslocado por um valor aleatório de até poll_jitter_percent desse intervalo em qualquer direção. Ele envia a última ETag em toda requisição após a primeira. Um cliente NÃO DEVE sondar mais rápido que a extremidade inferior dessa faixa de desvio (jitter).
Até a primeira resposta bem-sucedida, use 300 segundos com 15% de jitter.
Limite de taxa
Seção intitulada “Limite de taxa”60 solicitações por 10 segundos para cada usuário autenticado, no bucket default.

