-
Notifications
You must be signed in to change notification settings - Fork 2k
Description
Bug description
When setting a keep_alive option on the Ollama Embedding spring boot yaml configuration. the duration is parsed as a java.time.Duration, the Ollama "keep_alive" expect a numeric duration followed by the unit (h / m / etc...) like "15m" that would instruct to keep the model in memory for 15 minutes.
the bug is as follow : the duration sent to Ollama is expressed in ISO format, so setting the keep_alive in the yaml configuration leads to "PT15m" and give a parsing error from Ollama Server.
Environment
Spring AI 1.0.3
Spring Boot 3.5.6
Ollama Server 0.12.5
Steps to reproduce
put a keep_alive in the ollama embedding configuration.
spring:
ai:
ollama:
embedding:
options:
model: qwen3-embedding:0.6b
num-ctx: 8192
truncate: false
keep-alive: 15m
request an embedding.
error is as follow :
Caused by: org.springframework.ai.retry.NonTransientAiException: HTTP 400 - {"error":"time: invalid duration \"PT15M\""}
at org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration$2.handleError(SpringAiRetryAutoConfiguration.java:109)
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:58)
at org.springframework.web.client.StatusHandler.lambda$fromErrorHandler$1(StatusHandler.java:71)
at org.springframework.web.client.StatusHandler.handle(StatusHandler.java:146)
at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.applyStatusHandlers(DefaultRestClient.java:838)
at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.lambda$readBody$4(DefaultRestClient.java:827)
at org.springframework.web.client.DefaultRestClient.readWithMessageConverters(DefaultRestClient.java:216)
at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.readBody(DefaultRestClient.java:826)
at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.lambda$body$0(DefaultRestClient.java:757)
at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchangeInternal(DefaultRestClient.java:586)
at org.springframework.web.client.DefaultRestClient$DefaultRequestBodyUriSpec.exchange(DefaultRestClient.java:540)
at org.springframework.web.client.RestClient$RequestHeadersSpec.exchange(RestClient.java:680)
at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.executeAndExtract(DefaultRestClient.java:821)
at org.springframework.web.client.DefaultRestClient$DefaultResponseSpec.body(DefaultRestClient.java:757)
at org.springframework.ai.ollama.api.OllamaApi.embed(OllamaApi.java:181)
at org.springframework.ai.ollama.OllamaEmbeddingModel.lambda$call$2(OllamaEmbeddingModel.java:123)
at io.micrometer.observation.Observation.observe(Observation.java:564)
at org.springframework.ai.ollama.OllamaEmbeddingModel.call(OllamaEmbeddingModel.java:122)
at org.springframework.ai.embedding.EmbeddingModel.embed(EmbeddingModel.java:67)
at org.springframework.ai.embedding.EmbeddingModel.embed(EmbeddingModel.java:49)
at org.springframework.ai.embedding.AbstractEmbeddingModel.dimensions(AbstractEmbeddingModel.java:79)
at org.springframework.ai.embedding.AbstractEmbeddingModel.dimensions(AbstractEmbeddingModel.java:104)
at org.springframework.ai.vectorstore.redis.RedisVectorStore.createObservationContextBuilder(RedisVectorStore.java:461)
at org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore.similaritySearch(AbstractObservationVectorStore.java:131)
Expected behavior
the embedding suceed and the model is kept in memory for 15 minutes.