Closed
Description
It seems that the server returns a JSON structure that is not being correctly interpreted as a map object by the client code.
Environment
- Spring AI version: 1.0.0-M7
- Java version: 21
- Vector Store: None
- Other: Using MCP server as backend.
Steps to reproduce
- Use Vertext AI Gemini model 1.5flash
private ChatModel getVertexChatModel(String name, double temperature) {
VertexAI vertexApi = new VertexAI(projectId, location);
return VertexAiGeminiChatModel.builder()
.vertexAI(vertexApi)
.defaultOptions(VertexAiGeminiChatOptions.builder()
.model(name)
.temperature(temperature)
.build())
.build();
}
- Use mcp server return products
@mcp.tool(description="List products from Shopify")
def list_products(limit: int = 10) -> dict:
client = get_shopify_client()
products = client.list_products(params={"limit": limit})
return {"products": products}
- Ask Chat Client
list 2 products
at org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel.jsonToStruct(VertexAiGeminiChatModel.java:408) ~[spring-ai-vertex-ai-gemini-1.0.0-M7.jar:1.0.0-M7]
at org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel.lambda$messageToGeminiParts$1(VertexAiGeminiChatModel.java:368) ~[spring-ai-vertex-ai-gemini-1.0.0-M7.jar:1.0.0-M7]
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na]
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627) ~[na:na]
at org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel.messageToGeminiParts(VertexAiGeminiChatModel.java:371) ~[spring-ai-vertex-ai-gemini-1.0.0-M7.jar:1.0.0-M7]
at org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel.lambda$toGeminiContent$20(VertexAiGeminiChatModel.java:781) ~[spring-ai-vertex-ai-gemini-1.0.0-M7.jar:1.0.0-M7]
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na]
at java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:722) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575) ~[na:na]
at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622) ~[na:na]
at java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627) ~[na:na]
at org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel.toGeminiContent(VertexAiGeminiChatModel.java:783) ~[spring-ai-vertex-ai-gemini-1.0.0-M7.jar:1.0.0-M7]
at org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel.createGeminiRequest(VertexAiGeminiChatModel.java:742) ~[spring-ai-vertex-ai-gemini-1.0.0-M7.jar:1.0.0-M7]
at org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel.lambda$internalStream$12(VertexAiGeminiChatModel.java:556) ~[spring-ai-vertex-ai-gemini-1.0.0-M7.jar:1.0.0-M7]
at reactor.core.publisher.FluxDeferContextual.subscribe(FluxDeferContextual.java:49) ~[reactor-core-3.7.4.jar:3.7.4]
at reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:54) ~[reactor-core-3.7.4.jar:3.7.4]
at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194) ~[reactor-core-3.7.4.jar:3.7.4]
at reactor.core.scheduler.BoundedElasticThreadPerTaskScheduler$SchedulerTask.run(BoundedElasticThreadPerTaskScheduler.java:1013) ~[reactor-core-3.7.4.jar:3.7.4]
at java.base/java.lang.VirtualThread.run(VirtualThread.java:309) ~[na:na]
Caused by: com.google.protobuf.InvalidProtocolBufferException: Expect a map object but found: [{"text":"{\"products\": {\"products\": [{\"id\": \"gid://shopify/Product/8484113744026\", \"handle\":
The issue is when using vertex ai only, while i change the model to OpenAiChatModel, it's working