Built-in Tools
TeamWeb AI ships with a comprehensive set of built-in tools organized into categories. These tools are available to all assistants by default and can be toggled on or off per assistant from the assistant’s Tools tab.
Content & Canvas
| Tool | Description |
|---|---|
| show | Display a visual card on the canvas with a title, markdown body, and optional image. For presenting finished content only — not for choices. |
| save_content | Save a deliverable (blog post, report, file, etc.) with a shareable URL. Optionally submit for human review. |
| get_deliverable | Retrieve the full content of an existing deliverable |
| list_deliverables | List deliverables filtered by status or content type |
| search_deliverables | Search deliverable titles and bodies |
Communication
| Tool | Description |
|---|---|
| ask_human | Pause the conversation and ask the human a question. Supports rich multimedia options with images, descriptions, and selectable choices. The agent loop pauses until the human responds. |
| send_email | Send an email to the current user. |
Knowledge & Research
| Tool | Description |
|---|---|
| search_knowledge | Search the project’s knowledge base and datasets using semantic search. Returns knowledge articles, facts, documents, code, and dataset records in a unified result set. Dataset records are formatted with display fields. Accepts an optional dataset parameter to filter by dataset name. |
| query_dataset | Run a SQL SELECT query against a structured dataset for precise filtering, sorting, and aggregation |
| describe_dataset | Get the full schema, field types, sample values, and record count for a structured dataset. Helps the assistant understand data structure before querying. |
| get_record | Fetch a single complete record from a structured dataset by its key value. Use after search_knowledge to get full details. |
| read_code_file | Read the full source code of an indexed repository file |
| add_knowledge | Add a new fact or URL to the knowledge base |
Notes
| Tool | Description |
|---|---|
| save_note | Save a persistent note for future reference. Set about_user to save a personal memory about the person you’re speaking with. |
| get_notes | Retrieve previously saved notes, optionally filtered by query or tags. Set about_user to retrieve only memories about the current person. |
| update_note | Update an existing note’s title, content, or tags |
| delete_note | Delete a note |
User Memories
Notes support an optional per-user scoping mode. When an assistant calls save_note or get_notes with about_user: true, the note is tied to the specific person the assistant is currently speaking with — whether that’s a registered user or an external contact.
This lets assistants build up personal memory about individuals across conversations. For example, an assistant might remember a customer’s preferred communication style, project context, or previous requests.
How it works:
- Saving —
save_notewithabout_user: truecreates a note scoped to the current person. If a note with the same title already exists for that person, the content is updated instead of creating a duplicate. - Retrieving —
get_noteswithabout_user: truereturns only notes about the current person. Without the flag (orabout_user: false), only general assistant notes are returned. - Auto-injection — The 5 most recently updated user memories are automatically included in the assistant’s system prompt at the start of each conversation turn, so the assistant doesn’t need to explicitly retrieve them.
- Promotion — When a contact is promoted to a registered user, their memories are automatically transferred to the new user account.
User memories can be viewed and managed from the Notes tab on the assistant detail page (admin), the staff chat memories view, or the contact detail page.
Todos
| Tool | Description |
|---|---|
| create_todo | Create a new todo item on the assistant’s todo list. Supports title, description, priority, due date, tags, and optional source linking (to an inbox item or conversation). |
| list_todos | List the assistant’s todos, with optional status and priority filters. By default shows pending and in-progress items. |
| update_todo | Update a todo’s title, description, status, priority, due date, or tags. Marking a todo as completed automatically records the completion time. |
| delete_todo | Remove a todo from the assistant’s list. |
Inbox
| Tool | Description |
|---|---|
| list_inbox | List the assistant’s inbox items. By default shows open and in-progress items. Supports status filtering and a configurable limit. |
| get_inbox_item | Read the full message thread of an inbox item, including all inbound messages, assistant replies, internal notes, and attachment links. |
| reply_to_inbox | Reply to an inbox item. The response is sent as an email to the sender via the assistant’s configured email channel. Supports file attachments via deliverable IDs. |
| close_inbox_item | Close an inbox item when the matter is resolved. Optionally add a resolution note. |
| update_inbox_item | Update an inbox item’s status, priority, or tags. |
| snooze_inbox_item | Snooze an inbox item until a specified future date. The item’s status is set to “snoozed” and it will reappear when the snooze period ends. |
Child Runs
| Tool | Description |
|---|---|
| spawn_child_runs | Spawn one or more managed background runs on other assistants in parallel. Each task becomes an independent child run with its own conversation, journal, tools, and lifecycle. Returns the child run IDs. |
| wait_for_child_runs | Wait for one or more child runs to reach a terminal status (completed, failed, cancelled). Returns per-run status and result text. Omit child_run_ids to wait for all currently active child runs. |
| list_child_runs | List managed child runs spawned from this conversation, optionally filtered by status. |
| get_child_run | Get status, result, and run-journal details for a specific child run. |
| steer_child_run | Send additional steering instructions to an active child run. The child assistant receives the message at the next safe turn boundary. |
| cancel_child_run | Request cancellation of an active child run. The child assistant stops at the next safe turn boundary. |
Technical Details — Child Runs
How child runs work — The spawn_child_runs tool takes an array of tasks and queues each as an independent background run via Celery. Every child run gets its own conversation, agent loop, run journal, and tool access, and runs in parallel with the others. The parent assistant continues immediately with the child run IDs; it can then carry on with non-overlapping work, or call wait_for_child_runs to block on results.
Lifecycle — Each child run has a status: queued → running → completed, failed, or cancelled. The child cannot see the parent’s conversation history; all context must be provided in the task description.
Steering and cancellation — While a child run is active, the parent can queue additional steering messages (steer_child_run) or request cancellation (cancel_child_run). The child assistant checks for both at safe turn boundaries and honours them without losing its current turn’s work.
Safety guardrails — The delegation chain is depth-limited (default 3). Self-delegation is allowed within that cap — an assistant can spawn child runs of itself to fan out parallel research, and those children can spawn one more level. Only assistants in the same project can be spawned. Stale queued or running child runs are reaped by a periodic reconcile_child_runs task.
Project Management
| Tool | Description |
|---|---|
| get_project_state | Read shared key-value state for the project |
| update_project_state | Update shared project state |
Tasks & Scheduling
| Tool | Description |
|---|---|
| create_task | Create a reusable task definition |
| list_tasks | List task definitions |
| update_task | Update a task definition |
| cancel_task | Deactivate a task |
| list_schedules | List task schedules |
| create_schedule | Create a cron schedule for a task |
| update_schedule | Update a schedule |
Conversations
| Tool | Description |
|---|---|
| list_conversations | List past conversations in the project |
| get_conversation_summary | Get a summary of a past conversation |
Code Execution
| Tool | Description |
|---|---|
| execute_code | Run code in a sandboxed Docker container. Supports Python, JavaScript, Java, C++, Go, and R. Optional library installation for Python. |
| save_generated_tool | Save a Python custom tool as a reusable BaseTool subclass. The code is validated and always runs sandboxed; use execute_code first to test it. |
Browser
| Tool | Description |
|---|---|
| browser_action | Control a managed browser session from the conversation. Supports start, navigate, click, click_text, type, wait_for, extract, screenshot, scroll, find_text, accept_cookies, and close. Use start first, then operate on the same session_key across tool calls. |
browser_action
The browser_action tool gives an assistant access to a real managed browser
session. Unlike simple HTTP fetching, this lets the assistant interact with
dynamic pages that require JavaScript, form input, navigation, and DOM-based
waiting.
Supported actions:
start— Start a browser session for the current conversation. Call this once.navigate— Go to anhttp://orhttps://URL. Cookie/consent banners are auto-dismissed by default; passauto_dismiss: falseto keep the banner if you need to interact with it.click— Click an element using a CSS selector.click_text— Click the first visible element matching a label. Optionalrole(e.g."button","link","tab") disambiguates when the same label exists on multiple element types. Prefer this over building speculative CSS selectors.type— Clear a field and type text into it using a CSS selector.wait_for— Wait for either a selector to appear or the URL to contain a given substring.extract— Extract data from the current page or an optional selector scope. See Extract modes below.screenshot— Capture a PNG screenshot of the current page or a specific element. Last-resort orientation tool — preferextract mode='page_model'.scroll— Scroll the page (viewport,page, a pixel count) or scroll a specific selector into view. Useful for lazy-loaded list pages.find_text— Find visible elements matching a text label and return their selectors. Use when you need a selector for a follow-upextractorwait_for; for clicking, preferclick_text.accept_cookies— Best-effort dismissal of a cookie/consent banner. Rarely needed manually sincenavigateruns this automatically.close— Close the session and release browser resources.
Extract modes:
text— Plain visible text from the page or a selector.html— Inner HTML, orouterHTMLwhen a selector is given (use this for self-closing elements like<img>/<input>to read attributes such assrc,value,alt).links— Array of{href, text}for every<a>in scope. Capped at 50 entries with per-item href/text trimming, so a busy page can’t dump tens of KB into context.form_fields— Array of{name, type, value, placeholder}for every form field in scope.page_model— Compact JSON skeleton of the current page: visible headings, landmarks (main,nav, etc.), interactive elements (each withrole,name,selector), forms with field labels, and detected list groups (≥3 sibling elements with the same shape). Output is bounded to fit comfortably under 8 KB. This is the cheap default for orienting on a new page.structured— Schema-driven scraping for lists/grids/cards. Pass arepeat_selectormatched once per item and aschemaof{name, selector, attr?}field specs. Returns a list of dicts. ReadsinnerTextby default, or the named attribute whenattris set. Caps atmax_items(default 50).
Key behaviors:
- Conversation-scoped sessions — Browser sessions belong to the current
conversation. They can be reused across multiple tool calls in that
conversation by using the same
session_key. - Explicit lifecycle — The assistant must start a session before it can navigate or interact with pages. If the browser runtime expires, the session must be started again.
- Managed profile state — Login cookies and local browser storage persist while the managed browser profile remains active. TeamWeb AI does not replay old browser actions to reconstruct expired sessions.
- Auto-dismiss on navigate — Each
navigatecall attempts a best-effort cookie/consent banner dismissal once the page is loaded. Failures are swallowed so they cannot fail the navigation. Disable per-call withauto_dismiss: false. - Inline screenshot results — Screenshots are stored through the media system and returned in the tool result as both a URL and a ready-to-use markdown image snippet. This is intended for normal conversation output, not the canvas or deliverables system.
- Channel-friendly delivery — When a reply containing a local screenshot is sent through email, Telegram, Slack, or other attachment-capable channels, TeamWeb AI promotes that referenced media into a real outbound attachment instead of relying on the raw markdown image URL.
Best practices for the assistant:
- Don’t guess URLs. Use site navigation. If the right URL isn’t already
known, run
web_searchfirst or navigate to the site root and useextract mode='page_model'to follow real links. Pattern-matching paths from product or destination names ("/cruises/port/copenhagen", “/products/foo”) fails fast with 404s and burns turns. - Orient with
page_model, notscreenshot. Apage_modelextract is much cheaper and gives the assistant a click-ready map. Reach forscreenshotonly when visual layout is genuinely needed. - Click by label.
click_textremoves the find-then-click dance; reserve CSS selectors for cases where labels are ambiguous. - Scrape lists with
structuredmode. Define arepeat_selectorand aschemarather than dumpingmode='text'and parsing prose. - Use the run journal. For non-trivial multi-page research, write objective,
current state, verified findings, and the next action via
update_run_journal/append_run_journal_entryearly and often. The journal is reloaded on every continuation, including after iteration-limit halts — see Run Journal.
The bundled browser-research skill packages these guidelines plus worked patterns (form-filling, embedded SPA app-state extraction, lazy-loaded results, recovery from CAPTCHAs and dead-ends) into a single activatable instruction set.
Current limits:
- CSS selectors only in v1
- No multi-tab support
- No video recording
- No automatic recovery of expired sessions
file://,
localhost, private-network IPs, and internal-only hostnames is blocked by
default unless the deployment explicitly allows it.Planning
| Tool | Description |
|---|---|
| manage_plan | Create hierarchical task plans, track progress, and manage steps. Plans are scoped to the conversation and visible in the workspace sidebar. |
| think | Structured self-reflection tool. The agent records its reasoning, which is stored as a hidden message for debugging. |
summarize_history tool — the agent loop now performs auto-compaction in the background when the conversation approaches the model’s context window. See Agent Loop for details.manage_plan
The manage_plan tool lets an assistant create, inspect, and update a structured task plan within the current conversation. Plans support hierarchical (nested) steps, so a top-level step can contain sub-steps for finer-grained tracking.
Actions:
- create — Create a new plan with a title and a list of steps. Steps can be nested to form a hierarchy.
- get — Retrieve the current plan and its step statuses.
- update_step — Mark a step as completed, in-progress, skipped, or failed.
- add_steps — Append new steps to an existing plan.
- remove_steps — Remove steps from the plan by ID.
Plans appear in the workspace sidebar during the conversation, giving you a live view of what the assistant is working on and how far along it is.
Configuration options (set per assistant):
| Option | Type | Default | Description |
|---|---|---|---|
auto_plan | boolean | — | When enabled, the assistant automatically creates a plan for complex tasks. |
max_steps | integer | 20 | Maximum number of top-level steps allowed in a plan. |
think
The think tool gives the assistant a structured space for self-reflection. When called, the agent writes down its reasoning about the current task — what it knows, what’s uncertain, and what approach it should take. The reasoning is stored as a hidden message (not shown to the user) but is available in API Logs for debugging.
Research on LLM tool-use shows a 21% average improvement in task quality when agents use structured reflection before acting. The tool is especially valuable for multi-step or ambiguous tasks.
Workspace
| Tool | Description |
|---|---|
| write_file | Create or overwrite a text file in the conversation workspace. |
| read_file | Read a file’s content from the workspace. |
| list_files | List all files in the workspace with sizes and modification times. |
| delete_file | Remove a file from the workspace. |
| get_run_journal | Read the current run journal for this conversation. The journal is durable session memory for verified findings, decisions, blockers, artifacts, and handoff notes. |
| update_run_journal | Create or replace the run journal for this conversation. Use after meaningful milestones to capture concise session memory. |
| append_run_journal_entry | Append a concise timestamped entry to a run journal section without rewriting the whole journal. |
Workspace files give assistants a scratch-pad for producing and iterating on deliverables — drafts, data files, generated code, and so on. Files persist across turns within the same conversation and are visible in the workspace sidebar.
Key behaviors:
- Scoped to the conversation — Each conversation has its own isolated workspace. Files are not shared between conversations.
- Upsert semantics —
write_fileoverwrites the file if one with the same filename already exists. - Automatic cleanup — Workspace files are removed after a configurable time-to-live once the conversation ends. The TTL is controlled by the
WORKSPACE_TTL_DAYSenvironment variable (default: 7 days).
Workflow
These tools are automatically available during workflow execution. They do not need to be enabled per assistant – the workflow engine injects them when a workflow run is active.
| Tool | Description |
|---|---|
| record_data | Record a key-value pair of gathered information. Accepts a key, value, and optional source (user_stated, tool_result, or inferred). Data persists across states and is used by guards and downstream operations. If a reducer is configured for the key, the value is merged according to the reducer strategy. |
| signal_completion | Signal that the current workflow state’s work is done. Accepts a summary of what was accomplished. Triggers guard evaluation and fires the next transition if guards pass. If required fields are unmet, returns the list of missing requirements instead of advancing. |
| retry_state | Retry the current workflow state when an action fails. Accepts a reason for the retry. The engine checks the state’s retry policy and returns the attempt count, or an error if the retry budget is exhausted. |
| switch_workflow | Switch the conversation to a different workflow. Accepts a workflow_id and reason. The current run is marked as abandoned, a new run is created with the target workflow, and previously gathered data is preserved. Only available when the assistant has multiple workflows attached. |
Skills
| Tool | Description |
|---|---|
| activate_skill | Activate a skill for the current conversation |
| read_skill_resource | Read a file from an activated skill |