> ## Documentation Index
> Fetch the complete documentation index at: https://docs.profy.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# Tool Catalog

> Every tool an expert can call, with parameter signatures, grouped by plugin

# Tool Catalog

This page enumerates every tool an expert can call in a conversation, along with its parameters. Tools are the model's **action interface** — a tool the model cannot see is a tool it cannot call, and a tool not activated this turn does not exist.

How to read it: first confirm in the [Plugin Catalog](/en/documentation/reference/plugins-catalog) whether a plugin is active this turn, then come here for what it injects and how the parameters work.

<Info>
  Most tools **multiplex on an `action` parameter** (a single `browser` tool carries 12 actions) rather than splitting into a dozen separate tools. The reason is that tool count directly consumes system-prompt context budget, and more tools means a higher chance the model picks the wrong one. The cost is longer parameter tables where most fields are irrelevant to any given action.
</Info>

## Sandbox tools (not part of any plugin)

**Always available** when sandbox mode is not `none`; no plugin tick required. This is the most commonly misunderstood group — users assume "no plugins enabled means nothing touches files," but file I/O is a base capability.

| Tool     | Parameters                                                                                        | Notes                                                                                                                              |
| -------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `write`  | `file_path` (absolute), `content` (default `""`, **must not be empty**)                           | Whole-file overwrite                                                                                                               |
| `read`   | `file_path`, `offset` (default 0), `limit` (default **2000** lines)                               | Line-based; long files truncate                                                                                                    |
| `edit`   | `file_path`, `old_string` (**must match exactly**), `new_string`, `replace_all` (default `false`) | String replacement; first match only by default                                                                                    |
| `bash`   | `command`, `timeout` (default **120** seconds)                                                    | Shell execution                                                                                                                    |
| `grep`   | `pattern` (regex), `path`, `include` (glob), `max_results` (default **50**)                       | Content search                                                                                                                     |
| `glob`   | `pattern`, `path`                                                                                 | Filename search                                                                                                                    |
| `insert` | `file_path`, `line` (**0 = start of file**), `content`                                            | Insert after the given line                                                                                                        |
| `lsp`    | `operation`, `file_path`, `line`, `character`, `query`, `paths`                                   | Code intelligence: `diagnostics` / `definition` / `references` / `hover` / `document_symbols` / `workspace_symbols` / `read_lints` |

<Warning>
  `edit`'s `old_string` must match the file **character for character**, including indentation and whitespace. The most common failure when a model edits a large file is right here — it reconstructs `old_string` from memory instead of reading first. Repeated edit-retry loops usually mean exactly this.

  `lsp`'s `read_lints` checks **every file written or edited in this session** when `paths` is left empty.
</Warning>

### Plan mode only

| Tool                | Parameters | Notes                                                                                                                                     |
| ------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `plan_write`        | Plan body  | Exists only under `permission_mode="plan"`. **Path is not a parameter** — it always overwrites `plan.md` in the session working directory |
| `suggest_plan_mode` | —          | Suggests the user switch to plan mode                                                                                                     |

`plan_write` having no path parameter is deliberate: plan mode filters out every world-writing tool, so if `plan_write` could target a path it would immediately degrade into a general-purpose write escape and break the mode isolation.

## Browser (`profy-browser`)

| Tool      | Parameters                                                                                                  |
| --------- | ----------------------------------------------------------------------------------------------------------- |
| `browser` | `action`, `url`, `html`, `file_path`, `selector`, `ref`, `text`, `key`, `direction`, `amount`, `tab_action` |

`action` values: `navigate`, `screenshot`, `snapshot`, `click`, `type`, `fill`, `scroll`, `press_key`, `tabs`, `set_html`, `evaluate`, `go_back`.

An invalid action returns:

```
Error: Unknown browser action 'xxx'. Valid actions: navigate, screenshot,
snapshot, click, type, fill, scroll, press_key, tabs, set_html, evaluate, go_back
```

`ref` is an element handle returned by `snapshot` and is **only valid for that snapshot**. Once the page changes you must re-snapshot for fresh refs, or you click the wrong element or fail outright.

Fine-grained variants (`browser_click`, `browser_fill`, `browser_navigate`, `browser_press_key`, `browser_scroll`, `browser_snapshot`, `browser_tabs`, `browser_take_screenshot`, `browser_type`) are exposed separately on some paths with identical parameters.

## Chrome extension (`profy-chrome`)

Requires `chrome_connected: true`.

