Kaynağa Gözat

#5406 AI Agents revamp: async call

Aleksandr Trofimov 4 ay önce
ebeveyn
işleme
7cf9281bad

+ 22 - 12
inc/classes/BxDolAiAlertResponse.php

@@ -31,19 +31,29 @@ class BxDolAiAlertResponse extends BxDolAlertsResponse
             foreach($aAgents as $a) {
                 if (!$a['message_profile_id'] || $iSender == $a['message_profile_id']) {
 
-                    $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,
-                        ],
+                    $aParams = [
+                        'trigger' => 'message',
+                        'sender_profile_id' => $iSender,
+                        'recipient_profile_id' => $iRecipient,
+                        'message_lot_id' => $iLotId, 
+                        'message_id' => $iJotId,
+                        'message_text' => $aJotInfo['message'],
+                        'message_info' => $aJotInfo,
                     ];
+                    if ($a['async']) {
+                        BxDolBackgroundJobs::getInstance()->add(bin2hex(random_bytes(16)), [
+                            'system', 'call_agent', 
+                            ['message', $a, $aParams], 
+                            'TemplServices'
+                        ]);
+                    }
+                    else {
+                        $GLOBALS['glAgentsCallQueue'][] = [
+                            'type' => 'message',
+                            'agent' => $a,
+                            'params' => $aParams,
+                        ];
+                    }
                 }
             }
             if (!empty($GLOBALS['glAgentsCallQueue'])) {

+ 20 - 10
inc/classes/BxDolAlerts.php

@@ -154,23 +154,33 @@ class BxDolAlerts extends BxDol
         $oAi = BxDolAI::getInstance();
         if($aAgents = $oAi->getAgentsByAlertUnitAndAction($this->sUnit, $this->sAction)) {
             foreach($aAgents as $a) {
-                $sExtraJSON = $oAi->callAgent('alert', $a, [
+                $aParams = [
                     'trigger' => 'alert',
                     'object_id' => $this->iObject,
                     'sender_profile_id' => $this->iSender,
                     'unit' => $this->sUnit, 
                     'action' => $this->sAction,
                     'extra' => $this->aExtras,
-                ]);
+                ];
+                if ($a['async']) {
+                    BxDolBackgroundJobs::getInstance()->add(bin2hex(random_bytes(16)), [
+                        'system', 'call_agent', 
+                        ['alert', $a, $aParams], 
+                        'TemplServices'
+                    ]);
+                }
+                else {
+                    $sExtraJSON = $oAi->callAgent('alert', $a, $aParams);
 
-                $aExtra = [];
-                if ($sExtraJSON && 0 === bx_mb_strpos($sExtraJSON, '{'))
-                    $aExtra = json_decode($sExtraJSON, true);
-                
-                if ($aExtra && is_array($aExtra)) {
-                    foreach ($aExtra as $k => $v) {
-                        if (isset($this->aExtras[$k]))
-                            $this->aExtras[$k] = $v;
+                    $aExtra = [];
+                    if ($sExtraJSON && 0 === bx_mb_strpos($sExtraJSON, '{'))
+                        $aExtra = json_decode($sExtraJSON, true);
+                    
+                    if ($aExtra && is_array($aExtra)) {
+                        foreach ($aExtra as $k => $v) {
+                            if (isset($this->aExtras[$k]))
+                                $this->aExtras[$k] = $v;
+                        }
                     }
                 }
             }

+ 1 - 0
install/sql/system.sql

@@ -7181,6 +7181,7 @@ CREATE TABLE `sys_agents_agents` (
   `chat_history_context` int(11) NOT NULL DEFAULT 50000,
   `vector_store_id` int(11) NOT NULL,
   `trigger` enum('alert','scheduler','webhook','manual','agent','message') NOT NULL DEFAULT 'message',
+  `async` tinyint(4) NOT NULL DEFAULT 0,
   `alert` varchar(192) NOT NULL DEFAULT '',
   `scheduler_cron` varchar(64) NOT NULL,
   `webhook_key` varchar(255) NOT NULL,

+ 4 - 1
modules/boonex/english/data/langs/system/en.xml

@@ -2290,6 +2290,8 @@
     <string name="_sys_agents_automators_popup_add"><![CDATA[Add automator]]></string>
     <string name="_sys_agents_count_today"><![CDATA[{0} calls today]]></string>
     <string name="_sys_agents_count_per_req"><![CDATA[{0} calls per request]]></string>
+    <string name="_sys_agents_field_async"><![CDATA[Delayed execution]]></string>
+    <string name="_sys_agents_field_async_inf"><![CDATA[Run agent later to not block/delay normal code execution. Not applicable for 'manual' and 'scheduler'. For 'alert' - overriding values will not work. For 'messenger' - messages will not appear automatically.]]></string>
     <string name="_sys_agents_popup_edit"><![CDATA[Edit automator]]></string>
     <string name="_sys_agents_field_name"><![CDATA[Name]]></string>
     <string name="_sys_agents_field_name_info"><![CDATA[Uniq agent name]]></string>
@@ -2306,7 +2308,8 @@
     <string name="_sys_agents_field_trigger"><![CDATA[Trigger]]></string>
     <string name="_sys_agents_field_trigger_info"><![CDATA[Trigger which will initiate agent to run. Alert — system event notification. Scheduler — time-based scheduled execution. Webhook — external HTTP trigger. Manual — user-initiated run. Agent — triggered by another agent. Message — triggered by chat message.]]></string>
     <string name="_sys_agents_field_alert_sample"><![CDATA[Alert: payload]]></string>
-    <string name="_sys_agents_waiting_for_sample_data"><![CDATA[Please select an alert to see its payload.]]></string>
+    <string name="_sys_agents_waiting_for_sample_data_alert"><![CDATA[Please select an alert to see its payload.]]></string>
+    <string name="_sys_agents_waiting_for_sample_data_webhook"><![CDATA[Trigger webhook to see its payload.]]></string>
     <string name="_sys_agents_field_alert"><![CDATA[Alert: event name]]></string>
     <string name="_sys_agents_field_alert_info"><![CDATA[Event that triggers the agent. Usually starts with system or module_name. Only events that have occurred at least once are shown.]]></string>
     <string name="_sys_agents_field_scheduler_cron"><![CDATA[Scheduler (CRON)]]></string>

+ 4 - 3
modules/boonex/russian/data/langs/system/ru.xml

@@ -2267,8 +2267,8 @@
         <string name="_sys_agents_count_today"><![CDATA[{0} вызовов сегодня]]></string>
         <string name="_sys_agents_count_per_req"><![CDATA[{0} вызовов на запрос]]></string>
         <string name="_sys_agents_popup_edit"><![CDATA[Редактировать автоматизатор]]></string>
-        <string name="_sys_agents_field_name"><![CDATA[Название]]></string>
-        <string name="_sys_agents_field_name_info"><![CDATA[Уникальное название агента.]]></string>
+        <string name="_sys_agents_field_async"><![CDATA[Отложенное выполнение]]></string>
+        <string name="_sys_agents_field_async_inf"><![CDATA[Запустить агента позже, чтобы не блокировать/замедлять выполнение основного кода. Не применяется для 'manual' и 'scheduler'. Для 'alert' — переопределение значений не сработает. Для 'messenger' — сообщения не появятся автоматически.]]></string>
         <string name="_sys_agents_field_model_id"><![CDATA[Модель]]></string>
         <string name="_sys_agents_field_model_id_info"><![CDATA[Модель для использования этим агентом.]]></string>
         <string name="_sys_agents_automators_field_profile_id"><![CDATA[Профиль]]></string>
@@ -2282,7 +2282,8 @@
         <string name="_sys_agents_field_trigger"><![CDATA[Триггер]]></string>
         <string name="_sys_agents_field_trigger_info"><![CDATA[Триггер, который запускает агента. Alert — системное событие. Scheduler — запуск по расписанию. Webhook — HTTP внешний вызов. Manual — ручной запуск. Agent — запуск другим агентом. Message — сообщение пользователя.]]></string>
         <string name="_sys_agents_field_alert_sample"><![CDATA[Alert - пример данных]]></string>
-        <string name="_sys_agents_waiting_for_sample_data"><![CDATA[Пожалуйста, выберите алерт, чтобы увидеть его данные.]]></string>
+        <string name="_sys_agents_waiting_for_sample_data_alert"><![CDATA[Пожалуйста, выберите алерт, чтобы увидеть его данные.]]></string>
+        <string name="_sys_agents_waiting_for_sample_data_webhook"><![CDATA[Пожалуйста, активируйте вебхук, чтобы увидеть его данные.]]></string>       
         <string name="_sys_agents_field_alert"><![CDATA[Alert - событие]]></string>
         <string name="_sys_agents_field_alert_info"><![CDATA[Событие, запускающее агента. Обычно начинается с system или module_name. Показаны только уже произошедшие события.]]></string>
         <string name="_sys_agents_field_alert_action"><![CDATA[Alert - действие события]]></string>

+ 13 - 2
studio/template/scripts/BxBaseStudioAgentsAgents.php

@@ -358,6 +358,17 @@ class BxBaseStudioAgentsAgents extends BxDolStudioAgentsAgents
                         'pass' => 'Xss',
                     ]
                 ],
+                'async' => [
+                    'type' => 'checkbox',
+                    'name' => 'async',
+                    'caption' => _t('_sys_agents_field_async'),
+                    'info' => _t('_sys_agents_field_async_inf'),                    
+                    'value' => 1,
+                    'checked' => isset($aAgent['async']) ? $aAgent['async'] : 0,
+                    'db' => [
+                        'pass' => 'Boolean',
+                    ]
+                ],
 
                 'alert_section' => array(
                     'type' => 'block_header',
@@ -372,7 +383,7 @@ class BxBaseStudioAgentsAgents extends BxDolStudioAgentsAgents
                     'caption' => _t('_sys_agents_field_alert_sample'),
                     'content' => $this->_oTemplate->parseHtmlByName('agents_agents_alerts_payload.html', [
                         'text-visibility' => empty($aAgent['alert']) ? 'block' : 'none',
-                        'text' => _t('_sys_agents_waiting_for_sample_data'),
+                        'text' => _t('_sys_agents_waiting_for_sample_data_alert'),
 
                         'payload-visibility' => !empty($aAgent['alert']) ? 'block' : 'none',
                         'desc' => $aAgent ? $this->_oDb->getAlertDesc($aAgent['alert']) : '',
@@ -420,7 +431,7 @@ class BxBaseStudioAgentsAgents extends BxDolStudioAgentsAgents
                     'type' => 'custom',
                     'name' => 'webhook_sample',
                     'caption' => _t('_sys_agents_field_webhook_sample'),
-                    'content' => isset($aAgent['webhook_sample']) ? $aAgent['webhook_sample'] : _t('_sys_agents_waiting_for_sample_data'),
+                    'content' => isset($aAgent['webhook_sample']) ? $aAgent['webhook_sample'] : _t('_sys_agents_waiting_for_sample_data_webhook'),
                 ],
                 'webhook_key' => [
                     'type' => 'text',

+ 7 - 0
template/scripts/BxBaseServices.php

@@ -1746,6 +1746,13 @@ class BxBaseServices extends BxDol implements iBxDolProfileService
     {
         BxDolEmbed::getObjectInstance()->process();
     }
+
+    public function serviceCallAgent($sType, $aAgent, $aParams)
+    {
+        $oAi = BxDolAI::getInstance();
+        return $oAi->callAgent($sType, $aAgent, $aParams);
+    }
+
 }
 
 /** @} */

+ 12 - 3
webhook.php

@@ -31,6 +31,15 @@ if (!$aAgent) {
 $aParams = $_REQUEST;
 $aParams['trigger'] = 'webhook';
 
-$mixed = $oAi->callAgent('webhook', $aAgent, $aParams);
-
-echo json_encode($mixed);
+if ($aAgent['async']) {
+    BxDolBackgroundJobs::getInstance()->add(bin2hex(random_bytes(16)), [
+        'system', 'call_agent', 
+        ['webhook', $aAgent, $aParams], 
+        'TemplServices'
+    ]);
+    echo json_encode(['result' => 'scheduled']);
+}
+else {
+    $mixed = $oAi->callAgent('webhook', $aAgent, $aParams);
+    echo json_encode($mixed);
+}