spring-projects / spring-projects/spring-ai

A strange problem for tool calling

Open
#3,248 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

status: waiting-for-triage
Dominant language
Java
Stars
9.5k
Forks
2.9k
Avg merge
1d 7h
Merged PRs (30d)
6

Description

a same request ,run it, and it will become sometimes it's good, sometimes it's abnormal. The following are the abnormal information:

2025-05-19 19:24:57 ERROR o.s.a.m.o.ErrorLoggingObservationHandler - Traced Error:
java.lang.IllegalArgumentException: toolInput cannot be null or empty
at org.springframework.util.Assert.hasText(Assert.java:253)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Assembly trace from producer [reactor.core.publisher.FluxDefer] :
reactor.core.publisher.Flux.defer(Flux.java:810)
org.springframework.ai.openai.OpenAiChatModel.lambda$internalStream$11(OpenAiChatModel.java:362)
Error has been observed at the following site(s):
*_______Flux.defer ⇢ at org.springframework.ai.openai.OpenAiChatModel.lambda$internalStream$11(OpenAiChatModel.java:362)
|
Flux.subscribeOn ⇢ at org.springframework.ai.openai.OpenAiChatModel.lambda$internalStream$11(OpenAiChatModel.java:377)
*______Flux.flatMap ⇢ at org.springframework.ai.openai.OpenAiChatModel.lambda$internalStream$14(OpenAiChatModel.java:360)
Original Stack Trace:
at org.springframework.util.Assert.hasText(Assert.java:253)
at org.springframework.ai.tool.method.MethodToolCallback.call(MethodToolCallback.java:99)
at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCall(DefaultToolCallingManager.java:205)
at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCalls(DefaultToolCallingManager.java:128)
at org.springframework.ai.openai.OpenAiChatModel.lambda$internalStream$10(OpenAiChatModel.java:365)
at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:46)
at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:68)
at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194)
at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)
at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:840)
2025-05-19 19:24:57 ERROR o.s.ai.chat.model.MessageAggregator - Aggregation Error
java.lang.IllegalArgumentException: toolInput cannot be null or empty
at org.springframework.util.Assert.hasText(Assert.java:253)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Assembly trace from producer [reactor.core.publisher.FluxDefer] :
reactor.core.publisher.Flux.defer(Flux.java:810)
org.springframework.ai.openai.OpenAiChatModel.lambda$internalStream$11(OpenAiChatModel.java:362)
Error has been observed at the following site(s):
*_________Flux.defer ⇢ at org.springframework.ai.openai.OpenAiChatModel.lambda$internalStream$11(OpenAiChatModel.java:362)
|
Flux.subscribeOn ⇢ at org.springframework.ai.openai.OpenAiChatModel.lambda$internalStream$11(OpenAiChatModel.java:377)
*__Flux.flatMap ⇢ at org.springframework.ai.openai.OpenAiChatModel.lambda$internalStream$14(OpenAiChatModel.java:360)
|
Flux.doOnError ⇢ at org.springframework.ai.openai.OpenAiChatModel.lambda$internalStream$14(OpenAiChatModel.java:383)
|
Flux.doFinally ⇢ at org.springframework.ai.openai.OpenAiChatModel.lambda$internalStream$14(OpenAiChatModel.java:384)
|
Flux.contextWrite ⇢ at org.springframework.ai.openai.OpenAiChatModel.lambda$internalStream$14(OpenAiChatModel.java:385)
|
Flux.doOnSubscribe ⇢ at org.springframework.ai.chat.model.MessageAggregator.aggregate(MessageAggregator.java:94)
|
Flux.doOnNext ⇢ at org.springframework.ai.chat.model.MessageAggregator.aggregate(MessageAggregator.java:105)
|
Flux.doOnComplete ⇢ at org.springframework.ai.chat.model.MessageAggregator.aggregate(MessageAggregator.java:144)
Original Stack Trace:
at org.springframework.util.Assert.hasText(Assert.java:253)
at org.springframework.ai.tool.method.MethodToolCallback.call(MethodToolCallback.java:99)
at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCall(DefaultToolCallingManager.java:205)
at org.springframework.ai.model.tool.DefaultToolCallingManager.executeToolCalls(DefaultToolCallingManager.java:128)
at org.springframework.ai.openai.OpenAiChatModel.lambda$internalStream$10(OpenAiChatModel.java:365)
at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:46)
at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:68)
at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194)
at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)
at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:840)
2025-05-19 19:24:57 ERROR o.s.a.m.o.ErrorLoggingObservationHandler - Traced Error:
java.lang.IllegalArgumentException: toolInput cannot be null or empty

the code is simple below:

Image

Image

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with OpenAiChatModel.java around lines 360-385 and trace the reported call through DefaultToolCallingManager and MethodToolCallback.java line 99. Reproduce the same tool-calling request repeatedly and determine why toolInput is sometimes null or empty; done means the reported request no longer produces this exception.

Written by the indexing model from the issue text.

Assessment

Tech stack
java, spring
Domain
ai
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.