Skip to main content
The application never calls a model provider directly. It sends every model call to one OpenAI-compatible endpoint, named by LITELLM_PROXY_API_BASE in values/jedify-be.yaml, and authenticates with LITELLM_PROXY_API_KEY from your application configuration secret. By default that endpoint is the LiteLLM proxy the platform chart installs, which forwards each call to Vertex AI in your project. You can point it at an OpenAI-compatible gateway you already run instead.
Never leave LITELLM_PROXY_API_BASE unset. Without it, the client library falls back to https://api.openai.com/v1: your prompts leave your project, under Jedify’s model names, and nothing in any log says so. LITELLM_PROXY_URL in the same file isn’t read by the application; keep it pointing at the same address so the two never disagree.

The model names the application calls

The application asks for models by fixed names. Whatever serves them, proxy or gateway, must answer to exactly these names. As of release 2026.10.10: These are names, not vendors. In the default configuration every one of them is served by a Gemini model, so a name doesn’t tell you which vendor answered.
A name that your proxy or gateway doesn’t serve breaks one feature, and never looks like a missing model:
  • Without claude-opus-4-7, Analyst mode returns empty results while everything else works.
  • Without claude-sonnet-5, agent runs fail at once while ordinary questions work.
  • Without text-embedding-ada-002, every chat model works and only grounding fails, deep inside a question: the question fails with no explanation, and the logs show No groundable columns found.
The one log line that names the cause is the refusal itself: Invalid model name passed in model=<name>.

The embedding model is a one-time choice

Embeddings belong to your account: building the model and answering questions read the same vectors. Choose the model behind text-embedding-ada-002 before your first build, and don’t change it. Changing it later means re-embedding everything with a full rebuild; otherwise your account holds vectors from two different models, and answers degrade without any error. The default, gemini-embedding-001, covers more than 100 languages.

Default: Vertex AI through the LiteLLM proxy

The proxy runs in the jedify namespace as its own Google service account, which holds only roles/aiplatform.user. Its model list is litellm.modelList in the platform chart’s values. The chart fills each entry’s Vertex AI project from gcp.projectId, so most installations change nothing here. The proxy runs with two settings: drop_params: true, so a parameter a model doesn’t support is dropped instead of failing the call, and num_retries: 2.

Check that each model is offered to your project

A Vertex AI model is servable only where Google offers it to your project, and preview models are allowlisted project by project. A name that works in one project can return 404 in the next, same region and all. The defaults use generally available models in us-central1. Check each one before the first question:
Expected: a short reply for each model. An error message such as not found means that model isn’t offered to your project in that location. Model availability changes over time, so check again when you change models or Google retires one.

Choose the location

Decision. The defaults call Vertex AI in us-central1. If your data must stay in another region, set vertex_location on every entry to a location where each model is offered.
  • Embeddings need a regional location, never global. Pods reach Google APIs through Private Google Access’s restricted addresses, which don’t serve the global Vertex AI endpoint for embeddings. The call fails with The service you are trying to access is not available on Google's Restricted VIPs.
  • Chat models may use global. Some preview models are offered only there, and chat completions at global work over the same path.

Change the model list

litellm.modelList is a list, so a list in your values replaces the chart’s whole list. Restate all eight names. The chart fills in your project on every entry, so you set only the model and the location. For example, to keep the default models in europe-west4, add this block to the end of values/jedify-infra.yaml, once (YAML keeps only the last of two blocks with the same key):
Then upgrade the platform chart:
Reloader restarts the proxy when its model list changes, because the proxy reads the list only when it starts. Then verify the models. If a model you just added still answers Invalid model name, restart the proxy yourself:
If you turn on Model Armor screening (model_armor_mode in OpenTofu), it covers Gemini models on Vertex AI only. A model served any other way, including through your own gateway, isn’t screened.

Verify the models

Run a real completion for every name, from inside an application pod, through the application’s own configuration. This tests what the application uses: the address, the key, DNS, and the certificates the pod trusts. It doesn’t print any secret.
Expected: every chat name prints a short reply, and the embedding prints a number of dimensions. Any other line names the problem. Don’t use /v1/models as the check. Every name in the proxy’s list is an alias, so the proxy lists all of them whether or not the model behind each one exists. Only a real completion proves a name works.

Use your own gateway

You can replace the bundled proxy with an OpenAI-compatible gateway you already run. The gateway must:
  • answer POST /v1/chat/completions, including streamed responses, and POST /v1/embeddings;
  • serve every name in the model names the application calls, spelled exactly;
  • accept or ignore parameters a model doesn’t support, the way the bundled proxy’s drop_params does, instead of rejecting the call;
  • accept the key it issued you as a bearer token;
  • present a certificate the application trusts: one from a public certificate authority, or from your own after you trust your certificate authority;
  • be reachable from the cluster. With egress masquerade on, the gateway and any firewall in front of it see your node subnet’s addresses, not the pod range: allow that range.
1

Store your gateway's key

Replace LITELLM_PROXY_API_KEY in your application configuration secret with the key your gateway issued. This adds a new version and keeps every other key:
To verify, list the key names. Expected: the same keys as before.
2

Point the application at your gateway

Set GATEWAY_URL to your gateway’s base URL, with no trailing slash and no /v1: the client library appends the path itself.
To verify, read both back. Expected: both show your gateway’s URL.
3

Apply the change and verify

External Secrets refreshes the application’s secret every hour. Force it now, then upgrade both application releases:
Then run Verify the models. Expected: every name answers through your gateway.
4

Turn off the bundled proxy

Once every name answers through your gateway, remove the bundled proxy:
To verify, check that the proxy is gone. Expected: NotFound.

A gateway behind a private certificate authority

The application’s image trusts the public certificate authorities only. A gateway (or a data warehouse, or any other endpoint the application calls) whose certificate comes from your own certificate authority fails every call with CERTIFICATE_VERIFY_FAILED. Turn on componentsDefaults.trustExtraCA and add your authority’s certificate to the application configuration secret as EXTRA_CA_PEM_B64: the PEM file, base64-encoded on one line. One PEM file can hold several certificates; include the intermediates if your server doesn’t send its own chain.
Every application pod then starts with an init container, ca-bundle, that writes the public authorities plus yours into /trust/bundle.pem, and the process reads it through SSL_CERT_FILE and REQUESTS_CA_BUNDLE. Because the public authorities are in the same file, your identity provider, your warehouse and Google’s APIs keep working beside the private endpoint. Set the switch and the key together. With the switch on and the key missing, the init container refuses to start the pod rather than run it without your certificate authority. A changed certificate takes effect when the pods restart. To verify, read the init container’s log: it prints how many certificates the bundle holds. Then verify the models again.