Skip to content

Vertext Ai Chat model thrown Exception Expect a map object but found array when using gemini chat model #2849

Closed
@kiditz

Description

@kiditz

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions