AntonLV 2 лет назад
Родитель
Сommit
3fe230aa29

+ 27 - 22
inc/classes/BxDolAI.php

@@ -82,7 +82,7 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
         return $aModel;
     }
 
-    public function getModelObject($iId = 0)
+    public function getModelObject($iId)
     {
         if(!$iId)
             $iId = $this->getDefaultModel();
@@ -90,6 +90,14 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
             return false;
 
         return BxDolAIModel::getObjectInstance($iId);
+    }
+    
+    public function getProviderObject($iId)
+    {
+        if(!$iId)
+            return false;
+
+        return BxDolAIProvider::getObjectInstance($iId);
     }   
 
     public function getAutomator($iId, $bFullInfo = false)
@@ -103,6 +111,24 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
         return $aAutomator;
     }
     
+    public function getAutomatorInstruction($sType, $aParams = [])
+    {
+        $mixedResult = '';
+
+        switch($sType){
+            case 'providers':
+                $aProviders = $this->_oDb->getProviderBy(['sample' => 'ids', 'ids' => $aParams]);
+                if(!empty($aProviders) && is_array($aProviders)) {
+                    $mixedResult = "avaliable proividers list:";
+                    foreach($aProviders as $aProvider)
+                        $mixedResult .= "\n- " . $aProvider['provider_name'] . ", \$iProviderId=" . $aProvider['id'];
+                }
+                break;
+        }
+
+        return $mixedResult;
+    }
+    
     public function getAutomatorsEvent($sUnit, $sAction)
     {
         if(in_array($sUnit, $this->_aExcludeAlertUnits))
@@ -125,27 +151,6 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
         return $aAutomators;
     }
 
-    public function chat($sEndpoint, $sModel, $sApiKey, $aParams, $aMessages)
-    {
-        $aData = [
-            'model' => $sModel,
-            'messages' => $aMessages
-        ];
-
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        $sRv = bx_file_get_contents($sEndpoint, $aData, "post-json", ["Authorization: Bearer ".$sApiKey, 'Content-Type: application/json', 'OpenAI-Beta: assistants=v1']);
-        $aRv = json_decode($sRv, true);
-
-        if(isset($aRv['error'])) {
-            //TODO: log error in AI related log file.
-            return 'false';
-        }
-
-        return trim(str_replace(['```json', '```php', '```'], '', $aRv['choices'][0]['message']['content']));
-    }
-
     public function callAutomator($sType, $aParams = [])
     {
         $sMethod = '_callAutomator' . bx_gen_method_name($sType);

+ 3 - 0
inc/classes/BxDolAIModelGpt35.php

@@ -56,6 +56,9 @@ class BxDolAIModelGpt35 extends BxDolAIModel
                     ]
                 ];
                 break;
+
+            case BX_DOL_AI_AUTOMATOR_WEBHOOK:
+                break;
         }
         
 

+ 10 - 1
inc/classes/BxDolAIModelGpt40.php

@@ -43,7 +43,8 @@ class BxDolAIModelGpt40 extends BxDolAIModel
         $mixedResult = [];
         switch($sType) {
             case BX_DOL_AI_AUTOMATOR_EVENT:
-                //TODO: previously we had an array here with 'alert_unit', 'alert_action' and 'trigger';
+                $aResponse = json_decode($sResponse, true);
+
                 $mixedResult = [
                     'alert_unit' => $aResponse['alert_unit'],
                     'alert_action' => $aResponse['alert_action'],
@@ -62,6 +63,14 @@ class BxDolAIModelGpt40 extends BxDolAIModel
                     ]
                 ];
                 break;
+
+            case BX_DOL_AI_AUTOMATOR_WEBHOOK:
+                $mixedResult = [
+                    'params' => [
+                        'thread_id' => $sThreadId,
+                    ]
+                ];
+                break;
         }
 
         return $mixedResult;

+ 21 - 0
inc/classes/BxDolAIProvider.php

@@ -67,8 +67,29 @@ class BxDolAIProvider extends BxDol
     	$this->_aOptions = $aOptions;
     }
 
