Skip to main content

Junie

Note

AI Gateway is part of AI Governance, which is included with a Premium license.

Junie CLI supports AI Gateway through custom model profiles.

ProviderAPI typeEndpoint
OpenAIOpenAIResponses/openai/v1/responses
AnthropicAnthropic/anthropic/v1/messages

For Junie inside JetBrains IDEs, refer to JetBrains IDEs.

Prerequisites

  • Junie CLI: Installed with curl -fsSL https://junie.jetbrains.com/install.sh | bash.
  • Authentication: Your Coder API token.

Centralized API Key

Junie discovers custom model profiles from JSON files in two locations:

ScopeLocation
User~/.junie/models/*.json
Project.junie/models/*.json

The file name without the .json extension is the profile ID.

Create ~/.junie/models/ai-gateway.json for the OpenAI endpoint:

{ "id": "gpt-5.5", "baseUrl": "https://coder.example.com/api/v2/ai-gateway/openai/v1/responses", "apiType": "OpenAIResponses", "apiKey": "${CODER_API_TOKEN}", "fasterModel": { "id": "gpt-5.4-mini" } }

Or for the Anthropic endpoint:

{ "id": "claude-sonnet-5", "baseUrl": "https://coder.example.com/api/v2/ai-gateway/anthropic/v1/messages", "apiType": "Anthropic", "apiKey": "${CODER_API_TOKEN}", "fasterModel": { "id": "claude-haiku-4-5-20251001" } }

Replace coder.example.com with your Coder deployment URL.

Note

baseUrl is the complete endpoint URL. Junie does not append a path to it, so include /v1/responses for OpenAIResponses and /v1/messages for Anthropic.

Junie resolves ${VAR} references in apiKey and extraHeaders from the environment, so the token never has to be written to disk:

export CODER_API_TOKEN=$(coder login token)

Run Junie with the profile:

junie --model custom:ai-gateway

Custom profiles also appear in the model selection list of the interactive TUI and in the /model slash command.

BYOK (Personal API Key)

Junie supports custom headers, so BYOK works by sending your personal provider key as the API key and the Coder API token as the governance token:

{ "id": "gpt-5.5", "baseUrl": "https://coder.example.com/api/v2/ai-gateway/openai/v1/responses", "apiType": "OpenAIResponses", "apiKey": "${OPENAI_API_KEY}", "extraHeaders": { "X-Coder-AI-Governance-Token": "${CODER_API_TOKEN}" } }

Set both environment variables:

# Your personal provider API key, forwarded to the upstream provider. export OPENAI_API_KEY="<your-openai-api-key>" # Your Coder API token, used for authentication with AI Gateway. export CODER_API_TOKEN="<your-coder-api-token>"

Pre-configuring in Templates

Commit the profile to your repository at .junie/models/ai-gateway.json and inject the token from the template, so users get a working configuration without manual setup:

data "coder_workspace_owner" "me" {} data "coder_workspace" "me" {} resource "coder_env" "coder_api_token" { agent_id = coder_agent.main.id name = "CODER_API_TOKEN" value = data.coder_workspace_owner.me.session_token }

Reference the deployment URL in the profile with ${data.coder_workspace.me.access_url}/api/v2/ai-gateway/openai/v1/responses if you generate the file from the template instead of committing it.

References: Junie custom LLMs