| Tool                       | Parameters                                                                                              |
| -------------------------- | ------------------------------------------------------------------------------------------------------- |
| `chrome`                   | `action`, `tab_id`, `url`, `selector`, `ref`, `text`, `key`, `code`, `direction`, `amount`, `full_page` |
| `chrome__match_workflow`   | Match a previously recorded workflow                                                                    |
| `chrome__execute_workflow` | Replay a workflow                                                                                       |
| `chrome__save_trajectory`  | Save this run as a workflow                                                                             |

The critical difference from `profy-browser`: Chrome drives **your own browser with your own login state**. That is why it has a four-tier permission gate that hard-blocks financial and account operations.

## Computer use (`profy-computer`)

Requires `desktop_connected: true`.

| Tool       | Parameters                                                                                                       |
| ---------- | ---------------------------------------------------------------------------------------------------------------- |
| `computer` | `action`, `x`, `y`, `text`, `keys`, `delivery_mode`, `path`, `direction`, `amount`, `from_x`, `from_y`, and more |

`action` values: `screenshot`, `click`, `double_click`, `type`, `scroll`, `drag`, `keypress`, `invoke_menu`, `move`, `wait`, `cursor_position`, `list_windows`, `get_window_state`, `launch_app`, `list_apps`, `get_accessibility_tree`, `bring_to_front`, `set_value`, `check_permissions`.

Fine-grained variants: `click`, `drag`, `key`, `mouse_move`, `screenshot`, `scroll`, `type_text`, `list_windows`, `get_window_state`.

`check_permissions` is worth calling once up front — without macOS accessibility permission every subsequent action fails, and the failure message does not always point at permissions.

## Creative generation (`profy-creative`)

Automatically available; no tick needed.

| Tool                  | Parameters                                                                                                                              | Actions                              |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |
| `image`               | `action`, `prompt`, `image_urls`, `resolution` (default `1024x1024`)                                                                    | `generate`, `generate_batch`, `read` |
| `video`               | `action`, `prompt`, `video_urls`, `resolution` (default `720p`), `duration` (default `5.0`), `reference_image_url`                      | `generate`, `generate_batch`, `read` |
| `music`               | `action`, `prompt`, `lyrics`, `duration` (default `30.0`), `is_instrumental` (default `true`)                                           | `generate`                           |
| `audio`               | `action`, `text`, `audio_url`, `voice_id`, `language` (default `zh`)                                                                    | `tts`, `tts_batch`, `stt`            |
| `generate_3d_tool`    | `prompt`, `image_url`, `sketch_url`, `mode` (default `rapid`), `format` (default `GLB`), `face_count`, `pbr_materials` (default `true`) | —                                    |
| `postprocess_3d_tool` | `model_url`, `action`, `target_format`, `target_faces`, `animation_type`                                                                | —                                    |
| `generate_world_tool` | `prompt`, `image_url`, `video_url`, `resolution` (default `512`)                                                                        | —                                    |

The `read` action is often overlooked: it lets the model **actually see** what it generated, which is the linchpin of the generate → inspect → regenerate loop. Without it the model can only imagine the result from its own prompt.

Billing follows `per_call` or `duration_second` per the [Billing Formulas](/en/documentation/reference/billing-formulas).

## Search (`profy-search`)

Requires `enable_web_search: true`.

| Tool         | Parameters |
| ------------ | ---------- |
| `web_search` | `query`    |
| `web_fetch`  | `url`      |

The minimal signature is intentional: search results must be truncated per result and capped in count before returning, and opening up parameters would let parallel searches blow out the context.

## Memory (`profy-memory`)

Requires `enable_memory: true`.

| Tool     | Parameters                                                                                           |
| -------- | ---------------------------------------------------------------------------------------------------- |
| `memory` | `action`, `content`, `query`, `memory_type`, `scope`, `k` (default 5), `entity`, `depth` (default 1) |

| Action    | Required         | Purpose                                                               |
| --------- | ---------------- | --------------------------------------------------------------------- |
| `add`     | `content`        | Write to long-term memory                                             |
| `search`  | `query`          | Retrieve relevant memories                                            |
| `explore` | `entity`         | Traverse the memory graph from an entity                              |
| `dream`   | `scope="expert"` | Consolidate expert memories (merge duplicates, archive stale entries) |

`memory_type` values: `preference`, `fact`, `skill`, `habit`, `event`, `context`, `constraint`, `decision`, `entity`.
`scope` values: `user` (personal), `expert` (expert-specific).

An invalid action returns:

```
❌ Invalid action 'xxx'. Must be 'add', 'search', 'explore', or 'dream'.
```

<Warning>
  Terminal users of the developer platform (calling through `/v1/*`) get the **entire tool refused**. Memory is isolated per platform user; a terminal user is not a platform identity, so writing would cross accounts.
</Warning>

## Knowledge (`profy-knowledge`)

| Tool                 | Parameters                                                                                    | Actions                                                                |
| -------------------- | --------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| `knowledge`          | `action`, `query`, `platform`, `source_id`, `doc_id`, `title`, `content`, `top_k` (default 5) | `search`, `list_sources`, `list_documents`, `read`, `create`, `append` |
| `obsidian_knowledge` | `action`, `query`, `vault_path`, `source_id`, `top_k` (default 10)                            | Same (local vault)                                                     |

Leaving `platform` empty **searches every connected platform**. Write actions (`create` / `append`) depend on whether that platform's adapter implements them; unimplemented ones report a capability error rather than failing silently.

## Skills (`profy-skill`)

| Tool           | Parameters                                                                    | Actions                                                               |
| -------------- | ----------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| `skill`        | `action`, `name`, `tag`, `resource_type`, `resource_name`, `script_args`      | `discover`, `activate`, `execute`                                     |
| `skill_manage` | `action`, `name`, `source`, `content`, `description`, `target_expert`, `path` | `catalog`, `install`, `install_batch`, `save_dir`, `create`, `update` |

Use qualified names: `builtin/docx`, `user/nuwa`, `expert/my-skill`. Bare names auto-resolve when unambiguous.

`execute` takes `resource_type` of `script` / `reference` / `asset` / `template` / `workflow`. **Scripts run black-box** — only stdout/stderr comes back, source never enters context. That is deliberate: skill scripts run to hundreds of lines and would crowd out the data actually being processed.

## Delegation and scheduling

| Tool       | Parameters                                                                                                                                             | Owner                                              |
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------- |
| `delegate` | `expert_identifier`, `task`, `timeout`                                                                                                                 | `profy-delegation` (needs `available_specialists`) |
| `schedule` | `action`, `title`, `prompt`, `task_type`, `scheduled_date`, `scheduled_time`, `repeat_type`, `timezone`, `depends_on`, `dependency_strategy`, `status` | `profy-schedule`                                   |

`schedule` has only `add` and `search`:

* `add` requires `title` + `prompt` + `scheduled_date` (ISO, e.g. `2025-03-15`) + `scheduled_time` (`HH:MM`)
* `repeat_type`: `no-repeat` / `daily` / `weekly` / `monthly`
* `dependency_strategy`: `skip` or `continue` when the predecessor fails
* `search`'s `status` filter: `pending` / `running` / `completed` / `paused` / `all`

Invalid action: `❌ Invalid action 'xxx'. Must be 'add' or 'search'.`

There is **no delete or update**. Modifying a scheduled task means going to the product UI; conversation cannot do it.

`delegate` runs **detached by default** — it dispatches without blocking the current conversation.

## Human interaction (`profy-message`)

| Tool  | Parameters                       |
| ----- | -------------------------------- |
| `Ask` | `questions: List[dict]`, `title` |

Called when the expert needs you to choose; the frontend renders it as a choice card. This is the **only** mechanism that halts execution to wait for your answer.

## Sites (`profy-sites`)

Requires `sandbox_mode != none`.

| Tool           | Parameters                                                                                                                     | Notes                                                                                                                 |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------- |
| `open_preview` | `title` (default `Website Preview`), `template`                                                                                | Starts the preview (lazy dev server)                                                                                  |
| `deploy`       | `slug` (3–63 chars, lowercase letters/digits/hyphens), `summary`                                                               | **Only a request signal**; returns `awaiting_confirmation` with no build or upload side effect                        |
| `site_design`  | `mode` (`direction_selection` / `asset_authorization`), `brief_summary` (1–4000 chars), `directions` (exactly 3), `asset_plan` | Design direction confirmation                                                                                         |
| `site_assets`  | `items`                                                                                                                        | Asset writes; ≤2MB goes to the sandbox returning `path`, larger or over-budget goes to object storage returning `url` |
| `browser`      | As above                                                                                                                       | Preview self-check                                                                                                    |

<Warning>
  `deploy` **does not publish**. The only real publish entry point is the deploy dialog in the UI. The expert calling `deploy` merely hands the request to you for confirmation — a deliberate one-way gate so experts cannot ship on their own.
</Warning>

## Visualize (`profy-visualize`)

| Tool         | Parameters                                                                                     |
| ------------ | ---------------------------------------------------------------------------------------------- |
| `visualize`  | `title`, `html`, `css`                                                                         |
| `render_ui`  | `components: list[dict]`, `surface_id`                                                         |
| `inspect_3d` | `url`, `max_depth` (default 5), `include_materials`, `include_animations`, `performance_audit` |

## Canvas (`profy-canvas`)

| Tool                          | Key parameters                                                                                                                                                                                 |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `canvas_node_operation`       | `action` (`create`/`update`/`delete`/`duplicate`), `node_type` (`text`/`image`/`imageEdit`/`video`/`storyboard`), `node_ids`, `label`, `config`, `position`, `remix_from_node_id`, `parent_id` |
| `canvas_connection_operation` | `action` (`connect`/`disconnect`/`reconnect`), `source_node_id`, `target_node_id`, `edge_id`, `connections`                                                                                    |
| `canvas_run_dag`              | `node_id`, `concurrency` (default **1, sequential**)                                                                                                                                           |
| `canvas_get_nodes`            | `filter_type`, `label`                                                                                                                                                                         |
| `canvas_auto_layout`          | `scope` (`canvas`/`topLevelGroups`/`group`), `target_group_id`, `focus_node_id`                                                                                                                |

`concurrency` defaulting to 1 is a conservative choice — running the DAG in parallel fires multiple billable generation jobs at once.

## Video production (`profy-movie`)

`exclusive: true`; no other plugin loads while it is on.

| Tool            | Parameters                            |
| --------------- | ------------------------------------- |
| `movie`         | `action`, `data` (structured payload) |
| `timeline_edit` | `action`, `params`                    |

`movie` actions are pipeline stages: `brief` → `script` → `storyboard` → `strategy` → `assemble` → `caption` → `export`.
`timeline_edit` actions: `insert_clip`, `remove_clip`, `trim`, `split`, and others.

## Feishu (`profy-feishu`)

Requires `has_feishu_client: true`.

| Tool                  | Coverage                   |
| --------------------- | -------------------------- |
| `feishu_tool`         | Calendar, tasks, schedules |
| `feishu_doc_tool`     | Document read/write        |
| `feishu_bitable_tool` | Bitables                   |

Write operations need user authorization; without it the tool returns an authorization marker prompting you to send `/auth`. See [Feishu tools](/en/documentation/plugins/feishu-tools).

## Customs (`profy-customs`)

| Tool                  | Parameters                                                      |
| --------------------- | --------------------------------------------------------------- |
| `customs_ocr`         | `file_url`, `pages` (default `all`)                             |
| `customs_code_lookup` | `table`, `query`, `direction` (default `name_to_code`), `fuzzy` |
| `customs_validate`    | `fields_json`                                                   |

## Record & Replay (`profy-record-and-replay`)

Requires `desktop_connected: true`.

| Tool                                                               | Parameters |
| ------------------------------------------------------------------ | ---------- |
| `event_stream_start` / `event_stream_stop` / `event_stream_status` | None       |

## Distillation and evolution (internal)

| Tool             | Owner                                              | Visibility                                                       |
| ---------------- | -------------------------------------------------- | ---------------------------------------------------------------- |
| `distill_manage` | `profy-distill` (needs `target_expert_identifier`) | Distillation conversations only                                  |
| `evolution_log`  | `profy-evolution` (needs `is_internal_invoke`)     | Platform-internal calls only; **cannot be triggered externally** |

`evolution_log` parameters: `action` (only `suggest_skill_improvement`), `skill_name`, `summary`, `diff_summary`, `improved_content`, `before_scores`, `after_scores`, `improved_dimensions`. Scoring rules are in [Self-evolution](/en/documentation/how-it-works/darwin-evolution).

## The four office plugins have no tools

`profy-docx` / `profy-pdf` / `profy-pptx` / `profy-xlsx` declare empty tool arrays. They work through skill documents plus pre-installed sandbox libraries, driven by `bash`. See each plugin's page for the concrete methods.

## Related pages

<CardGroup cols={2}>
  <Card title="Plugin Catalog" icon="puzzle-piece" href="/en/documentation/reference/plugins-catalog">
    Which tools activate this turn
  </Card>

  <Card title="Skill Catalog" icon="book" href="/en/documentation/reference/skills-catalog">
    The method layer beyond tools
  </Card>

  <Card title="Limits" icon="gauge" href="/en/documentation/reference/limits">
    Timeouts, counts, size caps
  </Card>

  <Card title="Billing Formulas" icon="calculator" href="/en/documentation/reference/billing-formulas">
    How tool calls are billed
  </Card>
</CardGroup>

<Note>
  Verified 2026-08-11. Sources: `services/agent-runtime/src/base/tools/sandbox.py`, `services/agent-runtime/src/plugins/builtin/*/tools/*.py`. Defaults are taken directly from each tool's `Field(default=...)`.
</Note>
