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
AnythingLLM Max Tokens: como corrigir respostas cortadas

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ívelO que conferir primeiroPróximo passo
A API retorna finish_reason=length e o orçamento efetivo pode ser verificadoLimite de saídaMantenha 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 recuperadosExcesso de contextoReduza 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ívelConexão, cancelamento ou compatibilidade do streamingCruze 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 numeradoInstruções, sequências de parada e completudeConfira 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:

CampoO que verificar
Base URL, API Key, Selected ModelO endereço que já funcionava, a chave correspondente e o identificador exato do modelo; não deduza o identificador pelo nome exibido
Model context windowA capacidade de contexto configurada, não o orçamento da resposta
Max TokensO 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.

Quer otimizar seu fluxo de trabalho com LLMs?

Conecte modelos por uma única API, gerencie chaves e controle os gastos com IA.

Começar grátis