What are tools?

Tools extend your chatbot with external capabilities. Enable them from the Tools tab — configuration is a per-tool form of credentials.

The Tools tab on a chatbot page lists every tool you can enable. Each tool adds a capability the chatbot can use during a conversation.

The page

/app/chatbots/{id}/tools. Sub-nav active tab: Tools.

Section heading

When unlocked:

  • : Available Tools

  • Subtitle: "Enable tools to give your chatbot access to external services during conversations."

When locked (see below), the same section is rendered but with:

  • : Preview — Available Tools

  • Subtitle: "This is what you'll be able to enable once you upgrade."

Empty state

If no tools are seeded at all, the card area shows:

No tools available yet.

Today two tools ship — see Wasi real estate and Human handoff.

Plan gate

The backend controller has plug ChatbotgenWeb.Plugs.RequireFeature, feature: :tools, label: "AI Tools". When feature_locked is true, the page renders a FeatureLockCard at the top, and the tools list below is dimmed with opacity-60 pointer-events-none select-none.

The lock card uses exactly this copy:

  • Title: Turn your chatbot into an AI agent
  • Tagline: "Tools let your bot DO things mid-conversation — not just answer questions. Capture leads, book meetings, search real estate listings, or hand off to a human."
  • Price badge: Growth — $79
  • Four bullets:
    • Lead capture"Save visitor contact info straight into your CRM or a webhook."
    • Book appointments"Your bot picks a time from your calendar and confirms the meeting."
    • Real estate & custom APIs"Wasi property search out of the box. Custom webhooks for any service you use."
    • Human handoff"When the bot can't help, it transfers the conversation to your team seamlessly."

Tool card

Each tool renders as a card:

┌──────────────────────────────────────────────────┐
│  🔧  Wasi Real Estate                            │
│      ● Enabled                                   │
│      Search properties from Wasi CRM…            │
│                        [ Configure ] [ Remove ]  │
└──────────────────────────────────────────────────┘

Per card:

  • A wrench icon
  • The tool name (from tool.name)
  • A green Enabled pill (dot + word) if the tool is already enabled on this chatbot
  • The tool description (from tool.description)
  • Right-side buttons:
    • When not enabled: a single Enable button
    • When enabled: Configure (or Hide when the form is already open) + Remove

Clicking any of the toggle buttons opens/closes the inline config form below the card.

Config form (inline)

The form is built from tool.config_schema.fields — each field in the schema renders based on its type:

  • checkbox — a checkbox + label; stored as string "true" / "false"
  • textarea — a 4-row textarea
  • password — a masked
  • anything else — a plain text input

Required fields show a red * next to the label.

When enabling, the submit button reads Enable Tool; when configuring an already-enabled tool, it reads Update. Submits go to:

  • POST /app/chatbots/{id}/tools with tool_id + credentials (enable)
  • PUT /app/chatbots/{id}/tools/{tool_id} with credentials (update)

Remove flow

Clicking Remove on an enabled tool calls the browser's confirm() with:

Are you sure you want to remove this tool?

Confirming fires DELETE /app/chatbots/{id}/tools/{tool_id}.

Backend flash messages

Verified from ToolController:

  • Enable success: "Tool enabled successfully."
  • Enable failure: "Failed to enable tool."
  • Update success: "Tool updated successfully."
  • Update failure: "Failed to update tool." (or "Tool not found." if the ChatbotTool doesn't exist)
  • Remove success: "Tool removed."

The enable/update actions also re-check the feature gate on the server (RequireFeature.halt_if_locked) — a locked account that somehow submits the form gets halted.

See also