+    public function getInfo()
+    {
+        $aInfo = $this->_oDb->getProviderBy(['sample' => 'id', 'id' => $this->_iId]);
+        $aInfo['options'] = $this->getOptions();
+
+        return $aInfo;
+    }
+
+    public function getOptions()
+    {
+        $aOptions = $this->_oDb->getProviderBy(['sample' => 'options_by_id', 'id' => $this->_iId]);
+        foreach($aOptions as &$aOption)
+            $aOption['value'] = $this->getOption($aOption['name']);
+
+        return $aOptions;
+    }
+
     public function getOption($sName)
     {
+        $sCustomMethod = 'getOption' . bx_gen_method_name(str_replace($this->_sPrefix, '', $sName));
+        if(method_exists($this, $sCustomMethod))
+             return $this->$sCustomMethod();
+        
     	if(substr($sName, 0, strlen($this->_sPrefix)) != $this->_sPrefix)
             $sName = $this->_sPrefix . $sName;
 

+ 14 - 0
inc/classes/BxDolAIProviderShopifyAdmin.php

@@ -67,8 +67,22 @@ class BxDolAIProviderShopifyAdmin extends BxDolAIProvider
         return $aProduct['product'];
     }
 
+    public function getOptionWebhookUrl()
+    {
+        return bx_append_url_params(BX_DOL_URL_ROOT . 'agents.php', [
+            'p' => $this->_iId,
+            'a' => 'webhook'
+        ]);
+    }
+
     public function processActionWebhook()
     {
+        /**
+         * TODO: 
+         * 1. Verify Webhook
+         * 2. Call automators which use this provider.
+         */
+
         echo 'TODO: Webhook processing here';
     }
 

+ 8 - 1
inc/classes/BxDolAIQuery.php

@@ -287,13 +287,20 @@ class BxDolAIQuery extends BxDolDb
                 $sWhereClause = " AND `tp`.`id`=:id";
                 break;
 
+            case 'ids':
+                $sSelectClause .= ", `tpt`.`name` AS `provider_name`";
+                $sJoinClause = "INNER JOIN `sys_agents_provider_types` AS `tpt` ON `tp`.`type_id`=`tpt`.`id`";
+                $sWhereClause = " AND `tp`.`id` IN (" . $this->implode_escape($aParams['ids']) . ")";
+                
+                break;
+                 
             case 'options_by_id':
                 $aMethod['params'][1] = [
                     'id' => $aParams['id']
                 ];
 
                 $sSelectClause = "`tpo`.`id`, `tpo`.`name`, `tpo`.`type`, `tpo`.`title`, `tpo`.`description`, `tpv`.`value`";
-                $sJoinClause = "INNER JOIN `sys_agents_providers_values` AS `tpv` ON `tp`.`id`=`tpv`.`provider_id` INNER JOIN `sys_agents_provider_options` AS `tpo` ON `tpv`.`option_id`=`tpo`.`id`";
+                $sJoinClause = "LEFT JOIN `sys_agents_provider_options` AS `tpo` ON `tp`.`type_id`=`tpo`.`provider_type_id` LEFT JOIN `sys_agents_providers_values` AS `tpv` ON `tp`.`id`=`tpv`.`provider_id` AND `tpo`.`id`=`tpv`.`option_id`";
                 $sWhereClause = " AND `tp`.`id`=:id";
                 break;
             

+ 4 - 2
install/sql/system.sql

