fix(agent): o reparo carimbava um modelo com desligamento marcado (CRM-464) - #61
Merged
gomessguii merged 2 commits intoAug 31, 2026
Conversation
…M-464) Mesma correção do core-service, nos dois call sites que o Python tem: get_agent e get_agents_by_account repetem o reparo do agente sequential/parallel/loop sem sub_agents, e ambos atribuíam gpt-4.1-nano quando o agente não tinha modelo próprio. A OpenAI desliga esse modelo em 23/10/2026, e o reparo faz db.commit() — o id morto era gravado no agente do cliente, não apenas tentado uma vez. Passa a apontar para openai/gpt-5.6-luna, com prefixo de provider. Aqui o prefixo importa mais do que no Go: é este serviço que monta o LiteLlm, e a LiteLLM só adivinha um nome cru quando ele casa com uma família que ela já conhece, levantando BadRequestError em qualquer outro. O valor sai de uma constante de módulo para que a próxima varredura ache os dois pontos de uma vez. Modelo só é atribuído quando o agente não tem nenhum — o que o cliente já escolheu nunca é reapontado, e isso agora tem teste.
Reviewer's GuideAtualiza o default persistido para agentes sequential/parallel/loop sem modelo próprio, centralizando o valor como Sequence diagram for agent model repair and persistencesequenceDiagram
participant Caller
participant AgentService
participant Database
Caller->>AgentService: get_agent(agent_id)
AgentService->>AgentService: get_agents_by_account(account_id)
alt agent.model is absent
AgentService->>AgentService: DEFAULT_REPAIR_MODEL
AgentService->>Database: db.commit()
else agent.model already exists
AgentService-->>Caller: preserve existing model
end
AgentService-->>Caller: repaired agent
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Hey - I've reviewed your changes and they look great!
Sourcery assessment
Needs a human reviewer. This changes the persisted default model for every malformed agent that enters the repair path, so an invalid, retired, or unsuitable model ID can immediately affect all such customers and cause failed or misrouted model requests. Reverting stops future assignments but does not restore model values already written to customer agents.
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
…4 review)
Das tres portas de reparo, a de listagem era a unica sem asserir persistencia —
e e justo a que o PR chama de pior ("gravado no agente do cliente so por alguem
abrir a listagem"). test_get_agents_by_account_repair_stamps_the_same_model
passa a aferir db.commit.called, como o teste de get_agent ja fazia.
test_repair_keeps_a_model_the_agent_already_has passava a vazio pelo mesmo
motivo do lado Go: sem aferir que o agente foi coagido para llm, um guard de
sub_agents que parasse de casar deixaria o modelo intocado e o teste verde.
Provado por mutacao: removendo o db.commit() do bloco de reparo de
get_agents_by_account, so o teste novo cai; anulando o guard de sub_agents nas
duas portas, os tres testes caem (antes, o de preservacao passava).
O comentario da constante cai de 6 para 2 linhas e o docstring do teste perde o
id do card — o commit e a PR ja carregam CRM-464.
gomessguii
approved these changes
Aug 31, 2026
gomessguii
deleted the
danilocarneiro/crm-464-default-de-reparo-modelo-vigente
branch
August 31, 2026 16:59
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 problema
Dois pontos deste serviço repetem o reparo do agente
sequential/parallel/loopque está semsub_agents—get_agenteget_agents_by_account. Os dois coagem parallme, quando o agente não tem modelo próprio, atribuíamgpt-4.1-nano, que a OpenAI desliga em 23/10/2026.O reparo faz
db.commit(), então o id morto era gravado no agente do cliente, não apenas tentado uma vez.O que muda
O default passa a ser
openai/gpt-5.6-luna, numa constante de módulo — o valor estava escrito duas vezes, e a constante faz a próxima varredura achar os dois pontos de uma vez.Sobre a escolha: tier econômico da família vigente, conferido contra catálogo JSON (
canonical_slug: openai/gpt-5.6-luna-20260709), e já uma das opções doModelSelector.Sobre o prefixo de provider: aqui ele pesa mais do que no core-service, porque é este serviço que monta o
LiteLlmemllm_agent_builder.py. Verificado na LiteLLM pinada (1.68.2):gpt-4.1-nanoopenaigpt-5.6-lunaopenailuna-5.6BadRequestError: LLM Provider NOT providedopenai/some-new-modelopenaiO nome cru só resolve quando casa com uma família que a LiteLLM já conhece. Com prefixo, qualquer id futuro roteia.
normalize_model_for_providernão interfere neste caminho — ela só age emopenrouter.O agente que já roda não é tocado
O reparo só atribui modelo quando o agente não tem nenhum. Um agente com modelo já escolhido passa pelo reparo e sai com o que tinha, inclusive um modelo perto do fim de vida — é a garantia de que apertar a lista de modelos oferecidos não desliga fluxo de cliente em execução. Coberto por teste.
Verificação
Três testes novos em
tests/unit/test_agent_repair_default_model.py, exercitando os dois pontos de entrada de verdade (não a constante): o reparo porget_agentcarimba o modelo vigente e comita, o reparo porget_agents_by_accountcarimba o mesmo, e nenhum dos dois reaponta um modelo que o agente já tinha.Provados por mutação — revertendo a constante para
gpt-4.1-nano, os dois primeiros caem. As asserções usam a string literal em vez de importarDEFAULT_REPAIR_MODEL, senão passariam com qualquer coisa em que a constante apodrecesse.80 passedno recorte-k "agent or model or litellm".tests/unit/test_exception_handlers.pynão coleta nadeveloppor umImportErrordegeneric_exception_handlerque não tem relação com esta mudança — confirmei que já falha sem ela.Nota para quem revisar
O mesmo default existia no
evo-ai-core-service-community(agent_service.go), corrigido em PR irmão. São 3 call sites em 2 repos e os dois lados precisam entrar.Summary by Sourcery
Update agent repair logic to persist a current OpenAI model only when malformed agents lack an assigned model.
Bug Fixes:
Enhancements:
Tests: