Technical stuff
Events dispatched by the Assistants Manager
Full Subscriber example.
<?php declare(strict_types=1);
namespace AnyPlugin\Subscriber;
use FelOAIAssistantsManager\Event\ActionRequiredEvent;
use FelOAIAssistantsManager\Event\CancelRunEvent;
use FelOAIAssistantsManager\Event\CompletedEvent;
use FelOAIAssistantsManager\Event\CreateThreadEvent;
use FelOAIAssistantsManager\Event\DeleteThreadEvent;
use FelOAIAssistantsManager\Event\DeleteMessageEvent;
use FelOAIAssistantsManager\Event\FetchMessagesEvent;
use FelOAIAssistantsManager\Event\SendMessageEvent;
use FelOAIAssistantsManager\Event\RunFailedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class AssistantEventListener implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
FetchMessagesEvent::NAME => 'onFetchMessages',
CancelRunEvent::NAME => 'onCancelRun',
CreateThreadEvent::NAME => 'onCreateThread',
SendMessageEvent::NAME => 'onSendMessage',
CompletedEvent::NAME => 'onCompleted',
DeleteThreadEvent::NAME => 'onDeleteThread',
DeleteMessageEvent::NAME => 'onDeleteMessage',
ActionRequiredEvent::NAME => 'onActionRequired',
RunFailedEvent::NAME => 'onRunFailedEvent',
];
}
public function onFetchMessages(FetchMessagesEvent $event): void
{
$response = [
'threadId' => $event->getThreadId(),
'threadMessages' => $event->getThreadMessages(),
];
}
public function onCancelRun(CancelRunEvent $event): void
{
$response = [
'statusResponse' => $event->getStatusResponse(),
'threadId' => $event->getThreadId(),
'runId' => $event->getRunId(),
];
}
public function onCreateThread(CreateThreadEvent $event): void
{
$response = [
'statusResponse' => $event->getStatusResponse(),
'assistantId' => $event->getAssistantId(),
'message' => $event->getMessage(),
];
}
public function onSendMessage(SendMessageEvent $event): void
{
$response = [
'statusResponse' => $event->getStatusResponse(),
'threadId' => $event->getThreadId(),
'assistantId' => $event->getAssistantId(),
'message' => $event->getMessage(),
];
}
public function onCompleted(CompletedEvent $event): void
{
$response = [
'statusResponse' => $event->getStatusResponse(),
'threadId' => $event->getThreadId(),
'runId' => $event->getRunId(),
];
}
public function onDeleteThread(DeleteThreadEvent $event): void
{
$response = [
'threadId' => $event->getThreadId(),
'deleted' => $event->getDeleted(),
];
}
public function onDeleteMessage(DeleteMessageEvent $event): void
{
$response = [
'threadId' => $event->getThreadId(),
'messageId' => $event->getMessageId(),
'deleted' => $event->getDeleted(),
];
}
public function onActionRequired(ActionRequiredEvent $event): void
{
$response = [
'toolCalls' => $event->getToolCalls(),
'processedActions' => $event->getProcessedActions(),
'executedActions' => $event->getExecutedActions(),
'getUsedConfig' => $event->getUsedConfig(),
'storeApiError' => $event->getStoreApiError(),
'threadId' => $event->getThreadId(),
'runId' => $event->getRunId(),
];
}
public function onRunFailedEvent(RunFailedEvent $event): void
{
$response = [
'statusResponse' => $event->getStatusResponse(),
'threadId' => $event->getThreadId(),
'runId' => $event->getRunId(),
];
}
}
Workflow of a chat
''' autoHandleRequest (autoChat) │ ├─> send_message │ └─> gets runId │ ├─> status_check (via handleRequest) │ └─> checkRunStatusAndHandleActions │ ├─> loops through statuses │ ├─> handles tool calls if needed │ └─> returns when completed/failed │ └─> When status === 'completed' ├─> triggers fetch_messages ├─> clears run state (runId, message, etc.) └─> returns final structure with messages '''