Provider Support

Use this page to connect a hosted provider or local model server. If you are still deciding how Agents should choose models, start with Models and Providers.

Compare provider support

Every connection uses the same configuration shape:

LittleGhost.configure do |config|
  config.providers = {
    primary: {
      adapter: :openrouter,
      api_key: ENV.fetch("OPENROUTER_API_KEY")
    }
  }
end

primary is a name chosen by the application, and adapter selects the wire protocol. An Agent can now use a target such as primary:openai/gpt-5.6-luna.

Provider or endpoint Adapter Generation Decisions Embeddings
OpenRouter :openrouter Chat Completions Typed decision endpoints When the model supports it
TypeSafe :typesafe No System One decisions No
OpenAI :openai Responses or Chat Completions No Yes
Compatible API :openai_compatible Responses or Chat Completions No When the endpoint implements it
Ollama :openai_compatible Responses or Chat Completions No When the model supports it
Anthropic :anthropic Messages No No
Gemini :gemini Gemini API No No
Vertex AI :vertex_ai Gemini on Vertex AI No No
Bedrock :bedrock Converse No Titan Text Embeddings V2
LM Studio :lm_studio Responses or Chat Completions No Yes

TypeSafe Jev is a decision model that returns structured answers to typed questions. Its API and OpenRouter’s Jev routes support the same question types. These operations return structured answers directly and do not create an Agent Run. See Decisions for the question and answer model.

Capabilities can vary by model, account, and server version. Handle provider failures even when a model is expected to support a feature.

Hosted providers

OpenRouter

OpenRouter gives one connection access to models from several providers:

config.providers = {
  openrouter: {
    adapter: :openrouter,
    api_key: ENV.fetch("OPENROUTER_API_KEY"),
    app_name: "Support Console",
    site_url: "https://support.example.com"
  }
}

Use OpenRouter’s publisher/model form, such as openrouter:anthropic/claude-sonnet-4. app_name and site_url are optional. The selected model must support embeddings before you call LittleGhost.embed.

For Jev decisions, OpenRouter supports both decision endpoints. The default uses the Decisions API and namespaced model identifiers such as openrouter:~typesafe/jev-latest:

LittleGhost.configure do |config|
  config.providers = {
    openrouter: {
      adapter: :openrouter,
      api_key: ENV.fetch("OPENROUTER_API_KEY"),
      decision_api: :decisions
    }
  }
end

Set decision_api: :system_one to use /api/v1/systemone; that route accepts a bare TypeSafe model identifier such as jev-latest, used as openrouter:jev-latest. OpenRouter describes these routes in its Jev guide.

TypeSafe

Connect directly to TypeSafe’s System One endpoint with a TypeSafe API key:

LittleGhost.configure do |config|
  config.providers = {
    typesafe: {
      adapter: :typesafe,
      api_key: ENV.fetch("TYPESAFE_API_KEY")
    }
  }
end

Use a Jev identifier such as typesafe:jev-latest. This adapter supports typed decisions only. See the TypeSafe API reference for question and answer fields.

OpenAI

config.providers = {
  openai: {
    adapter: :openai,
    api_key: ENV.fetch("OPENAI_API_KEY")
  }
}

Generation uses the Responses API by default. Use openai:gpt-5.6-luna for generation or openai:text-embedding-3-small for embeddings. Set api: :chat_completions only when required.

Anthropic

config.providers = {
  anthropic: {
    adapter: :anthropic,
    api_key: ENV.fetch("ANTHROPIC_API_KEY")
  }
}

Use a target such as anthropic:claude-sonnet-4-6. The adapter uses the Messages API. LittleGhost does not provide Anthropic embeddings.

Gemini

config.providers = {
  gemini: {
    adapter: :gemini,
    api_key: ENV.fetch("GEMINI_API_KEY")
  }
}

Use gemini:gemini-2.5-flash, for example. LittleGhost does not provide Gemini embeddings.

Vertex AI

Vertex AI uses Gemini’s request format with a Google Cloud project and location:

config.providers = {
  vertex: {
    adapter: :vertex_ai,
    project: ENV.fetch("GOOGLE_CLOUD_PROJECT"),
    location: "global"
  }
}

Use a target such as vertex:gemini-2.5-flash. The credential resolver can obtain Google credentials, or startup can supply an access token. LittleGhost does not provide Vertex AI embeddings.

