diff --git a/adk/advanced/assets/deflecting-bot.png b/adk/advanced/assets/deflecting-bot.png new file mode 100644 index 00000000..6927d955 Binary files /dev/null and b/adk/advanced/assets/deflecting-bot.png differ diff --git a/adk/advanced/assets/deflecting-dark.png b/adk/advanced/assets/deflecting-dark.png new file mode 100644 index 00000000..ed69c9d0 Binary files /dev/null and b/adk/advanced/assets/deflecting-dark.png differ diff --git a/adk/advanced/assets/deflecting.png b/adk/advanced/assets/deflecting.png new file mode 100644 index 00000000..4e3e0991 Binary files /dev/null and b/adk/advanced/assets/deflecting.png differ diff --git a/adk/advanced/assets/desk-main.png b/adk/advanced/assets/desk-main.png new file mode 100644 index 00000000..b7e9a016 Binary files /dev/null and b/adk/advanced/assets/desk-main.png differ diff --git a/adk/advanced/assets/desk-ui-dark.png b/adk/advanced/assets/desk-ui-dark.png new file mode 100644 index 00000000..6b60caf0 Binary files /dev/null and b/adk/advanced/assets/desk-ui-dark.png differ diff --git a/adk/advanced/assets/desk-ui.png b/adk/advanced/assets/desk-ui.png new file mode 100644 index 00000000..b651bb9a Binary files /dev/null and b/adk/advanced/assets/desk-ui.png differ diff --git a/adk/advanced/desk-hitl.mdx b/adk/advanced/desk-hitl.mdx new file mode 100644 index 00000000..f4cbc65c --- /dev/null +++ b/adk/advanced/desk-hitl.mdx @@ -0,0 +1,136 @@ +--- +title: HITL with Desk +description: Escalate conversations to support agents in Botpress Desk. +--- + +The `desk-hitl` plugin connects your agent to Botpress Desk for human handoff. When escalated, your agent calls `startHitl` to create a Desk ticket and a support agent takes over from there. + + + Botpress Desk main inbox view + Botpress Desk main inbox view + + +## Add `desk-hitl` to your agent + +Add the plugin to `agent.config.ts`: + +```typescript +import { defineConfig, z } from "@botpress/runtime" + +export default defineConfig({ + name: "my-agent", + + dependencies: { + integrations: { + webchat: "webchat@0.3.0", + }, + plugins: { + "desk-hitl": { + version: "desk-hitl@latest", + }, + }, + }, +}) +``` + +### Customize handoff messages + +Override the default messages the plugin sends when an agent joins or a session ends: + +```typescript +plugins: { + "desk-hitl": { + version: "desk-hitl@latest", + config: { + agentAssignedMessage: "A support agent has joined the conversation.", + sessionEndedMessage: "The support session has ended. Is there anything else I can help you with?", + }, + }, +}, +``` + +## Connect your bot in Botpress Desk + +To enable escalations, link your bot to Botpress Desk from the Desk UI. This is a one-time step per bot. Your bot must be deployed at least once before it appears in the list. + + + + Run `adk deploy` to deploy your bot. + + + Open [**Botpress Desk**](/desk/introduction). + + + Go to **AI Agents → Deflecting Bots**. + + + Add your bot. + + + + + Deflecting Bots page in Botpress Desk settings + Deflecting Bots page in Botpress Desk settings + + + + If you skip this step, `startHitl` will fail with: _"This bot is not connected to Botpress Desk. Enable it on the Deflecting Bots page in Botpress Desk, then republish."_ + + + +## Create an escalation tool + +Wrap `startHitl` in an `Autonomous.Tool` so the model can decide when to escalate. Create a file called `handToSupport.ts` under `src/tools/`: + +```typescript +import { Autonomous, context, plugins, z } from "@botpress/runtime" + +export default new Autonomous.Tool({ + name: "handToSupport", + description: + "Transfer the conversation to a support agent. Use when the user explicitly asks for a support agent, or when their issue is beyond the bot's capabilities.", + input: z.object({ + reason: z.string().describe("Why the conversation needs a support agent"), + priority: z.enum(["low", "medium", "high", "urgent"]).default("medium"), + }), + handler: async ({ reason, priority }) => { + const conversation = context.get("conversation") + + await plugins["desk-hitl"].actions.startHitl({ + conversationId: conversation.id, + title: reason, + priority, + }) + }, +}) +``` + +Fields passed to `startHitl`: + +| Field | Type | Description | +|-------|------|-------------| +| `conversationId` | `string` | The conversation to escalate — required | +| `title` | `string` | Ticket title shown in Desk | +| `priority` | `'low' \| 'medium' \| 'high' \| 'urgent'` | Ticket priority (default: `'medium'`) | +| `userName` | `string` | Customer name shown in the Desk ticket | +| `userEmail` | `string` | Customer email shown in the Desk ticket | + +## Use the tool in a conversation handler + +Add the tool to `conversations/index.ts` and instruct the model when to use it: + +```typescript +import { Conversation } from "@botpress/runtime" +import handToSupport from "../tools/handToSupport" + +export default new Conversation({ + channel: "*", + handler: async ({ execute }) => { + await execute({ + instructions: `You are a helpful support assistant. +If the user needs help beyond your capabilities or explicitly asks for a support agent, use the handToSupport tool. After calling it, do not send any message.`, + tools: [handToSupport], + }) + }, +}) +``` diff --git a/adk/advanced/hitl.mdx b/adk/advanced/hitl.mdx index afce21d5..19ff56e0 100644 --- a/adk/advanced/hitl.mdx +++ b/adk/advanced/hitl.mdx @@ -1,10 +1,10 @@ --- -title: Human-in-the-loop +title: Human-in-the-loop (HITL) description: Escalate conversations to live human agents. --- - This covers the HITL integration and plugin, which connects your agent to external helpdesk platforms (Zendesk, Intercom, etc.). This is separate from integrating your ADK agent with [Botpress Desk](/desk/introduction). + This covers the HITL integration and plugin, which works with Botpress's built-in HITL dashboard and external helpdesk platforms (Zendesk, Intercom, etc.). This is separate from [Botpress Desk](/adk/advanced/desk-hitl). HITL (Human-in-the-Loop) lets your agent hand off a conversation to a live human agent. It's powered by two dependencies working together: the **HITL integration** (the transport to a helpdesk or agent platform) and the **HITL plugin** (the actions your code calls). diff --git a/docs.json b/docs.json index e61161ce..d530c08a 100644 --- a/docs.json +++ b/docs.json @@ -523,7 +523,8 @@ { "group": "Advanced", "pages": [ - "/adk/advanced/hitl" + "/adk/advanced/hitl", + "/adk/advanced/desk-hitl" ] }, {