LLM Connections
LLM Connections let you add multiple AI provider configurations and switch between them. Each session locks to a specific connection after the first message, and workspaces can define their own default connection.
Location
Section titled “Location”LLM connections are stored in:
~/.craft-agent/config.jsonHow Connections Are Used
Section titled “How Connections Are Used”Connections resolve in this order:
- Session connection (locked after first message)
- Workspace default connection (
defaults.defaultLlmConnection) - Global default connection (
defaultLlmConnection) - First connection in the list (fallback)
Connection Schema
Section titled “Connection Schema”{ "slug": "anthropic-api", "name": "Anthropic (API Key)", "providerType": "anthropic", "authType": "api_key", "baseUrl": "https://api.anthropic.com", "defaultModel": "claude-sonnet-5", "createdAt": 1737451800000}Fields
Section titled “Fields”| Field | Required | Description |
|---|---|---|
slug | Yes | URL-safe identifier (e.g., anthropic-api, codex) |
name | Yes | Display name shown in the UI |
providerType | Yes | Provider backend (see list below) |
authType | Yes | Auth mechanism (see list below) |
baseUrl | No | Custom base URL for compatible providers |
models | No | Explicit model list. Accepts strings ("gpt-5.4") or objects with optional contextWindow and supportsImages overrides (see Custom Endpoint Capabilities). |
customEndpoint | No | Custom endpoint protocol config. Use api to select the wire format and optional supportsImages to opt an entire endpoint into image input. |
midStreamBehavior | No | How mid-stream user sends are handled ("steer" or "queue"). Defaults to "queue" for anthropic, "steer" for Pi-backed providers. See Mid-stream behavior. |
defaultModel | No | Default model for this connection |
codexPath | No | Path to Codex binary (OpenAI/Codex only) |
awsRegion | No | AWS region for Bedrock |
gcpProjectId | No | GCP project for Vertex |
gcpRegion | No | GCP region for Vertex |
createdAt | Yes | Timestamp (ms) when created |
lastUsedAt | No | Timestamp (ms) when last used |
providerType Values
Section titled “providerType Values”| Value | Description |
|---|---|
anthropic | Direct Anthropic API |
anthropic_compat | Anthropic‑compatible endpoints (OpenRouter, Vercel AI Gateway, custom) |
openai | OpenAI via Codex app‑server |
openai_compat | OpenAI‑compatible endpoints |
bedrock | AWS Bedrock |
vertex | Google Vertex AI |
authType Values
Section titled “authType Values”| Value | Description |
|---|---|
api_key | API key only |
api_key_with_endpoint | API key + custom endpoint |
oauth | OAuth login (Claude Max / Codex / OpenAI) |
iam_credentials | AWS IAM credentials (Bedrock) |
service_account_file | GCP service account JSON (Vertex) |
environment | Uses environment variables |
none | No auth required |
Examples
Section titled “Examples”Anthropic (API Key)
Section titled “Anthropic (API Key)”{ "slug": "anthropic-api", "name": "Anthropic (API Key)", "providerType": "anthropic", "authType": "api_key", "defaultModel": "claude-sonnet-5", "createdAt": 1737451800000}Claude Max (OAuth)
Section titled “Claude Max (OAuth)”{ "slug": "claude-max", "name": "Claude Max", "providerType": "anthropic", "authType": "oauth", "defaultModel": "claude-opus-4-8", "createdAt": 1737451800000}OpenRouter (Anthropic‑compatible)
Section titled “OpenRouter (Anthropic‑compatible)”{ "slug": "openrouter", "name": "OpenRouter", "providerType": "anthropic_compat", "authType": "api_key_with_endpoint", "baseUrl": "https://openrouter.ai/api", "models": [ "anthropic/claude-opus-4.8", "anthropic/claude-haiku-4.5" ], "defaultModel": "anthropic/claude-opus-4.8", "createdAt": 1737451800000}OpenRouter (OpenAI‑compatible)
Section titled “OpenRouter (OpenAI‑compatible)”{ "slug": "openrouter-openai", "name": "OpenRouter (OpenAI‑compat)", "providerType": "openai_compat", "authType": "api_key_with_endpoint", "baseUrl": "https://openrouter.ai/api/v1", "models": [ "openai/gpt-5.2-codex", "openai/gpt-5.1-codex-mini" ], "defaultModel": "openai/gpt-5.2-codex", "createdAt": 1737451800000}AWS Bedrock (IAM Credentials)
Section titled “AWS Bedrock (IAM Credentials)”{ "slug": "bedrock", "name": "AWS Bedrock", "providerType": "bedrock", "authType": "iam_credentials", "awsRegion": "us-east-1", "defaultModel": "claude-sonnet-5", "createdAt": 1737451800000}With iam_credentials, your AWS Access Key ID, Secret Access Key, and optional Session Token are stored securely and injected into the subprocess environment at runtime. Use this when you want to configure credentials directly in the UI.
AWS Bedrock (Environment)
Section titled “AWS Bedrock (Environment)”{ "slug": "bedrock", "name": "AWS Bedrock", "providerType": "bedrock", "authType": "environment", "awsRegion": "us-east-1", "defaultModel": "claude-sonnet-5", "createdAt": 1737451800000}With environment, the subprocess inherits your shell’s AWS credential chain — ~/.aws/credentials, AWS_PROFILE, IAM roles, SSO sessions, and environment variables all work. No credentials are stored in Craft Agents.
Set awsRegion to the region where you have Bedrock model access enabled (e.g., us-east-1, us-west-2, eu-west-1).
Codex / OpenAI (OAuth)
Section titled “Codex / OpenAI (OAuth)”{ "slug": "codex", "name": "OpenAI (Codex)", "providerType": "openai", "authType": "oauth", "codexPath": "/Applications/Craft Agents.app/Contents/Resources/vendor/codex/darwin-arm64/codex", "defaultModel": "codex-mini-latest", "createdAt": 1737451800000}Custom Endpoint Capabilities
Section titled “Custom Endpoint Capabilities”Custom endpoints default to a 128K context window and text-only input. If your model supports a larger context window or accepts image input, set those capabilities explicitly in the connection config.
Per-model overrides (recommended)
Section titled “Per-model overrides (recommended)”Use model objects when an endpoint hosts a mix of text-only and multimodal models:
{ "slug": "ollama", "name": "Ollama", "providerType": "pi_compat", "authType": "none", "baseUrl": "http://localhost:11434/v1", "customEndpoint": { "api": "openai-completions" }, "models": [ { "id": "gemma4", "contextWindow": 262144, "supportsImages": true }, { "id": "qwen3-coder", "contextWindow": 131072 } ], "defaultModel": "gemma4", "createdAt": 1737451800000}Whole-endpoint opt-in
Section titled “Whole-endpoint opt-in”If every model behind the endpoint is multimodal, you can opt in at the endpoint level:
{ "customEndpoint": { "api": "openai-completions", "supportsImages": true }}Mid-stream Behavior
Section titled “Mid-stream Behavior”When you send a message while the agent is still streaming a previous turn, Craft Agents needs to decide whether to deliver it into the in-flight turn or hold it for the next one. The midStreamBehavior field on the connection controls this.
| Value | Behavior |
|---|---|
"steer" | Deliver the message into the in-flight turn (Pi’s native .steer() or Claude’s PreToolUse hook injection). |
"queue" | Hold the message; let the current turn finish naturally; replay as a new turn afterwards. |
{ "slug": "anthropic-api", "providerType": "anthropic", "authType": "api_key", "midStreamBehavior": "queue", "createdAt": 1737451800000}Defaults by backend
Section titled “Defaults by backend”If midStreamBehavior is omitted (legacy connections, fresh setups), the default depends on the backend:
anthropic→"queue". Claude’s emulated steer relies on the model invoking a tool before the turn ends. If no tool fires, the steer becomes undelivered and Craft Agents falls back to a re-queue anyway — with the original turn’s tokens already paid. Defaulting to queue avoids the wasted round-trip.pi/pi_compat→"steer". Pi’s native steer is non-destructive: your message is delivered after the current tool finishes, full conversation context preserved.
Changing it from the UI
Section titled “Changing it from the UI”Open Settings → AI, scroll to the Connections section, click the … menu on the relevant connection (or right-click the row), and choose Mid-stream sends → Steer immediately or Queue until ready. The selection is saved on the connection and takes effect immediately for the next mid-stream send.
For the user-facing concept and UI walkthrough, see Interactions → Sending while the agent is responding.
Managing Connections
Section titled “Managing Connections”Connections are managed in Settings → AI:
- Add/edit/delete connections
- Set a global default connection
- Validate connection status
- Set per‑workspace defaults