@@ -6302,7 +6302,7 @@ CREATE TABLE IF NOT EXISTS `sys_agents_models` (
 
 INSERT INTO `sys_agents_models`(`name`, `title`, `key`, `params`, `class_name`, `class_file`) VALUES
 ('gpt-3.5-turbo', 'GPT-3.5-TURBO', '', '{"call":{"temperature":0.1}}', 'BxDolAIModelGpt35', ''),
-('gpt-4o', 'GPT-4.O', '', '{"call":{},"assistants":{"event_init":"asst_HcEyaghqWZefkAyoEML40joY","event":"asst_wqaXtKjcsBKceMtJ2NxID2LT","scheduler_init":"asst_kEbDH1hUy2Y45nOKk9jaSTB8","scheduler":"asst_M6zOv4osQwZmRItaiYptjjOS"}}', 'BxDolAIModelGpt40', '');
+('gpt-4o', 'GPT-4.O', '', '{"call":{},"assistants":{"event_init":"asst_HcEyaghqWZefkAyoEML40joY","event":"asst_wqaXtKjcsBKceMtJ2NxID2LT","scheduler_init":"asst_kEbDH1hUy2Y45nOKk9jaSTB8","scheduler":"asst_M6zOv4osQwZmRItaiYptjjOS","webhook_init":"asst_sSkOblPyXmYovS5IiEiVW17n","webhook":"asst_w7F3RiylJfdDEb9Eaa4RvO1q"}}', 'BxDolAIModelGpt40', '');
 
 CREATE TABLE IF NOT EXISTS `sys_agents_automators` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
@@ -6383,7 +6383,9 @@ SET @iProviderId = LAST_INSERT_ID();
 
 INSERT INTO `sys_agents_provider_options`(`provider_type_id`, `name`, `type`, `title`, `description`, `extra`, `check_type`, `check_params`, `check_error`, `order`) VALUES
 (@iProviderId, 'shf_adm_shop_domain', 'text', '_sys_agents_pvd_opt_cpt_shop_domain', '_sys_agents_pvd_opt_dsc_shop_domain', '', '', '', '', 1),
-(@iProviderId, 'shf_adm_access_token', 'text', '_sys_agents_pvd_opt_cpt_access_token', '_sys_agents_pvd_opt_dsc_access_token', '', '', '', '', 2);
+(@iProviderId, 'shf_adm_access_token', 'text', '_sys_agents_pvd_opt_cpt_access_token', '_sys_agents_pvd_opt_dsc_access_token', '', '', '', '', 2),
+(@iProviderId, 'shf_adm_secret_key', 'text', '_sys_agents_pvd_opt_cpt_secret_key', '_sys_agents_pvd_opt_dsc_secret_key', '', '', '', '', 3),
+(@iProviderId, 'shf_adm_webhook_url', 'value', '_sys_agents_pvd_opt_cpt_webhook_url', '_sys_agents_pvd_opt_dsc_webhook_url', '', '', '', '', 4);
 
 CREATE TABLE IF NOT EXISTS `sys_agents_providers` (
   `id` int(11) NOT NULL auto_increment,

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

@@ -2187,7 +2187,10 @@
         <string name="_sys_agents_pvd_opt_dsc_shop_domain"><![CDATA[]]></string>
         <string name="_sys_agents_pvd_opt_cpt_access_token"><![CDATA[Access token]]></string>
         <string name="_sys_agents_pvd_opt_dsc_access_token"><![CDATA[]]></string>
-        <string name=""><![CDATA[]]></string>
+        <string name="_sys_agents_pvd_opt_cpt_secret_key"><![CDATA[Secret key]]></string>
+        <string name="_sys_agents_pvd_opt_dsc_secret_key"><![CDATA[]]></string>
+        <string name="_sys_agents_pvd_opt_cpt_webhook_url"><![CDATA[Webhook URL]]></string>
+        <string name="_sys_agents_pvd_opt_dsc_webhook_url"><![CDATA[]]></string>
         <string name=""><![CDATA[]]></string>
         <string name=""><![CDATA[]]></string>
         <string name=""><![CDATA[]]></string>

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

@@ -2163,6 +2163,10 @@
         <string name="_sys_agents_pvd_opt_dsc_shop_domain"><![CDATA[]]></string>
         <string name="_sys_agents_pvd_opt_cpt_access_token"><![CDATA[Токен доступа]]></string>
         <string name="_sys_agents_pvd_opt_dsc_access_token"><![CDATA[]]></string>
+        <string name="_sys_agents_pvd_opt_cpt_secret_key"><![CDATA[Секретный ключ]]></string>
+        <string name="_sys_agents_pvd_opt_dsc_secret_key"><![CDATA[]]></string>
+        <string name="_sys_agents_pvd_opt_cpt_webhook_url"><![CDATA[URL вебхука]]></string>
+        <string name="_sys_agents_pvd_opt_dsc_webhook_url"><![CDATA[]]></string>
         <string name=""><![CDATA[]]></string>
         <string name=""><![CDATA[]]></string>
         <string name=""><![CDATA[]]></string>

+ 7 - 1
studio/template/scripts/BxBaseStudioAgentsAutomators.php

@@ -48,14 +48,19 @@ class BxBaseStudioAgentsAutomators extends BxDolStudioAgentsAutomators
             if(!empty($sSchedulerTime))
                 $aValsToAdd['params'] = json_encode(['scheduler_time' => $sSchedulerTime]);
 
+            $oAI = BxDolAI::getInstance();
+  
             $iModel = $oForm->getCleanValue('model_id');
             $sType = $oForm->getCleanValue('type');
+            $aProviders = $oForm->getCleanValue('providers');
             $sMessage = $oForm->getCleanValue('message');
+            if(!empty($aProviders) && is_array($aProviders))
+                $sMessage .= $oAI->getAutomatorInstruction('providers', $aProviders);
             $bMessage = !empty($sMessage);
             $sMessageAdd = '';
             $sMessageResponse = '';
 
-            $oAIModel = BxDolAI::getInstance()->getModelObject($iModel);
+            $oAIModel = $oAI->getModelObject($iModel);
 
             $bIsValid = true;
             $aResponseInit = [];
@@ -77,6 +82,7 @@ class BxBaseStudioAgentsAutomators extends BxDolStudioAgentsAutomators
                     break;
 
                 case BX_DOL_AI_AUTOMATOR_SCHEDULER:
+                case BX_DOL_AI_AUTOMATOR_WEBHOOK:
                     if(($aResponseInit = $oAIModel->getResponseInit($sType, $sMessage)) !== false) {
                         $oAIModel->setParams($aResponseInit['params']);
 

+ 16 - 12
studio/template/scripts/BxBaseStudioAgentsProviders.php

@@ -77,13 +77,13 @@ class BxBaseStudioAgentsProviders extends BxDolStudioAgentsProviders
 
         $iId = $this->_getId();
 
-        $aProvider = $this->_oDb->getProviderBy(['sample' => 'id', 'id' => $iId]);
-        if(empty($aProvider) || !is_array($aProvider))
+        $oAIProvider = BxDolAI::getInstance()->getProviderObject($iId);
+        if(!$oAIProvider)
             return echoJson([]);
 
-        $aProvider['options'] = $this->_oDb->getProviderBy(['sample' => 'options_by_id', 'id' => $iId]);
+        $aProviderInfo = $oAIProvider->getInfo();
 
-        $aForm = $this->_getFormEdit($sAction, $aProvider);
+        $aForm = $this->_getFormEdit($sAction, $aProviderInfo);
         $oForm = new BxTemplFormView($aForm);
         $oForm->initChecker();
 
@@ -91,8 +91,8 @@ class BxBaseStudioAgentsProviders extends BxDolStudioAgentsProviders
             if($oForm->update($iId) === false)
                 return echoJson(['msg' => _t('_sys_txt_error_occured')]);
 
-            if(!empty($aProvider['options']) && is_array($aProvider['options']))
-                foreach($aProvider['options'] as $aOption)
+            if(!empty($aProviderInfo['options']) && is_array($aProviderInfo['options']))
+                foreach($aProviderInfo['options'] as $aOption)
                     $this->_oDb->updateProviderValue([
                         'value' => $oForm->getCleanValue($aOption['name'])
                     ], [
@@ -120,15 +120,15 @@ class BxBaseStudioAgentsProviders extends BxDolStudioAgentsProviders
 
         $iId = $this->_getId();
 
-        $aProvider = $this->_oDb->getProviderBy(['sample' => 'id', 'id' => $iId]);
-        if(empty($aProvider) || !is_array($aProvider))
+        $oAIProvider = BxDolAI::getInstance()->getProviderObject($iId);
+        if(!$oAIProvider)
             return echoJson([]);
 
-        $aProvider['options'] = $this->_oDb->getProviderBy(['sample' => 'options_by_id', 'id' => $iId]);
+        $aProviderInfo = $oAIProvider->getInfo();
 
-        $aForm = $this->_getFormView($sAction, $aProvider);
+        $aForm = $this->_getFormView($sAction, $aProviderInfo);
         $oForm = new BxTemplFormView($aForm);
-        $oForm->initChecker($aProvider);
+        $oForm->initChecker($aProviderInfo);
 
         $sFormId = $oForm->getId();
         $sContent = BxTemplStudioFunctions::getInstance()->popupBox($sFormId . '_popup_' . $sAction, _t('_sys_agents_providers_popup_view'), $this->_oTemplate->parseHtmlByName('agents_provider_form.html', [
@@ -272,7 +272,10 @@ class BxBaseStudioAgentsProviders extends BxDolStudioAgentsProviders
             ];
 
             if(!empty($aProvider['options']) && is_array($aProvider['options']))
-                foreach($aProvider['options'] as $aOption)
+                foreach($aProvider['options'] as $aOption) {
+                    if($aOption['type'] == 'value' && empty($aOption['value']))
+                        continue;
+
                     $aInputsAdd[$aOption['name']] = [
                         'type' => $aOption['type'],
                         'name' => $aOption['name'],
@@ -285,6 +288,7 @@ class BxBaseStudioAgentsProviders extends BxDolStudioAgentsProviders
                             'error' => _t($aOption['check_error']),
                         ] : null,
                     ];
+                }
 
             $aForm['inputs'] = bx_array_insert_before($aInputsAdd, $aForm['inputs'], 'controls');
         }