Agent Skills

Every skill, explained

Skills are what turn a language model into a working assistant. Each checkbox in the Skills panel gives the agent one or more tools, plus a short built-in prompt telling it how to use them. This page covers every skill in detail.

How skills work

Enabling a skill does two things:

  1. Registers a set of tools (functions the model can call).
  2. Appends a built-in prompt that explains how to use them.

You can override the built-in prompt from the skill's config panel — the panel opens automatically when you tick a skill's box.

#Memory

Lets the agent look back through prior messages on demand. Without this skill, the agent only sees the last N turns (set by History depth). With Memory on, older context is reachable via search and range fetches.

Tools

  • conversationStats — total turn count, first-message date, last message.
  • searchMessages(query, limit?) — full-text search inside this conversation.
  • getMessages(from, to) — fetch a range of turns by index (1 = oldest).
  • getMessagesAround(turnIdx, radius?) — grab context around a specific turn.

When to enable

  • Long-running conversations where old details matter (medical follow-ups, ongoing sales cycles).
  • Any use case where the customer casually references “last week” or “that thing I asked about”.

Combined with a shrunk History depth (e.g. 3), Memory dramatically reduces per-turn cost while keeping the whole conversation reachable when needed.

#Self-pause

Gives the agent a way to hand a conversation off to a human by pausing itself for the current contact. Once paused, the agent stops replying to that contact until an operator resumes them from the inbox.

Tools

  • pauseAgent({ reason: string }) — pause auto-replies for this contact. The reason is saved to the CRM record as an audit trail.

When to enable

Almost always. It's a safety valve: hostile customer, deal that's ready for a human closer, ambiguity that only a person can resolve.

System-prompt hint
prompt fragment
If the customer is asking to speak with a person, is visibly upset, or needs a decision only management can make, call pauseAgent with a one-line reason. After that, write ONE polite handoff line ("A colleague will get back to you shortly") and stop.

#CRM Management

Lets the agent create and update contact records — the foundation of “pre-qualified leads” hitting your sales team's inbox already tagged and tagged.

Tools

  • upsertClient({...}) — create or update a contact by phone. Sets name, status, tags, summary.
  • getClient(phone) — look up an existing contact.
  • searchClients(query) — find contacts by name or phone.
Contacts auto-upsert on first message

Even without this skill, alChatBot creates a Client row for every new sender. The skill just lets the agent enrich that row (tag, status, summary) automatically.

#User Fields

Custom fields you define on the Contacts page (age, city, plan, budget…) — the agent can read and write them just like normal contact attributes. Combine with a field schemato build powerful qualification flows.

Tools

  • listUserFields() — schema of available fields.
  • setUserField(key, value) — save a value on the current contact.
  • getUserField(key) — recall a saved value.
  • searchContactsByField(key, value) — find contacts matching a filter.
Example — qualification flow
Salam, saytım üçün proqramçı axtarıram.
Salam! Sizin sahə nədir və proqramçınız neçə ay ərzində lazımdır?
İT startap, 2 ay sonra.

Agent calls setUserField("industry", "IT startup") and setUserField("timeline", "2 months").

Anladım. Sizin təxmini büdcəniz nə qədərdir?

#Data Tables

Custom tables you upload on the /dashboard/ai/tables page — perfect for price lists, product catalogues, FAQ archives, or team rosters. Agents search across rows and answer the customer with the right entry.

Tools

  • listTables() — enumerate available tables in this workspace.
  • searchTable(tableId, query) — full-text search on the table's content.
  • getTableRows(tableId, from, to) — read a specific range.
Prefer tables over long system prompts

If your system prompt is stuffed with menu items or a price list, move them into a Data Table. The prompt stays clean, and tables update independently — no re-testing the whole agent when prices change.

#HTTP API Requests

Lets the agent call your own APIs — Bitrix, Notion, an in-house billing service, whatever. You define the tools upfront as templates; the agent picks the right one and fills in parameters.

Configuration

Open the HTTP skill panel and click + Add tool. Each tool has:

  • Name — a JavaScript-safe identifier (e.g. createBitrixLead).
  • Description — 1–2 lines the model reads when deciding whether to call it.
  • Method, URL, Headers, Body — the actual HTTP call. Supports Handlebars-style placeholders for parameters.
  • Parameters — the schema the model must satisfy (each parameter has a name, description, and type).
