Tool Confirmations
Add human verification steps to your tools
Overview
Tool confirmations allow you to add a human verification step before executing sensitive operations. When enabled, the assistant will present a confirmation UI to the user before proceeding with the tool's main handler.
Configuration
Enable confirmations in your tool config:
import { ToolConfig } from '@dainprotocol/service-sdk';
import { CardUIBuilder } from '@dainprotocol/utils';
const toolConfig: ToolConfig = {
// ... other config
suggestConfirmation: true,
async suggestConfirmationUI(input) {
return {
success: true,
ui: new CardUIBuilder()
.title('Confirm Action')
.content(`Are you sure you want to proceed?`)
.build()
};
}
};
Example: Issue Creation Confirmation
const createIssueConfig: ToolConfig = {
id: 'create-issue',
name: 'Create Issue',
suggestConfirmation: true,
async suggestConfirmationUI(input) {
return {
success: true,
ui: new CardUIBuilder()
.title('Confirm Issue Creation')
.content(`
## Issue Details
**Title:** ${input.title}
**Description:** ${input.description}
**Assignee:** ${input.assigneeId}
**Due Date:** ${input.dueDate}
`)
.build()
};
},
handler: async (input, agentInfo) => {
// Handler only runs after user confirms
const issue = await createIssue(input);
// ...
}
};

Flow
- Assistant calls tool with parameters
suggestConfirmationUI
generates confirmation UI- User sees confirmation dialog with details
- If user confirms, handler executes
- If user denies, operation is cancelled
Use Cases
- Creating, updating, or deleting resources
- Making purchases or payments
- Sending messages or emails
- Modifying user settings
- Executing irreversible operations
- Actions requiring human oversight
Error Handling
async suggestConfirmationUI(input) {
try {
// Validate input or check conditions
if (!isValid(input)) {
return {
success: false,
ui: new CardUIBuilder()
.title('Invalid Parameters')
.content('Please check the input values')
.build()
};
}
return {
success: true,
ui: new CardUIBuilder()
.title('Confirm Action')
.content('Action details...')
.build()
};
} catch (error) {
return {
success: false,
ui: new CardUIBuilder()
.title('Error')
.content(error.message)
.build()
};
}
}