Agent Engines

SkillAI & models

Lets your agent check which AI model powers it, switch models, and set up different providers.

Available today. Use it from your connected AI after setup.

Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.

Then ask your AI: use the Agent Engines skill

About this skill

How to inspect and configure the AI engine (model provider) powering the agent. Use when the user asks to switch models, check which engine is active, test a new provider, or register a custom engine.

What this skill tells your AI

The instructions your AI receives, as published by builderio/agent-native in templates/assets/.agents/skills/agent-engines/SKILL.md and read by ahel’s review.

Overview

The framework supports pluggable AI engines beneath the agent loop. The Anthropic engine is the default and best-in-class path (Claude models). Additional engines can be added via the Vercel AI SDK (OpenAI, Google Gemini, Groq, Mistral, Cohere, Ollama).

Available Tools

ToolPurpose
list-agent-enginesList all registered engines, their capabilities, the current selection, and whether you can change the organization default (canUpdateDefault)
set-agent-engineSet the organization's default engine and model (owners and admins only)
test-agent-engineSend a trivial prompt to verify the engine works (connectivity + API key)
check-provider-keyCheck a provider API key by listing the models it reaches, before saving it
get-provider-modelsRead which models each provider shows in the model picker and default-model select
manage-provider-modelsChoose those models (set) or go back to the recommended ones (reset)
list-model-providersWhat Settings › Model shows: each provider's organization and personal key (masked), rejections, the restriction, and the stored default

Checking the Current Engine

list-agent-engines

Returns the registry of all engines (name, label, capabilities, supported models) plus the currently active engine and model. supportedModels is what the model picker offers: the provider's checked models when modelSelection.state is "selected", otherwise its recommendedModels. credentialRejected: true means the provider rejected that engine's saved key (credentialRejectedAt says when); chats with it stop until the key is replaced, so tell the user.

Switching Engines

set-agent-engine --engine "ai-sdk:openai" --model "gpt-4o"

Changes take effect on the next conversation. The default belongs to the organization (the agent-engine org setting), and only owners and admins can change it. A member's call is refused with an error to relay: ask an owner or admin, or pick a model for this chat in the model picker. A user with no organization sets their own default.

Resolution order (highest priority first):

  1. Explicit engine option passed to createAgentChatPlugin() in the server plugin
  2. The organization's default (agent-engine org setting)
  3. AGENT_ENGINE environment variable
  4. Default: "anthropic" (requires ANTHROPIC_API_KEY)

Settings › Model

The Model page (/settings/model, page id model) has three groups:

  • Organization providers: the organization's Builder.io connection and each organization key. Owners and admins manage them; members see only "N models".
  • Personal providers: a member's own Builder.io connection, their own keys, and the ChatGPT subscription while its lab is on. A personal key is used before the organization's, for that person only.
  • Organization settings: Default model (manage-agent-engine set, organization models only), Restrict personal API keys (manage-provider-key-policy), and Max iterations (manage-agent-loop-settings, 1 to 1000). Owners and admins change them; members see the values.

Read the page's state with list-model-providers, and the models each provider shows with get-provider-models. Keys are added and replaced in the provider dialog, which checks a pasted key by listing its models; you can't save a key for the user, so check one with check-provider-key and send them to Model (open-settings-page) to paste it. Before they remove a provider, run preview-secret-removal with the provider's key name and scope and tell them what stops.

Restricting Personal API Keys

manage-provider-key-policy reads or changes the organization's "Restrict personal API keys" setting. While it is on, members (not owners or admins) can't use or save their own provider keys or a personal Builder.io connection, so their chats use organization providers; with none, a chat fails with "Owners and admins restricted personal API keys." Nothing is deleted, and turning it off restores their keys.

manage-provider-key-policy            # read; owners/admins also get affectedMembers
manage-provider-key-policy --set true # owners and admins only

Read it first and tell the user which members lose which providers before turning it on.

Testing a New Engine

Before switching, verify the engine is working:

test-agent-engine --engine "ai-sdk:openai" --model "gpt-4o"

Returns { ok, latencyMs, response, capabilities }. If ok: false, the error message explains what's wrong (missing API key, package not installed, etc.).

To check a key without sending a prompt, for example one the user just gave you:

check-provider-key --provider "anthropic" --key "<the key>"

Returns { ok: true, models } or { ok: false, code, reason } (rejected, wrong-provider, missing-key, invalid-endpoint, unreachable, provider-error). Relay the reason. Omit --key to re-check the saved key; it is only checked against its saved endpoint, so --baseUrl needs --key (except for Ollama). --scope org is for owners and admins.

Choosing Which Models Show

Each provider (Builder.io included) keeps the models its owner checked. Only checked models appear in the chat model picker and the default-model select; Builder.io and providers with their own key show side by side.

get-provider-models --provider "openai"
manage-provider-models --action "set" --provider "openai" --models '["gpt-6-sol"]'
manage-provider-models --action "reset" --provider "openai"
  • A selection lives at the same scope as the provider's key: --scope user is the caller's own, --scope org is the organization's (owners and admins only; members get an error to relay). Without --scope, the call changes the selection in effect, which follows the key in effect (a member's personal key uses their personal selection).
  • A member's personal selection never changes the organization's. The default-model select always offers the organization's checked models.
  • set with an empty list hides the provider's chat models, for a key used only by services. Builder.io accepts only its own catalog.
  • A chat already on an unchecked model keeps running on it. When nothing picked a model and the engine default is unchecked, chats use the first checked model.
  • A row with models: null has nothing chosen and shows the recommended models. state: "unreadable" means the selection couldn't be read, not that it is empty.

