Works with your stack
The honest short version: LLMJury works with every model provider, including ones we have never heard of. Variant assignment is a local hash and the prompt comes out of client memory, so there is no client for us to support — you call your provider exactly as you do now.
What the list below tells you is which of two paths you would be on. On the interception path, one wrap() call at startup measures latency, tokens, errors, and the model text automatically. On the key-only path you send the measurements yourself — and no prompt or response text ever reaches us, which for some teams is the reason to choose it.
⚡ Automatic capture with wrap()
For OpenAI-shaped and Anthropic-shaped clients. Latency, tokens, model, errors, and the prompt and response text are recorded with no call-site code — and judge-scored quality works, because the judge has text to score.
⌘ Key-only — you send the metrics
For everything else. Resolve the variant, call your provider however you already do, send the outcome. Nothing on this path carries a prompt or a response, so we never receive either.
Model providers
OpenAI
Automatic capture with wrap()Wrap the openai client once at startup and every GPT call becomes an experiment — prompt, response, latency, tokens, model, and errors recorded with no call-site code.
Anthropic
Automatic capture with wrap()The client every example on this site wraps. Two lines put your Claude calls behind an experiment key, with prompt versioning and a graded verdict on top.
Azure OpenAI
Automatic capture with wrap()Azure OpenAI is the same openai client class pointed at your Azure deployment, so it is the same wrap() call — there is no separate Azure code path, and none is needed.
Amazon Bedrock
Key-only — you send the metricsBedrock’s boto3 client is not one of the two shapes wrap() recognises, so this is the key-only path: resolve the variant, call Bedrock the way you already do, send the outcome.
Google Vertex AI and Gemini
Key-only — you send the metricsThe Google GenAI client is its own shape, so Gemini runs on the key-only path — with one exception: Claude on Vertex through AnthropicVertex is back on the interception path.
Self-hosted and OpenAI-compatible endpoints
Automatic capture with wrap()vLLM, Ollama, LiteLLM, Together, Groq, and anything else that speaks the OpenAI API: point the openai client at your base URL and wrap() intercepts it like any other.
Frameworks & runtimes
LangChain and LangGraph
Key-only — you send the metricsResolve the variant before the chain runs and pass it in as a parameter. There is no LangChain callback handler — the prompt is an input to your chain, which is all the integration needs to be.
LlamaIndex
Key-only — you send the metricsThe interesting RAG experiment is rarely the prompt — it is top_k, the chunk size, the reranker. Put the whole retrieval configuration behind one variant key and test the permutation.
Vercel AI SDK
Key-only — you send the metricsResolve the variant on the server, pass the prompt into generateText or streamText, and track the outcome. The publishable key is write-only, so assignment can happen at the edge.
Not on the list?
Then you are on the key-only path, and it already works — that is what provider-agnostic means. Start free and point it at whatever you are running; if you would rather have automatic capture for it, tell us which client, because the requests are how that list grows.