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);
    // ...
  }
};
Confirmations

Flow

  1. Assistant calls tool with parameters
  2. suggestConfirmationUI generates confirmation UI
  3. User sees confirmation dialog with details
  4. If user confirms, handler executes
  5. 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()
    };
  }
}