Complete command-line reference for openfang, the CLI tool for the OpenFang Agent OS.
The openfang binary is the primary interface for managing the OpenFang Agent OS. It supports two modes of operation:
- Daemon mode -- When a daemon is running (
openfang start), CLI commands communicate with it over HTTP. This is the recommended mode for production use. - In-process mode -- When no daemon is detected, commands that support it will boot an ephemeral in-process kernel. Agents spawned in this mode are not persisted and will be lost when the process exits.
Running openfang with no subcommand launches the interactive TUI (terminal user interface) built with ratatui, which provides a full dashboard experience in the terminal.
cargo install --path crates/openfang-clicargo build --release -p openfang-cli
# Binary: target/release/openfang (or openfang.exe on Windows)docker run -it openfang/openfang:latestcurl -fsSL https://get.openfang.ai | shThese options apply to all commands.
| Option | Description |
|---|---|
--config <PATH> |
Path to a custom config file. Overrides the default ~/.openfang/config.toml. |
--help |
Print help information for any command or subcommand. |
--version |
Print the version of the openfang binary. |
Environment variables:
| Variable | Description |
|---|---|
RUST_LOG |
Controls log verbosity (e.g. info, debug, openfang_kernel=trace). |
OPENFANG_AGENTS_DIR |
Override the agent templates directory. |
EDITOR / VISUAL |
Editor used by openfang config edit. Falls back to notepad (Windows) or vi (Unix). |
Launch the interactive TUI dashboard.
openfang [--config <PATH>]
The TUI provides a full-screen terminal interface with panels for agents, chat, workflows, channels, skills, settings, and more. Tracing output is redirected to ~/.openfang/tui.log to avoid corrupting the terminal display.
Press Ctrl+C to exit. A second Ctrl+C force-exits the process.
Initialize the OpenFang workspace. Creates ~/.openfang/ with subdirectories (data/, agents/) and a default config.toml.
openfang init [--quick]
Options:
| Option | Description |
|---|---|
--quick |
Skip interactive prompts. Auto-detects the best available LLM provider and writes config immediately. Suitable for CI/scripts. |
Behavior:
- Without
--quick: Launches an interactive 5-step onboarding wizard (ratatui TUI) that walks through provider selection, API key configuration, and optionally starts the daemon. - With
--quick: Auto-detects providers by checking environment variables in priority order: Groq, Gemini, DeepSeek, Anthropic, OpenAI, OpenRouter. Falls back to Groq if none are found. - File permissions are restricted to owner-only (
0600for files,0700for directories) on Unix.
Example:
# Interactive setup
openfang init
# Non-interactive (CI/scripts)
export GROQ_API_KEY="gsk_..."
openfang init --quickStart the OpenFang daemon (kernel + API server).
openfang start [--config <PATH>]
Behavior:
- Checks if a daemon is already running; exits with an error if so.
- Boots the OpenFang kernel (loads config, initializes SQLite database, loads agents, connects MCP servers, starts background tasks).
- Starts the HTTP API server on the address specified in
config.toml(default:127.0.0.1:4200). - Writes
daemon.jsonto~/.openfang/so other CLI commands can discover the running daemon. - Blocks until interrupted with
Ctrl+C.
Output:
OpenFang Agent OS v0.1.0
Starting daemon...
[ok] Kernel booted (groq/llama-3.3-70b-versatile)
[ok] 50 models available
[ok] 3 agent(s) loaded
API: http://127.0.0.1:4200
Dashboard: http://127.0.0.1:4200/
Provider: groq
Model: llama-3.3-70b-versatile
hint: Open the dashboard in your browser, or run `openfang chat`
hint: Press Ctrl+C to stop the daemon
Example:
# Start with default config
openfang start
# Start with custom config
openfang start --config /path/to/config.tomlShow the current kernel/daemon status.
openfang status [--json]
Options:
| Option | Description |
|---|---|
--json |
Output machine-readable JSON for scripting. |
Behavior:
- If a daemon is running: queries
GET /api/statusand displays agent count, provider, model, uptime, API URL, data directory, and lists active agents. - If no daemon is running: boots an in-process kernel and shows persisted state. Displays a warning that the daemon is not running.
Example:
openfang status
openfang status --json | jq '.agent_count'Run diagnostic checks on the OpenFang installation.
openfang doctor [--json] [--repair]
Options:
| Option | Description |
|---|---|
--json |
Output results as JSON for scripting. |
--repair |
Attempt to auto-fix issues (create missing directories, config, remove stale files). Prompts for confirmation before each repair. |
Checks performed:
- OpenFang directory --
~/.openfang/exists - .env file -- exists and has correct permissions (0600 on Unix)
- Config TOML syntax --
config.tomlparses without errors - Daemon status -- whether a daemon is running
- Port 4200 availability -- if daemon is not running, checks if the port is free
- Stale daemon.json -- leftover
daemon.jsonfrom a crashed daemon - Database file -- SQLite magic bytes validation
- Disk space -- warns if less than 100MB available (Unix only)
- Agent manifests -- validates all
.tomlfiles in~/.openfang/agents/ - LLM provider keys -- checks env vars for 10 providers (Groq, OpenRouter, Anthropic, OpenAI, DeepSeek, Gemini, Google, Together, Mistral, Fireworks), performs live validation (401/403 detection)
- Channel tokens -- format validation for Telegram, Discord, Slack tokens
- Config consistency -- checks that
api_key_envreferences in config match actual environment variables - Rust toolchain --
rustc --version
Example:
openfang doctor
openfang doctor --repair
openfang doctor --jsonOpen the web dashboard in the default browser.
openfang dashboard
Behavior:
- Requires a running daemon.
- Opens the daemon URL (e.g.
http://127.0.0.1:4200/) in the system browser. - Copies the URL to the system clipboard (uses PowerShell on Windows,
pbcopyon macOS,xclip/xselon Linux).
Example:
openfang dashboardGenerate shell completion scripts.
openfang completion <SHELL>
Arguments:
| Argument | Description |
|---|---|
<SHELL> |
Target shell. One of: bash, zsh, fish, elvish, powershell. |
Example:
# Bash
openfang completion bash > ~/.bash_completion.d/openfang
# Zsh
openfang completion zsh > ~/.zfunc/_openfang
# Fish
openfang completion fish > ~/.config/fish/completions/openfang.fish
# PowerShell
openfang completion powershell > openfang.ps1Spawn an agent from a built-in template.
openfang agent new [<TEMPLATE>]
Arguments:
| Argument | Description |
|---|---|
<TEMPLATE> |
Template name (e.g. coder, assistant, researcher). If omitted, displays an interactive picker listing all available templates. |
Behavior:
- Templates are discovered from: the repo
agents/directory (dev builds),~/.openfang/agents/(installed), andOPENFANG_AGENTS_DIR(env override). - Each template is a directory containing an
agent.tomlmanifest. - In daemon mode: sends
POST /api/agentswith the manifest. Agent is persistent. - In standalone mode: boots an in-process kernel. Agent is ephemeral.
Example:
# Interactive picker
openfang agent new
# Spawn by name
openfang agent new coder
# Spawn the assistant template
openfang agent new assistantSpawn an agent from a custom manifest file.
openfang agent spawn <MANIFEST>
Arguments:
| Argument | Description |
|---|---|
<MANIFEST> |
Path to an agent manifest TOML file. |
Behavior:
- Reads and parses the TOML manifest file.
- In daemon mode: sends the raw TOML to
POST /api/agents. - In standalone mode: boots an in-process kernel and spawns the agent locally.
Example:
openfang agent spawn ./my-agent/agent.tomlList all running agents.
openfang agent list [--json]
Options:
| Option | Description |
|---|---|
--json |
Output as JSON array for scripting. |
Output columns: ID, NAME, STATE, PROVIDER, MODEL (daemon mode) or ID, NAME, STATE, CREATED (in-process mode).
Example:
openfang agent list
openfang agent list --json | jq '.[].name'Start an interactive chat session with a specific agent.
openfang agent chat <AGENT_ID>
Arguments:
| Argument | Description |
|---|---|
<AGENT_ID> |
Agent UUID. Obtain from openfang agent list. |
Behavior:
- Opens a REPL-style chat loop.
- Type messages at the
you>prompt. - Agent responses display at the
agent>prompt, followed by token usage and iteration count. - Type
exit,quit, or pressCtrl+Cto end the session.
Example:
openfang agent chat a1b2c3d4-e5f6-7890-abcd-ef1234567890Terminate a running agent.
openfang agent kill <AGENT_ID>
Arguments:
| Argument | Description |
|---|---|
<AGENT_ID> |
Agent UUID to terminate. |
Example:
openfang agent kill a1b2c3d4-e5f6-7890-abcd-ef1234567890All workflow commands require a running daemon.
List all registered workflows.
openfang workflow list
Output columns: ID, NAME, STEPS, CREATED.
Create a workflow from a JSON definition file.
openfang workflow create <FILE>
Arguments:
| Argument | Description |
|---|---|
<FILE> |
Path to a JSON file describing the workflow steps. |
Example:
openfang workflow create ./my-workflow.jsonExecute a workflow by ID.
openfang workflow run <WORKFLOW_ID> <INPUT>
Arguments:
| Argument | Description |
|---|---|
<WORKFLOW_ID> |
Workflow UUID. Obtain from openfang workflow list. |
<INPUT> |
Input text to pass to the workflow. |
Example:
openfang workflow run abc123 "Analyze this code for security issues"All trigger commands require a running daemon.
List all event triggers.
openfang trigger list [--agent-id <ID>]
Options:
| Option | Description |
|---|---|
--agent-id <ID> |
Filter triggers by the owning agent's UUID. |
Output columns: TRIGGER ID, AGENT ID, ENABLED, FIRES, PATTERN.
Create an event trigger for an agent.
openfang trigger create <AGENT_ID> <PATTERN_JSON> [--prompt <TEMPLATE>] [--max-fires <N>]
Arguments:
| Argument | Description |
|---|---|
<AGENT_ID> |
UUID of the agent that owns the trigger. |
<PATTERN_JSON> |
Trigger pattern as a JSON string. |
Options:
| Option | Default | Description |
|---|---|---|
--prompt <TEMPLATE> |
"Event: {{event}}" |
Prompt template. Use {{event}} as a placeholder for the event data. |
--max-fires <N> |
0 (unlimited) |
Maximum number of times the trigger will fire. |
Pattern examples:
# Fire on any lifecycle event
openfang trigger create <AGENT_ID> '{"lifecycle":{}}'
# Fire when a specific agent is spawned
openfang trigger create <AGENT_ID> '{"agent_spawned":{"name_pattern":"*"}}'
# Fire on agent termination
openfang trigger create <AGENT_ID> '{"agent_terminated":{}}'
# Fire on all events (limited to 10 fires)
openfang trigger create <AGENT_ID> '{"all":{}}' --max-fires 10Delete a trigger by ID.
openfang trigger delete <TRIGGER_ID>
Arguments:
| Argument | Description |
|---|---|
<TRIGGER_ID> |
UUID of the trigger to delete. |
List all installed skills.
openfang skill list
Output columns: NAME, VERSION, TOOLS, DESCRIPTION.
Loads skills from ~/.openfang/skills/ plus bundled skills compiled into the binary.
Install a skill from a local directory, git URL, or FangHub marketplace.
openfang skill install <SOURCE>
Arguments:
| Argument | Description |
|---|---|
<SOURCE> |
Skill name (FangHub), local directory path, or git URL. |
Behavior:
- Local directory: Looks for
skill.tomlin the directory. If not found, checks for OpenClaw-format skills (SKILL.md with YAML frontmatter) and auto-converts them. - Remote (FangHub): Fetches and installs from the FangHub marketplace. Skills pass through SHA256 verification and prompt injection scanning.
Example:
# Install from local directory
openfang skill install ./my-skill/
# Install from FangHub
openfang skill install web-search
# Install an OpenClaw-format skill
openfang skill install ./openclaw-skill/Remove an installed skill.
openfang skill remove <NAME>
Arguments:
| Argument | Description |
|---|---|
<NAME> |
Name of the skill to remove. |
Example:
openfang skill remove web-searchSearch the FangHub marketplace for skills.
openfang skill search <QUERY>
Arguments:
| Argument | Description |
|---|---|
<QUERY> |
Search query string. |
Example:
openfang skill search "docker kubernetes"Interactively scaffold a new skill project.
openfang skill create
Behavior:
Prompts for:
- Skill name
- Description
- Runtime (
python,node, orwasm; defaults topython)
Creates a directory under ~/.openfang/skills/<name>/ with:
skill.toml-- manifest filesrc/main.py(orsrc/index.js) -- entry point with boilerplate
Example:
openfang skill create
# Skill name: my-tool
# Description: A custom analysis tool
# Runtime (python/node/wasm) [python]: pythonList configured channels and their status.
openfang channel list
Output columns: CHANNEL, ENV VAR, STATUS.
Checks config.toml for channel configuration sections and environment variables for required tokens. Status is one of: Ready, Missing env, Not configured.
Channels checked: webchat, telegram, discord, slack, whatsapp, signal, matrix, email.
Interactive setup wizard for a channel integration.
openfang channel setup [<CHANNEL>]
Arguments:
| Argument | Description |
|---|---|
<CHANNEL> |
Channel name. If omitted, displays an interactive picker. |
Supported channels: telegram, discord, slack, whatsapp, email, signal, matrix.
Each wizard:
- Displays step-by-step instructions for obtaining credentials.
- Prompts for tokens/credentials.
- Saves tokens to
~/.openfang/.envwith owner-only permissions. - Appends the channel configuration block to
config.toml(prompts for confirmation). - Warns to restart the daemon if one is running.
Example:
# Interactive picker
openfang channel setup
# Direct setup
openfang channel setup telegram
openfang channel setup discord
openfang channel setup slackSend a test message through a configured channel.
openfang channel test <CHANNEL>
Arguments:
| Argument | Description |
|---|---|
<CHANNEL> |
Channel name to test. |
Requires a running daemon. Sends POST /api/channels/<channel>/test.
Example:
openfang channel test telegramEnable a channel integration.
openfang channel enable <CHANNEL>
Arguments:
| Argument | Description |
|---|---|
<CHANNEL> |
Channel name to enable. |
In daemon mode: sends POST /api/channels/<channel>/enable. Without a daemon: prints a note that the change will take effect on next start.
Disable a channel without removing its configuration.
openfang channel disable <CHANNEL>
Arguments:
| Argument | Description |
|---|---|
<CHANNEL> |
Channel name to disable. |
In daemon mode: sends POST /api/channels/<channel>/disable. Without a daemon: prints a note to edit config.toml.
Display the current configuration file.
openfang config show
Prints the contents of ~/.openfang/config.toml with the file path as a header comment.
Open the configuration file in your editor.
openfang config edit
Uses $EDITOR, then $VISUAL, then falls back to notepad (Windows) or vi (Unix).
Get a single configuration value by dotted key path.
openfang config get <KEY>
Arguments:
| Argument | Description |
|---|---|
<KEY> |
Dotted key path into the TOML structure. |
Example:
openfang config get default_model.provider
# groq
openfang config get api_listen
# 127.0.0.1:4200
openfang config get memory.decay_rate
# 0.05Set a configuration value by dotted key path.
openfang config set <KEY> <VALUE>
Arguments:
| Argument | Description |
|---|---|
<KEY> |
Dotted key path. |
<VALUE> |
New value. Type is inferred from the existing value (integer, float, boolean, or string). |
Warning: This command re-serializes the TOML file, which strips all comments.
Example:
openfang config set default_model.provider anthropic
openfang config set default_model.model claude-sonnet-4-20250514
openfang config set api_listen "0.0.0.0:4200"Save an LLM provider API key to ~/.openfang/.env.
openfang config set-key <PROVIDER>
Arguments:
| Argument | Description |
|---|---|
<PROVIDER> |
Provider name (e.g. groq, anthropic, openai, gemini, deepseek, openrouter, together, mistral, fireworks, perplexity, cohere, xai, brave, tavily). |
Behavior:
- Prompts interactively for the API key.
- Saves to
~/.openfang/.envas<PROVIDER_NAME>_API_KEY=<value>. - Runs a live validation test against the provider's API.
- File permissions are restricted to owner-only on Unix.
Example:
openfang config set-key groq
# Paste your groq API key: gsk_...
# [ok] Saved GROQ_API_KEY to ~/.openfang/.env
# Testing key... OKRemove an API key from ~/.openfang/.env.
openfang config delete-key <PROVIDER>
Arguments:
| Argument | Description |
|---|---|
<PROVIDER> |
Provider name. |
Example:
openfang config delete-key openaiTest provider connectivity with the stored API key.
openfang config test-key <PROVIDER>
Arguments:
| Argument | Description |
|---|---|
<PROVIDER> |
Provider name. |
Behavior:
- Reads the API key from the environment (loaded from
~/.openfang/.env). - Hits the provider's models/health endpoint.
- Reports
OK(key accepted) orFAILED (401/403)(key rejected). - Exits with code 1 on failure.
Example:
openfang config test-key groq
# Testing groq (GROQ_API_KEY)... OKQuick alias for starting a chat session.
openfang chat [<AGENT>]
Arguments:
| Argument | Description |
|---|---|
<AGENT> |
Optional agent name or UUID. |
Behavior:
- Daemon mode: Finds the agent by name or ID among running agents. If no agent name is given, uses the first available agent. If no agents exist, suggests
openfang agent new. - Standalone mode (no daemon): Boots an in-process kernel and auto-spawns an agent from templates. Searches for an agent matching the given name, then falls back to
assistant, then to the first available template.
This is the simplest way to start chatting -- it works with or without a daemon.
Example:
# Chat with the default agent
openfang chat
# Chat with a specific agent by name
openfang chat coder
# Chat with a specific agent by UUID
openfang chat a1b2c3d4-e5f6-7890-abcd-ef1234567890Migrate configuration and agents from another agent framework.
openfang migrate --from <FRAMEWORK> [--source-dir <PATH>] [--dry-run]
Options:
| Option | Description |
|---|---|
--from <FRAMEWORK> |
Source framework. One of: openclaw, langchain, autogpt. |
--source-dir <PATH> |
Path to the source workspace. Auto-detected if not set (e.g. ~/.openclaw, ~/.langchain, ~/Auto-GPT). |
--dry-run |
Show what would be imported without making changes. |
Behavior:
- Converts agent configurations, YAML manifests, and settings from the source framework into OpenFang format.
- Saves imported data to
~/.openfang/. - Writes a
migration_report.mdsummarizing what was imported.
Example:
# Dry run migration from OpenClaw
openfang migrate --from openclaw --dry-run
# Migrate from OpenClaw (auto-detect source)
openfang migrate --from openclaw
# Migrate from LangChain with explicit source
openfang migrate --from langchain --source-dir /home/user/.langchain
# Migrate from AutoGPT
openfang migrate --from autogptStart an MCP (Model Context Protocol) server over stdio.
openfang mcp
Behavior:
- Exposes running OpenFang agents as MCP tools via JSON-RPC 2.0 over stdin/stdout with Content-Length framing.
- Each agent becomes a callable tool named
openfang_agent_<name>(hyphens replaced with underscores). - Connects to a running daemon via HTTP if available; otherwise boots an in-process kernel.
- Protocol version:
2024-11-05. - Maximum message size: 10MB (security limit).
Supported MCP methods:
| Method | Description |
|---|---|
initialize |
Returns server capabilities and info. |
tools/list |
Lists all available agent tools. |
tools/call |
Sends a message to an agent and returns the response. |
Tool input schema:
Each agent tool accepts a single message (string) argument.
Integration with Claude Desktop / other MCP clients:
Add to your MCP client configuration:
{
"mcpServers": {
"openfang": {
"command": "openfang",
"args": ["mcp"]
}
}
}The CLI uses a two-step mechanism to detect a running daemon:
-
Read
daemon.json: On startup, the daemon writes~/.openfang/daemon.jsoncontaining the listen address (e.g.127.0.0.1:4200). The CLI reads this file to learn where the daemon is. -
Health check: The CLI sends
GET http://<listen_addr>/api/healthwith a 2-second timeout. If the health check succeeds, the daemon is considered running and the CLI uses HTTP to communicate with it.
If either step fails (no daemon.json, stale file, health check timeout), the CLI falls back to in-process mode for commands that support it. Commands that require a daemon (workflows, triggers, channel test/enable/disable, dashboard) will exit with an error and a helpful message.
Daemon lifecycle:
openfang start # Starts daemon, writes daemon.json
# Other CLI instances detect daemon.json
openfang status # Connects to daemon via HTTP
Ctrl+C # Daemon shuts down, daemon.json removed
openfang doctor --repair # Cleans up stale daemon.json from crashes
OpenFang loads ~/.openfang/.env into the process environment on every CLI invocation. System environment variables take priority over .env values.
The .env file stores API keys and secrets:
GROQ_API_KEY=gsk_...
ANTHROPIC_API_KEY=sk-ant-...
GEMINI_API_KEY=AIza...
TELEGRAM_BOT_TOKEN=123456:ABC-DEF...Manage keys with the config set-key / config delete-key commands rather than editing the file directly, as these commands enforce correct permissions.
| Code | Meaning |
|---|---|
0 |
Success. |
1 |
General error (invalid arguments, failed operations, missing daemon, parse errors, spawn failures). |
130 |
Interrupted by second Ctrl+C (force exit). |
# 1. Set your API key
export GROQ_API_KEY="gsk_your_key_here"
# 2. Initialize OpenFang
openfang init --quick
# 3. Start the daemon
openfang start# Quick chat (auto-spawns agent if needed)
openfang chat
# Chat with a specific agent
openfang chat coder
# Check what's running
openfang status
# Open the web dashboard
openfang dashboard# Spawn from a template
openfang agent new assistant
# Spawn from a custom manifest
openfang agent spawn ./agents/custom-agent/agent.toml
# List running agents
openfang agent list
# Chat with an agent by UUID
openfang agent chat <UUID>
# Kill an agent
openfang agent kill <UUID># Create a workflow
openfang workflow create ./review-pipeline.json
# List workflows
openfang workflow list
# Run a workflow
openfang workflow run <WORKFLOW_ID> "Review the latest PR"# Create a trigger that fires on agent spawn
openfang trigger create <AGENT_ID> '{"agent_spawned":{"name_pattern":"*"}}' \
--prompt "New agent spawned: {{event}}" \
--max-fires 100
# List all triggers
openfang trigger list
# List triggers for a specific agent
openfang trigger list --agent-id <AGENT_ID>
# Delete a trigger
openfang trigger delete <TRIGGER_ID># Search FangHub
openfang skill search "code review"
# Install a skill
openfang skill install code-reviewer
# List installed skills
openfang skill list
# Create a new skill
openfang skill create
# Remove a skill
openfang skill remove code-reviewer# Interactive channel picker
openfang channel setup
# Direct channel setup
openfang channel setup telegram
# Check channel status
openfang channel list
# Test a channel
openfang channel test telegram
# Enable/disable channels
openfang channel enable discord
openfang channel disable slack# View config
openfang config show
# Get a specific value
openfang config get default_model.provider
# Change provider
openfang config set default_model.provider anthropic
openfang config set default_model.model claude-sonnet-4-20250514
openfang config set default_model.api_key_env ANTHROPIC_API_KEY
# Manage API keys
openfang config set-key anthropic
openfang config test-key anthropic
openfang config delete-key openai
# Open in editor
openfang config edit# Preview migration
openfang migrate --from openclaw --dry-run
# Run migration
openfang migrate --from openclaw
# Migrate from LangChain
openfang migrate --from langchain --source-dir ~/.langchain# Start MCP server for Claude Desktop or other MCP clients
openfang mcp# Run all diagnostic checks
openfang doctor
# Auto-repair issues
openfang doctor --repair
# Machine-readable diagnostics
openfang doctor --json# Generate and install completions for your shell
openfang completion bash >> ~/.bashrc
openfang completion zsh > "${fpath[1]}/_openfang"
openfang completion fish > ~/.config/fish/completions/openfang.fishThe following providers are recognized by openfang config set-key and openfang doctor:
| Provider | Environment Variable | Default Model |
|---|---|---|
| Groq | GROQ_API_KEY |
llama-3.3-70b-versatile |
| Gemini | GEMINI_API_KEY or GOOGLE_API_KEY |
gemini-2.5-flash |
| DeepSeek | DEEPSEEK_API_KEY |
deepseek-chat |
| Anthropic | ANTHROPIC_API_KEY |
claude-sonnet-4-20250514 |
| OpenAI | OPENAI_API_KEY |
gpt-4o |
| OpenRouter | OPENROUTER_API_KEY |
openrouter/google/gemini-2.5-flash |
| Together | TOGETHER_API_KEY |
-- |
| Mistral | MISTRAL_API_KEY |
-- |
| Fireworks | FIREWORKS_API_KEY |
-- |
| Perplexity | PERPLEXITY_API_KEY |
-- |
| Cohere | COHERE_API_KEY |
-- |
| xAI | XAI_API_KEY |
-- |
Additional search/fetch provider keys: BRAVE_API_KEY, TAVILY_API_KEY.