这个案例将说明,智能体将调用Tool获取数据,再调用另外一个Tool,格式化数据。
首先调用Tool获取当前时间,获取当前时间后,调用另外一个Tool转换为UTC格式时间。
例子
创建Tools
java
import dev.langchain4j.agent.tool.Tool;
import java.time.Instant;
public class SystemTools {
@Tool("Returns the current system time in milliseconds")
public long systemMillis() {
return System.currentTimeMillis();
}
@Tool("Converts epoch milliseconds to a UTC timestamp")
public String formatMillis(long millis) {
return Instant.ofEpochMilli(millis).toString();
}
}
Multi-Tool Agent
java
package com.logicbig.example;
import dev.langchain4j.agent.tool.ToolExecutionRequest;
import dev.langchain4j.agent.tool.ToolSpecification;
import dev.langchain4j.agent.tool.ToolSpecifications;
import dev.langchain4j.data.message.*;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.request.ChatRequest;
import dev.langchain4j.model.chat.response.ChatResponse;
import dev.langchain4j.model.ollama.OllamaChatModel;
import dev.langchain4j.service.tool.DefaultToolExecutor;
import dev.langchain4j.service.tool.ToolExecutor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AgentExample {
private static final Map<String, ToolExecutor> executors = new HashMap<>();
private static final List<ToolSpecification> specs = new ArrayList<>();
static {
SystemTools tools = new SystemTools();
for (Method method : SystemTools.class.getDeclaredMethods()) {
ToolSpecification spec = ToolSpecifications.toolSpecificationFrom(method);
specs.add(spec);
executors.put(spec.name(), new DefaultToolExecutor(tools, method));
}
}
public static void main(String[] args) {
ChatModel model = OllamaChatModel.builder()
.baseUrl("http://localhost:11434")
.modelName("llama3.2:latest")
.temperature(0.0)
.numCtx(4096)
.build();
List<ChatMessage> messages = new ArrayList<>();
messages.add(SystemMessage.from(
"You are a helpful assistant with access to tools. " +
"You may call multiple tools in sequence. " +
"Use tool outputs as inputs to subsequent tools when needed."
));
sendUserMessageAndHandleToolCall(model, "What is the current system time?", messages);
sendUserMessageAndHandleToolCall(model, "Now convert the system time into "
+ "a human-readable UTC format.", messages);
//final message
messages.add(model.chat(messages).aiMessage());
for (ChatMessage chatMessage : messages) {
System.out.println("-- %s --".formatted(chatMessage.type()));
switch (chatMessage.type()) {
case SYSTEM -> System.out.println(((SystemMessage) chatMessage).text());
case USER -> System.out.println(((UserMessage) chatMessage).singleText());
case TOOL_EXECUTION_RESULT ->
System.out.println(((ToolExecutionResultMessage) chatMessage).text());
case AI -> {
AiMessage aiMessage = (AiMessage) chatMessage;
if(aiMessage.text()!=null){
System.out.println(aiMessage.text());
}
if(aiMessage.hasToolExecutionRequests()){
System.out.println(aiMessage.toolExecutionRequests());
}
}
}
}
}
private static void sendUserMessageAndHandleToolCall(ChatModel chatModel,
String myMessage,
List<ChatMessage> messages) {
messages.add(UserMessage.from(myMessage));
ChatRequest request = ChatRequest.builder()
.messages(messages)
.toolSpecifications(specs)
.build();
ChatResponse response = chatModel.chat(request);
AiMessage aiMessage = response.aiMessage();
messages.add(aiMessage);
if (aiMessage.hasToolExecutionRequests()) {
for (ToolExecutionRequest r : aiMessage.toolExecutionRequests()) {
String result = executors.get(r.name()).execute(r, r.id());
messages.add(ToolExecutionResultMessage.from(r, result));
}
}
}
}
输出:
bash
-- SYSTEM --
You are a helpful assistant with access to tools. You may call multiple tools in sequence. Use tool outputs as inputs to subsequent tools when needed.
-- USER --
What is the current system time?
-- AI --
[ToolExecutionRequest { id = null, name = "systemMillis", arguments = "{}" }]
-- TOOL_EXECUTION_RESULT --
1769091187617
-- USER --
Now convert the system time into a human-readable UTC format.
-- AI --
[ToolExecutionRequest { id = null, name = "formatMillis", arguments = "{"arg0":1769091187617}" }]
-- TOOL_EXECUTION_RESULT --
2026-01-22T14:13:07.617Z
-- AI --
This is the current system time in a human-readable UTC format.

