Desenvolvedor tira agente do OpenWebUI após requisição de 1,67 milhão de tokens
Um assistente interno baseado no OpenWebUI acumulou uma requisição de 1,67 milhão de tokens: os resultados da leitura de arquivos eram enviados repetidamente ao modelo junto com o histórico. O autor primeiro adicionou limpeza e resumos, depois transferiu a execução de tarefas para um serviço separado com memória própria. O caso é útil para equipes que transformam um chat em um agente de engenharia: será preciso verificar o histórico, as respostas em streaming e o caminho real das requisições.
Processado por IA de Habr AI; editado por Hamidun News
Se o seu agente lê um arquivo grande, o conteúdo pode ser enviado novamente ao modelo a cada mensagem seguinte. Foi exatamente assim que o assistente interno de uma pequena equipe, baseado no OpenWebUI, chegou a uma requisição de 1.674.813 tokens e à rejeição pela API. O autor de uma análise publicada no Habr primeiro limpou o histórico com um filtro e depois transferiu a execução de tarefas para um serviço separado. A lição prática: antes de ampliar a janela de contexto, descubra quais dados são reenviados ao modelo e qual componente armazena o estado da conversa.
Um arquivo permanece na conversa por muito tempo
Segundo o autor, uma única chamada a read_file retornou 66.871 caracteres. Onze chamadas de ferramentas produziram quase 130 mil caracteres — cerca de 32 mil tokens, pela estimativa dele. Esses resultados continuavam acompanhando o histórico. O agente solicitava novas verificações, o contexto crescia e o usuário acabava cancelando a tarefa.
Imagine um pedido para corrigir a configuração de um serviço. O agente lê o arquivo, altera algumas linhas e executa uma verificação. Na etapa seguinte, talvez precise do resultado dessa verificação e de um pequeno trecho da configuração. Mas o chat volta a anexar o arquivo antigo completo, os comandos anteriores e suas saídas. Alguns ciclos assim transformam uma conversa de trabalho em um depósito de dados repetidos.
O primeiro filtro removia os resultados de ferramentas dos turnos anteriores, mantendo o turno atual intacto. Esse limite é importante: se o resultado de uma ferramenta recém-executada for removido, o modelo perderá os dados necessários para continuar a tarefa. Depois, o autor adicionou um resumo da conversa antiga, preservando as mensagens mais recentes.
O teste sintético parecia convincente: o tamanho estimado caiu de 3637 para 103 tokens. Mas os logs de um dia mostraram outra realidade: em 128 acionamentos, o filtro removeu apenas duas mensagens com o papel tool. Boa parte do conteúdo desnecessário permanecia no texto normal das respostas de assistant, incluindo blocos de exibição de ferramentas. Foi preciso limpá-los também.
A memória do agente foi para um serviço separado
A sumarização também esbarrou no tamanho da entrada. Segundo o relato do autor, as requisições de compactação chegavam a 161–170 mil tokens, enquanto o modelo escolhido tinha um limite de 128 mil. O mecanismo falhava nas conversas mais longas, justamente onde era mais necessário.
Também houve um timeout quando o filtro chamou a própria API do OpenWebUI em uma configuração com um único worker. O autor associou o problema ao processamento de uma requisição aninhada e substituiu esse caminho por uma chamada direta ao gateway. Trata-se de uma observação de uma instalação específica; não convém estender essa explicação a toda configuração com um único worker sem diagnóstico.
Até julho, o autor havia alterado a arquitetura. O OpenWebUI manteve a gestão de usuários, o upload de arquivos e a exibição das respostas. Uma função Pipe passou a encaminhar a última mensagem, as regras do sistema e os anexos para um Agent Runtime externo. Agora, o próprio serviço de execução, que usa Agents SDK ou Codex SDK, armazena o estado da conversa.
Para a equipe, o importante é ter responsabilidades claras. No modo de engenharia, um único serviço gerencia o histórico, as ferramentas e a continuidade da tarefa. Ele deixa de precisar reconstruir a memória de trabalho a partir da conversa na interface. Ainda assim, um Runtime separado não garante, por si só, um contexto curto: regras de armazenamento e compactação continuam necessárias.
A resposta em streaming precisou ser verificada evento por evento
A migração para a Responses API revelou outra armadilha. A chamada de ferramenta aparecia nos eventos intermediários do fluxo, mas output estava vazio no objeto final. A versão instalada do SDK obtinha o resultado do turno desse objeto final, e o agente repetia as chamadas até esgotar o limite de etapas.
Um programa de diagnóstico separado, que coletava os itens concluídos do fluxo, permitiu dar continuidade ao processo. Mas o autor não identificou onde os dados se perdiam: não houve comparação do fluxo antes e depois do proxy. Este caso não permite atribuir o problema à própria API.
Após atualizar as dependências, o autor relatou seis cenários de API bem-sucedidos, sem fallback oculto para Chat Completions. A verificação no navegador, a carga paralela prolongada e alguns cenários de recuperação de estado ficaram fora dos testes de aceitação.
No seu próprio sistema, vale repetir três verificações: analisar o histórico real de requisições, testar o sumarizador com a entrada máxima e confirmar nos logs o protocolo efetivamente utilizado. Este caso mostra quantos erros podem se esconder por trás de uma resposta do agente que parece bem-sucedida.
- 30 de out. de 2026HOSTKEY escreveu um pipe para o bot: Gemma 4 responde em 5–7 segundos, Qwen 3 em 30–40
- 30 de abr. de 2026OpenWebUI mostra como combinar System Prompt, Skills e MCP Tools para verificar links
- 8 de nov. de 2026Desenvolvedor reduz para 0,34 rublos o custo mediano de um turno em jogo com LLM
- 8 de jul. de 2026Otimização de tokens de IA: como economizar 4,6 milhões por dia
Perguntas frequentes sobre a notícia
O que se sabe sobre Um arquivo permanece na conversa por muito tempo?
Segundo o autor, uma única chamada a read_file retornou 66.871 caracteres. Onze chamadas de ferramentas produziram quase 130 mil caracteres — cerca de 32 mil tokens, pela estimativa dele. Esses resultados continuavam acompanhando o histórico. O agente solicitava novas verificações, o contexto crescia e o usuário acabava cancelando a tarefa. Imagine um pedido para corrigir a configuração de um serviço. O agente lê o arquivo, altera algumas linhas e executa uma verificação.
O que se sabe sobre A memória do agente foi para um serviço separado?
A sumarização também esbarrou no tamanho da entrada. Segundo o relato do autor, as requisições de compactação chegavam a 161–170 mil tokens, enquanto o modelo escolhido tinha um limite de 128 mil. O mecanismo falhava nas conversas mais longas, justamente onde era mais necessário. Também houve um timeout quando o filtro chamou a própria API do OpenWebUI em uma configuração com um único worker.
O que se sabe sobre A resposta em streaming precisou ser verificada evento por evento?
A migração para a Responses API revelou outra armadilha. A chamada de ferramenta aparecia nos eventos intermediários do fluxo, mas output estava vazio no objeto final. A versão instalada do SDK obtinha o resultado do turno desse objeto final, e o agente repetia as chamadas até esgotar o limite de etapas. Um programa de diagnóstico separado, que coletava os itens concluídos do fluxo, permitiu dar continuidade ao processo.
Test Frontier LLMs & Autonomous Agents in One Workspace
Run Claude Opus 5.5, GPT-6, Gemini 3.1, and DeepSeek side-by-side in Nomad AI (nomadnet.ai) — unified model routing, deep research, and multimodal workflows under one subscription.
O essencial da IA — uma vez por semana
Sete histórias que realmente importaram, escolhidas a dedo. Sem ruído nem releases.
Pronto! Verifique seu e-mail para a confirmação.