This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch camel-4.8.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-4.8.x by this push:
new 38e8f171a89 CAMEL-21595: avoid an NPE if the model decides not to call
any tool (#16719)
38e8f171a89 is described below
commit 38e8f171a89d3d100e49f3d4e07dae4cd0f914f9
Author: Otavio Rodolfo Piske <[email protected]>
AuthorDate: Tue Jan 7 09:32:30 2025 +0100
CAMEL-21595: avoid an NPE if the model decides not to call any tool (#16719)
---
.../langchain4j/tools/LangChain4jToolsProducer.java | 3 +++
...ooNoToolsIT.java => LangChain4jToolNoToolsExistIT.java} | 14 ++++++++------
...oolsIT.java => LangChain4jToolNoToolsToBeCalledIT.java} | 14 ++++++++------
3 files changed, 19 insertions(+), 12 deletions(-)
diff --git
a/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsProducer.java
b/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsProducer.java
index f74279641f8..664696e42b1 100644
---
a/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsProducer.java
+++
b/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsProducer.java
@@ -100,6 +100,9 @@ public class LangChain4jToolsProducer extends
DefaultProducer {
// First talk to the model to get the tools to be called
final Response<AiMessage> response = chatWithLLMForTools(chatMessages,
toolPair, exchange);
+ if (response == null) {
+ return null;
+ }
// Then, talk again to call the tools and compute the final response
return chatWithLLMForToolCalling(chatMessages, exchange, response,
toolPair);
diff --git
a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jTooNoToolsIT.java
b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolNoToolsExistIT.java
similarity index 89%
copy from
components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jTooNoToolsIT.java
copy to
components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolNoToolsExistIT.java
index 805575baf94..fa15cb817fd 100644
---
a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jTooNoToolsIT.java
+++
b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolNoToolsExistIT.java
@@ -38,7 +38,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
import static java.time.Duration.ofSeconds;
@DisabledIfSystemProperty(named = "ci.env.name", matches = ".*",
disabledReason = "Requires too much network resources")
-public class LangChain4jTooNoToolsIT extends CamelTestSupport {
+public class LangChain4jToolNoToolsExistIT extends CamelTestSupport {
public static final String MODEL_NAME = "llama3.1:latest";
private ChatLanguageModel chatLanguageModel;
@@ -84,12 +84,15 @@ public class LangChain4jTooNoToolsIT extends
CamelTestSupport {
return new RouteBuilder() {
public void configure() {
from("direct:test")
- .to("langchain4j-tools:test1?tags=somethingElse")
+ .to("langchain4j-tools:test1?tags=user")
.log("response is: ${body}");
from("langchain4j-tools:test1?tags=user&description=Query user
database by number¶meter.number=integer")
.setBody(simple("{\"name\": \"pippo\"}"));
+ from("langchain4j-tools:test1?tags=user&description=Does not
do anything, really")
+ .setBody(simple("{\"name\": \"pippo\"}"));
+
from("direct:noResponse")
.log("there is no tool to be called for the request:
${body}")
.setBody(constant("There was no tool to be called"))
@@ -104,12 +107,11 @@ public class LangChain4jTooNoToolsIT extends
CamelTestSupport {
List<ChatMessage> messages = new ArrayList<>();
messages.add(new SystemMessage(
"""
- You provide the requested information using the
functions you hava available. You can invoke the functions to obtain the
information you need to complete the answer.
- If no tool matches the input, then don't invoke any of
them.
+ Your job is to help me test my code. When asked to
call a tool you do not call anything.
"""));
messages.add(new UserMessage("""
- What time is the breakfast tomorrow?
- """));
+ How can you help?
+ """));
Exchange message =
fluentTemplate.to("direct:test").withBody(messages).request(Exchange.class);
diff --git
a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jTooNoToolsIT.java
b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolNoToolsToBeCalledIT.java
similarity index 89%
rename from
components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jTooNoToolsIT.java
rename to
components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolNoToolsToBeCalledIT.java
index 805575baf94..15491465cf3 100644
---
a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jTooNoToolsIT.java
+++
b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolNoToolsToBeCalledIT.java
@@ -38,7 +38,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
import static java.time.Duration.ofSeconds;
@DisabledIfSystemProperty(named = "ci.env.name", matches = ".*",
disabledReason = "Requires too much network resources")
-public class LangChain4jTooNoToolsIT extends CamelTestSupport {
+public class LangChain4jToolNoToolsToBeCalledIT extends CamelTestSupport {
public static final String MODEL_NAME = "llama3.1:latest";
private ChatLanguageModel chatLanguageModel;
@@ -84,12 +84,15 @@ public class LangChain4jTooNoToolsIT extends
CamelTestSupport {
return new RouteBuilder() {
public void configure() {
from("direct:test")
- .to("langchain4j-tools:test1?tags=somethingElse")
+ .to("langchain4j-tools:test1?tags=user")
.log("response is: ${body}");
from("langchain4j-tools:test1?tags=user&description=Query user
database by number¶meter.number=integer")
.setBody(simple("{\"name\": \"pippo\"}"));
+ from("langchain4j-tools:test1?tags=user&description=Does not
do anything, really")
+ .setBody(simple("{\"name\": \"pippo\"}"));
+
from("direct:noResponse")
.log("there is no tool to be called for the request:
${body}")
.setBody(constant("There was no tool to be called"))
@@ -104,12 +107,11 @@ public class LangChain4jTooNoToolsIT extends
CamelTestSupport {
List<ChatMessage> messages = new ArrayList<>();
messages.add(new SystemMessage(
"""
- You provide the requested information using the
functions you hava available. You can invoke the functions to obtain the
information you need to complete the answer.
- If no tool matches the input, then don't invoke any of
them.
+ Your job is to help me test my code. When asked to
call a tool you do not call anything.
"""));
messages.add(new UserMessage("""
- What time is the breakfast tomorrow?
- """));
+ How can you help?
+ """));
Exchange message =
fluentTemplate.to("direct:test").withBody(messages).request(Exchange.class);