测试
上面的代码是基于JDK21的,修改成17的运行。
AgentExample2.java
java
import dev.langchain4j.agent.tool.ToolExecutionRequest;
import dev.langchain4j.agent.tool.ToolSpecification;
import dev.langchain4j.agent.tool.ToolSpecifications;
import dev.langchain4j.data.message.*;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.request.ChatRequest;
import dev.langchain4j.model.chat.response.ChatResponse;
import dev.langchain4j.model.ollama.OllamaChatModel;
import dev.langchain4j.service.tool.DefaultToolExecutor;
import dev.langchain4j.service.tool.ToolExecutor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AgentExample2 {
private static final Map<String, ToolExecutor> executors = new HashMap<>();
private static final List<ToolSpecification> specs = new ArrayList<>();
static {
SystemTools tools = new SystemTools();
for (Method method : SystemTools.class.getDeclaredMethods()) {
ToolSpecification spec = ToolSpecifications.toolSpecificationFrom(method);
specs.add(spec);
executors.put(spec.name(), new DefaultToolExecutor(tools, method));
}
}
public static void main(String[] args) {
ChatModel model = OllamaChatModel.builder()
.baseUrl("http://localhost:11434")
.modelName("llama3.2:latest")
.temperature(0.0)
.numCtx(4096)
.build();
List<ChatMessage> messages = new ArrayList<>();
messages.add(SystemMessage.from(
"You are a helpful assistant with access to tools. " +
"You may call multiple tools in sequence. " +
"Use tool outputs as inputs to subsequent tools when needed."
));
sendUserMessageAndHandleToolCall(model, "What is the current system time?", messages);
sendUserMessageAndHandleToolCall(model, "Now convert the system time into "
+ "a human-readable UTC format.", messages);
//final message
messages.add(model.chat(messages).aiMessage());
for (ChatMessage chatMessage : messages) {
System.out.println(chatMessage);
}
}
private static void sendUserMessageAndHandleToolCall(ChatModel chatModel,
String myMessage,
List<ChatMessage> messages) {
messages.add(UserMessage.from(myMessage));
ChatRequest request = ChatRequest.builder()
.messages(messages)
.toolSpecifications(specs)
.build();
ChatResponse response = chatModel.chat(request);
AiMessage aiMessage = response.aiMessage();
messages.add(aiMessage);
if (aiMessage.hasToolExecutionRequests()) {
for (ToolExecutionRequest r : aiMessage.toolExecutionRequests()) {
String result = executors.get(r.name()).execute(r, r.id());
messages.add(ToolExecutionResultMessage.from(r, result));
}
}
}
}
SystemTools.java
java
import dev.langchain4j.agent.tool.Tool;
import java.time.Instant;
public class SystemTools {
@Tool("Returns the current system time in milliseconds")
public long systemMillis() {
return System.currentTimeMillis();
}
@Tool("Converts epoch milliseconds to a UTC timestamp")
public String formatMillis(long millis) {
return Instant.ofEpochMilli(millis).toString();
}
}
pom.xml
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>dev.langchain4j</groupId>
<artifactId>ollama-examples</artifactId>
<version>1.10.0</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Source: https://mvnrepository.com/artifact/dev.langchain4j/langchain4j-open-ai -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>1.10.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>1.10.0</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-ollama</artifactId>
<version>1.10.0</version>
</dependency>
</dependencies>
</project>
运行截图:
