Bug description Getting error "toolInput cannot be null or empty" while calling .stream() in chatClient
java.lang.IllegalArgumentException: toolInput cannot be null or empty
at org.springframework.util.Assert.hasText(Assert.java:253) ~[spring-core-6.2.6.jar:6.2.6]
at org.springframework.ai.tool.method.MethodToolCallback.call(MethodToolCallback.java:99) ~[spring-ai-model-1.0.0.jar:1.0.0]
at org.springframework.ai.model.tool.DefaultToolCallingManager.lambda$executeToolCall$5(DefaultToolCallingManager.java:224) ~[spring-ai-model-1.0.0.jar:1.0.0]
at io.micrometer.observation.Observation.observe(Observation.java:564) ~[micrometer-observation-1.14.6.jar:1.14.6]
at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCall(DefaultToolCallingManager.java:221) ~[spring-ai-model-1.0.0.jar:1.0.0]
at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCalls(DefaultToolCallingManager.java:137) ~[spring-ai-model-1.0.0.jar:1.0.0]
at org.springframework.ai.openai.OpenAiChatModel.lambda$internalStream$10(OpenAiChatModel.java:369) ~[spring-ai-openai-1.0.0.jar:1.0.0]
at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:46) ~[reactor-core-3.7.5.jar:3.7.5]
at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194) ~[reactor-core-3.7.5.jar:3.7.5]
at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84) ~[reactor-core-3.7.5.jar:3.7.5]
at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37) ~[reactor-core-3.7.5.jar:3.7.5]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
Environment Spring AI 1.0.0, Java version temurin-21.0.1, Vllm
Expected behavior There are no error when invoke .call() method, but have error when invoke .stream()
Minimal Complete Reproducible example Run Vllm:
docker run --runtime nvidia --gpus all --name Qwen3-8B-AWQ -p 8000:8000 --ipc=host vllm/vllm-openai:latest --model Qwen/Qwen3-8B-AWQ --gpu-memory-utilization 0.75 --max-model-len 8192 --enforce-eager --enable-auto-tool-choice --tool-call-parser hermes
application.properties
spring.ai.openai.base-url=http://localhost:8000
spring.ai.openai.chat.options.model=Qwen/Qwen3-8B-AWQ
spring.ai.openai.api-key=KEY
Create Simple Date Time calling tool
@Component
public class DateTimeTools {
private static final Logger log = LoggerFactory.getLogger(DateTimeTools.class);
@Tool(description = "Get date and time user")
public String getCurrentDateTime() {
log.info("Called tool getCurrentDateTime()");
return LocalDateTime.now().toString();
}
}
Create Simple controller:
@RestController
public class ChatApiController {
private final ChatClient chatClient;
public ChatApiController(ChatClient.Builder chatClientBuilder, DateTimeTools dateTimeTools) {
this.chatClient = chatClientBuilder
.defaultTools(dateTimeTools)
.build();
}
@PostMapping("/api/stream/v1")
public Flux<String> sendStreamMessage(@RequestBody MessageRequest message) {
String userInput = message.message();
return this.chatClient.prompt()
.user(userInput)
.stream()
.content();
}
}
Steps to reproduce Call method: POST http://localhost:8080/api/stream/v1 Content-Type: application/json
{ "message": "Give me current date" }