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.
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). @Cloudsmoke suites: the live-API suites inmodules/itfor that provider, run bysbt 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 |
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.