Compatibility Matrix

Which provider supports what with LLM4S, and which versions of the stack around it LLM4S is built and tested with. Both tables are generated from the code, not written by hand: sbt generateCompatibilityMatrix writes docs/_data/capabilities.yml and docs/_data/tested-versions.yml, and CI runs it again on every pull request and fails when either committed file differs. A new provider module or a dependency bump cannot ship with a stale table.

  1. Provider capabilities
    1. Not declared yet
  2. Tested versions

Provider capabilities

One row per provider id that the provider modules of this repository register. The facts come from each module’s ProviderDescriptor and EmbeddingProviderDescriptor, found through its META-INF/services entry the way an application finds them (writing a provider):

  • Chat and Embeddings: the artifact whose descriptor registers the id, if any. One id can be served by two artifacts, as Cohere is.
  • Streaming and Tool calling: the descriptor’s ProviderFeatures.
  • API key: whether a section must have one (ProviderConfigSpec.requiresApiKey). not required covers both a provider with no key (Ollama) and one that uses its platform’s own credentials (Amazon Bedrock, Vertex AI), and a provider whose key is optional (the generic OpenAI-compatible one).
  • Workload identity: whether a section can authenticate with an identity token instead of a key (the descriptor declares authExtras).
  • @Cloud smoke suites: the live-API suites in modules/it for that provider, run by sbt testSmoke.
Provider id Aliases Chat Streaming Tool calling API key (chat) Workload identity Embeddings API key (embeddings) @Cloud smoke suites
anthropic   llm4s-anthropic yes yes required yes - - AnthropicSmokeSpec, AnthropicStructuredOutputSmokeSpec
azure   llm4s-openai yes yes required no - -  
bedrock   llm4s-bedrock yes yes not required no - - BedrockSmokeSpec
cohere   llm4s-openai-compatible yes yes required no llm4s-cohere required CohereEmbeddingsSmokeSpec, CohereSmokeSpec
deepseek   llm4s-openai-compatible yes yes required no - - DeepSeekSmokeSpec
gemini google llm4s-gemini yes yes required no - - GeminiSmokeSpec
jina   - - - - - llm4s-jina required JinaEmbeddingsSmokeSpec
mistral   llm4s-openai-compatible yes yes required no - - MistralSmokeSpec
ollama   llm4s-ollama yes yes not required no llm4s-ollama not required  
openai   llm4s-openai yes yes required yes llm4s-openai required OpenAISmokeSpec
openai-compatible   llm4s-openai-compatible yes yes not required yes - -  
openrouter   llm4s-openai-compatible yes yes required no - - OpenRouterSmokeSpec
requesty   llm4s-openai yes yes required no - -  
vertexai vertex llm4s-gemini yes yes not required no - -  
voyage voyageai - - - - - llm4s-voyage required  
watsonx   llm4s-watsonx yes yes required no - - WatsonXAssumptionProbeSpec
xai   llm4s-openai-compatible yes yes required no - - XaiSmokeSpec
zai   llm4s-openai-compatible yes yes required no - - ZaiSmokeSpec

Not declared yet

ProviderFeatures holds two flags today, streaming and tool calling. Structured output, vision input, reasoning effort and token usage on streams are not declared by any descriptor yet, so the matrix says not declared rather than repeating claims from prose; a provider’s own section of the providers guide describes what it does. A column changes here when a module declares the fact in code.

Provider id Structured output Vision input Reasoning effort Usage on streams
anthropic not declared not declared not declared not declared
azure not declared not declared not declared not declared
bedrock not declared not declared not declared not declared
cohere not declared not declared not declared not declared
deepseek not declared not declared not declared not declared
gemini not declared not declared not declared not declared
jina not declared not declared not declared not declared
mistral not declared not declared not declared not declared
ollama not declared not declared not declared not declared
openai not declared not declared not declared not declared
openai-compatible not declared not declared not declared not declared
openrouter not declared not declared not declared not declared
requesty not declared not declared not declared not declared
vertexai not declared not declared not declared not declared
voyage not declared not declared not declared not declared
watsonx not declared not declared not declared not declared
xai not declared not declared not declared not declared
zai not declared not declared not declared not declared

Any endpoint that speaks the OpenAI chat-completions API also works through the generic openai-compatible id with configuration alone (recipes).

Tested versions

Read from the build: the Scala version and the JDK floor from project/Dependencies.scala, the JDKs and the latest Spring Boot releases from the CI workflow, Kotlin from the Kotlin API’s Gradle build and Quarkus from the Quarkus sample.

  • Scala: 3.7.1, Scala 3 only.
  • Scala 2.13: call-only, via the TASTy reader (Using LLM4S from Scala 2.13); CI runs its probes on 2.13.16 and the latest 2.13 on every change to the frozen modules.
  • Minimum JDK: 21. CI runs 21.
Stack Versions Where Note
Spring Boot 3 3.3.6, 3.5.16 llm4s-spring-boot-starter Built against 3.3.6; CI also runs the starter’s specs on 3.5.16.
Spring Boot 4 4.0.8, 4.1.1 llm4s-spring-boot-starter The same artifact’s Boot 4 health indicator, built against 4.0.8; CI also runs the specs on 4.1.1.
Cats Effect 3.5.7 llm4s-effect  
fs2 3.11.0 llm4s-effect  
ZIO 2.1.16 llm4s-zio  
Apache Pekko 1.7.1 llm4s-pekko  
Project Reactor 3.8.8 llm4s-reactor  
Kotlin 2.0.21 llm4s-kotlin-api With kotlinx-coroutines 1.9.0.
Quarkus 3.40.1 modules/samples/quarkus-java (sample) A sample with a CDI producer, not an extension.
http4s 0.23.30 modules/examples-http (unpublished)  
Tapir 1.11.20 modules/examples-http (unpublished)  
ZIO HTTP 3.2.0 modules/examples-http (unpublished)  
Micrometer 1.17.1 llm4s-observability-micrometer  
OpenTelemetry 1.63.0 llm4s-observability-otel  
Prometheus client 1.8.0 llm4s-observability-prometheus  
circe 0.14.17 docs/guide/json-libraries.md (tested recipe)  
Play JSON 3.0.6 docs/guide/json-libraries.md (tested recipe)  
zio-json 1.0.0 docs/guide/json-libraries.md (tested recipe) Pinned: later releases are built with a newer Scala 3 whose TASTy the 3.7.1 compiler cannot read.
OpenAI Java SDK 4.69.3 llm4s-openai  
Anthropic Java SDK 2.65.0 llm4s-anthropic  
AWS SDK 2.46.14 llm4s-bedrock  

A version here is the one the build compiles and tests against, not a range LLM4S promises. What you can rely on across upgrades is in the compatibility and deprecation policy; for resolving a version conflict in your own build, see dependency conflicts.