diff --git a/langchain4j-agentic/src/main/java/dev/langchain4j/agentic/agent/AgentBuilder.java b/langchain4j-agentic/src/main/java/dev/langchain4j/agentic/agent/AgentBuilder.java index 74ae2176a8..830f01fd01 100644 --- a/langchain4j-agentic/src/main/java/dev/langchain4j/agentic/agent/AgentBuilder.java +++ b/langchain4j-agentic/src/main/java/dev/langchain4j/agentic/agent/AgentBuilder.java @@ -219,7 +219,11 @@ public class AgentBuilder> { aiServices.chatRequestTransformer( new Context.AgenticScopeContextGenerator(agenticScope, contextProvider)); } else { - aiServices.chatRequestTransformer(new Context.Summarizer(agenticScope, model, contextProvidingAgents)); + ChatModel summarizerModel = model; + if (summarizerModel == null && chatModelProvider != null) { + summarizerModel = chatModelProvider.apply(agenticScope); + } + aiServices.chatRequestTransformer(new Context.Summarizer(agenticScope, summarizerModel, contextProvidingAgents)); } } diff --git a/langchain4j-agentic/src/test/java/dev/langchain4j/agentic/DeclarativeAgentIT.java b/langchain4j-agentic/src/test/java/dev/langchain4j/agentic/DeclarativeAgentIT.java index 2dfea789e8..0d1f07d054 100644 --- a/langchain4j-agentic/src/test/java/dev/langchain4j/agentic/DeclarativeAgentIT.java +++ b/langchain4j-agentic/src/test/java/dev/langchain4j/agentic/DeclarativeAgentIT.java @@ -1193,4 +1193,48 @@ public class DeclarativeAgentIT { assertThat(result.agenticScope().readState("cityData", "")).contains("Rome"); assertThat(result.result()).containsIgnoringCase("Rome"); } + + public interface ProducerAgent { + + @UserMessage("Provide a brief analysis of: {{request}}") + @Agent(description = "A producer agent", outputKey = "analysis") + String produce(@V("request") String request); + + @ChatModelSupplier + static ChatModel chatModel() { + return baseModel(); + } + } + + public interface ConsumerWithScopeDependentSupplier { + + @UserMessage("You are an expert. The user request is {{request}}.") + @Agent( + description = "An expert that summarizes context from other agents", + outputKey = "response", + summarizedContext = {"produce"}) + String consume(@V("request") String request); + + @ChatModelSupplier + static ChatModel chatModel(AgenticScope scope) { + return baseModel(); + } + } + + public interface SummarizedContextWithScopeSupplierPipeline { + + @SequenceAgent( + outputKey = "response", + subAgents = {ProducerAgent.class, ConsumerWithScopeDependentSupplier.class}) + String process(@V("request") String request); + } + + @Test + void summarizedContext_with_scope_dependent_chatModelSupplier_should_not_throw() { + SummarizedContextWithScopeSupplierPipeline pipeline = + AgenticServices.createAgenticSystem(SummarizedContextWithScopeSupplierPipeline.class); + + String response = pipeline.process("test request"); + assertThat(response).isNotBlank(); + } }