Install any skill in seconds. Free to start, no credit card required.
Get Started Free →a set of guidelines to build with Botpress's Agent Development Kit (ADK) - use these whenever you're tasked with building a feature using the ADK
.claude/skills/majiayu000-adk/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 43% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 18% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 160% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 41% | 0% |
Use this skill when you've got questions about the Botpress Agent Development Kit (ADK) - like when you're building a feature that involves tables, actions, tools, workflows, conversations, files, knowledge bases, triggers, or Zai.
The Botpress ADK is a convention-based TypeScript framework where file structure maps directly to bot behavior. Place files in the correct directories, and they automatically become available as bot capabilities.
The ADK provides primitives for:
All primitives must be placed in src/ directory:
/ # Project root
├── src/
│ ├── actions/ # Strongly-typed functions → auto-registered
│ ├── tools/ # AI-callable tools → available via execute()
│ ├── workflows/ # Long-running processes → resumable/scheduled
│ ├── conversations/ # Message handlers → routes by channel
│ ├── tables/ # Database schemas → auto-created with search
│ ├── triggers/ # Event handlers → subscribe to events
│ ├── knowledge/ # Knowledge bases → RAG with semantic search
│ └── utils/ # Shared helpers (not auto-registered)
└── agent.config.ts # Bot configuration (includes integrations)> Note: dependencies.json was removed in ADK 1.9+. All configuration including integrations now lives in agent.config.ts.
> Critical: Files outside src/ are not discovered. Location = behavior.
Activate this skill when users ask ADK-related questions like:
ADK questions fall into two categories: CLI queries and documentation lookups.
For integration discovery and CLI queries, use the Bash tool to run commands directly:
Integration Discovery:
bash# Search for integrations adk search <query> # List all available integrations adk list --available # Get detailed integration info (actions, channels, events) adk info <integration-name> # Check installed integrations (must be in ADK project) adk list
Project Info:
bash# Check CLI version adk --version # Show project status adk # Get help adk --help
When to use CLI commands:
Response pattern:
adk commandadk add slack@3.0.0 to install")For documentation, patterns, and how-to questions, search and reference the documentation files directly:
When to use documentation:
How to answer documentation questions:
pattern: **/references/*.md
pattern: <keyword from user question> path: <path to references directory from step 1> output_mode: files_with_matches
Documentation should be located in ./references/ directory relative to this skill. When answering questions, search for these topics:
Quick reference for accessing ADK runtime services:
typescript// Always import from @botpress/runtime import { Action, Autonomous, Workflow, Conversation, z, actions, adk, user, bot, conversation, context, } from "@botpress/runtime";
typescript// Bot state (defined in agent.config.ts) bot.state.maintenanceMode = true; bot.state.lastDeployedAt = new Date().toISOString(); // User state (defined in agent.config.ts) user.state.preferredLanguage = "en"; user.state.onboardingComplete = true; // User tags user.tags.email; // Access user metadata
typescript// Call bot actions await actions.fetchUser({ userId: "123" }); await actions.processOrder({ orderId: "456" }); // Call integration actions await actions.slack.sendMessage({ channel: "...", text: "..." }); await actions.linear.issueList({ teamId: "..." }); // Convert action to tool tools: [fetchUser.asTool()];
typescript// Get runtime services const client = context.get("client"); // Botpress client const cognitive = context.get("cognitive"); // AI model client const citations = context.get("citations"); // Citation manager
myAction.ts, searchDocs.ts (camelCase)Users.ts, Orders.ts (PascalCase)chat.ts, slack.ts (lowercase)When answering questions, always verify these patterns against the documentation:
bash# All package managers are supported bun install # Recommended (fastest) npm install # Works fine yarn install # Works fine pnpm install # Works fine # ADK auto-detects based on lock files # - bun.lockb → uses bun # - package-lock.json → uses npm # - yarn.lock → uses yarn # - pnpm-lock.yaml → uses pnpm
typescript// ✅ CORRECT - Always from @botpress/runtime import { Action, Autonomous, Workflow, z } from "@botpress/runtime"; // ❌ WRONG - Never from zod or @botpress/sdk import { z } from "zod"; // ❌ Wrong import { Action } from "@botpress/sdk"; // ❌ Wrong
typescript// ✅ Both patterns work - export const is recommended export const myAction = new Action({ ... }); // Recommended export default new Action({ ... }); // Also valid // Why export const? // - Enables direct imports: import { myAction } from "./actions/myAction" // - Can pass to execute(): tools: [myAction.asTool()]
typescript// ✅ CORRECT - Handler receives { input, client } export const fetchUser = new Action({ name: "fetchUser", async handler({ input, client }) { // ✅ Destructure from props const { userId } = input; // ✅ Then destructure fields return { name: userId }; } }); // ❌ WRONG - Cannot destructure input fields directly handler({ userId }) { // ❌ Wrong - must be { input } return { name: userId }; }
typescript// ✅ CORRECT - Tools CAN destructure directly export const myTool = new Autonomous.Tool({ handler: async ({ query, maxResults }) => { // ✅ Direct destructuring OK return search(query, maxResults); }, });
typescript// ✅ CORRECT - Use conversation.send() method await conversation.send({ type: "text", payload: { text: "Hello!" } }); // ❌ WRONG - Never use client.createMessage() directly await client.createMessage({ ... }); // ❌ Wrong
When answering ADK questions, follow this structure:
Example Response Structure:
Actions are strongly-typed functions that can be called from anywhere in your bot.
**Example:**
[code example]
**Common Pitfall:** Remember to destructure `input` first (see troubleshooting section)
**Related:** You can convert Actions to Tools using `.asTool()` - see the "When to Use What" decision tree.
**Next Steps:** Create your action in `src/actions/myAction.ts` and it will be auto-registered.Other measured skills in the registry, with their headline benchmark lift.