Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Deep reference on Omnigent config format, executor types, skill/tool structure, and conventions. Load when you need to look up how the platform works.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 175% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 119% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 160% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 104% | 0% |
| case-24 | ✗→✓ | ▲ Improved | 253% | 0% |
Agent plane is a server that hosts, manages, and executes agents via an OpenResponses-compatible API. Users create agent directories (also called agent images) that contain configuration, instructions, skills, and tools. The server loads these directories and serves them via HTTP.
my-agent/
├── config.yaml # REQUIRED — agent spec
├── AGENTS.md # Recommended — instructions/personality
├── skills/ # Optional — load-on-demand skills
│ └── <skill-name>/
│ └── SKILL.md
├── tools/ # Optional — packaged tools
│ ├── python/ # Local Python tools (auto-discovered *.py)
│ ├── typescript/ # Local TypeScript tools (auto-discovered *.ts)
│ └── mcp/ # MCP server declarations (*.yaml)
└── agents/ # Optional — sub-agent directories (recursive)
└── <agent-name>/
├── config.yaml
└── ...The only required file. All fields except spec_version are optional.
yamlspec_version: 1 # REQUIRED, must be 1 name: my-agent # Display name description: Does X and Y. # One-line summary # Instructions — path to a file or inline text. # Default: looks for AGENTS.md in the agent directory. instructions: AGENTS.md executor: # REQUIRED area. type must be one of: claude_sdk | agents_sdk | omnigent. # There is NO `llm` executor type. type: claude_sdk # Anthropic Claude SDK, in-process (simplest) # type: agents_sdk — OpenAI Agents SDK, in-process # type: omnigent — subprocess harness; requires config.harness below # Only for type: omnigent — pick the harness that runs the loop. # One of: claude-native | claude-sdk | codex-native | codex | # openai-agents | open-responses | pi # config: # harness: claude-native # permission_mode: bypassPermissions # claude-native headless # yolo: true # codex-native headless # Model is OPTIONAL — omit to use the configured provider's default. # Pin one directly on the executor when needed: # model: anthropic/claude-sonnet-4-20250514 # LiteLLM provider/model # model: databricks-claude-opus-4-7 # or a serving-endpoint name # connection: # provider credentials # api_key: ${ANTHROPIC_API_KEY} # auth: # or Databricks profile auth # type: databricks # profile: oss timeout: 3600 # Task deadline in seconds (default: 3600) max_iterations: 1000 # Max LLM calls per task (default: 1000) # os_env — grant filesystem/shell access (harness agents). Exposes # sys_os_read / sys_os_write / sys_os_edit / sys_os_shell. os_env: type: caller_process cwd: . sandbox: type: none # or linux_bwrap / darwin_seatbelt to sandbox # guardrails — runtime policy gates (optional). guardrails: ask_timeout: 86400 # seconds to wait on an approval prompt policies: blast_radius: type: function function: path: omnigent.inner.nessie.policies.blast_radius interaction: conversational: true # Maintain turn history (default: true) modalities: input: [text, image, file] # default: [text] output: [text] # default: [text] tools: # Sub-agents this agent can spawn (must match agents/ subdirectories) agents: - researcher - summarizer # Built-in tools — string name or dict with config builtins: - web_search # auto-detects backend based on model provider - terminal_run # persistent bash shell scoped to the conversation - upload_file - search_conversations timeout: 60 # Default tool timeout in seconds params: # Arbitrary key-value (readable by skills/tools) max_results: 10
| Type | When to use | How it works | |------|------------|--------------| | claude_sdk | New simple agents; existing Claude SDK code | In-process Anthropic Claude SDK; it manages its own loop | | agents_sdk | New simple agents; existing OpenAI Agents SDK code | In-process OpenAI Agents SDK runner | | omnigent | Coding/CLI harnesses, shell + file tools, sub-agents | Spawns a subprocess harness selected by config.harness |
There is no llm executor type — the only valid values are claude_sdk, agents_sdk, and omnigent. For most new simple agents, use claude_sdk (or agents_sdk) — in-process, no extra config. Use omnigent when the agent needs a specific harness, shell/file access, or sub-agents; it requires a config.harness:
| config.harness | What it is | |------------------|------------| | claude-native (alias claude) | Claude Code — full coding tools, native permissions | | claude-sdk | Claude Agent SDK loop | | codex-native / codex | Codex CLI / harness | | openai-agents | OpenAI Agents harness (any gateway model) | | open-responses | OpenResponses-compatible harness | | pi | Headless multi-model worker (bridged sys_os_* tools) |
Free-form markdown. This becomes the agent-authored portion of the system prompt; Omnigent may append framework-owned lifecycle or metadata instructions at runtime. Best practices:
Each skill lives in skills/<skill-name>/SKILL.md:
markdown--- name: deep-research description: Investigate a topic in depth using web search and source synthesis. --- When researching a topic: 1. Search broadly first using web search... 2. Cross-reference multiple sources...
Rules:
name and description (both required)name must match the directory name, be lowercase, use [a-z0-9-]+Call list_builtin_tools to get the current set of available built-in tools and their descriptions. Do not rely on a hardcoded list — new tools may be added at any time.
Tool recommendation guide:
web_search + web_fetchterminal_run + upload_fileterminal_run + upload_file + download_fileweb_search for current info)MCP (Model Context Protocol) lets agents connect to external services — databases, APIs, Slack, GitHub, etc. Each MCP server is declared as a YAML file in tools/mcp/:
my-agent/
tools/
mcp/
github.yaml
slack.yamlMCP server config format (tools/mcp/github.yaml):
yamltransport: http url: https://mcp-server.example.com/sse headers: Authorization: Bearer ${GITHUB_TOKEN}
transport: must be httpurl: the MCP server's SSE endpoint URLheaders: optional auth headers (use ${ENV_VAR} for secrets)When to recommend MCP:
Finding MCP servers: Use web_search (if available) or web_fetch to search for available MCP servers. Good starting points:
"Postgres MCP server")
If the user mentions a specific service they want to connect to, use web_search or web_fetch to find if an MCP server exists for it and how to configure it.
What to tell the user: MCP servers are external processes that expose tools via HTTP. The user needs to run the MCP server separately (or use a hosted one) and provide the URL in the config.
Python files in tools/python/ are auto-discovered. Each @tool-decorated module-level function in those files becomes a separate tool — one file may export many tools. The decorator derives the JSON schema from the function's type hints and Google-style docstring.
python# tools/python/my_tools.py from omnigent.tools import tool @tool def my_tool(text: str, count: int = 1) -> str: """ Repeat the text count times. Args: text: The text to repeat. count: Number of repetitions (default 1). """ return text * count
Authoring rules:
lambda, or nested function (the decorator rejects those at decoration time with a clear error).
concrete types — Any and object produce permissive schemas with no validation.
not collide with built-in tools or with other custom tools in the same agent (collisions fail loud at agent load).
def and async def are supported. Sync def bodies arewrapped in asyncio.to_thread automatically so they don't block the event loop.
BaseModel arguments are first-class — they getexpanded into the schema correctly with full validation.
When to recommend local tools: When the user needs custom logic that isn't covered by builtins or MCP servers.
yamlspec_version: 1 name: my-assistant description: A helpful assistant. executor: type: claude_sdk instructions: | You are a helpful assistant. Answer questions clearly and concisely.
This is the simplest valid agent — a name, an executor, and instructions. No model is pinned, so it uses the configured provider's default. No skills, no tools, no sub-agents.
yamlspec_version: 1 name: researcher description: A research agent that searches the web and synthesizes findings. executor: type: agents_sdk tools: builtins: - web_search - upload_file interaction: modalities: input: [text, file] output: [text] instructions: AGENTS.md
An agent can spawn child agents to delegate tasks. Sub-agents are full agents with their own config.yaml, living in the agents/ directory:
my-agent/
config.yaml
AGENTS.md
agents/
researcher/
config.yaml # sub-agent spec
fact-checker/
config.yaml # another sub-agentThe parent's config.yaml lists sub-agent names under tools.agents:
yamltools: agents: - researcher - fact-checker builtins: - web_search
Each name must match a directory under agents/. The parent must use executor.type: omnigent — that's what provides the spawn tools. Each sub-agent is a full agent and may use any executor (claude_sdk, agents_sdk, or omnigent).
Each sub-agent has its own complete config.yaml:
yaml# agents/researcher/config.yaml spec_version: 1 name: researcher description: Sub-agent that searches the web for information. executor: type: claude_sdk tools: builtins: - web_search - web_fetch instructions: | You are a researcher. When given a topic, search the web and return a summary with sources.
The parent agent gets sys_session_send (singular), check_task, and sys_cancel_task tools automatically when sub-agents are declared. The parent's AGENTS.md should reference them:
markdownYou have two sub-agents you can delegate to: - **researcher** — searches the web for information - **fact-checker** — verifies claims with evidence Call `sys_session_send(type="<name>", input="<task>")` to dispatch one. Emit multiple `sys_session_send` tool calls in the same response to run sub-agents in parallel. Each result auto- delivers as a system message when ready — `check_task` polls, `sys_cancel_task` aborts.
For simple agents, sub-agents are overkill. Only suggest them when the user describes a workflow with distinct steps or roles.
Once the agent directory is created:
bash# Start the server with the agent pre-registered ap server --agent ./my-agent/ # Or deploy to a running server ap deploy ./my-agent/ --server http://localhost:6767
Other measured skills in the registry, with their headline benchmark lift.