فهرست منبع

#5406 AI Agents revamp: tools

Aleksandr Trofimov 7 ماه پیش
والد
کامیت
e43987fbdb

+ 36 - 24
inc/classes/BxDolAIQuery.php

@@ -14,40 +14,38 @@ class BxDolAIQuery extends BxDolDb
         parent::__construct();
     }
 
-    static public function getModelObject($iId)
+    static protected function _getObject(int $iId, string $sTable): array|bool
     {
         $oDb = BxDolDb::getInstance();
 
-        $aModel = $oDb->getRow("SELECT * FROM `sys_agents_models` WHERE `id` = :id", ['id' => $iId]);
-        if(!$aModel || !is_array($aModel))
+        $a = $oDb->getRow("SELECT * FROM `$sTable` WHERE `id` = :id", ['id' => $iId]);
+        if(!$a || !is_array($a))
             return false;
 
-        return $aModel;
+        return $a;
     }
 
-    static public function getVectorStoreObject($iId)
+    static public function getModelObject(int $iId): array|bool
     {
-        $oDb = BxDolDb::getInstance();
-
-        $aVectorStore = $oDb->getRow("SELECT * FROM `sys_agents_vector_store` WHERE `id` = :id", ['id' => $iId]);
-        if(!$aVectorStore || !is_array($aVectorStore))
-            return false;
-
-        return $aVectorStore;
+        return self::_getObject($iId, 'sys_agents_models');
     }
 
-    static public function getAgentObject($iId)
+    static public function getVectorStoreObject(int $iId): array|bool
     {
-        $oDb = BxDolDb::getInstance();
+        return self::_getObject($iId, 'sys_agents_vector_store');
+    }
 
-        $a = $oDb->getRow("SELECT * FROM `sys_agents_agents` WHERE `id` = :id", ['id' => $iId]);
-        if(!$a || !is_array($a))
-            return false;
+    static public function getAgentObject(int $iId): array|bool
+    {
+        return self::_getObject($iId, 'sys_agents_agents');
+    }
 
-        return $a;
+    static public function getToolObject(int $iId): array|bool
+    {
+        return self::_getObject($iId, 'sys_agents_tools');
     }
 
-    static public function getProviderObject($iId)
+    static public function getProviderObject(int $iId)
     {
         $oDb = BxDolDb::getInstance();
 
@@ -893,11 +891,6 @@ class BxDolAIQuery extends BxDolDb
         return $oDb->query($sQuery, ['status' => $sStatus, 'id' => $iId]);
     }
 
-    public function getTools()
-    {
-        return [];
-    }
-
     public function getAgentsByAlertUnitAndAction($sUnit, $sAction)
     {
         return $this->getAll("SELECT * FROM `sys_agents_agents` WHERE `alert_unit` = :unit AND `alert_action` = :action", ['unit' => $sUnit, 'action' => $sAction]);
@@ -907,6 +900,25 @@ class BxDolAIQuery extends BxDolDb
     {
         return $this->query("UPDATE `sys_agents_agents` SET `$sField` = :value WHERE `id` = :id", ['value' => $sValue, 'id' => $iId]);
     }
+
+    public function getToolById (int $iId): mixed
+    {
+        $sQuery = "SELECT * FROM `sys_agents_tools` WHERE `id` = :id";
+        return $this->getRow($sQuery, ['id' => $iId]); 
+    }
+
+    public function insertTool(array $aFields): int
+    {
+        if(empty($aFields) || !is_array($aFields))
+            return false;
+
+        return (int)$this->query("INSERT INTO `sys_agents_tools` SET " . $this->arrayToSQL($aFields));
+    }
+
+    public function getTools()
+    {
+        return [];
+    }
 }
 
 /** @} */

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
install/sql/system.sql


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

@@ -1123,7 +1123,6 @@
     <string name="_adm_lmi_cpt_api_config"><![CDATA[Configuration]]></string>
     <string name="_adm_lmi_cpt_agents"><![CDATA[Agents]]></string>
     <string name="_adm_lmi_cpt_ai_providers"><![CDATA[AI Providers]]></string>
-    <string name="_adm_lmi_cpt_embedding_providers"><![CDATA[Embedding Providers]]></string>
     <string name="_adm_lmi_cpt_tools"><![CDATA[Tools]]></string>
     <string name="_adm_lmi_cpt_vector_store"><![CDATA[Vector Store]]></string>
     <string name="_adm_lmi_cpt_assistants"><![CDATA[Assistants]]></string>

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

@@ -1107,7 +1107,6 @@
     <string name="_adm_lmi_cpt_api_config"><![CDATA[Конфигурация]]></string>
     <string name="_adm_lmi_cpt_agents"><![CDATA[Агенты]]></string>
     <string name="_adm_lmi_cpt_ai_providers"><![CDATA[ИИ поставщики]]></string>
-    <string name="_adm_lmi_cpt_embedding_providers"><![CDATA[Поставщики вставок]]></string>
     <string name="_adm_lmi_cpt_tools"><![CDATA[Инструменты]]></string>
     <string name="_adm_lmi_cpt_vector_store"><![CDATA[Вектороное хранилище]]></string>
     <string name="_adm_lmi_cpt_assistants"><![CDATA[Ассистент]]></string>

+ 0 - 1
studio/classes/BxDolStudioAgents.php

@@ -12,7 +12,6 @@ define('BX_DOL_STUDIO_AGENTS_TYPE_ASSISTANTS', 'assistants');
 
 define('BX_DOL_STUDIO_AGENTS_TYPE_AI_PROVIDERS', 'ai_providers');
 define('BX_DOL_STUDIO_AGENTS_TYPE_TOOLS', 'tools');
-define('BX_DOL_STUDIO_AGENTS_TYPE_EMBEDDING_PROVIDERS', 'embedding_providers');
 define('BX_DOL_STUDIO_AGENTS_TYPE_VECTOR_STORE', 'vector_store');
 define('BX_DOL_STUDIO_AGENTS_TYPE_AGENTS', 'agents');
 

+ 96 - 0
studio/classes/BxDolStudioAgentsInstruments.php

@@ -0,0 +1,96 @@
+<?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 BxDolStudioAgentsInstruments extends BxTemplStudioGridAgents
+{
+    protected $_oDb;
+    protected $_sFieldName;
+
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+        parent::__construct ($aOptions, $oTemplate);
+
+        $this->_sDefaultSortingOrder = 'DESC';
+        $this->_sFieldName = 'name';
+        $this->_oDb = new BxDolStudioAgentsQuery();
+    }
+
+    public function getPageJsObject()
+    {
+        return 'oBxDolStudioPageAgents';
+    }
+
+    public function _performActionDuplicate($sMethodGetData, $sMethodInsertData)
+    {
+        $iId = $this->_getId();
+        $aData = $this->_oDb->$sMethodGetData($iId);
+        if (!empty($aData)) {
+            unset($aData['id']);
+            $aData['title'] .= ' (Copy)';
+            $aData['duplicate'] = 1;
+            $aData['changed'] = time();
+            $aData['active'] = 0;
+            $iNewId = $this->_oDb->$sMethodInsertData($aData);
+            if ($iNewId) {
+                $aRes = ['grid' => $this->getCode(false), 'blink' => $iNewId];
+                return echoJson($aRes);
+            }
+        }
+        $aRes = ['msg' => _t('_sys_txt_error_occured')];
+        return echoJson($aRes);
+    }
+
+    protected function _performActionEdit($sMethodGetDataById, $sPopupTitleKey)
+    {
+        $sAction = 'edit';
+
+        $iId = $this->_getId();
+        $aData = $this->_oDb->$sMethodGetDataById($iId);
+
+        $aForm = $this->_getFormEdit($sAction, $aData);
+        $oForm = new BxTemplFormView($aForm);
+        $oForm->initChecker();
+
+        if($oForm->isSubmittedAndValid()) {
+            if($oForm->update($iId, ['changed' => time()]) === false)
+                return echoJson(['msg' => _t('_sys_txt_error_occured')]);
+
+            return echoJson(['grid' => $this->getCode(false), 'blink' => $iId]);
+        } 
+
+        $sFormId = $oForm->getId();
+        $sForm = $oForm->getCode(true);
+        $sContent = BxTemplStudioFunctions::getInstance()->popupBox($sFormId . '_popup_' . $sAction, _t($sPopupTitleKey), $this->_oTemplate->parseHtmlByName('agents_automator_form.html', [
+            'form_id' => $sFormId,
+            'form' => $sForm,
+            'object' => $this->_sObject,
+            'action' => $sAction
+        ]));
+
+        return echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false]]]);
+    }
+
+    protected function _getFormEdit($sAction, $aData = [])
+    {
+        $aForm = $this->_getForm($sAction, $aData);
+        $aForm['form_attrs']['action'] .= '&id=' . $aData['id'];
+
+        return $aForm;
+    }
+    
+    protected function _getActionDelete ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
+    {
+        if ($sType == 'single' && $aRow['duplicate'] == 0)
+            return '';
+        return parent::_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
+    }
+
+}
+
+/** @} */

+ 4 - 9
studio/template/scripts/BxBaseStudioAgents.php

@@ -35,7 +35,6 @@ class BxBaseStudioAgents extends BxDolStudioAgents
             BX_DOL_STUDIO_AGENTS_TYPE_SETTINGS => ['icon' => 'mi-agt-settings.svg'],
             BX_DOL_STUDIO_AGENTS_TYPE_AI_PROVIDERS => ['icon' => 'mi-agt-providers.svg'],
             BX_DOL_STUDIO_AGENTS_TYPE_TOOLS => ['icon' => 'mi-agt-helpers.svg'],
-            BX_DOL_STUDIO_AGENTS_TYPE_EMBEDDING_PROVIDERS => ['icon' => 'mi-agt-helpers.svg'],
             BX_DOL_STUDIO_AGENTS_TYPE_VECTOR_STORE => ['icon' => 'mi-agt-helpers.svg'],
             BX_DOL_STUDIO_AGENTS_TYPE_AGENTS => ['icon' => 'mi-agt-assistants.svg'],
 
@@ -51,6 +50,7 @@ class BxBaseStudioAgents extends BxDolStudioAgents
         $this->aGridObjects = [
             BX_DOL_STUDIO_AGENTS_TYPE_AI_PROVIDERS => 'sys_studio_agents_models',
             BX_DOL_STUDIO_AGENTS_TYPE_VECTOR_STORE => 'sys_studio_agents_vector_store',
+            BX_DOL_STUDIO_AGENTS_TYPE_TOOLS => 'sys_studio_agents_tools',
 
             BX_DOL_STUDIO_AGENTS_TYPE_ASSISTANTS => 'sys_studio_agents_assistants',
             BX_DOL_STUDIO_AGENTS_TYPE_ASSISTANTS . '_chats' => 'sys_studio_agents_assistants_chats',
@@ -122,18 +122,13 @@ class BxBaseStudioAgents extends BxDolStudioAgents
     
     protected function getTools()
     {
-        return MsgBox('Under construction');
-    }
-    
-    protected function getEmbeddingProviders()
-    {
-        return MsgBox('Under construction');
+        $this->aPageJsOptions['sPageUrl'] .= 'tools';
+
+        return $this->getGrid($this->aGridObjects[BX_DOL_STUDIO_AGENTS_TYPE_TOOLS]);
     }
 
     protected function getVectorstore()
     {
-        $oTemplate = BxDolStudioTemplate::getInstance();
-        
         $this->aPageJsOptions['sPageUrl'] .= 'vector_store';
 
         return $this->getGrid($this->aGridObjects[BX_DOL_STUDIO_AGENTS_TYPE_VECTOR_STORE]);

+ 108 - 0
studio/template/scripts/BxBaseStudioAgentsTools.php

@@ -0,0 +1,108 @@
+<?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 BxBaseStudioAgentsTools extends BxDolStudioAgentsInstruments
+{
+    protected $_sUrlPage;
+
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+        parent::__construct ($aOptions, $oTemplate);
+
+        $this->_sUrlPage = BX_DOL_URL_STUDIO . 'agents.php?page=tools';
+    }
+    
+    public function performActionDuplicate()
+    {
+        return parent::_performActionDuplicate('getToolById', 'insertTool');
+    }
+
+    public function performActionEdit()
+    {
+        return $this->_performActionEdit('getToolById', '_sys_agents_tools_popup_edit');
+    }
+
+    protected function _getForm($sAction = '', $aTool = [])
+    {
+        $sJsObject = $this->getPageJsObject();
+    
+        if (empty($aTool['params_user'])) {
+            $aTool['params_user'] = $aTool['params'];
+        }
+
+        $data = json_decode($aTool['params_user'], true);
+        $aTool['params_user'] = json_encode($data, JSON_PRETTY_PRINT);
+
+        $oParsedown = new Parsedown();
+        $oParsedown->setSafeMode(false);
+        $sDocs = $oParsedown->text($aTool['docs']);
+
+        return [
+            'form_attrs' => [
+                'id' => 'bx_std_agents_tools_' . $sAction,
+                'action' => BX_DOL_URL_ROOT . 'grid.php?o=sys_studio_agents_tools&a=' . $sAction,
+                'method' => 'post',
+            ],
+            'params' => array (
+                'db' => array(
+                    'table' => 'sys_agents_tools',
+                    'key' => 'id',
+                    'submit_name' => 'do_submit',
+                ),
+            ),
+            'inputs' => [
+                'docs' => [
+                    'type' => 'custom',
+                    'name' => 'docs',
+                    'caption' => '',
+                    'content' => $sDocs,
+                ],
+                'title' => [
+                    'type' => 'text',
+                    'name' => 'title',
+                    'caption' => _t('_sys_agents_field_title'),
+                    'required' => true,
+                    'value' => !empty($aTool['title']) ? $aTool['title'] : '',
+                    'db' => [
+                        'pass' => 'Xss'
+                    ]
+                ],
+                'params_user' => [
+                    'type' => 'textarea',
+                    'name' => 'params_user',
+                    'caption' => _t('_sys_agents_tools_field_params'),
+                    'info' => _t('_sys_agents_tools_field_params_info'),
+                    'required' => false,
+                    'value' => !empty($aTool['params_user']) ? $aTool['params_user'] : '',
+                    'checker' => [
+                        'func' => 'Json',
+                        'params' => ['allow_empty' => true],
+                        'error' => _t('_sys_agents_json_field_err'),
+                    ],
+                    'db' => [
+                        'pass' => 'All'
+                    ]
+                ],
+                'submit' => $this->_getFormControls(),
+            ]
+        ];
+    }
+
+    protected function _delete ($mixedId)
+    {
+        $aTool = $this->_oDb->getToolById($mixedId);
+        if (empty($aTool) || $aTool['duplicate'] == 0)
+            return false;
+
+        return parent::_delete($mixedId);
+    }
+}
+
+/** @} */

+ 15 - 68
studio/template/scripts/BxBaseStudioAgentsVectorStore.php

@@ -8,10 +8,9 @@
  * @{
  */
 
-class BxBaseStudioAgentsVectorStore extends BxDolStudioAgentsVectorStore
+class BxBaseStudioAgentsVectorStore extends BxDolStudioAgentsInstruments
 {
     protected $_sUrlPage;
-    protected $_sFieldName;
     protected $_aDataExt = [
         'txt' => 'getFileContentPlain',
         'md' => 'getFileContentPlain',
@@ -23,33 +22,11 @@ class BxBaseStudioAgentsVectorStore extends BxDolStudioAgentsVectorStore
         parent::__construct ($aOptions, $oTemplate);
 
         $this->_sUrlPage = BX_DOL_URL_STUDIO . 'agents.php?page=vector_store';
-
-        $this->_sFieldName = 'name';
-    }
-
-    public function getPageJsObject()
-    {
-        return 'oBxDolStudioPageAgents';
     }
     
     public function performActionDuplicate()
     {
-        $iId = $this->_getId();
-        $aVectorStore = $this->_oDb->getVectorStoreById($iId);
-        if (!empty($aVectorStore)) {
-            unset($aVectorStore['id']);
-            $aVectorStore['title'] .= ' (Copy)';
-            $aVectorStore['duplicate'] = 1;
-            $aVectorStore['changed'] = time();
-            $aVectorStore['active'] = 0;
-            $iNewId = $this->_oDb->insertVectorStore($aVectorStore);
-            if ($iNewId) {
-                $aRes = ['grid' => $this->getCode(false), 'blink' => $iNewId];
-                return echoJson($aRes);
-            }
-        }
-        $aRes = ['msg' => _t('_sys_txt_error_occured')];
-        return echoJson($aRes);
+        return parent::_performActionDuplicate('getVectorStoreById', 'insertVectorStore');
     }
 
     public function performActionAddData()
@@ -112,32 +89,7 @@ class BxBaseStudioAgentsVectorStore extends BxDolStudioAgentsVectorStore
 
     public function performActionEdit()
     {
-        $sAction = 'edit';
-
-        $iId = $this->_getId();
-        $aVectorStore = $this->_oDb->getVectorStoreById($iId);
-
-        $aForm = $this->_getFormEdit($sAction, $aVectorStore);
-        $oForm = new BxTemplFormView($aForm);
-        $oForm->initChecker();
-
-        if($oForm->isSubmittedAndValid()) {
-            if($oForm->update($iId, ['changed' => time()]) === false)
-                return echoJson(['msg' => _t('_sys_txt_error_occured')]);
-
-            return echoJson(['grid' => $this->getCode(false), 'blink' => $iId]);
-        } 
-
-        $sFormId = $oForm->getId();
-        $sForm = $oForm->getCode(true);
-        $sContent = BxTemplStudioFunctions::getInstance()->popupBox($sFormId . '_popup_' . $sAction, _t('_sys_agents_vector_store_popup_edit'), $this->_oTemplate->parseHtmlByName('agents_automator_form.html', [
-            'form_id' => $sFormId,
-            'form' => $sForm,
-            'object' => $this->_sObject,
-            'action' => $sAction
-        ]));
-
-        return echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false]]]);
+        return $this->_performActionEdit('getVectorStoreById', '_sys_agents_vector_store_popup_edit');
     }
 
     public function performActionFiles()
@@ -180,7 +132,7 @@ class BxBaseStudioAgentsVectorStore extends BxDolStudioAgentsVectorStore
 
         return [
             'form_attrs' => [
-                'id' => 'bx_std_agents_helpers_' . $sAction,
+                'id' => 'bx_std_agents_vector_store_' . $sAction,
                 'action' => BX_DOL_URL_ROOT . 'grid.php?o=sys_studio_agents_vector_store&a=' . $sAction,
                 'method' => 'post',
             ],
@@ -198,6 +150,16 @@ class BxBaseStudioAgentsVectorStore extends BxDolStudioAgentsVectorStore
                     'caption' => '',
                     'content' => $sDocs,
                 ],
+                'title' => [
+                    'type' => 'text',
+                    'name' => 'title',
+                    'caption' => _t('_sys_agents_field_title'),
+                    'required' => true,
+                    'value' => !empty($aVectorStore['title']) ? $aVectorStore['title'] : '',
+                    'db' => [
+                        'pass' => 'Xss'
+                    ]
+                ],
                 'embedding_provider_id' => [
                     'type' => 'select',
                     'name' => 'embedding_provider_id',
@@ -249,7 +211,7 @@ class BxBaseStudioAgentsVectorStore extends BxDolStudioAgentsVectorStore
 
         return [
             'form_attrs' => [
-                'id' => 'bx_std_agents_helpers_' . $sAction,
+                'id' => 'bx_std_agents_vector_store_data_' . $sAction,
                 'action' => BX_DOL_URL_ROOT . 'grid.php?o=sys_studio_agents_vector_store&a=' . $sAction,
                 'method' => 'post',
             ],
@@ -330,14 +292,6 @@ class BxBaseStudioAgentsVectorStore extends BxDolStudioAgentsVectorStore
         ];
     }
 