Built-in Engines

Engine NameProviderRequires
anthropicAnthropic Claude SDKANTHROPIC_API_KEY
ai-sdk:anthropicClaude via Vercel AI SDKANTHROPIC_API_KEY
ai-sdk:openaiOpenAI via Vercel AI SDKOPENAI_API_KEY
ai-sdk:openrouter300+ models (Anthropic, OpenAI, Google, Meta, …) routed through OpenRouterOPENROUTER_API_KEY
ai-sdk:googleGoogle Gemini via Vercel AI SDKGOOGLE_GENERATIVE_AI_API_KEY
ai-sdk:groqGroq LPU via Vercel AI SDKGROQ_API_KEY
ai-sdk:mistralMistral via Vercel AI SDKMISTRAL_API_KEY
ai-sdk:cohereCohere via Vercel AI SDKCOHERE_API_KEY
ai-sdk:ollamaLocal Ollama via Vercel AI SDKNone (local)

Engine Capabilities

Each engine advertises its capabilities:

CapabilityAnthropicAI SDK: AnthropicAI SDK: OpenAIAI SDK: Google
thinking✓✓✗✓
promptCaching✓✓✗✗
vision✓✓✓✓
computerUse✓✗✗✗
parallelToolCalls✓✓✓✓

Anthropic-Exclusive Features

When using the anthropic engine (or ai-sdk:anthropic):

  • Prompt caching is applied automatically to the system prompt — cutting latency and cost on repeated turns.
  • Extended thinking can be enabled via providerOptions.anthropic.thinking — the agent reasons longer before responding.

These features are silently ignored when a non-Anthropic engine is active (capability-gated, no breakage).

Using OpenRouter

ai-sdk:openrouter gives access to 300+ models from many providers through a single API. Model IDs use the vendor/model form:

set-agent-engine --engine "ai-sdk:openrouter" --model "anthropic/claude-sonnet-4.5"
set-agent-engine --engine "ai-sdk:openrouter" --model "openai/gpt-4o"
set-agent-engine --engine "ai-sdk:openrouter" --model "google/gemini-2.5-pro"

Any vendor/model string from openrouter.ai/models works — the supportedModels list in the registry is a UI hint, not an allow-list.

App attribution (optional): pass appName / appUrl in the engine config to set the X-OpenRouter-Title / HTTP-Referer headers — useful to see your app on the OpenRouter dashboard and leaderboards:

createAISDKEngine("openrouter", {
  apiKey: process.env.OPENROUTER_API_KEY,
  appName: "My App",
  appUrl: "https://myapp.example",
});

Registering a Custom Engine

Register custom engines in a server plugin at startup. Import from the @agent-native/core/agent/engine subpath:

// server/plugins/my-engine.ts
import {
  registerAgentEngine,
  type AgentEngine,
  type EngineEvent,
  type EngineStreamOptions,
} from "@agent-native/core/agent/engine";

registerAgentEngine({
  name: "my-engine",
  label: "My Custom Engine",
  description: "...",
  capabilities: {
    thinking: false,
    promptCaching: false,
    vision: false,
    computerUse: false,
    parallelToolCalls: true,
  },
  defaultModel: "my-model-v1",
  supportedModels: ["my-model-v1", "my-model-v2"],
  requiredEnvVars: ["MY_ENGINE_API_KEY"],
  create: (config): AgentEngine => ({
    name: "my-engine",
    label: "My Custom Engine",
    defaultModel: "my-model-v1",
    supportedModels: ["my-model-v1", "my-model-v2"],
    capabilities: {
      /* same shape as above */
    } as any,
    async *stream(opts: EngineStreamOptions): AsyncIterable<EngineEvent> {
      // yield text-delta / thinking-delta / tool-call / usage events
      // as they arrive, then:
      yield { type: "assistant-content", parts: /* final content parts */ [] };
      yield { type: "stop", reason: "end_turn" };
    },
  }),
});

Engine stream contract

Every engine's stream(opts) MUST emit, in order:

  1. Zero or more text-delta, thinking-delta, tool-call, and usage events as they arrive from the model.
  2. Exactly one { type: "assistant-content", parts } event with the structured content for the turn. runAgentLoop reads this to reconstruct the assistant message for the next turn.
  3. Exactly one terminal { type: "stop", reason } event.

After registering, the engine appears in list-agent-engines output and can be selected via set-agent-engine.

Env Vars Reference

VariablePurpose
ANTHROPIC_API_KEYRequired for anthropic and ai-sdk:anthropic engines
OPENAI_API_KEYRequired for ai-sdk:openai
OPENROUTER_API_KEYRequired for ai-sdk:openrouter
GOOGLE_GENERATIVE_AI_API_KEYRequired for ai-sdk:google
GROQ_API_KEYRequired for ai-sdk:groq
MISTRAL_API_KEYRequired for ai-sdk:mistral
COHERE_API_KEYRequired for ai-sdk:cohere
AGENT_ENGINEDefault engine name (overridden by settings store)

Signals

GitHub stars
7k
Forks
613
Last commit
Sep 2026
Advanced
Item type
skill
Key
agent-engines
Source
github.com/builderio/agent-native