Skip to content

Falta de credencial deixa de ser o fim da sessão - #1

Merged
Dione-b merged 1 commit into
masterfrom
contexto-e-recuperacao-de-provider
Aug 21, 2026
Merged

Dione-b merged 1 commit into
masterfrom
contexto-e-recuperacao-de-provider

Conversation

@Dione-b

@Dione-b Dione-b commented Aug 21, 2026 •

Copy link
Copy Markdown
Owner

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.

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>
@Dione-b
Dione-b merged commit abe593b into master Aug 21, 2026
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant