1
0
roman.lesnikov@gmail.com 2 жил өмнө
parent
commit
c16662a5eb

+ 8 - 0
inc/classes/BxDolAI.php

@@ -57,6 +57,14 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
 
         return $GLOBALS['bxDolClasses'][__CLASS__];
     }
+    
+    public static function callHelper($iHelperId, $sMessage)
+    {
+        $oAI = BxDolAI::getInstance();
+        $aHelper = $oAI->_oDb->getHelpersBy(['sample' => 'id', 'id' => $iHelperId]);
+        $oAIModel = $oAI->getModelObject($aHelper['model_id']);
+        return $oAIModel->getResponseText($aHelper['prompt'], $sMessage);
+    }
 
     public function getProfileId()
     {

+ 14 - 0
inc/classes/BxDolAIModelGpt35.php

@@ -24,6 +24,20 @@ class BxDolAIModelGpt35 extends BxDolAIModel
         $this->_sPathInst = BX_DIRECTORY_PATH_ROOT . 'ai/instructions/';
     }
 
+    public function getResponseText($sPrompt, $sMessage)
+    {
+        $aMessages = [
+            ['role' => 'system', 'content' => $sPrompt],
+            ['role' => 'user', 'content' => $sMessage]
+        ];
+
+        $sResponse = $this->call($aMessages);
+        if($sResponse == 'false')
+            return false;
+        
+        return $sResponse;
+    }
+    
     public function getResponseInit($sType, $sMessage, $aParams = [])
     {
         $aMessages = [

+ 46 - 0
inc/classes/BxDolAIModelGpt40.php

@@ -15,6 +15,7 @@ class BxDolAIModelGpt40 extends BxDolAIModel
     protected $_sEndpointRuns;
     protected $_sEndpointRunsCheck;
     protected $_sEndpointMessages;
+    protected $_sEndpointChat;
 
     public function __construct($aModel)
     {
@@ -26,6 +27,22 @@ class BxDolAIModelGpt40 extends BxDolAIModel
         $this->_sEndpointRuns = $this->_sEndpoint . '/%s/runs';
         $this->_sEndpointRunsCheck = $this->_sEndpoint . '/%s/runs/%s';
         $this->_sEndpointMessages = $this->_sEndpoint . '/%s/messages';
+        
+        $this->_sEndpointChat = "https://api.openai.com/v1/chat/completions";
+    }
+    
+    public function getResponseText($sPrompt, $sMessage)
+    {
+        $aMessages = [
+            ['role' => 'system', 'content' => $sPrompt],
+            ['role' => 'user', 'content' => $sMessage]
+        ];
+
+        $sResponse = $this->callChat($aMessages);
+        if($sResponse == 'false')
+            return false;
+        
+        return $sResponse;
     }
 
     public function getResponseInit($sType, $sMessage, $aParams = [])
@@ -143,6 +160,35 @@ class BxDolAIModelGpt40 extends BxDolAIModel
 
         return $mixedResponse;
     }
+    
+    public function callChat($aMessages, $aParams = [])
+    {
+        $aData = [
+            'model' => $this->_sName,
+            'messages' => $aMessages
+        ];
+
+        if(!empty($this->_aParams['call']) && is_array($this->_aParams['call']))
+            $aData = array_merge($aData, $this->_aParams['call']);
+        if(!empty($aParams) && is_array($aParams))
+            $aData = array_merge($aData, $aParams);
+
+        $sResponse = bx_file_get_contents($this->_sEndpointChat, $aData, "post-json", [
+            "Authorization: Bearer " . $this->_sKey, 
+            'Content-Type: application/json', 
+            'OpenAI-Beta: assistants=v1'
+        ]);
+        
+        print_r($aResponse);
+
+        $aResponse = json_decode($sResponse, true);
+        if(isset($aResponse['error'])) {
+            $this->_log($aResponse['error']);
+            return 'false';
+        }
+
+        return trim(str_replace(['```json', '```php', '```'], '', $aResponse['choices'][0]['message']['content']));
+    }
 
     public function getMessages($sThreadId, $aParams = [])
     {

+ 36 - 0
inc/classes/BxDolAIQuery.php

@@ -182,6 +182,42 @@ class BxDolAIQuery extends BxDolDb
 
         return call_user_func_array([$this, $aMethod['name']], $aMethod['params']);
     }
+    
+    public function getHelpersBy($aParams = [])
+    {
+        $aMethod = ['name' => 'getAll', 'params' => [0 => 'query']];
+        $sSelectClause = "`taa`.*";
+    	$sJoinClause = $sWhereClause = "";
+
+        switch($aParams['sample']) {
+            case 'id':
+            	$aMethod['name'] = 'getRow';
+            	$aMethod['params'][1] = [
+                    'id' => $aParams['id']
+                ];
+
+                $sWhereClause .= " AND `taa`.`id`=:id";
+                break;
+
+            case 'id_full':
+            	$aMethod['name'] = 'getRow';
+            	$aMethod['params'][1] = [
+                    'id' => $aParams['id']
+                ];
+
+                $sSelectClause .= ", `tam`.`name` AS `model_name`, `tam`.`title` AS `model_title`, `tam`.`key` AS `model_key`, `tam`.`params` AS `model_params`";
+                $sJoinClause .= " LEFT JOIN `sys_agents_models` AS `tam` ON `taa`.`model_id`=`tam`.`id`";
+                $sWhereClause .= " AND `taa`.`id`=:id";
+                break;
+            
+        }
+
+        $aMethod['params'][0] = "SELECT " . $sSelectClause . "
+            FROM `sys_agents_helpers` AS `taa` " . $sJoinClause . "
+            WHERE 1" . $sWhereClause;
+
+        return call_user_func_array([$this, $aMethod['name']], $aMethod['params']);
+    }
 
     public function updateAutomators($aSetClause, $aWhereClause)
     {

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
install/sql/system.sql


+ 83 - 66
modules/boonex/english/data/langs/system/en.xml

@@ -1106,6 +1106,7 @@
     <string name="_adm_lmi_cpt_actions"><![CDATA[Actions]]></string>
     <string name="_adm_lmi_cpt_api_config"><![CDATA[Configuration]]></string>
     <string name="_adm_lmi_cpt_automators"><![CDATA[Automators]]></string>
+    <string name="_adm_lmi_cpt_helpers"><![CDATA[Helpers]]></string>
     <string name="_adm_lmi_cpt_badges"><![CDATA[Badges]]></string>
     <string name="_adm_lmi_cpt_categories"><![CDATA[Categories]]></string>
     <string name="_adm_lmi_cpt_checkout"><![CDATA[Checkout {checkout_counter}]]></string>
@@ -2128,73 +2129,89 @@
 	<string name="_sys_acl_start"><![CDATA[Started: ]]></string>
 	<string name="_sys_acl_expire"><![CDATA[Expires: ]]></string>
 	<string name="_sys_acl_expire_never"><![CDATA[never]]></string>
-        <string name="_sys_acl_state"><![CDATA[State: ]]></string>
-        <string name="_sys_acl_state_trial"><![CDATA[Trial]]></string>
+    <string name="_sys_acl_state"><![CDATA[State: ]]></string>
+    <string name="_sys_acl_state_trial"><![CDATA[Trial]]></string>
+    
+    <string name="_sys_agents_helpers_txt_active"><![CDATA[Active]]></string>
+    <string name="_sys_agents_helpers_txt_name"><![CDATA[Name]]></string>
+    <string name="_sys_agents_helpers_txt_model_id"><![CDATA[Model]]></string>
+    <string name="_sys_agents_helpers_txt_profile_id"><![CDATA[Profile]]></string>
+    <string name="_sys_agents_helpers_txt_prompt"><![CDATA[Prompt]]></string>
+    <string name="_sys_agents_helpers_txt_added"><![CDATA[Added]]></string>
+    <string name="_sys_agents_helpers_btn_add"><![CDATA[Add]]></string>
+    <string name="_sys_agents_helpers_popup_add"><![CDATA[Add helper]]></string>
+    <string name="_sys_agents_helpers_field_name"><![CDATA[Name]]></string>
+    <string name="_sys_agents_helpers_field_model_id"><![CDATA[Model]]></string>
+    <string name="_sys_agents_helpers_field_profile_id"><![CDATA[Profile]]></string>
+    <string name="_sys_agents_helpers_field_prompt"><![CDATA[Prompt]]></string>
+    <string name="_sys_agents_helpers_field_profile_id_inf"><![CDATA[Leave empty to use default.]]></string>
+    <string name="_sys_agents_helpers_popup_edit"><![CDATA[Edit helper]]></string>
+    <string name="_sys_agents_automators_btn_check"><![CDATA[Check]]></string>
 
-        <string name="_sys_agents_automators_txt_active"><![CDATA[Active]]></string>
-        <string name="_sys_agents_automators_txt_type"><![CDATA[Type]]></string>
-        <string name="_sys_agents_automators_txt_alert_unit"><![CDATA[Unit]]></string>
-        <string name="_sys_agents_automators_txt_alert_action"><![CDATA[Action]]></string>
-        <string name="_sys_agents_automators_txt_scheduler_time"><![CDATA[Time]]></string>
-        <string name="_sys_agents_automators_txt_model_id"><![CDATA[Model]]></string>
-        <string name="_sys_agents_automators_txt_profile_id"><![CDATA[Profile]]></string>
-        <string name="_sys_agents_automators_txt_message_id"><![CDATA[Prompt]]></string>
-        <string name="_sys_agents_automators_txt_messages"><![CDATA[Messages]]></string>
-        <string name="_sys_agents_automators_txt_code"><![CDATA[Code]]></string>
-        <string name="_sys_agents_automators_txt_added"><![CDATA[Added]]></string>
-        <string name="_sys_agents_automators_txt_status"><![CDATA[Status]]></string>
-        <string name="_sys_agents_automators_btn_add"><![CDATA[Add]]></string>
-        <string name="_sys_agents_automators_btn_tune"><![CDATA[Tune]]></string>
-        <string name="_sys_agents_automators_btn_approve"><![CDATA[Approve]]></string>
-        <string name="_sys_agents_automators_popup_add"><![CDATA[Add automator]]></string>
-        <string name="_sys_agents_automators_popup_edit"><![CDATA[Edit automator]]></string>
-        <string name="_sys_agents_automators_field_model_id"><![CDATA[Model]]></string>
-        <string name="_sys_agents_automators_field_profile_id"><![CDATA[Profile]]></string>
-        <string name="_sys_agents_automators_field_profile_id_inf"><![CDATA[Leave empty to use default.]]></string>
-        <string name="_sys_agents_automators_field_type"><![CDATA[Type]]></string>
-        <string name="_sys_agents_automators_field_type_event"><![CDATA[Event]]></string>
-        <string name="_sys_agents_automators_field_type_scheduler"><![CDATA[Scheduler]]></string>
-        <string name="_sys_agents_automators_field_type_webhook"><![CDATA[Webhook]]></string>
-        <string name="_sys_agents_automators_field_alert_unit"><![CDATA[Event Type]]></string>
-        <string name="_sys_agents_automators_field_alert_action"><![CDATA[Event Action]]></string>
-        <string name="_sys_agents_automators_field_scheduler_time"><![CDATA[Scheduler Time]]></string>
-        <string name="_sys_agents_automators_field_providers"><![CDATA[Providers]]></string>
-        <string name="_sys_agents_automators_field_providers_add"><![CDATA[Add]]></string>
-        <string name="_sys_agents_automators_field_message"><![CDATA[Prompt]]></string>
-        <string name="_sys_agents_automators_field_status_auto"><![CDATA[Auto]]></string>
-        <string name="_sys_agents_automators_field_status_manual"><![CDATA[Manual]]></string>
-        <string name="_sys_agents_automators_field_status_ready"><![CDATA[Ready]]></string>
-        <string name="_sys_agents_automators_err_event_not_found"><![CDATA[Event isn't found, please rephrase your prompt.]]></string>
-        <string name="_sys_agents_automators_err_cannot_get_code"><![CDATA[Can't generate code, please rephrase your prompt.]]></string>
-        <string name="_sys_agents_providers_txt_active"><![CDATA[Active]]></string>
-        <string name="_sys_agents_providers_txt_provider_title"><![CDATA[Title]]></string>
-        <string name="_sys_agents_providers_txt_provider_type"><![CDATA[Type]]></string>
-        <string name="_sys_agents_providers_txt_added"><![CDATA[Added]]></string>
-        <string name="_sys_agents_providers_btn_add"><![CDATA[Add Provider]]></string>
-        <string name="_sys_agents_providers_btn_info"><![CDATA[Info]]></string>
-        <string name="_sys_agents_providers_btn_edit"><![CDATA[Edit]]></string>
-        <string name="_sys_agents_providers_btn_delete"><![CDATA[Delete]]></string>
-        <string name="_sys_agents_providers_popup_add"><![CDATA[Add provider]]></string>
-        <string name="_sys_agents_providers_popup_edit"><![CDATA[Edit provider]]></string>
-        <string name="_sys_agents_providers_popup_view"><![CDATA[View provider]]></string>
-        <string name="_sys_agents_providers_field_type_id"><![CDATA[Type]]></string>
-        <string name="_sys_agents_providers_field_type_id_err"><![CDATA[Type is essential. Please select a value.]]></string>
-        <string name="_sys_agents_providers_field_title"><![CDATA[Title]]></string>        
-        <string name="_sys_agents_pvd_cpt_shopify_admin"><![CDATA[Shopify (Admin API)]]></string>
-        <string name="_sys_agents_pvd_opt_cpt_active"><![CDATA[Active]]></string>
-        <string name="_sys_agents_pvd_opt_dsc_active"><![CDATA[Activate(Deactivate) source]]></string>
-        <string name="_sys_agents_pvd_opt_cpt_shop_domain"><![CDATA[Shop domain]]></string>
-        <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="_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>
-        <string name=""><![CDATA[]]></string>
+    <string name="_sys_agents_automators_txt_active"><![CDATA[Active]]></string>
+    <string name="_sys_agents_automators_txt_type"><![CDATA[Type]]></string>
+    <string name="_sys_agents_automators_txt_alert_unit"><![CDATA[Unit]]></string>
+    <string name="_sys_agents_automators_txt_alert_action"><![CDATA[Action]]></string>
+    <string name="_sys_agents_automators_txt_scheduler_time"><![CDATA[Time]]></string>
+    <string name="_sys_agents_automators_txt_model_id"><![CDATA[Model]]></string>
+    <string name="_sys_agents_automators_txt_profile_id"><![CDATA[Profile]]></string>
+    <string name="_sys_agents_automators_txt_message_id"><![CDATA[Prompt]]></string>
+    <string name="_sys_agents_automators_txt_messages"><![CDATA[Messages]]></string>
+    <string name="_sys_agents_automators_txt_code"><![CDATA[Code]]></string>
+    <string name="_sys_agents_automators_txt_added"><![CDATA[Added]]></string>
+    <string name="_sys_agents_automators_txt_status"><![CDATA[Status]]></string>
+    <string name="_sys_agents_automators_btn_add"><![CDATA[Add]]></string>
+    <string name="_sys_agents_automators_btn_tune"><![CDATA[Tune]]></string>
+    <string name="_sys_agents_automators_btn_approve"><![CDATA[Approve]]></string>
+    <string name="_sys_agents_automators_popup_add"><![CDATA[Add automator]]></string>
+    <string name="_sys_agents_automators_popup_edit"><![CDATA[Edit automator]]></string>
+    <string name="_sys_agents_automators_field_model_id"><![CDATA[Model]]></string>
+    <string name="_sys_agents_automators_field_profile_id"><![CDATA[Profile]]></string>
+    <string name="_sys_agents_automators_field_profile_id_inf"><![CDATA[Leave empty to use default.]]></string>
+    <string name="_sys_agents_automators_field_type"><![CDATA[Type]]></string>
+    <string name="_sys_agents_automators_field_type_event"><![CDATA[Event]]></string>
+    <string name="_sys_agents_automators_field_type_scheduler"><![CDATA[Scheduler]]></string>
+    <string name="_sys_agents_automators_field_type_webhook"><![CDATA[Webhook]]></string>
+    <string name="_sys_agents_automators_field_alert_unit"><![CDATA[Event Type]]></string>
+    <string name="_sys_agents_automators_field_alert_action"><![CDATA[Event Action]]></string>
+    <string name="_sys_agents_automators_field_scheduler_time"><![CDATA[Scheduler Time]]></string>
+    <string name="_sys_agents_automators_field_providers"><![CDATA[Providers]]></string>
+    <string name="_sys_agents_automators_field_providers_add"><![CDATA[Add]]></string>
+    <string name="_sys_agents_automators_field_message"><![CDATA[Prompt]]></string>
+    <string name="_sys_agents_automators_field_status_auto"><![CDATA[Auto]]></string>
+    <string name="_sys_agents_automators_field_status_manual"><![CDATA[Manual]]></string>
+    <string name="_sys_agents_automators_field_status_ready"><![CDATA[Ready]]></string>
+    <string name="_sys_agents_automators_err_event_not_found"><![CDATA[Event isn't found, please rephrase your prompt.]]></string>
+    <string name="_sys_agents_automators_err_cannot_get_code"><![CDATA[Can't generate code, please rephrase your prompt.]]></string>
+    <string name="_sys_agents_providers_txt_active"><![CDATA[Active]]></string>
+    <string name="_sys_agents_providers_txt_provider_title"><![CDATA[Title]]></string>
+    <string name="_sys_agents_providers_txt_provider_type"><![CDATA[Type]]></string>
+    <string name="_sys_agents_providers_txt_added"><![CDATA[Added]]></string>
+    <string name="_sys_agents_providers_btn_add"><![CDATA[Add Provider]]></string>
+    <string name="_sys_agents_providers_btn_info"><![CDATA[Info]]></string>
+    <string name="_sys_agents_providers_btn_edit"><![CDATA[Edit]]></string>
+    <string name="_sys_agents_providers_btn_delete"><![CDATA[Delete]]></string>
+    <string name="_sys_agents_providers_popup_add"><![CDATA[Add provider]]></string>
+    <string name="_sys_agents_providers_popup_edit"><![CDATA[Edit provider]]></string>
+    <string name="_sys_agents_providers_popup_view"><![CDATA[View provider]]></string>
+    <string name="_sys_agents_providers_field_type_id"><![CDATA[Type]]></string>
+    <string name="_sys_agents_providers_field_type_id_err"><![CDATA[Type is essential. Please select a value.]]></string>
+    <string name="_sys_agents_providers_field_title"><![CDATA[Title]]></string>        
+    <string name="_sys_agents_pvd_cpt_shopify_admin"><![CDATA[Shopify (Admin API)]]></string>
+    <string name="_sys_agents_pvd_opt_cpt_active"><![CDATA[Active]]></string>
+    <string name="_sys_agents_pvd_opt_dsc_active"><![CDATA[Activate(Deactivate) source]]></string>
+    <string name="_sys_agents_pvd_opt_cpt_shop_domain"><![CDATA[Shop domain]]></string>
+    <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="_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>
+    <string name=""><![CDATA[]]></string>
 
   <string name="_sys_audit_content_info_popup_title"><![CDATA[Information]]></string>
   <string name="_sys_audit_action_edit_content"><![CDATA[Content edited]]></string>

+ 1 - 0
studio/classes/BxDolStudioAgents.php

@@ -10,6 +10,7 @@
 define('BX_DOL_STUDIO_AGENTS_TYPE_SETTINGS', 'settings');
 define('BX_DOL_STUDIO_AGENTS_TYPE_AUTOMATORS', 'automators');
 define('BX_DOL_STUDIO_AGENTS_TYPE_PROVIDERS', 'providers');
+define('BX_DOL_STUDIO_AGENTS_TYPE_HELPERS', 'helpers');
 
 define('BX_DOL_STUDIO_AGENTS_TYPE_DEFAULT', BX_DOL_STUDIO_AGENTS_TYPE_SETTINGS);
 

+ 42 - 0
studio/classes/BxDolStudioAgentsHelpers.php

@@ -0,0 +1,42 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudio UNA Studio
+ * @{
+ */
+
+class BxDolStudioAgentsHelpers extends BxTemplStudioGrid
+{
+    protected $_oDb;
+
+    protected $_sCmts;
+
+    protected $_iProfileIdAi;
+
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+        parent::__construct ($aOptions, $oTemplate);
+
+        $this->_sDefaultSortingOrder = 'DESC';
+
+        $this->_oDb = new BxDolStudioAgentsQuery();
+
+        $this->_sCmts = 'sys_agents_helpers';
+
+        $this->_iProfileIdAi = BxDolAI::getInstance()->getProfileId();
+    }
+
+    protected function _delete ($mixedId)
+    {
+        $mixedResult = parent::_delete($mixedId);
+        if($mixedResult !== false && ($oCmts = BxDolCmts::getObjectInstance($this->_sCmts, $mixedId)) !== null) {
+            $oCmts->onObjectDelete($mixedId);
+        }
+
+        return $mixedResult;
+    }
+}
+
+/** @} */

+ 15 - 0
studio/template/scripts/BxBaseStudioAgents.php

@@ -35,11 +35,13 @@ class BxBaseStudioAgents extends BxDolStudioAgents
             BX_DOL_STUDIO_AGENTS_TYPE_SETTINGS => ['icon' => 'mi-cog.svg', 'icon_bg' => true],
             BX_DOL_STUDIO_AGENTS_TYPE_PROVIDERS => ['icon' => 'mi-agt-providers.svg', 'icon_bg' => true],
             BX_DOL_STUDIO_AGENTS_TYPE_AUTOMATORS => ['icon' => 'mi-agt-automators.svg', 'icon_bg' => true],
+            BX_DOL_STUDIO_AGENTS_TYPE_HELPERS => ['icon' => 'mi-agt-automators.svg', 'icon_bg' => true],
         ];
 
         $this->aGridObjects = [
             BX_DOL_STUDIO_AGENTS_TYPE_AUTOMATORS => 'sys_studio_agents_automators',
             BX_DOL_STUDIO_AGENTS_TYPE_PROVIDERS => 'sys_studio_agents_providers',
+            BX_DOL_STUDIO_AGENTS_TYPE_HELPERS => 'sys_studio_agents_helpers',
         ];
     }
 
@@ -99,6 +101,19 @@ class BxBaseStudioAgents extends BxDolStudioAgents
 
         return $this->getGrid($this->aGridObjects[BX_DOL_STUDIO_AGENTS_TYPE_AUTOMATORS]);
     }
+    
+    protected function getHelpers()
+    {
+        $oTemplate = BxDolStudioTemplate::getInstance();
+        
+        $this->aPageJsOptions['sPageUrl'] .= 'helpers';
+
+        if(($iId = bx_get('id')) !== false) {
+            return 'todo';//$sText = BxDolAI::callHelper(1, 'when is the end of the world?');
+        }
+
+        return $this->getGrid($this->aGridObjects[BX_DOL_STUDIO_AGENTS_TYPE_HELPERS]);
+    }
 
     protected function getProviders()
     {

+ 301 - 0
studio/template/scripts/BxBaseStudioAgentsHelpers.php

@@ -0,0 +1,301 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+
+class BxBaseStudioAgentsHelpers extends BxDolStudioAgentsHelpers
+{
+    protected $_sUrlPage;
+
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+        parent::__construct ($aOptions, $oTemplate);
+
+        $this->_sUrlPage = BX_DOL_URL_STUDIO . 'agents.php?page=helpers';
+    }
+
+    public function getPageJsObject()
+    {
+        return 'oBxDolStudioPageAgents';
+    }
+    
+    
+    protected function _getActionsDisabledBehavior($aRow)
+    {
+        return false;
+    }
+    
+
+    public function performActionAdd()
+    {
+        $sAction = 'add';
+
+        $aForm = $this->_getForm($sAction);
+        $oForm = new BxTemplFormView($aForm);
+        $oForm->initChecker();
+
+        if($oForm->isSubmittedAndValid()) {
+            $aValsToAdd = ['added' => time()];
+
+            $iProfileId = $oForm->getCleanValue('profile_id');
+            if(empty($iProfileId)) {
+                $iProfileId = (int)getParam('sys_agents_profile');
+                if(empty($iProfileId))
+                    $iProfileId = current(bx_srv('system', 'get_options_agents_profile', [false], 'TemplServices'))['key'];
+
+                $aValsToAdd['profile_id'] = $iProfileId;
+            }
+
+            $aValsToAdd['name'] = $oForm->getCleanValue('name');
+            $aValsToAdd['prompt'] = $oForm->getCleanValue('prompt');
+
+            $bIsValid = true;
+            if($bIsValid) {
+                if(($iId = $oForm->insert($aValsToAdd)) !== false) {
+                    $aRes = ['grid' => $this->getCode(false), 'blink' => $iId];
+                }
+                else
+                    $aRes = ['msg' => _t('_sys_txt_error_occured')];
+
+                return echoJson($aRes);
+            }
+        }
+
+        $sFormId = $oForm->getId();
+        $sContent = BxTemplStudioFunctions::getInstance()->popupBox($sFormId . '_popup', _t('_sys_agents_helpers_popup_add'), $this->_oTemplate->parseHtmlByName('agents_automator_form.html', [
+            'form_id' => $sFormId,
+            'form' => $oForm->getCode(true),
+            'object' => $this->_sObject,
+            'action' => $sAction
+        ]));
+
+        return echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false]]]);
+    }
+
+    public function performActionEdit()
+    {
+        $sAction = 'edit';
+
+        $iId = $this->_getId();
+        $aHelper = $this->_oDb->getHelpersBy(['sample' => 'id', 'id' => $iId]);
+
+        $aForm = $this->_getFormEdit($sAction, $aHelper);
+        $oForm = new BxTemplFormView($aForm);
+        $oForm->initChecker();
+
+        if($oForm->isSubmittedAndValid()) {
+            $aValsToAdd = [];
+
+            
+            $iProfileId = $oForm->getCleanValue('profile_id');
+            if(empty($iProfileId)) {
+                $iProfileId = (int)getParam('sys_agents_profile');
+                if(empty($iProfileId))
+                    $iProfileId = current(bx_srv('system', 'get_options_agents_profile', [false], 'TemplServices'))['key'];
+
+                $aValsToAdd['profile_id'] = $iProfileId;
+            }
+
+            $aValsToAdd['name'] = $oForm->getCleanValue('name');
+            $aValsToAdd['prompt'] = $oForm->getCleanValue('prompt');
+            
+            if($oForm->update($iId, $aValsToAdd) !== false)
+                $aRes = ['grid' => $this->getCode(false), 'blink' => $iId];
+            else
+                $aRes = ['msg' => _t('_sys_txt_error_occured')];
+
+            return echoJson($aRes);
+        } 
+
+        $sFormId = $oForm->getId();
+        $sContent = BxTemplStudioFunctions::getInstance()->popupBox($sFormId . '_popup', _t('_sys_agents_helpers_popup_edit'), $this->_oTemplate->parseHtmlByName('agents_automator_form.html', [
+            'form_id' => $sFormId,
+            'form' => $oForm->getCode(true),
+            'object' => $this->_sObject,
+            'action' => $sAction
+        ]));
+
+        return echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false]]]);
+    }
+
+    protected function _getCellSwitcher ($mixedValue, $sKey, $aField, $aRow)
+    {
+        if(empty($aRow['code']) || $aRow['status'] != BX_DOL_AI_AUTOMATOR_STATUS_READY)
+            return parent::_getCellDefault('', $sKey, $aField, $aRow);
+
+        return parent::_getCellSwitcher ($mixedValue, $sKey, $aField, $aRow);
+    }
+
+    protected function _getCellModelId($mixedValue, $sKey, $aField, $aRow)
+    {
+        $aModel = $this->_oDb->getModelsBy(['sample' => 'id', 'id' => $mixedValue]);
+        if(!empty($aModel) && is_array($aModel))
+            $mixedValue = $aModel['title'];
+
+        return parent::_getCellDefault($mixedValue, $sKey, $aField, $aRow);
+    }
+
+    protected function _getCellProfileId($mixedValue, $sKey, $aField, $aRow)
+    {
+        return parent::_getCellDefault(BxDolProfile::getInstanceMagic($mixedValue)->getDisplayName(), $sKey, $aField, $aRow);
+    }
+
+    protected function _getCellType($mixedValue, $sKey, $aField, $aRow)
+    {
+        return parent::_getCellDefault(_t('_sys_agents_helpers_field_type_' . $mixedValue), $sKey, $aField, $aRow);
+    }
+
+    protected function _getCellData($sKey, $aField, $aRow)
+    {
+        if($sKey == 'message_id' && ($iCmtId = (int)$aRow[$sKey]) != 0 && ($oCmts = BxDolCmts::getObjectInstance($this->_sCmts, $aRow['id'])) !== null) {
+            $aCmt = $oCmts->getCommentSimple($iCmtId);
+            if(!empty($aCmt) && is_array($aCmt))
+                $aRow[$sKey] = $aCmt['cmt_text'];
+        }
+
+        return parent::_getCellData($sKey, $aField, $aRow);
+    }
+
+    protected function _getCellAdded($mixedValue, $sKey, $aField, $aRow)
+    {
+        return parent::_getCellDefault(bx_time_js($mixedValue), $sKey, $aField, $aRow);
+    }
+
+    
+
+    protected function _getActionCheck($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = [])
+    {
+    	$a['attr'] = array_merge($a['attr'], [
+            "onclick" => "window.open('" . $this->_sUrlPage . '&id=' . $aRow['id'] . "', '_self');"
+    	]);
+
+    	return $this->_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
+    }
+
+    protected function _addJsCss()
+    {
+        parent::_addJsCss();
+
+        $this->_oTemplate->addJs(['jquery.form.min.js', 'agents_helpers.js']);
+
+        $oForm = new BxTemplStudioFormView([]);
+        $oForm->addCssJs();
+    }
+    
+    protected function _isCheckboxDisabled($aRow)
+    {
+        return false;
+    }
+
+
+
+    protected function _getFormEdit($sAction, $aHelper = [])
+    {
+        $aForm = $this->_getForm($sAction, $aHelper);
+        $aForm['form_attrs']['action'] .= '&id=' . $aHelper['id'];
+
+        return $aForm;
+    }
+
+    protected function _getForm($sAction, $aHelper = [])
+    {
+        $sJsObject = $this->getPageJsObject();
+
+        $sType = isset($aHelper['type']) ? $aHelper['type'] : 'event';
+
+
+
+        $aForm = array(
+            'form_attrs' => array(
+                'id' => 'bx_std_agents_helpers_' . $sAction,
+                'action' => BX_DOL_URL_ROOT . 'grid.php?o=sys_studio_agents_helpers&a=' . $sAction,
+                'method' => 'post',
+            ),
+            'params' => array (
+                'db' => array(
+                    'table' => 'sys_agents_helpers',
+                    'key' => 'id',
+                    'submit_name' => 'do_submit',
+                ),
+            ),
+            'inputs' => array(
+                 'name' => [
+                    'type' => 'text',
+                    'name' => 'name',
+                    'required' => '1',
+                    'caption' => _t('_sys_agents_helpers_field_name'),
+                    'value' => isset($aHelper['name']) ? $aHelper['name'] : '',
+                ],
+                'model_id' => [
+                    'type' => 'select',
+                    'name' => 'model_id',
+                    'caption' => _t('_sys_agents_helpers_field_model_id'),
+                    'info' => '',
+                    'value' => isset($aHelper['model_id']) ? $aHelper['model_id'] : BxDolAI::getInstance()->getDefaultModel(),
+                    'values' => $this->_oDb->getModelsBy(['sample' => 'all_pairs']),
+                    'required' => '1',
+                    'db' => [
+                        'pass' => 'Int',
+                    ]
+                ],
+                'profile_id' => [
+                    'type' => 'select',
+                    'name' => 'profile_id',
+                    'caption' => _t('_sys_agents_helpers_field_profile_id'),
+                    'info' => _t('_sys_agents_helpers_field_profile_id_inf'),
+                    'value' => isset($aHelper['profile_id']) ? $aHelper['profile_id'] : 0,
+                    'values' => bx_srv('system', 'get_options_agents_profile', [], 'TemplServices'),
+                    'required' => '0',
+                    'db' => [
+                        'pass' => 'Int',
+                    ]
+                ],
+                
+                'prompt' => [
+                    'type' => 'textarea',
+                    'name' => 'prompt',
+                    'required' => '1',
+                    'caption' => _t('_sys_agents_helpers_field_prompt'),
+                    'value' => isset($aHelper['prompt']) ? $aHelper['prompt'] : '',
+                ],
+                'submit' => array(
+                    'type' => 'input_set',
+                    0 => array (
+                        'type' => 'submit',
+                        'name' => 'do_submit',
+                        'value' => _t('_sys_submit'),
+                    ),
+                    1 => array (
+                        'type' => 'reset',
+                        'name' => 'close',
+                        'value' => _t('_sys_close'),
+                        'attrs' => array('class' => 'bx-def-margin-sec-left', 'onclick' => '$(\'.bx-popup-applied:visible\').dolPopupHide();'),
+                    ),
+                ),
+
+            ),
+        );
+
+        return $aForm;
+    }
+    
+    protected function _getId()
+    {
+        $aIds = bx_get('ids');
+        if(!empty($aIds) && is_array($aIds))
+            return array_shift($aIds);
+
+        $iId = (int)bx_get('id');
+        if(!$iId)
+            return false;
+
+        return $iId;
+    }
+}
+
+/** @} */

+ 19 - 0
studio/template/scripts_templ/BxTemplStudioAgentsHelpers.php

@@ -0,0 +1,19 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+
+class BxTemplStudioAgentsHelpers extends BxBaseStudioAgentsHelpers
+{
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+        parent::__construct ($aOptions, $oTemplate);
+    }
+}
+
+/** @} */

+ 1 - 1
template/embed_system_link.html

@@ -1,4 +1,4 @@
-<a href="__link__" target="_blank" style="text-decoration: none; color: inherit;" __attrs__>
+<a href="__link__" target="_blank" style="text-decoration: none; " class="bx-embeded-link" __attrs__>
     <div class="bx-embeded" style="display: flex; flex-direction: row; column-gap:  height: 128px; border: 1px solid #cccccc; border-radius:8px; align-items: stretch;">
         <div style="flex: 0 0 128px; height: 128px; border-radius:8px 0 0 8px; background: url('__image__') center center / cover no-repeat;">
             <img  class="bx-embeded-image" src="__image__"  width="128" height="128">

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно