You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
feat:contrib/model-prism: pluggable LLM backend SPI for ADK Java via ServiceLoader - #1199
This is a working prototype demonstrating one way to add pluggable LLM backends to ADK-Java via ServiceLoader.
Problem
Python ADK gets zero-code provider switching for free — dynamic imports and LiteLLM resolve a model string from config at runtime. This PR demonstrates the Java-idiomatic equivalent: a ServiceLoader-based SPI where a model string in config plus a Maven dependency swap is all it takes.
What goes where
Into google-adk.jar — SPI layer (3 files):
ModelProvider — SPI interface
ModelProviderRegistry — ServiceLoader wiring
OpenAiCompatibleLlm — reusable base class for any POST /v1/chat/completions provider
Into google-adk.jar — HTTP and serialization layer (or replaced by Google's existing implementation):
OpenAiHttpClient — HTTP client interface (default impl included; could be backed by ADK's existing ChatCompletionsHttpClient)
OpenAiMessageSerializer — serializer interface (default impl included; could be replaced by AdkChatSerializer using ADK 1.1.0 internal DTOs for richer response mapping)
Into Runner and AdkWebServer.start() (2 lines total):
ModelProviderRegistry.registerAll();
Everything else stays external. Provider JARs (Groq, Ollama, OpenRouter) live outside ADK and self-register via META-INF/services. No ADK PR is needed to add a new provider — dropping a JAR on the classpath in an ADK application is enough.
What's included
Module
Purpose
model-prism-core
ModelProvider SPI + OpenAiCompatibleLlm base class
model-prism-groq
Groq provider (groq/.*)
model-prism-ollama
Ollama provider — no API key, great for local dev
model-prism-openrouter
OpenRouter provider — free tier available
model-prism-demo
11 runnable demos covering tools, streaming, web server
Tests
13 unit tests, all passing. See PR description for full list.
Manual E2E verified with Groq and Ollama.
Proposed core integration (one line)
// In Runner or AdkWebServer.start()ModelProviderRegistry.registerAll();
svetanis
changed the title
contrib/model-prism: pluggable LLM backend SPI for ADK Java via ServiceLoader
contrib/model-prism: zero-config OpenAI-compatible provider discovery for ADK Java via ServiceLoader
May 19, 2026
svetanis
changed the title
contrib/model-prism: zero-config OpenAI-compatible provider discovery for ADK Java via ServiceLoader
feat:contrib/model-prism: zero-config OpenAI-compatible provider discovery for ADK Java via ServiceLoader
May 19, 2026
svetanis
changed the title
feat:contrib/model-prism: zero-config OpenAI-compatible provider discovery for ADK Java via ServiceLoader
feat:contrib/model-prism: pluggable LLM backend SPI for ADK Java via ServiceLoaderMay 19, 2026
Hi @svetanis, thank you for your contribution! We appreciate you taking the time to submit this pull request. Currently this PR is under review by our team, we will keep you posted if any additional information is required. thank you.
Closing this PR — some context on why, and where the work goes next:
This PR reflects a snapshot from two months ago, and the ground has shifted under it since.
At the time it was developed, shipping its own HTTP/serialization layer was how the project got
OpenAI-compatible endpoints working end-to-end. Since then, ADK's native ChatCompletionsHttpClient path has matured into the right foundation for this feature — and
along the way, integrating it into this project's demos helped surface and reproduce the
serializer issue fixed in ADK 1.6.0 (#1265/#1266).
For these reasons, I'm closing this PR today:
ADK now has a fully functional native client for OpenAI-compatible endpoints, so the custom
HTTP client and serializer here are obsolete — the right implementation today simply wraps ChatCompletionsHttpClient.
The ModelProvider interface itself has evolved past this snapshot (name-aware per-model
factories, bare wire-format model IDs).
The five demo modules bundled here have found a better home in a personal reference repo, agentic-jvm/model-prism, where they've been run
against Groq and OpenRouter endpoints — keeping the upstream proposal down
to its small core.
Rather than rebase a large diff whose foundations have shifted, I'm closing this in favor of a
small, self-contained follow-up — the SPI interface, the registry, a thin OpenAiCompatibleLlm
over the native client, and tests — already open as #1363 (issue: #1362).
Thanks @hemasekhar-p and @tilgalas for the triage — the follow-up will be a much easier review.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Add
model-prism: pluggable LLM backend SPI for ADK Java viaServiceLoaderPlease ensure you have read the contribution guide before creating a pull request.
Link to Issue or Description of Change
1. Related discussion:
2. Description of change:
This is a working prototype demonstrating one way to add pluggable LLM backends to ADK-Java via
ServiceLoader.Problem
Python ADK gets zero-code provider switching for free — dynamic imports and LiteLLM resolve a model string from config at runtime. This PR demonstrates the Java-idiomatic equivalent: a
ServiceLoader-based SPI where a model string in config plus a Maven dependency swap is all it takes.What goes where
Into
google-adk.jar— SPI layer (3 files):ModelProvider— SPI interfaceModelProviderRegistry—ServiceLoaderwiringOpenAiCompatibleLlm— reusable base class for anyPOST /v1/chat/completionsproviderInto
google-adk.jar— HTTP and serialization layer (or replaced by Google's existing implementation):OpenAiHttpClient— HTTP client interface (default impl included; could be backed by ADK's existingChatCompletionsHttpClient)OpenAiMessageSerializer— serializer interface (default impl included; could be replaced byAdkChatSerializerusing ADK 1.1.0 internal DTOs for richer response mapping)Into
RunnerandAdkWebServer.start()(2 lines total):Everything else stays external. Provider JARs (Groq, Ollama, OpenRouter) live outside ADK and self-register via
META-INF/services. No ADK PR is needed to add a new provider — dropping a JAR on the classpath in an ADK application is enough.What's included
model-prism-coreModelProviderSPI +OpenAiCompatibleLlmbase classmodel-prism-groqgroq/.*)model-prism-ollamamodel-prism-openroutermodel-prism-demoTests
13 unit tests, all passing. See PR description for full list.
Manual E2E verified with Groq and Ollama.
Proposed core integration (one line)
Testing Plan
Unit Tests:
Manual End-to-End (E2E) Tests:
The
model-prism-demomodule includes 11 runnable demo classes. To verify end-to-end:For Ollama (no API key required): install Ollama, run
ollama pull llama3, then use model nameollama/llama3.Checklist
Additional context
Modules added under
contrib/model-prism/:model-prism-coreModelProviderSPI,ModelProviderRegistry,OpenAiCompatibleLlmbase classmodel-prism-groqgroq/.*)model-prism-ollamaollama/.*, no API key)model-prism-openrouteropenrouter/.*, free tier available)model-prism-demo