Skip to content

Commit

Permalink
TASK: Move thread processing to assistant record
Browse files Browse the repository at this point in the history
  • Loading branch information
mficzel committed Feb 2, 2024
1 parent b559188 commit f93eb21
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 41 deletions.
26 changes: 4 additions & 22 deletions Classes/Controller/AssistantModuleController.php
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ public function addThreadMessageAction(string $threadId, string $assistantId, st
try {
$assistant->continueThread($threadId, $message, $withAdditionalInstructions);
$this->view->assignMultiple([
'messages' => $this->fetchMessages($threadId),
'messages' => $assistant->readThread($threadId),
'threadId' => $threadId,
'assistantId' => $assistantId,
'metadata' => $assistant->getCollectedMetadata()
Expand All @@ -127,30 +127,12 @@ public function addThreadMessageAction(string $threadId, string $assistantId, st

public function showThreadAction(string $threadId, string $assistantId): void
{
$assistant = $this->assistantDepartment->findAssistantById($assistantId);

$this->view->assignMultiple([
'messages' => $this->fetchMessages($threadId),
'messages' => $assistant->readThread($threadId),
'threadId' => $threadId,
'assistantId' => $assistantId,
]);
}

/**
* @return array<MessageRecord>
*/
private function fetchMessages(string $threadId): array
{
$threadMessageResponses = $this->client->threads()->messages()->list($threadId)->data;

$threadMessageResponsesFiltered = array_filter(
$threadMessageResponses,
fn(ThreadMessageResponse $threadMessageResponse) => ($threadMessageResponse->metadata['role'] ?? null) !== 'system'
);

return array_reverse(
array_map(
fn(ThreadMessageResponse $threadMessageResponse) => MessageRecord::fromThreadMessageResponse($threadMessageResponse),
$threadMessageResponsesFiltered
),
);
}
}
31 changes: 12 additions & 19 deletions Classes/Controller/ChatController.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,33 +34,26 @@ public function startAction(string $assistantId, string $message): void
$threadId = $assistant->startThread();
$assistant->continueThread($threadId, $message, true);

$messageResponse = $this->client->threads()->messages()->list($threadId)->data;
/** @var ?ThreadMessageResponse $lastMessage */
$lastMessage = reset($messageResponse);
$messageResponses = $assistant->readThread($threadId);
$lastMessageKey = array_key_last($messageResponses);
$lastMessage = $messageResponses[$lastMessageKey];

$this->view->assign('value', [
'bot' => true,
'message' => $lastMessage?->content ?: '',
'message' => $lastMessage->toApiArray(),
'threadId' => $threadId,
'metadata' => $assistant->getCollectedMetadata()
]);
}

public function historyAction(string $threadId): void
public function historyAction(string $assistantId, string $threadId): void
{
$data = $this->client->threads()->messages()->list($threadId)->data;

$messages = array_reverse(array_map(
fn (ThreadMessageResponse $threadMessageResponse) => MessageRecord::fromThreadMessageResponse($threadMessageResponse),
$data
));
$assistant = $this->assistantDepartment->findAssistantById($assistantId);
$messages = $assistant->readThread($threadId);

$this->view->assign('value', [
'messages' => array_map(
fn (MessageRecord $message): array => [
'bot' => $message->role !== 'user',
'message' => $message->content,
],
fn (MessageRecord $message): array => $message->toApiArray(),
$messages
),
]);
Expand All @@ -71,13 +64,13 @@ public function postAction(string $assistantId, string $threadId, string $messag
$assistant = $this->assistantDepartment->findAssistantById($assistantId);
$assistant->continueThread($threadId, $message);

$messageResponse = $this->client->threads()->messages()->list($threadId)->data;
/** @var ?ThreadMessageResponse $lastMessage */
$lastMessage = reset($messageResponse);
$messageResponses = $assistant->readThread($threadId);
$lastMessageKey = array_key_last($messageResponses);
$lastMessage = $messageResponses[$lastMessageKey];

$this->view->assign('value', [
'bot' => true,
'message' => $lastMessage?->content ?: '',
'message' => $lastMessage->toApiArray(),
'metadata' => $assistant->getCollectedMetadata()
]);
}
Expand Down
21 changes: 21 additions & 0 deletions Classes/Domain/Assistant.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use OpenAI\Contracts\ClientContract as OpenAiClientContract;
use Neos\Flow\Annotations as Flow;
use OpenAI\Responses\Threads\Messages\ThreadMessageResponse;
use OpenAI\Responses\Threads\Runs\ThreadRunResponseRequiredActionFunctionToolCall;
use OpenAI\Responses\Threads\Runs\ThreadRunResponseRequiredActionSubmitToolOutputs;
use Psr\Log\LoggerInterface;
Expand Down Expand Up @@ -66,6 +67,26 @@ public function continueThread(string $threadId, string $message, bool $withAddi
$this->completeRun($threadId, $runResponse->id);
}

/**
* @return array<MessageRecord>
*/
public function readThread(string $threadId): array
{
$threadMessageResponses = $this->client->threads()->messages()->list($threadId)->data;

$threadMessageResponsesFiltered = array_filter(
$threadMessageResponses,
fn(ThreadMessageResponse $threadMessageResponse) => ($threadMessageResponse->metadata['role'] ?? null) !== 'system'
);

return array_reverse(
array_map(
fn(ThreadMessageResponse $threadMessageResponse) => MessageRecord::fromThreadMessageResponse($threadMessageResponse),
$threadMessageResponsesFiltered
)
);
}

private function completeRun(string $threadId, string $runId): void
{
$threadRunResponse = $this->client->threads()->runs()->retrieve($threadId, $runId);
Expand Down
11 changes: 11 additions & 0 deletions Classes/Domain/MessageRecord.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,15 @@ public static function fromThreadMessageResponse(ThreadMessageResponse $response
$response->metadata
);
}

/**
* @return array{bot:boolean, messsage: string}
*/
public function toApiArray(): array
{
return [

Check failure on line 43 in Classes/Domain/MessageRecord.php

View workflow job for this annotation

GitHub Actions / Test (PHP 8.1, Flow 8.3)

Method Sitegeist\Chatterbox\Domain\MessageRecord::toApiArray() should return array{bot: bool, messsage: string} but returns array{bot: bool, message: array<int, OpenAI\Responses\Threads\Messages\ThreadMessageResponseContentImageFileObject|OpenAI\Responses\Threads\Messages\ThreadMessageResponseContentTextObject>}.
'bot' => $this->role !== 'user',
'message' => $this->content,
];
}
}

0 comments on commit f93eb21

Please sign in to comment.