Skip to content

Commit

Permalink
Merge pull request #9426 from nextcloud/enh/improve-smart-replies-prompt
Browse files Browse the repository at this point in the history
Enh: Improve smart replies prompt
  • Loading branch information
hamza221 authored Jun 12, 2024
2 parents 92c1592 + 17b7b80 commit 053af98
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 10 deletions.
2 changes: 1 addition & 1 deletion lib/Controller/MessagesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -908,7 +908,7 @@ public function smartReply(int $messageId):JSONResponse {
return new JSONResponse([], Http::STATUS_FORBIDDEN);
}
try {
$replies = $this->aiIntegrationService->getSmartReply($account, $mailbox, $message, $this->currentUserId);
$replies = array_values($this->aiIntegrationService->getSmartReply($account, $mailbox, $message, $this->currentUserId));
} catch (ServiceException $e) {
$this->logger->error('Smart reply failed: ' . $e->getMessage(), [
'exception' => $e,
Expand Down
36 changes: 27 additions & 9 deletions lib/Service/AiIntegrations/AiIntegrationsService.php
Original file line number Diff line number Diff line change
Expand Up @@ -170,9 +170,10 @@ public function generateEventData(Account $account, string $threadId, array $mes
}

/**
* @return string[]
* @return ?string[]
* @throws ServiceException
*/
public function getSmartReply(Account $account, Mailbox $mailbox, Message $message, string $currentUserId): array {
public function getSmartReply(Account $account, Mailbox $mailbox, Message $message, string $currentUserId): ?array {
try {
$manager = $this->container->get(IManager::class);
} catch (\Throwable $e) {
Expand All @@ -181,7 +182,7 @@ public function getSmartReply(Account $account, Mailbox $mailbox, Message $messa
if (in_array(FreePromptTaskType::class, $manager->getAvailableTaskTypes(), true)) {
$cachedReplies = $this->cache->getValue('smartReplies_'.$message->getId());
if ($cachedReplies) {
return explode("|", $cachedReplies);
return json_decode($cachedReplies, true, 512);
}
$client = $this->clientFactory->getClient($account);
try {
Expand All @@ -199,13 +200,30 @@ public function getSmartReply(Account $account, Mailbox $mailbox, Message $messa
} finally {
$client->logout();
}
$prompt = "Suggest 2 replies to the following email. Each reply should be 25 characters max. Separate the replies with \"| \", like for example \"Yes! | No, I'm not available \". Do not print anything else. The email contents are : ".$messageBody."";
$prompt = "You are tasked with formulating helpful replies or reply templates to e-mails provided that have been sent to me. If you don't know some relevant information for answering the e-mails (like my schedule) leave blanks in the text that can later be filled by me. You must write the replies from my point of view as replies to the original sender of the provided e-mail!
Formulate two extremely succinct reply suggestions to the provided ***E-MAIL***. Please, do not invent any context for the replies but, rather, leave blanks for me to fill in with relevant information where necessary. Provide the output formatted as valid JSON with the keys 'reply1' and 'reply2' for the reply suggestions.
Each suggestion must be of 25 characters or less.
Here is the ***E-MAIL*** for which you must suggest the replies to:
***START_OF_E-MAIL***".$messageBody."
***END_OF_E-MAIL***
Please, output *ONLY* a valid JSON string with the keys 'reply1' and 'reply2' for the reply suggestions. Leave out any other text besides the JSON! Be extremely succinct and write the replies from my point of view.
";
$task = new Task(FreePromptTaskType::class, $prompt, 'mail,', $currentUserId);
$manager->runTask($task);
$replies = array_slice(explode("|", $task->getOutput()), 0, 2);
$this->cache->addValue('smartReplies_'.$message->getUid(), implode("|", $replies));
return $replies;

$replies = $task->getOutput();
try {
$decoded = json_decode($replies, true, 512, JSON_THROW_ON_ERROR);
$this->cache->addValue('smartReplies_'.$message->getId(), $replies);
return $decoded;
} catch (JsonException $e) {
throw new ServiceException('Failed to decode smart replies JSON output', $e);
}
} else {
throw new ServiceException('No language model available for smart replies');
}
Expand Down Expand Up @@ -234,7 +252,7 @@ private function isPersonalEmail(IMAPMessage $imapMessage): bool {
];

$senderAddress = $imapMessage->getFrom()->first()?->getEmail();

if($senderAddress !== null) {
foreach ($commonPatterns as $pattern) {
if (stripos($senderAddress, $pattern) !== false) {
Expand Down

0 comments on commit 053af98

Please sign in to comment.