Repository navigation
Falta de credencial deixa de ser o fim da sessão - #1
Merged
Merged
Conversation
O agente encerrava a task quando get_api_key falhava. Isso derrubava o receptor de comandos junto, e como a UI descarta o resultado de todo user_tx.send, /model continuava respondendo "switched to" para um canal que ninguém escutava. A única recuperação disponível — trocar para um provider local — era exatamente a que a saída removia. Agora o agente sobe sem cliente, recusa prompts com o nome da variável que falta, e reconstrói o cliente quando o switch chega. Status deixa de descrever uma conexão que nunca existiu. Cada request é HTTP novo; não há link para cair. O par Connected/Disconnected ainda travava no primeiro erro da sessão, então um turno que falhou pintava o header de vermelho até o processo morrer. Ready/Working/NeedsCredential descreve o que dá para fazer, e um erro volta ao repouso em vez de latchar — só o agente move o estado da credencial. A UI para de manter cópia otimista do par provider/modelo. Quem confirma é o AgentUpdate::Ready do agente, o que também elimina o caso de trocar de provider carregando o modelo antigo: ollama pedindo claude-sonnet-5 era o que a tela mostrava. O modelo só é preservado quando o provider de destino o serve. Provider e modelo passam a aparecer no painel Status, que tinha espaço sobrando e era a informação que exigia rodar um comando. No mesmo tronco, a contabilidade de tokens do loop. O threshold ignorava system prompt e tool definitions, que não são arredondamento: o prompt é reconstruído por turno e o bloco de ferramentas carrega o schema de todo servidor MCP. O max_tokens da resposta não era reservado, então uma conversa dentro do limite ainda era recusada. O anchor era tomado antes do push da resposta, cobrando os tokens de saída duas vezes. Resultados de ferramenta entravam na história sem teto — um read_file grande estourava a janela em um passo, e como o budget é checado antes do request e não depois da ferramenta, só se descobria no turno seguinte. E o retry de overflow reenviava requests idênticos: compact não dizia se tinha encolhido a história, então um continue reemitia a mesma requisição recusada, cobrada de novo. O retain zero do caminho de retry ainda entregava ao sumarizador a história inteira que o provider acabara de recusar. overflow_retried era binding de função e só zerava em sucesso, o que desarmava a recuperação para o resto da sessão no primeiro insucesso. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
O agente encerrava a task quando get_api_key falhava. Isso derrubava o
receptor de comandos junto, e como a UI descarta o resultado de todo
user_tx.send, /model continuava respondendo "switched to" para um canal
que ninguém escutava. A única recuperação disponível — trocar para um
provider local — era exatamente a que a saída removia. Agora o agente
sobe sem cliente, recusa prompts com o nome da variável que falta, e
reconstrói o cliente quando o switch chega.
Status deixa de descrever uma conexão que nunca existiu. Cada request é
HTTP novo; não há link para cair. O par Connected/Disconnected ainda
travava no primeiro erro da sessão, então um turno que falhou pintava o
header de vermelho até o processo morrer. Ready/Working/NeedsCredential
descreve o que dá para fazer, e um erro volta ao repouso em vez de
latchar — só o agente move o estado da credencial.
A UI para de manter cópia otimista do par provider/modelo. Quem confirma
é o AgentUpdate::Ready do agente, o que também elimina o caso de trocar
de provider carregando o modelo antigo: ollama pedindo claude-sonnet-5
era o que a tela mostrava. O modelo só é preservado quando o provider de
destino o serve. Provider e modelo passam a aparecer no painel Status,
que tinha espaço sobrando e era a informação que exigia rodar um comando.
No mesmo tronco, a contabilidade de tokens do loop. O threshold ignorava
system prompt e tool definitions, que não são arredondamento: o prompt é
reconstruído por turno e o bloco de ferramentas carrega o schema de todo
servidor MCP. O max_tokens da resposta não era reservado, então uma
conversa dentro do limite ainda era recusada. O anchor era tomado antes
do push da resposta, cobrando os tokens de saída duas vezes. Resultados
de ferramenta entravam na história sem teto — um read_file grande
estourava a janela em um passo, e como o budget é checado antes do
request e não depois da ferramenta, só se descobria no turno seguinte.
E o retry de overflow reenviava requests idênticos: compact não dizia se
tinha encolhido a história, então um continue reemitia a mesma requisição
recusada, cobrada de novo. O retain zero do caminho de retry ainda
entregava ao sumarizador a história inteira que o provider acabara de
recusar. overflow_retried era binding de função e só zerava em sucesso,
o que desarmava a recuperação para o resto da sessão no primeiro
insucesso.