Skip to content

Ollama Embedding : keep_alive Duration is not sent in the proper format expected by OllamaΒ #4619

@Aelentel

Description

@Aelentel

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions