Junie Help

Custom proxies

Custom proxies let you route Junie's LLM traffic through a self-hosted or third-party proxy endpoint instead of the default JetBrains AI service. This is useful when your organization runs its own inference gateway, needs to add custom authentication headers, or wants to use a private Ingrazzio-compatible deployment.

About the Ingrazzio proxy

Ingrazzio is JetBrains' internal proxy protocol that Junie uses to communicate with LLM providers. The production Ingrazzio endpoint is https://ingrazzio-cloud-prod.labs.jb.gg.

When Junie connects through an Ingrazzio proxy, it uses the base URL to access several sub-endpoints:

  • LLM chat — the base path handles streaming chat completion requests.

  • Web search — the /search path provides web search capabilities.

  • URL extraction — the /extract path fetches and extracts content from URLs.

  • Authentication — the /auth/test and /auth/reset paths validate the token and license state.

When using the default JetBrains provider, Junie authenticates automatically via JetBrains Account (JBA). When using a custom proxy, JBA authentication is bypassed — you must supply any required credentials (such as Authorization: Bearer <token>) through the proxy's headers field. All the sub-endpoints above, including authentication, are routed through the selected proxy with those headers.

Configure a proxy

Add a proxies array to your config.json. Each entry describes a named proxy endpoint:

{ "proxies": [ { "name": "my-proxy", "kind": "Ingrazzio", "api-url": "https://ingrazzio-cloud-prod.labs.jb.gg", "headers": [ "Authorization: Bearer <your-token>" ] } ] }

Proxy fields

Field

Required

Description

name

Yes

A unique name for this proxy. Used to reference it from the provider field.

kind

No

The proxy protocol type. Defaults to Ingrazzio if omitted. See Supported proxy kinds.

api-url

Yes

The base URL of the proxy endpoint.

headers

No

A list of extra HTTP headers to send with every request. Each entry uses the format Header-Name: Header-Value.

available-models

No

JetBrains model ids this proxy is allowed to serve. See Restricting the model list.

Select a proxy as the active provider

To make Junie use a configured proxy, set the provider field to the proxy name:

{ "proxies": [ { "name": "corp-proxy", "kind": "Ingrazzio", "api-url": "https://ingrazzio-cloud-prod.labs.jb.gg", "headers": [ "Authorization: Bearer <your-token>" ] } ], "provider": "corp-proxy", "model": "sonnet" }

You can also override the provider at runtime with the --provider CLI flag:

junie --provider corp-proxy

When a proxy is selected as the provider, Junie does not use JetBrains AI authentication. All authentication must be handled through the headers you configure on the proxy entry.

Central auth-status display

The provider setting and --provider select a proxy by its name, not its URL or protocol kind. When the selected proxy's name contains the word Central (case-insensitive), ACP auth status displays JetBrains Air Gateway with kind: gateway and no account identity or detail. The current status is sent after successfully opening or restoring a session, even when the proxy is already ready; later changes update it without requiring a prompt. For example, Junie Central and corp-central-proxy match; decentralized does not. An unused proxy named Central does not affect the selected provider's status, and a logged-out proxy still reports Not ready.

This is a weak, display-only naming heuristic, not verification that the endpoint is Junie Central. It does not inspect URLs, headers, protocol kinds, or backend responses and does not change routing or authentication. Other selected proxies retain their proxy-name label and Proxy detail.

Legacy: the INGRAZZIO_URL environment variable

Setting the INGRAZZIO_URL environment variable creates an implicit Ingrazzio-kind proxy named ingrazzio-env pointing at that URL — no config.json entry is required:

INGRAZZIO_URL="http://127.0.0.1:53367" junie

The synthetic proxy behaves like a proxy declared in config.json:

  • All requests — LLM chat, web search, URL extraction, and authentication (/auth/test, /auth/reset) — are routed through the given URL, and it appears in the model selector next to configured proxies.

  • It automatically becomes the default provider unless another provider is selected via the CLI (--provider) or config.json.

  • If config.json declares any Ingrazzio-kind proxy, that configuration takes precedence and INGRAZZIO_URL is ignored entirely.

  • If an ingrazzio token is supplied via the environment (for example, JUNIE_API_KEY or EJ_AUTH_INGRAZZIO_TOKEN), it is sent as the Authorization header of the proxy's requests; otherwise Junie falls back to the JetBrains Account token.

Restricting the model list

available-models lists the JetBrains model ids a proxy is allowed to serve, for example anthropic-claude-4-6-sonnet. It works for every proxy kind.

The list is a filter, not a catalogue: Junie shows the intersection of it with the models that would otherwise be visible for that proxy. An OpenAI proxy can only ever serve OpenAI models, so listing an Anthropic id there adds nothing. Ids that this version of Junie does not recognize are ignored, and a list that matches nothing at all leaves the proxy out of the model selector entirely — check the log if a configured proxy does not appear.

Leave the field out to accept whatever the proxy kind supports.

{ "proxies": [ { "name": "central-openai", "kind": "OpenAI", "api-url": "https://openai-gw.corp.example.com", "available-models": ["openai-gpt-5-2", "openai-gpt-5-1-codex"] } ] }

Supported proxy kinds

The kind field determines which protocol Junie uses to communicate with the proxy.

Kind

Status

Description

Ingrazzio

Supported

Junie's native proxy protocol. Compatible with JetBrains Ingrazzio deployments. This is the default when kind is omitted.

Bedrock

Supported

Anthropic models served through an AWS Bedrock-compatible gateway. See Bedrock proxies.

OpenAI

Supported

OpenAI-compatible API.

Google

Supported

Google Gemini-compatible API.

Anthropic

Supported

Anthropic-compatible API.

JetBrainsAI

Not supported

JetBrains AI Gateway. Reserved for future use — selecting it as the active provider fails.

OpenRouter

Not supported

OpenRouter-compatible API. Reserved for future use — selecting it as the active provider fails.

Bedrock proxies

A Bedrock proxy routes Anthropic models through an AWS Bedrock-compatible gateway. Requests are sent to <api-url>/model/<wire-name>/invoke, where <wire-name> is the provider-side model id with Bedrock's default cross-region inference prefix.

Bedrock is the one kind where available-models is effectively required: omitting it lets Junie offer every Anthropic model it knows, and your gateway is unlikely to serve all of them.

Because Bedrock model ids differ from Junie's, a Bedrock proxy also accepts model-overrides, which maps a JetBrains model id to the name your gateway knows it by. It is the only kind that does — other kinds always send the JetBrains model name.

Field

Required

Description

model-overrides

No

JetBrains model id → the model id your Bedrock gateway expects in the request URL.

If the proxy's headers include an Authorization header, it is used as-is; otherwise Junie falls back to the JetBrains Account token.

{ "proxies": [ { "name": "corp-bedrock", "kind": "Bedrock", "api-url": "https://bedrock-gateway.example", "available-models": ["anthropic-claude-4-6-sonnet", "anthropic-claude-4-8-opus"], "model-overrides": { "anthropic-claude-4-6-sonnet": "us.anthropic.claude-sonnet-4-6", "anthropic-claude-4-8-opus": "us.anthropic.claude-opus-4-8-v1" }, "headers": [ "Authorization: Bearer <your-token>" ] } ], "provider": "corp-bedrock", "model": "sonnet" }

Quick setup example

  1. Create a configuration file (for example, my-config.json):

{ "proxies": [ { "name": "my-ing", "kind": "Ingrazzio", "api-url": "https://ingrazzio-cloud-prod.labs.jb.gg", "headers": [ "Authorization: Bearer <your-token>" ] } ], "provider": "my-ing", "model": "opus" }
  1. Run Junie with the custom config:

junie --config-location="/path/to/my-config.json"

You can still override the model at runtime with the --model flag:

junie --config-location="/path/to/my-config.json" --model sonnet

Merging proxies across configuration files

When multiple configuration files define proxies, they are merged by name:

  • If two files define a proxy with the same name, the higher-priority file's fields override the lower-priority file's fields on a per-field basis.

  • Headers from both files are combined (deduplicated).

  • available-models is replaced, not combined — otherwise a lower-priority file could widen a list the higher-priority one deliberately narrowed.

  • model-overrides entries from both files are combined per model id, with the higher-priority file winning (Bedrock only).

  • Proxies with different names are all included in the final list.

For the configuration precedence order, see Configuration files.

Limitations

  • The Ingrazzio, Bedrock, OpenAI, Google, and Anthropic proxy kinds are currently supported. The JetBrainsAI and OpenRouter kinds are reserved for future use and fail when selected as the active provider.

  • Proxy configuration is only available through config.json. There are no dedicated CLI flags for defining proxy entries.

  • When using a proxy provider, JetBrains AI authentication is bypassed entirely. You must supply any required credentials via the headers field.

23 October 2026