Skip to main content

Agent Callbacks

Register global callbacks for display events and approval requests.

Display Callbacks

import { registerDisplayCallback, DisplayTypes } from 'praisonai';

// Register callback for agent output
registerDisplayCallback(DisplayTypes.AGENT_OUTPUT, (data) => {
  console.log(`[${data.agentName}] ${data.content}`);
});

// Register callback for tool calls
registerDisplayCallback(DisplayTypes.TOOL_CALL, (data) => {
  console.log(`Tool: ${data.toolName}`);
});

// Async callback
registerDisplayCallback(DisplayTypes.LLM_RESPONSE, async (data) => {
  await saveToDatabase(data);
}, true); // isAsync = true

Display Types

import { DisplayTypes } from 'praisonai';

// Agent events
DisplayTypes.AGENT_OUTPUT     // Agent response
DisplayTypes.AGENT_THINKING   // Agent reasoning

// Tool events
DisplayTypes.TOOL_CALL        // Before tool execution
DisplayTypes.TOOL_RESULT      // After tool execution

// LLM events
DisplayTypes.LLM_REQUEST      // Before LLM call
DisplayTypes.LLM_RESPONSE     // After LLM call

// Status events
DisplayTypes.ERROR            // Error occurred
DisplayTypes.WARNING          // Warning
DisplayTypes.INFO             // Information
DisplayTypes.DEBUG            // Debug info

// Workflow events
DisplayTypes.WORKFLOW_START   // Workflow started
DisplayTypes.WORKFLOW_COMPLETE // Workflow done
DisplayTypes.STEP_START       // Step started
DisplayTypes.STEP_COMPLETE    // Step done

Approval Callbacks

Request human approval for risky operations:
import { registerApprovalCallback, requestApproval } from 'praisonai';

// Register approval handler
registerApprovalCallback(async (request) => {
  console.log(`Approval needed: ${request.action}`);
  console.log(`Risk level: ${request.risk}`);
  console.log(`Arguments:`, request.arguments);
  
  // Auto-approve low risk
  if (request.risk === 'low') {
    return { approved: true };
  }
  
  // For higher risk, prompt user
  const answer = await promptUser(`Approve ${request.action}?`);
  return { 
    approved: answer === 'yes',
    reason: answer === 'yes' ? undefined : 'User denied'
  };
});

// Request approval somewhere in your code
const decision = await requestApproval({
  action: 'delete_file',
  arguments: { path: '/important/file.txt' },
  risk: 'high',
  toolName: 'file_operations',
  description: 'Delete an important file'
});

if (decision.approved) {
  // Proceed with operation
} else {
  console.log('Denied:', decision.reason);
}

Risk Levels

type RiskLevel = 'low' | 'medium' | 'high' | 'critical';

// low: Safe operations, usually auto-approved
// medium: Some caution needed
// high: Requires explicit approval
// critical: Always requires human confirmation

Callback Management

import {
  registerDisplayCallback,
  unregisterDisplayCallback,
  getRegisteredDisplayTypes,
  clearAllCallbacks
} from 'praisonai';

// Register
const handler = (data) => console.log(data);
registerDisplayCallback('agent_output', handler);

// Check registered types
const types = getRegisteredDisplayTypes();
console.log('Registered:', types);

// Unregister specific callback
unregisterDisplayCallback('agent_output', handler);

// Clear all callbacks
clearAllCallbacks();

Execute Callbacks

import { executeCallback, executeSyncCallback } from 'praisonai';

// Execute async (preferred)
await executeCallback('agent_output', {
  content: 'Hello!',
  agentName: 'Assistant'
});

// Execute sync only
executeSyncCallback('agent_output', {
  content: 'Hello!',
  agentName: 'Assistant'
});