Skip to main content

Event Emitter

The Event Emitter utility provides a flexible event system for inter-component communication and framework lifecycle management in Agent Forge.

Overview

The Event Emitter is used throughout Agent Forge for:

  • LLM response streaming
  • Agent lifecycle events
  • Tool execution notifications
  • Framework status updates

Basic Usage

import { EventEmitter } from "agent-forge";

const eventEmitter = new EventEmitter();

// Listen for events
eventEmitter.on('custom-event', (data) => {
console.log('Event received:', data);
});

// Emit events
eventEmitter.emit('custom-event', { message: 'Hello World' });

Event Types

Framework Events

  • framework-init - Framework initialization
  • framework-ready - Framework ready for use
  • framework-shutdown - Framework shutdown

Agent Events

  • agent-run-start - Agent execution begins
  • agent-run-complete - Agent execution completes
  • agent-error - Agent execution error

LLM Events

  • llm-request-start - LLM request begins
  • llm-request-complete - LLM request completes
  • llm-stream-chunk - Streaming response chunk
  • llm-stream-complete - Streaming response complete

Tool Events

  • tool-execute-start - Tool execution begins
  • tool-execute-complete - Tool execution completes
  • tool-error - Tool execution error

Methods

on(event, listener)

Register an event listener.

eventEmitter.on('event-name', (data) => {
// Handle event
});

emit(event, data)

Emit an event with optional data.

eventEmitter.emit('event-name', { key: 'value' });

off(event, listener)

Remove an event listener.

const listener = (data) => console.log(data);
eventEmitter.on('event-name', listener);
eventEmitter.off('event-name', listener);

once(event, listener)

Listen for an event only once.

eventEmitter.once('one-time-event', (data) => {
console.log('This will only run once');
});

Integration Examples

LLM Streaming

const llm = await LLM.create("openai", { apiKey: process.env.OPENAI_API_KEY });
const eventEmitter = llm.getEventEmitter();

eventEmitter.on('llm-stream-chunk', (chunk) => {
process.stdout.write(chunk.content);
});

const response = await llm.chatStream({
messages: [{ role: "user", content: "Tell me a story" }],
model: "gpt-4",
onChunk: (chunk) => {
// Additional chunk processing
}
});

Agent Monitoring

const agent = new Agent(config);
const eventEmitter = agent.getLLMProvider()?.getEventEmitter();

if (eventEmitter) {
eventEmitter.on('agent-run-start', (data) => {
console.log(`Agent ${data.agentName} started`);
});

eventEmitter.on('agent-run-complete', (data) => {
console.log(`Agent ${data.agentName} completed in ${data.duration}ms`);
});
}

Best Practices

  • Use descriptive event names
  • Keep event listeners lightweight
  • Remove listeners when no longer needed
  • Handle errors in event listeners
  • Use once() for one-time events

See Also