Amazon Bedrock

config.providers = {
  bedrock: {
    adapter: :bedrock,
    region: ENV.fetch("AWS_REGION")
  }
}

Use a model available in the region, such as bedrock:us.anthropic.claude-sonnet-4-6-v1:0. The adapter resolves AWS credentials and signs requests without an AWS SDK.

Bedrock embeddings support amazon.titan-embed-text-v2:0. Its dimensions setting accepts 256, 512, or 1024, and normalize defaults to true.

Compatible APIs and local servers

Another OpenAI-compatible API

Use :openai_compatible for a hosted service, gateway, or local server that implements OpenAI-style endpoints:

config.providers = {
  models: {
    adapter: :openai_compatible,
    base_url: "https://models.example.com/v1/",
    api_key: ENV.fetch("MODEL_API_KEY"),
    api: :responses
  }
}

Use the model identifier expected by the endpoint, such as models:example-model. Choose api: :responses or api: :chat_completions to match the server. LittleGhost.embed uses the connection’s embeddings endpoint and supports dimensions when the server and model accept it.

Tool calls, structured results, reasoning, attachments, and embeddings depend on the compatible server and model.

Ollama and LM Studio normally listen on loopback HTTP. LittleGhost requires allow_insecure_http: true as an explicit opt-in because HTTP does not protect prompts, output, or credentials in transit. Use this setting only for a local or otherwise trusted endpoint; use HTTPS for a remote server.

Ollama

Pull a model, start Ollama, and use the existing OpenAI-compatible adapter:

$ ollama pull qwen3
config.providers = {
  ollama: {
    adapter: :openai_compatible,
    base_url: "http://localhost:11434/v1/",
    api_key: "ollama",
    api: :responses,
    allow_insecure_http: true
  }
}

Use the pulled model name in the target, such as ollama:qwen3. The api_key is a placeholder for a local server without authentication.

Ollama added its Responses endpoint in version 0.13.3. Set api: :chat_completions for an earlier release or when the selected model does not support the Responses features you need. See Ollama’s OpenAI compatibility reference for release-specific fields.

For embeddings, pull an embedding model and pass its target to LittleGhost.embed. LittleGhost does not list, pull, or delete Ollama models.

LM Studio

Start LM Studio’s local server after downloading or loading the model you want to use. The dedicated adapter supplies the usual local endpoint and a placeholder credential:

config.providers = {
  lm_studio: {
    adapter: :lm_studio,
    allow_insecure_http: true
  }
}

Use the model key shown by LM Studio, for example lm_studio:google/gemma-3-4b. Generation uses the Responses API by default.

Set api: :chat_completions with LM Studio releases earlier than 0.3.29, or when required by the selected model. LittleGhost.embed uses the same connection with an embedding model. See LM Studio’s compatibility reference for its current generation and embedding endpoints.

When LM Studio authentication is enabled, add api_key: ENV.fetch("LM_STUDIO_API_TOKEN") to the connection.

The native model list and API-token authentication require LM Studio 0.4.0 or newer. LittleGhost reads the list; it does not load, unload, or download models.

Discover current model details

Call refresh! when you need current availability, loaded state, or capabilities. Ordinary model requests do not make discovery calls.

resolver = LittleGhost.model_resolver
result = resolver.refresh!(target: "lm_studio:google/gemma-3-4b")
result[:errors]

details = resolver.details("lm_studio:google/gemma-3-4b")
details[:loaded]
details.context_window
details.input_modalities
details.supported_parameters

Pass target: for one model, or omit it for every configured source. On failure, result[:errors] describes the problem and previous details remain.

Hosted adapters can combine models.dev data with their provider’s model API. LM Studio reads its native model list. The generic compatible adapter and Ollama do not have built-in model discovery.

LM Studio details can include downloaded and loaded state, active context length, input types, tools, and reasoning. An unloaded model has no active context length. See LittleGhost::Models::Details for every field.

Keep connection settings in application code

Choose keys, tokens, headers, base URLs, model identifiers, and API variants at startup. Read secrets from deployment configuration or a secret manager. Do not copy public request parameters into provider settings.

The selected provider may receive prompts, conversation history, Tool results, schemas, and attachments. Choose one appropriate for that data.

Continue with Running in Production to place connections, roles, sessions, and observability into a long-running application.