spring-projects / spring-projects/spring-ai
Error in tool calling parsing
Open
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
I was testing Spring Ai 2.0.0-M2 with the tool calling example of the documentatation:
class DateTimeTools {
@Tool(description = "Get the current date and time in the user's timezone")
String getCurrentDateTime() {
return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();
}
@Tool(description = "Set a user alarm for the given time, provided in ISO-8601 format")
void setAlarm(String time) {
LocalDateTime alarmTime = LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME);
System.out.println("Alarm set for " + alarmTime);
}
}
And I experienced this error one time:
2026-02-11T19:43:38.904-03:00[0;39m [31mERROR[0;39m [35m66192[0;39m [2m--- [spring-ai-api] [io-8080-exec-10] [0;39m[36mo.a.c.c.C.[.[.[/].[dispatcherServlet] [0;39m [2m:[0;39m Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.RuntimeException: Failed to parse JSON: Text '19:52:00' could not be parsed at index 0] with root cause
com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Text': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 5]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:2599) ~[jackson-core-2.20.2.jar:2.20.2]
at com.fasterxml.jackson.core.JsonParser._constructReadException(JsonParser.java:2625) ~[jackson-core-2.20.2.jar:2.20.2]
at com.fasterxml.jackson.core.JsonParser._constructReadException(JsonParser.java:2633) ~[jackson-core-2.20.2.jar:2.20.2]
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:831) ~[jackson-core-2.20.2.jar:2.20.2]
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._reportInvalidToken(ReaderBasedJsonParser.java:3017) ~[jackson-core-2.20.2.jar:2.20.2]
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddValue(ReaderBasedJsonParser.java:2051) ~[jackson-core-2.20.2.jar:2.20.2]
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:780) ~[jackson-core-2.20.2.jar:2.20.2]
at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:5125) ~[jackson-databind-2.20.2.jar:2.20.2]
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:5028) ~[jackson-databind-2.20.2.jar:2.20.2]
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3954) ~[jackson-databind-2.20.2.jar:2.20.2]
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3922) ~[jackson-databind-2.20.2.jar:2.20.2]
at org.springframework.ai.google.genai.GoogleGenAiChatModel.parseJsonToMap(GoogleGenAiChatModel.java:378) ~[spring-ai-google-genai-2.0.0-M2.jar:2.0.0-M2]
at org.springframework.ai.google.genai.GoogleGenAiChatModel.lambda$messageToGeminiParts$0(GoogleGenAiChatModel.java:337) ~[spring-ai-google-genai-2.0.0-M2.jar:2.0.0-M2]
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:214) ~[na:na]
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1716) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:635) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:291) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:652) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:658) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:663) ~[na:na]
at org.springframework.ai.google.genai.GoogleGenAiChatModel.messageToGeminiParts(GoogleGenAiChatModel.java:340) ~[spring-ai-google-genai-2.0.0-M2.jar:2.0.0-M2]
at org.springframework.ai.google.genai.GoogleGenAiChatModel.lambda$toGeminiContent$0(GoogleGenAiChatModel.java:888) ~[spring-ai-google-genai-2.0.0-M2.jar:2.0.0-M2]
at java.base/java.util.stream.ReferencePipeline$3$1.accept
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in GoogleGenAiChatModel.messageToGeminiParts and parseJsonToMap, at the stack-trace locations around lines 337-378, and compare the tool-calling example's response with the parser input. Reproduce the intermittent failure using the documented DateTimeTools example, then add coverage showing that valid tool-call arguments are parsed without the reported JSON and time-format errors.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- google-cloud, java, spring
- Domain
- api, backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 35/100