Example — Bitrix lead creation
config
Name:        createBitrixLead
Description: Create a new lead in Bitrix CRM. Use after the customer confirms name and phone.
Method:      POST
URL:         https://your-bitrix.bitrix24.eu/rest/1/xyz.../crm.lead.add.json
Headers:     Content-Type: application/json
Body:        {"fields":{"TITLE":"{{title}}","NAME":"{{name}}","PHONE":[{"VALUE":"{{phone}}","VALUE_TYPE":"WORK"}]}}
Parameters:
  - title  (string) — Short lead title, e.g. "Website inquiry".
  - name   (string) — Customer's full name.
  - phone  (string) — Customer's phone in E.164, e.g. +994551234567.

HTTP tools fire even in the Sandbox — that's intentional so you can test the integration. Use throwaway data if you don't want real records created.

#Live Operators

Lets the agent ping a human teammate over WhatsApp when it doesn't know something, wait for their reply, and then forward the answer back to the customer.

Tools

  • listOperators() — enumerate available operators.
  • askOperator({ operatorId, question }) — ping the operator with the question. The system delivers their reply back to the customer automatically.

Configuration

The skill's config panel is where you add operators. Each operator has:

  • Name — shown to the agent when it decides who to ask.
  • WhatsApp phone — digits only, e.g. 994551234567.
  • Order — the pinging sequence. If operator #1 doesn't reply within their timeout, alChatBot forwards to operator #2.
  • System prompt — optional, describes their role so the agent knows what to ask them.
Example — customer asks about custom pricing
10 000 ədəd üçün endirim varmı?
Agent → operator
Aygün müəllim, müştəri 10 000 ədəd üçün endirim soruşur. Cavab verə bilərsiniz?

The operator replies on WhatsApp: “Bəli, 15% endirim təklif edirik.”

Agent → customer
Yeni məlumat aldım — 10 000 ədəd üçün 15% endirim təklif edirik. Sifariş vermək istəyirsiniz?

#Polls

Lets the agent send native WhatsApp polls with 2–12 options. The customer taps a choice, and the vote arrives as the next user message with the option's label — the agent handles it like any other reply.

Tools

  • sendPoll({ name, options, multi? }) — sends a poll.
No chat text with the poll

WhatsApp shows the poll as its own bubble. If the agent sends both a chat message and a poll in the same turn, the customer sees both at once — usually redundant. The built-in prompt reminds the model to write NOTHING else on poll turns.

For richer branching (poll options that each trigger a different downstream flow), use a poll node in an Automation instead — the agent's poll skill is best for lightweight in-conversation choices.

#Google Calendar (Connector)

Adds three tools that let the agent check availability and book meetings on the workspace's connected Google Calendar. Requires a workspace-level connection — see Connectors.

Tools

  • listCalendarEvents({ timeMin, timeMax, q? }) — check what's on the calendar between two ISO timestamps.
  • createCalendarEvent({ summary, start, end, timezone?, attendeeEmails? }) — book a slot.
  • cancelCalendarEvent({ eventId }) — remove a booking.
Example — booking a consultation
Sabah saat 15:00 üçün konsultasiya bron edə bilərəm?

Agent calls listCalendarEvents(timeMin: 2026-07-09T14:00:00+04:00, timeMax: 2026-07-09T16:00:00+04:00) — slot is free.

Bəli, sabah 15:00 boşdur. Adınızı və e-poçtunuzu təsdiq edin, sizin üçün Calendar-a qeyd edim.
Aygün Rəhimova, aygun@example.com

Agent calls createCalendarEvent(summary: "Konsultasiya — Aygün Rəhimova", start: 2026-07-09T15:00:00+04:00, end: 2026-07-09T15:30:00+04:00, attendeeEmails: ["aygun@example.com"]).

✓ Bron edildi — sabah 15:00–15:30. Google Calendar-dan dəvətnamə e-poçtunuza gələcək.
ISO timestamps with timezone

The tools require full ISO strings with timezone offset. The agent's Timezone setting drives the offset — set it correctly for your customers.

#Reminder (background)

Not a runtime tool — this skill enables a background scheduler that sends a warm follow-up when a contact has gone silent for a configurable number of hours (default 24). Perfect for re-engaging leads who ghosted.

Configuration

  • Reminder hours — how many hours of silence trigger the follow-up (default 24, max 720 / 30 days).

Only contacts that are not agent-paused are eligible. Paused conversations remain silent — the whole point of pausing is to hand off to a human.