Просмотр исходного кода

5406 AI Agents revamp: async agents call experiment

Aleksandr Trofimov 7 месяцев назад
Родитель
Сommit
325f5f7d8c
3 измененных файлов с 71 добавлено и 29 удалено
  1. 16 0
      inc/classes/BxDolAI.php
  2. 26 29
      inc/classes/BxDolAiAlertResponse.php
  3. 29 0
      inc/utils.inc.php

+ 16 - 0
inc/classes/BxDolAI.php

@@ -400,6 +400,22 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
         return $oMessage->getContent();
     }
 
+    public function sendAutoMessage ($iSender, $iRecipient, $sMsg) 
+    {        
+        $oMessengerModule = BxDolModule::getInstance('bx_messenger');
+
+        $aAutoReplyData = [
+            'message' => $sMsg,
+            'participants' => [$iSender, $iRecipient],
+        ];
+
+        $iSaveProfileId = $oMessengerModule->setProfileId($iSender);
+        $a = $oMessengerModule->sendMessage($aAutoReplyData, $iRecipient, $iSender);
+        $oMessengerModule->setProfileId($iSaveProfileId);
+
+        return $a;
+    }
+
     public function getAgentsByAlertUnitAndAction($sUnit, $sAction)
     {
         return $this->_oDb->getAgentsByAlertUnitAndAction($sUnit, $sAction);

+ 26 - 29
inc/classes/BxDolAiAlertResponse.php

@@ -26,41 +26,38 @@ class BxDolAiAlertResponse extends BxDolAlertsResponse
 
         // call agents
         $oAi = BxDolAI::getInstance();
-        if($aAgents = $oAi->getAgentsByProfileId($iRecipient)) {            
+        if($aAgents = $oAi->getAgentsByProfileId($iRecipient)) {
+            $GLOBALS['glAgentsCallQueue'] = [];
             foreach($aAgents as $a) {
                 if (!$a['message_profile_id'] || $iSender == $a['message_profile_id']) {
-                    $sMessage = $oAi->callAgent('message', $a, [
-                        'trigger' => 'message',
-                        'sender_profile_id' => $iSender,
-                        'recipient_profile_id' => $iRecipient,
-                        'message_lot_id' => $iLotId, 
-                        'message_id' => $iJotId,
-                        'message_text' => $aJotInfo['message'],
-                        'message_info' => $aJotInfo,
-                    ]);
-                    $oParsedown = new Parsedown();
-                    $oParsedown->setSafeMode(true);
-                    $sMessageHtml = $oParsedown->text($sMessage);
-                    $this->sendAutoMessage($a['profile_id'], $iSender, str_replace('\n', '', $sMessageHtml));
+
+                    $GLOBALS['glAgentsCallQueue'][] = [
+                        'type' => 'message',
+                        'agent' => $a,
+                        'params' => [
+                            'trigger' => 'message',
+                            'sender_profile_id' => $iSender,
+                            'recipient_profile_id' => $iRecipient,
+                            'message_lot_id' => $iLotId, 
+                            'message_id' => $iJotId,
+                            'message_text' => $aJotInfo['message'],
+                            'message_info' => $aJotInfo,
+                        ],
+                    ];
                 }
             }
-        }
-    }
-
-    function sendAutoMessage ($iSender, $iRecipient, $sMsg) 
-    {        
-        $oMessengerModule = BxDolModule::getInstance('bx_messenger');
-
-        $aAutoReplyData = [
-            'message' => $sMsg,
-            'participants' => [$iSender, $iRecipient],
-        ];
+            if (!empty($GLOBALS['glAgentsCallQueue'])) {
+                ignore_user_abort(true); 
+                set_time_limit(0);
 
-        $iSaveProfileId = $oMessengerModule->setProfileId($iSender);
-        $a = $oMessengerModule->sendMessage($aAutoReplyData, $iRecipient, $iSender);
-        $oMessengerModule->setProfileId($iSaveProfileId);
+                // TODO: need a way to force messenger to show new message from the server side
+                // register_shutdown_function(function () { 
+                //     bx_ai_process_agents_call_queue();
+                // });
+                bx_ai_process_agents_call_queue(false, false); // TODO: for a while do synchronically
+            }
 
-        return $a;
+        }
     }
 }
 

+ 29 - 0
inc/utils.inc.php

@@ -2907,5 +2907,34 @@ function bx_mem_cache_set(string $sKey, mixed $mixedData): mixed
     return $GLOBALS['glMemCache'][$sKey] = $mixedData;
 }
 
+function bx_ai_process_agents_call_queue($bFinishRequest = true, $bExit = true)
+{
+    if ($bFinishRequest) {
+        if (function_exists('fastcgi_finish_request')) {
+            fastcgi_finish_request();
+        } else {
+            @ob_end_flush();
+            @flush();
+        }
+    }
+
+    if (!empty($GLOBALS['glAgentsCallQueue']))
+    {
+        $oAi = BxDolAI::getInstance();
+        foreach ($GLOBALS['glAgentsCallQueue'] as $r) 
+        {
+            $sMessage = $oAi->callAgent($r['type'], $r['agent'], $r['params']);
+
+            $oParsedown = new Parsedown();
+            $oParsedown->setSafeMode(true);
+            $sMessageHtml = $oParsedown->text($sMessage);
+            $oAi->sendMessengerMessage($r['agent']['profile_id'], $r['params']['sender_profile_id'], str_replace('\n', '', $sMessageHtml));
+        }
+    }
+    
+    if ($bExit) {
+        exit(0);
+    }
+}
 
 /** @} */