-    protected function _getFormEdit($sAction, $aVectorStore = [])
-    {
-        $aForm = $this->_getForm($sAction, $aVectorStore);
-        $aForm['form_attrs']['action'] .= '&id=' . $aVectorStore['id'];
-
-        return $aForm;
-    }
-
     protected function getFileContentPlain($sFilePath)
     {
         return file_get_contents($sFilePath);
@@ -363,13 +317,6 @@ class BxBaseStudioAgentsVectorStore extends BxDolStudioAgentsVectorStore
             $s = '<a href="javascript:void(0)" onclick="glGrids.' . $this->_sObject . '.actionWithId (' . $aRow['id'] . ', \'files\', {}, \'\', false, 0);">' . $s . '</a>';
         return parent::_getCellDefault($s, $sKey, $aField, $aRow);
     }
-    
-    protected function _getActionDelete ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
-    {
-        if ($sType == 'single' && $aRow['duplicate'] == 0)
-            return '';
-        return parent::_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
-    }
 
     protected function _delete ($mixedId)
     {

+ 3 - 8
studio/classes/BxDolStudioAgentsVectorStore.php → studio/template/scripts_templ/BxTemplStudioAgentsTools.php

@@ -3,21 +3,16 @@
  * Copyright (c) UNA, Inc - https://una.io
  * MIT License - https://opensource.org/licenses/MIT
  *
- * @defgroup    UnaStudio UNA Studio
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
  * @{
  */
 
-class BxDolStudioAgentsVectorStore extends BxTemplStudioGridAgents
+class BxTemplStudioAgentsTools extends BxBaseStudioAgentsTools
 {
-    protected $_oDb;
-
     public function __construct ($aOptions, $oTemplate = false)
     {
         parent::__construct ($aOptions, $oTemplate);
-
-        $this->_sDefaultSortingOrder = 'DESC';
-
-        $this->_oDb = new BxDolStudioAgentsQuery();
     }
 }
 

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است