From d5b78dbeea2237f3aff8d58da7f2afb00e81167f Mon Sep 17 00:00:00 2001 From: Adam Weidman <65992621+adamfweidman@users.noreply.github.com> Date: Mon, 23 Mar 2026 15:45:59 -0400 Subject: [PATCH] fix(core): prevent redundant remote agent loading on model switch (#23576) --- packages/core/src/agents/registry.test.ts | 26 +++++++++++++++++++++++ packages/core/src/agents/registry.ts | 14 +++++++----- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/packages/core/src/agents/registry.test.ts b/packages/core/src/agents/registry.test.ts index 92bd3b2ec8..de0d95e659 100644 --- a/packages/core/src/agents/registry.test.ts +++ b/packages/core/src/agents/registry.test.ts @@ -1206,6 +1206,32 @@ describe('AgentRegistry', () => { }); describe('inheritance and refresh', () => { + it('should skip remote agents when refreshing on model change', async () => { + const remoteAgent: AgentDefinition = { + kind: 'remote', + name: 'RemoteAgent', + description: 'A remote agent', + agentCardUrl: 'https://example.com/card', + inputConfig: { inputSchema: { type: 'object' } }, + }; + + const loadAgentSpy = vi.fn().mockResolvedValue({ name: 'RemoteAgent' }); + vi.spyOn(mockConfig, 'getA2AClientManager').mockReturnValue({ + loadAgent: loadAgentSpy, + clearCache: vi.fn(), + } as unknown as A2AClientManager); + + await registry.testRegisterAgent(remoteAgent); + + expect(loadAgentSpy).toHaveBeenCalledTimes(1); + + coreEvents.emitModelChanged('new-model'); + + await new Promise((resolve) => setTimeout(resolve, 0)); + + expect(loadAgentSpy).toHaveBeenCalledTimes(1); + }); + it('should resolve "inherit" to the current model from configuration', async () => { const config = makeMockedConfig({ model: 'current-model' }); const registry = new TestableAgentRegistry(config); diff --git a/packages/core/src/agents/registry.ts b/packages/core/src/agents/registry.ts index 51d923001a..619f1dd71c 100644 --- a/packages/core/src/agents/registry.ts +++ b/packages/core/src/agents/registry.ts @@ -57,7 +57,7 @@ export class AgentRegistry { } private onModelChanged = () => { - this.refreshAgents().catch((e) => { + this.refreshAgents('local').catch((e) => { debugLogger.error( '[AgentRegistry] Failed to refresh agents on model change:', e, @@ -270,12 +270,16 @@ export class AgentRegistry { } } - private async refreshAgents(): Promise { + private async refreshAgents( + scope: AgentDefinition['kind'] | 'all' = 'all', + ): Promise { this.loadBuiltInAgents(); await Promise.allSettled( - Array.from(this.agents.values()).map((agent) => - this.registerAgent(agent), - ), + Array.from(this.agents.values()).map(async (agent) => { + if (scope === 'all' || agent.kind === scope) { + await this.registerAgent(agent); + } + }), ); }