|
Download docs/core/subagents.md from SaylorTwift/gemini-cli: direct link, hf CLI and curl.
- Browser
- Download file 23.6 kB
-
https://huggingface.co/SaylorTwift/gemini-cli/resolve/main/docs/core/subagents.md
- Command line
-
hf download hf://SaylorTwift/gemini-cli/docs/core/subagents.md
-
curl -L -o subagents.md https://huggingface.co/SaylorTwift/gemini-cli/resolve/main/docs/core/subagents.md
23.6 kB
| # Subagents | |
| Subagents are specialized agents that operate within your main Gemini CLI | |
| session. They are designed to handle specific, complex tasks—like deep codebase | |
| analysis, documentation lookup, or domain-specific reasoning—without cluttering | |
| the main agent's context or toolset. | |
| ## What are subagents? | |
| Subagents are "specialists" that the main Gemini agent can hire for a specific | |
| job. | |
| - **Focused context:** Each subagent has its own system prompt and persona. | |
| - **Specialized tools:** Subagents can have a restricted or specialized set of | |
| tools. | |
| - **Independent context window:** Interactions with a subagent happen in a | |
| separate context loop, which saves tokens in your main conversation history. | |
| Subagents are exposed to the main agent as a tool of the same name. When the | |
| main agent calls the tool, it delegates the task to the subagent. Once the | |
| subagent completes its task, it reports back to the main agent with its | |
| findings. | |
| ## How to use subagents | |
| You can use subagents through automatic delegation or by explicitly forcing them | |
| in your prompt. | |
| ### Automatic delegation | |
| Gemini CLI's main agent is instructed to use specialized subagents when a task | |
| matches their expertise. For example, if you ask "How does the auth system | |
| work?", the main agent may decide to call the `codebase_investigator` subagent | |
| to perform the research. | |
| ### Forcing a subagent (@ syntax) | |
| You can explicitly direct a task to a specific subagent by using the `@` symbol | |
| followed by the subagent's name at the beginning of your prompt. This is useful | |
| when you want to bypass the main agent's decision-making and go straight to a | |
| specialist. | |
| **Example:** | |
| ```bash | |
| @codebase_investigator Map out the relationship between the AgentRegistry and the LocalAgentExecutor. | |
| ``` | |
| When you use the `@` syntax, the CLI injects a system note that nudges the | |
| primary model to use that specific subagent tool immediately. | |
| ## Built-in subagents | |
| Gemini CLI comes with the following built-in subagents: | |
| ### Codebase Investigator | |
| - **Name:** `codebase_investigator` | |
| - **Purpose:** Analyze the codebase, reverse engineer, and understand complex | |
| dependencies. | |
| - **When to use:** "How does the authentication system work?", "Map out the | |
| dependencies of the `AgentRegistry` class." | |
| - **Configuration:** Enabled by default. You can override its settings in | |
| `settings.json` under `agents.overrides`. Example (forcing a specific model | |
| and increasing turns): | |
| ```json | |
| { | |
| "agents": { | |
| "overrides": { | |
| "codebase_investigator": { | |
| "modelConfig": { "model": "gemini-3-flash-preview" }, | |
| "runConfig": { "maxTurns": 50 } | |
| } | |
| } | |
| } | |
| } | |
| ``` | |
| ### CLI Help Agent | |
| - **Name:** `cli_help` | |
| - **Purpose:** Get expert knowledge about Gemini CLI itself, its commands, | |
| configuration, and documentation. | |
| - **When to use:** "How do I configure a proxy?", "What does the `/rewind` | |
| command do?" | |
| - **Configuration:** Enabled by default. | |
| ### Generalist Agent | |
| - **Name:** `generalist` | |
| - **Purpose:** A general, all-purpose subagent that uses the inherited tool | |
| access and configurations from the main agent. Useful for executing broad, | |
| resource-heavy subtasks in an isolated conversation, optimizing your main | |
| agent's context by returning only the final result of that given task. | |
| - **When to use:** Use this agent when a task requires many steps, handles large | |
| volumes of information, or requires the same full capabilities as the main | |
| agent. It is ideal for: | |
| - **Multi-file modifications:** Applying refactors or fixing errors across | |
| several files at once. | |
| - **High-volume execution:** Running commands or tests that produce extensive | |
| terminal output. | |
| - **Action-oriented research:** Investigations where the agent needs to both | |
| search code and run commands or make edits to find a solution. By delegating | |
| these tasks, you prevent your main conversation from becoming cluttered or | |
| slow. You can invoke it explicitly using `@generalist`. | |
| - **Configuration:** Enabled by default. | |
| ### Browser Agent | |
| - **Name:** `browser_agent` | |
| - **Purpose:** Automate web browser tasks — navigating websites, filling forms, | |
| clicking buttons, and extracting information from web pages — using the | |
| accessibility tree. | |
| - **When to use:** "Go to example.com and fill out the contact form," "Extract | |
| the pricing table from this page," "Click the login button and enter my | |
| credentials." | |
| #### Prerequisites | |
| The browser agent requires: | |
| - **Chrome** version 144 or later (any recent stable release works). | |
| The underlying | |
| [`chrome-devtools-mcp`](https://www.npmjs.com/package/chrome-devtools-mcp) | |
| server is bundled with Gemini CLI and launched automatically — no separate | |
| installation is needed. | |
| #### Enabling the browser agent | |
| The browser agent is disabled by default. Enable it in your `settings.json`: | |
| ```json | |
| { | |
| "agents": { | |
| "overrides": { | |
| "browser_agent": { | |
| "enabled": true | |
| } | |
| } | |
| } | |
| } | |
| ``` | |
| #### Session modes | |
| The `sessionMode` setting controls how Chrome is launched and managed. Set it | |
| under `agents.browser`: | |
| ```json | |
| { | |
| "agents": { | |
| "overrides": { | |
| "browser_agent": { | |
| "enabled": true | |
| } | |
| }, | |
| "browser": { | |
| "sessionMode": "persistent" | |
| } | |
| } | |
| } | |
| ``` | |
| The available modes are: | |
| | Mode | Description | | |
| | :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | |
| | `persistent` | **(Default)** Launches Chrome with a persistent profile stored at `~/.gemini/cli-browser-profile/`. Cookies, history, and settings are preserved between sessions. | | |
| | `isolated` | Launches Chrome with a temporary profile that is deleted after each session. Use this for clean-state automation. | | |
| | `existing` | Attaches to an already-running Chrome instance. You must enable remote debugging first by navigating to `chrome://inspect/#remote-debugging` in Chrome. No new browser process is launched. | | |
| #### First-run consent | |
| The first time the browser agent is invoked, Gemini CLI displays a consent | |
| dialog. You must accept before the browser session starts. This dialog only | |
| appears once. | |
| #### Configuration reference | |
| All browser-specific settings go under `agents.browser` in your `settings.json`. | |
| For full details, see the | |
| [`agents.browser` configuration reference](../reference/configuration.md#agents). | |
| | Setting | Type | Default | Description | | |
| | :------------------------ | :--------- | :------------- | :------------------------------------------------------------------------------ | | |
| | `sessionMode` | `string` | `"persistent"` | How Chrome is managed: `"persistent"`, `"isolated"`, or `"existing"`. | | |
| | `headless` | `boolean` | `false` | Run Chrome in headless mode (no visible window). | | |
| | `profilePath` | `string` | — | Custom path to a browser profile directory. | | |
| | `visualModel` | `string` | — | Model override for the visual agent. | | |
| | `allowedDomains` | `string[]` | — | Restrict navigation to specific domains (for example, `["github.com"]`). | | |
| | `disableUserInput` | `boolean` | `true` | Disable user input on the browser window during automation (non-headless only). | | |
| | `maxActionsPerTask` | `number` | `100` | Maximum tool calls per task. The agent is terminated when the limit is reached. | | |
| | `confirmSensitiveActions` | `boolean` | `false` | Require manual confirmation for `upload_file` and `evaluate_script`. | | |
| | `blockFileUploads` | `boolean` | `false` | Hard-block all file upload requests from the agent. | | |
| #### Automation overlay and input blocking | |
| In non-headless mode, the browser agent injects a visual overlay into the | |
| browser window to indicate that automation is in progress. By default, user | |
| input (keyboard and mouse) is also blocked to prevent accidental interference. | |
| You can disable this by setting `disableUserInput` to `false`. | |
| #### Security | |
| The browser agent enforces several layers of security: | |
| - **Domain restrictions:** When `allowedDomains` is set, the agent can only | |
| navigate to the listed domains (and their subdomains when using `*.` prefix). | |
| Attempting to visit a disallowed domain throws a fatal error that immediately | |
| terminates the agent. The agent also attempts to detect and block the use of | |
| allowed domains as proxies (e.g., via query parameters or fragments) to access | |
| restricted content. | |
| - **Blocked URL patterns:** The underlying MCP server blocks dangerous URL | |
| schemes including `file://`, `javascript:`, `data:text/html`, | |
| `chrome://extensions`, and `chrome://settings/passwords`. | |
| - **Sensitive action confirmation:** Form filling (`fill`, `fill_form`) always | |
| requires user confirmation through the policy engine, regardless of approval | |
| mode. When `confirmSensitiveActions` is `true`, `upload_file` and | |
| `evaluate_script` also require confirmation. | |
| - **File upload blocking:** Set `blockFileUploads` to `true` to hard-block all | |
| file upload requests, preventing the agent from uploading any files. | |
| - **Action rate limiting:** The `maxActionsPerTask` setting (default: 100) | |
| limits the total number of tool calls per task to prevent runaway execution. | |
| #### Visual agent | |
| By default, the browser agent interacts with pages through the accessibility | |
| tree using element `uid` values. For tasks that require visual identification | |
| (for example, "click the yellow button" or "find the red error message"), you | |
| can enable the visual agent by setting a `visualModel`: | |
| ```json | |
| { | |
| "agents": { | |
| "overrides": { | |
| "browser_agent": { | |
| "enabled": true | |
| } | |
| }, | |
| "browser": { | |
| "visualModel": "gemini-2.5-computer-use-preview-10-2025" | |
| } | |
| } | |
| } | |
| ``` | |
| When enabled, the agent gains access to the `analyze_screenshot` tool, which | |
| captures a screenshot and sends it to the vision model for analysis. The model | |
| returns coordinates and element descriptions that the browser agent uses with | |
| the `click_at` tool for precise, coordinate-based interactions. | |
| <!-- prettier-ignore --> | |
| > [!NOTE] | |
| > The visual agent requires API key or Vertex AI authentication. It is | |
| > not available when using "Sign in with Google". | |
| #### Sandbox support | |
| The browser agent adjusts its behavior automatically when running inside a | |
| sandbox. | |
| ##### macOS seatbelt (`sandbox-exec`) | |
| When the CLI runs under the macOS seatbelt sandbox, `persistent` and `isolated` | |
| session modes are forced to `isolated` with `headless` enabled. This avoids | |
| permission errors caused by seatbelt file-system restrictions on persistent | |
| browser profiles. If `sessionMode` is set to `existing`, no override is applied. | |
| ##### Container sandboxes (Docker / Podman) | |
| Chrome is not available inside the container, so the browser agent is | |
| **disabled** unless `sessionMode` is set to `"existing"`. When enabled with | |
| `existing` mode, the agent automatically connects to Chrome on the host via the | |
| resolved IP of `host.docker.internal:9222` instead of using local pipe | |
| discovery. Port `9222` is currently hardcoded and cannot be customized. | |
| To use the browser agent in a Docker sandbox: | |
| 1. Start Chrome on the host with remote debugging enabled: | |
| ```bash | |
| # Option A: Launch Chrome from the command line | |
| google-chrome --remote-debugging-port=9222 | |
| # Option B: Enable in Chrome settings | |
| # Navigate to chrome://inspect/#remote-debugging and enable | |
| ``` | |
| 2. Configure `sessionMode` and allowed domains in your project's | |
| `.gemini/settings.json`: | |
| ```json | |
| { | |
| "agents": { | |
| "overrides": { | |
| "browser_agent": { "enabled": true } | |
| }, | |
| "browser": { | |
| "sessionMode": "existing", | |
| "allowedDomains": ["example.com"] | |
| } | |
| } | |
| } | |
| ``` | |
| 3. Launch the CLI with port forwarding: | |
| ```bash | |
| GEMINI_SANDBOX=docker SANDBOX_PORTS=9222 gemini | |
| ``` | |
| ## Creating custom subagents | |
| You can create your own subagents to automate specific workflows or enforce | |
| specific personas. | |
| ### Agent definition files | |
| Custom agents are defined as Markdown files (`.md`) with YAML frontmatter. You | |
| can place them in: | |
| 1. **Project-level:** `.gemini/agents/*.md` (Shared with your team) | |
| 2. **User-level:** `~/.gemini/agents/*.md` (Personal agents) | |
| ### File format | |
| The file **MUST** start with YAML frontmatter enclosed in triple-dashes `---`. | |
| The body of the markdown file becomes the agent's **System Prompt**. | |
| **Example: `.gemini/agents/security-auditor.md`** | |
| ```markdown | |
| --- | |
| name: security-auditor | |
| description: Specialized in finding security vulnerabilities in code. | |
| kind: local | |
| tools: | |
| - read_file | |
| - grep_search | |
| model: gemini-3-flash-preview | |
| temperature: 0.2 | |
| max_turns: 10 | |
| --- | |
| You are a ruthless Security Auditor. Your job is to analyze code for potential | |
| vulnerabilities. | |
| Focus on: | |
| 1. SQL Injection | |
| 2. XSS (Cross-Site Scripting) | |
| 3. Hardcoded credentials | |
| 4. Unsafe file operations | |
| When you find a vulnerability, explain it clearly and suggest a fix. Do not fix | |
| it yourself; just report it. | |
| ``` | |
| ### Configuration schema | |
| | Field | Type | Required | Description | | |
| | :------------- | :----- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | |
| | `name` | string | Yes | Unique identifier (slug) used as the tool name for the agent. Only lowercase letters, numbers, hyphens, and underscores. | | |
| | `description` | string | Yes | Short description of what the agent does. This is visible to the main agent to help it decide when to call this subagent. | | |
| | `kind` | string | No | `local` (default) or `remote`. | | |
| | `tools` | array | No | List of tool names this agent can use. Supports wildcards: `*` (all tools), `mcp_*` (all MCP tools), `mcp_server_*` (all tools from a server). **If omitted, it inherits all tools from the parent session.** | | |
| | `mcpServers` | object | No | Configuration for inline Model Context Protocol (MCP) servers isolated to this specific agent. | | |
| | `model` | string | No | Specific model to use (for example, `gemini-3-preview`). Defaults to `inherit` (uses the main session model). | | |
| | `temperature` | number | No | Model temperature (0.0 - 2.0). Defaults to `1`. | | |
| | `max_turns` | number | No | Maximum number of conversation turns allowed for this agent before it must return. Defaults to `30`. | | |
| | `timeout_mins` | number | No | Maximum execution time in minutes. Defaults to `10`. | | |
| ### Tool wildcards | |
| When defining `tools` for a subagent, you can use wildcards to quickly grant | |
| access to groups of tools: | |
| - `*`: Grant access to all available built-in and discovered tools. | |
| - `mcp_*`: Grant access to all tools from all connected MCP servers. | |
| - `mcp_my-server_*`: Grant access to all tools from a specific MCP server named | |
| `my-server`. | |
| ### Isolation and recursion protection | |
| Each subagent runs in its own isolated context loop. This means: | |
| - **Independent history:** The subagent's conversation history does not bloat | |
| the main agent's context. | |
| - **Isolated tools:** The subagent only has access to the tools you explicitly | |
| grant it. | |
| - **Recursion protection:** To prevent infinite loops and excessive token usage, | |
| subagents **cannot** call other subagents. If a subagent is granted the `*` | |
| tool wildcard, it will still be unable to see or invoke other agents. | |
| ## Subagent tool isolation | |
| Subagent tool isolation moves Gemini CLI away from a single global tool | |
| registry. By providing isolated execution environments, you can ensure that | |
| subagents only interact with the parts of the system they are designed for. This | |
| prevents unintended side effects, improves reliability by avoiding state | |
| contamination, and enables fine-grained permission control. | |
| With this feature, you can: | |
| - **Specify tool access:** Define exactly which tools an agent can access using | |
| a `tools` list in the agent definition. | |
| - **Define inline MCP servers:** Configure Model Context Protocol (MCP) servers | |
| (which provide a standardized way to connect AI models to external tools and | |
| data sources) directly in the subagent's markdown frontmatter, isolating them | |
| to that specific agent. | |
| - **Maintain state isolation:** Ensure that subagents only interact with their | |
| own set of tools and servers, preventing side effects and state contamination. | |
| - **Apply subagent-specific policies:** Enforce granular rules in your | |
| [Policy Engine](../reference/policy-engine.md) TOML configuration based on the | |
| executing subagent's name. | |
| ### Configuring isolated tools and servers | |
| You can configure tool isolation for a subagent by updating its markdown | |
| frontmatter. This lets you explicitly state which tools the subagent can use, | |
| rather than relying on the global registry. | |
| Add an `mcpServers` object to define inline MCP servers that are unique to the | |
| agent. | |
| **Example:** | |
| ```yaml | |
| --- | |
| name: my-isolated-agent | |
| tools: | |
| - grep_search | |
| - read_file | |
| mcpServers: | |
| my-custom-server: | |
| command: 'node' | |
| args: ['path/to/server.js'] | |
| --- | |
| ``` | |
| ### Subagent-specific policies | |
| You can enforce fine-grained control over subagents using the | |
| [Policy Engine's](../reference/policy-engine.md) TOML configuration. This allows | |
| you to grant or restrict permissions specifically for an agent, without | |
| affecting the rest of your CLI session. | |
| To restrict a policy rule to a specific subagent, add the `subagent` property to | |
| the `[[rules]]` block in your `policy.toml` file. | |
| **Example:** | |
| ```toml | |
| [[rules]] | |
| name = "Allow pr-creator to push code" | |
| subagent = "pr-creator" | |
| description = "Permit pr-creator to push branches automatically." | |
| action = "allow" | |
| toolName = "run_shell_command" | |
| commandPrefix = "git push" | |
| ``` | |
| In this configuration, the policy rule only triggers if the executing subagent's | |
| name matches `pr-creator`. Rules without the `subagent` property apply | |
| universally to all agents. | |
| ## Managing subagents | |
| You can manage subagents interactively using the `/agents` command or | |
| persistently via `settings.json`. | |
| ### Interactive management (/agents) | |
| If you are in an interactive CLI session, you can use the `/agents` command to | |
| manage subagents without editing configuration files manually. This is the | |
| recommended way to quickly enable, disable, or re-configure agents on the fly. | |
| For a full list of sub-commands and usage, see the | |
| [`/agents` command reference](../reference/commands.md#agents). | |
| ### Persistent configuration (settings.json) | |
| While the `/agents` command and agent definition files provide a starting point, | |
| you can use `settings.json` for global, persistent overrides. This is useful for | |
| enforcing specific models or execution limits across all sessions. | |
| #### `agents.overrides` | |
| Use this to enable or disable specific agents or override their run | |
| configurations. | |
| ```json | |
| { | |
| "agents": { | |
| "overrides": { | |
| "security-auditor": { | |
| "enabled": false, | |
| "runConfig": { | |
| "maxTurns": 20, | |
| "maxTimeMinutes": 10 | |
| } | |
| } | |
| } | |
| } | |
| } | |
| ``` | |
| #### `modelConfigs.overrides` | |
| You can target specific subagents with custom model settings (like system | |
| instruction prefixes or specific safety settings) using the `overrideScope` | |
| field. | |
| ```json | |
| { | |
| "modelConfigs": { | |
| "overrides": [ | |
| { | |
| "match": { "overrideScope": "security-auditor" }, | |
| "modelConfig": { | |
| "generateContentConfig": { | |
| "temperature": 0.1 | |
| } | |
| } | |
| } | |
| ] | |
| } | |
| } | |
| ``` | |
| #### Safety policies (TOML) | |
| You can restrict access to specific subagents using the CLI's **Policy Engine**. | |
| Subagents are treated as virtual tool names for policy matching purposes. | |
| To govern access to a subagent, create a `.toml` file in your policy directory | |
| (e.g., `~/.gemini/policies/`): | |
| ```toml | |
| [[rule]] | |
| toolName = "codebase_investigator" | |
| decision = "deny" | |
| deny_message = "Deep codebase analysis is restricted for this session." | |
| ``` | |
| For more information on setting up fine-grained safety guardrails, see the | |
| [Policy Engine reference](../reference/policy-engine.md#special-syntax-for-subagents). | |
| ### Optimizing your subagent | |
| The main agent's system prompt encourages it to use an expert subagent when one | |
| is available. It decides whether an agent is a relevant expert based on the | |
| agent's description. You can improve the reliability with which an agent is used | |
| by updating the description to more clearly indicate: | |
| - Its area of expertise. | |
| - When it should be used. | |
| - Some example scenarios. | |
| For example, the following subagent description should be called fairly | |
| consistently for Git operations. | |
| > Git expert agent which should be used for all local and remote git operations. | |
| > For example: | |
| > | |
| > - Making commits | |
| > - Searching for regressions with bisect | |
| > - Interacting with source control and issues providers such as GitHub. | |
| If you need to further tune your subagent, you can do so by selecting the model | |
| to optimize for with `/model` and then asking the model why it does not think | |
| that your subagent was called with a specific prompt and the given description. | |
| ## Remote subagents (Agent2Agent) | |
| Gemini CLI can also delegate tasks to remote subagents using the Agent-to-Agent | |
| (A2A) protocol. | |
| See the [Remote Subagents documentation](remote-agents) for detailed | |
| configuration, authentication, and usage instructions. | |
| ## Extension subagents | |
| Extensions can bundle and distribute subagents. See the | |
| [Extensions documentation](../extensions/index.md#subagents) for details on how | |
| to package agents within an extension. | |
| ## Disabling subagents | |
| Subagents are enabled by default. To disable them, set `enableAgents` to `false` | |
| in your `settings.json`: | |
| ```json | |
| { | |
| "experimental": { "enableAgents": false } | |
| } | |
| ``` | |