AnythingLLM Max Tokens: como corrigir respostas cortadas
Uma resposta interrompida no meio da frase não indica necessariamente um problema de rede. Confira os ajustes efetivos do Generic OpenAI, o motivo de encerramento da API e um teste que altere uma variável por vez.
Conteúdo

Quando uma resposta longa do AnythingLLM para no meio da frase, confira primeiro se Max Tokens limitou aquela geração. Aumentar a janela de contexto ou o tempo limite do proxy não são correções equivalentes. Você precisa do orçamento de saída realmente enviado, do finish_reason retornado pela API e de um novo teste que altere uma única variável, preservando a configuração anterior.
Escolha a correção pelo motivo do encerramento
O texto parar de aparecer é um sintoma, não um diagnóstico. Em OpenAI Chat Completions, length significa que foi atingido o limite de tokens definido na requisição; stop pode indicar um término natural ou uma sequência de parada configurada. tool_calls indica que o modelo chamou uma ferramenta, não que entregou a resposta final. Em APIs compatíveis, confira também o comportamento do servidor utilizado.
| Evidência disponível | O que conferir primeiro | Próximo passo |
|---|---|---|
A API retorna finish_reason=length e o orçamento efetivo pode ser verificado | Limite de saída | Mantenha a entrada e altere somente o orçamento de saída para um valor aceito |
| O servidor informa explicitamente que o contexto é grande demais; a mesma tarefa funciona com menos histórico ou trechos recuperados | Excesso de contexto | Reduza a entrada e confira a janela real do modelo, em vez de apenas liberar mais saída |
| Há registro de tempo esgotado, conexão reiniciada, cancelamento ou fluxo encerrado sem motivo visível | Conexão, cancelamento ou compatibilidade do streaming | Cruze os horários e localize a camada que encerrou a requisição; a ausência de um campo não prova uma falha de rede |
A resposta retorna stop, mas falta uma seção ou item numerado | Instruções, sequências de parada e completude | Confira as omissões: encerramento normal não significa tarefa concluída |
O orçamento de saída limita quanto uma requisição pode gerar. A janela de contexto diz respeito ao contexto que o modelo consegue processar. Histórico, instruções de sistema e passagens recuperadas podem integrar a entrada: o adaptador Generic OpenAI do AnythingLLM monta esses componentes. Portanto, uma pergunta curta pode resultar em uma requisição grande, e digitar uma janela maior na interface não amplia a capacidade do modelo no servidor.
Um usuário na issue #6703 relatou ter investigado tempos limites de proxy reverso e WebSocket antes de descobrir um limite de saída. É um relato individual que ajuda a ordenar as verificações, não uma confirmação da causa na sua instalação.
Preserve os ajustes e identifique o modelo realmente usado
Registre a configuração antes de alterá-la. Anote a versão do AnythingLLM, se é Desktop ou uma instalação própria, o provedor global, o provedor e modelo escolhidos no espaço de trabalho e no chat, se há agente envolvido e os limites de contexto e saída. Oculte chaves nas capturas de tela. Não exclua o espaço de trabalho original, as conversas ou os documentos indexados para fazer o experimento.
Abra a configuração do provedor LLM em Settings e confirme que o teste realmente usa Generic OpenAI. A documentação oficial exige compatibilidade tanto nas funções da API quanto no formato das respostas de inferência. Se a chamada usa outro provedor, mudar o Generic OpenAI não configura esse outro caminho.
O código oficial da interface consultado em 2026-10-16 contém estes campos:
| Campo | O que verificar |
|---|---|
Base URL, API Key, Selected Model | O endereço que já funcionava, a chave correspondente e o identificador exato do modelo; não deduza o identificador pelo nome exibido |
Model context window | A capacidade de contexto configurada, não o orçamento da resposta |
Max Tokens | O orçamento de geração, que deve ser conferido separadamente |
Salve, reabra os ajustes e confirme que os valores permaneceram. Quando tiver acesso autorizado ao registro das requisições, confira também o model efetivo e o campo do limite de saída. A captura mostra o valor exibido, não o que o servidor recebeu. Teste chat comum e agente separadamente: as notas do Desktop v1.16.2 registram uma correção para Generic OpenAI ignorando max tokens em fluxos de agentes.
Se você já usa BetterToken, compare neste ponto o endereço, a chave e o modelo com as instruções de Chat Completions; é uma referência para conferir a conexão, não uma garantia de todas as funções do AnythingLLM ou de remoção dos limites de saída.
Entenda o zero, o nome do parâmetro e a versão
0 não significa saída ilimitada. As notas do Desktop v1.17.0 informam que Generic OpenAI aceita 0 para omitir max_tokens da requisição. Nesse caso, valem os padrões e limites do servidor. Para diagnosticar, prefira um orçamento positivo explícito aceito pelo modelo, deixando a comparação mais clara.
No adaptador consultado em 2026-10-16, a saída usa GENERIC_OPEN_AI_MAX_TOKENS, enquanto a janela usa GENERIC_OPEN_AI_MODEL_TOKEN_LIMIT. O nome padrão do parâmetro de saída é max_tokens; GENERIC_OPEN_AI_MODEL_MAX_TOKEN_KEY permite escolher outro nome. Isso descreve o código consultado, não garante os mesmos controles em todas as versões instaladas.
Não renomeie os parâmetros de toda API compatível por tentativa. A referência atual da OpenAI define max_completion_tokens, cujo orçamento inclui saída visível e tokens de raciocínio. Uma resposta visível curta pode, portanto, consumir o orçamento. Verifique o campo aceito pelo seu servidor e modelo e altere a configuração somente quando sua versão oferecer suporte.
No Desktop, use a interface em vez de editar .env a partir de um trecho encontrado na internet: o guia oficial limita essas instruções a instalações próprias ou Docker. A v1.17.0 também mudou a forma de salvar os ajustes do espaço de trabalho. Confira a persistência reabrindo os ajustes, sem presumir que todas as versões tenham o mesmo botão.
Onde obter finish_reason e o uso real de tokens
Priorize a resposta da API do modelo para o AnythingLLM. Em Chat Completions sem streaming, confira choices[0].finish_reason e o usage retornado. Em streaming, encontre o fragmento com o motivo de encerramento e verifique se chegou a sequência de término completa do servidor. Um valor vazio no primeiro fragmento não é o resultado final. Consulte as definições oficiais da resposta.
Na interface web, abra o painel Network das ferramentas do navegador, preserve o registro e reproduza o problema uma vez. Anote horário, status e resposta da requisição do chat. Isso captura o trecho navegador–AnythingLLM, não necessariamente a resposta original do serviço do modelo.
O processamento de streaming do Generic OpenAI consultado em 2026-10-16 transforma um motivo de encerramento não vazio em uma mensagem própria do AnythingLLM com close: true, em vez de encaminhar o motivo intacto. Sem uso informado pelo provedor, o código também tem uma estimativa por contagem de fragmentos de texto. Assim, o encerramento na tela e um número de tokens não comprovam nem a resposta completa nem um limite atingido com exatidão.
Obtenha o motivo original e o uso em logs do serviço ou detalhes da requisição aos quais tenha acesso autorizado. Caso contrário, forneça horário e identificador ao responsável pela instalação. As notas do Desktop v1.16.2 descrevem o acesso aos logs e armazenamento pela etiqueta de versão no topo da janela; achar a pasta não garante que aquela versão grave o campo original de encerramento.
O uso final pode não chegar em streaming: a OpenAI informa que interrupções ou cancelamentos podem impedir a entrega do último fragmento de usage. Registre como indisponível, não como zero, e não trate uma estimativa do aplicativo como informação de faturamento.
Compare uma resposta curta e uma longa com os ajustes preservados
Fixe o caminho da chamada e só depois varie o tamanho solicitado. Use um espaço de teste sem documentos da base de conhecimento anexados. Selecione o mesmo provedor e modelo e mantenha instruções de sistema, temperatura, orçamento e demais ajustes. Abra uma conversa vazia para cada teste, evitando que o segundo herde o primeiro. Comece pelo chat comum, sem agentes ou ferramentas.
Teste curto A:
Liste 3 recomendações para gerenciar a documentação de um projeto. Escreva 2–3 frases por recomendação. Ao terminar, escreva
[END]em uma linha separada.
Teste longo B:
Liste 20 recomendações para gerenciar a documentação de um projeto. Escreva 2–3 frases por recomendação. Ao terminar, escreva
[END]em uma linha separada.
Envie a mensagem e aguarde o término sem interromper a geração ou atualizar a página. Se houver tempo esgotado ou desconexão, anote quando ocorreu em vez de repetir continuamente. Copie as respostas exibidas por inteiro para A.txt e B.txt. Registre horário, modelo, orçamento efetivo, motivo de encerramento, se o usage veio do provedor e se aparecem o último número e [END]. Os números são requisitos do teste, não limites do modelo ou tamanhos garantidos.
A completo e B incompleto mostram um problema no caso de saída longa; ainda não provam que a causa é Max Tokens. Se B retornar length, mantenha seu prompt exato e os demais ajustes, aumente apenas o orçamento para um valor explícito permitido pelo servidor e faça o teste C em uma conversa vazia. Salve em C.txt. Os 20 itens completos, o marcador final e uma finalização diferente de length sustentam que a mudança ajudou neste caso.
Se B já termina normalmente, não aumente o orçamento sem necessidade. Compare a mesma tarefa real na conversa original e em uma vazia, mantendo a saída fixa. Investigue o contexto quando a falha acompanhar o histórico ou os trechos recuperados. Restaure os ajustes temporários desnecessários e preserve os registros iniciais. Testes em APIs pagas podem gerar a cobrança normal por requisição.
Corrija a causa indicada, sem mudar todos os controles
Limite de saída confirmado: altere o orçamento e confira a requisição
Aumente apenas o orçamento do caminho efetivamente utilizado, dentro dos limites do modelo. Se o número muda na interface, mas não na requisição enviada, confira provedor, persistência, versão e diferenças entre chat e agente. Aumentar o contexto não corrige uma configuração de saída que não chegou ao servidor.
Contexto excessivo: reduza a entrada, mantendo tarefa e orçamento
Repita primeiro a mesma tarefa longa em uma conversa vazia. Depois diminua separadamente os trechos recuperados ou o histórico desnecessário. Quando o servidor reportar explicitamente um limite de contexto, configure a capacidade real do modelo; preencher um número maior não a expande. Sem erro explícito, melhorar em um chat vazio deixa o contexto como hipótese a confirmar.
Conexão ou streaming: encontre a camada afetada antes de alterar o tempo
Compare os registros do navegador, AnythingLLM e API no mesmo período. Procure cancelamento, tempo esgotado e fechamento de conexão. Se a API completou a resposta e o navegador recebeu só parte, investigue transporte intermediário e renderização. Se a API falhou, trate primeiro seu erro. Altere o tempo limite de uma camada apenas quando os registros apontarem para ela.
Administradores de instalações próprias ou Docker podem testar o streaming isoladamente. A configuração oficial oferece GENERIC_OPENAI_STREAMING_DISABLED="true", que afeta só Generic OpenAI; reinicie o serviço ou contêiner após a alteração. Mantendo o restante igual, repita o prompt longo, depois restaure o valor original e reinicie. Funcionar sem streaming restringe a investigação a caminhos relacionados ao fluxo, mas não prova que a culpa seja do proxy. Não aplique essa edição de .env no Desktop.
Confirme a correção e envie evidências se a falha continuar
Uma resposta maior não basta. Confira todas as seções ou numerações, a última frase completa e o marcador final. Cruze o motivo original de encerramento e os registros da conexão para verificar se não houve novo corte. Nem stop nem [END] substituem a leitura do conteúdo. Depois do controle simplificado, repita também a tarefa real que falhava.
Se continuar, envie ao responsável a versão e implantação, chat comum ou agente, identificadores do provedor e modelo, ajustes sem segredos, prompt mínimo, diferenças A/B/C, horários e o motivo original obtido. Remova chaves, cabeçalhos de autenticação e conteúdo de documentos privados. Marque campos ausentes como indisponíveis. Assim, a próxima investigação parte de uma requisição concreta, não de mais uma alteração especulativa no proxy.