Aleksandr Trofimov 7 месяцев назад
Родитель
Сommit
6c47804829

+ 6 - 2
composer.json

@@ -11,7 +11,8 @@
     "config": {
         "vendor-dir": "plugins",
         "allow-plugins": {
-            "avto-dev/composer-cleanup-plugin": true
+            "avto-dev/composer-cleanup-plugin": true,
+            "php-http/discovery": true
         }
     },
     "repositories": [
@@ -100,7 +101,10 @@
         "enshrined/svg-sanitize": "^0.22.0",
         "neuron-core/neuron-ai": "^3.0",
         "aws/aws-sdk-php": "^3.371",
-        "spatie/fork": "^1.2"
+        "spatie/fork": "^1.2",
+        "elasticsearch/elasticsearch": "^9.3",
+        "opensearch-project/opensearch-php": "^2.5",
+        "typesense/typesense-php": "*"
     },
     "scripts": {
         "post-update-cmd": [

Разница между файлами не показана из-за своего большого размера
+ 1107 - 94
composer.lock


+ 6 - 0
inc/classes/BxDolAIQuery.php

@@ -794,6 +794,12 @@ class BxDolAIQuery extends BxDolDb
 
         return (int)$this->query("DELETE FROM `sys_agents_assistants_files` WHERE " . $this->arrayToSQL($aParamsWhere, ' AND ')) > 0;
     }
+
+    public function getVectorStoreById (int $iId): mixed
+    {
+        $sQuery = "SELECT * FROM `sys_agents_vector_store` WHERE `id` = :id";
+        return $this->getRow($sQuery, ['id' => $iId]); 
+    }
 }
 
 /** @} */

+ 18 - 0
inc/classes/BxDolForm.php

@@ -1732,6 +1732,15 @@ class BxDolFormCheckerHelper
         }
         return $s ? true : false;
     }
+    static public function checkJson ($mixed, $bAllowEmpty = false )
+    {
+        if (is_array($mixed)) {            
+            foreach ($mixed as $v)
+                if (!self::_isJsonValid($v, $bAllowEmpty))
+                    return false;
+        }
+        return self::_isJsonValid($mixed, $bAllowEmpty);
+    }
     static public function checkProfileName($s)
     {
         if (!self::checkAvail($s))
@@ -2059,6 +2068,15 @@ class BxDolFormCheckerHelper
     {
         return bx_is_full_array($a);
     }
+
+    static public function _isJsonValid($s, $bAllowEmpty = false)
+    {
+        if ($bAllowEmpty && empty($s))
+            return true;
+
+        json_decode($s);
+        return (json_last_error() == JSON_ERROR_NONE);
+    }
 }
 
 /** @} */

+ 110 - 0
install/sql/system.sql

@@ -5759,6 +5759,24 @@ INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon
 ('sys_studio_agents_providers', 'single', 'delete', '_sys_agents_providers_btn_delete', 'remove', 1, 1, 3),
 ('sys_studio_agents_providers', 'bulk', 'delete', '_sys_agents_providers_btn_delete', '', 0, 1, 1);
 
+-- GRID: Agents Vector Store
+INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `field_active`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `sorting_fields_translatable`, `visible_for_levels`, `responsive`, `show_total_count`, `override_class_name`, `override_class_file`) VALUES
+('sys_studio_agents_vector_store', 'Sql', 'SELECT * FROM `sys_agents_vector_store` WHERE 1 ', 'sys_agents_vector_store', 'id', 'id', 'active', '', 20, NULL, 'start', '', '', '', 'like', '', '', 2147483647, 1, 1, 'BxTemplStudioAgentsVectorStore', '');
+
+INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `hidden_on`, `order`) VALUES
+('sys_studio_agents_vector_store', 'checkbox', '', '2%', 0, 0, '', '', 1),
+('sys_studio_agents_vector_store', 'switcher', '_sys_active', '8%', 0, 0, '', '', 2),
+('sys_studio_agents_vector_store', 'title', '_Title', '20%', 0, 0, '', '', 3),
+('sys_studio_agents_vector_store', 'type', '_adm_form_txt_fields_type', '10%', 0, 0, '', '', 5),
+('sys_studio_agents_vector_store', 'topk', '_sys_agents_vector_store_txt_topk', '10%', 0, 0, '', '', 6),
+('sys_studio_agents_vector_store', 'actions', '', '25%', 0, 0, '', '', 9);
+
+INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon_only`, `confirm`, `active`, `order`) VALUES
+('sys_studio_agents_vector_store', 'single', 'edit', '_Edit', 'pencil-alt', 1, 0, 1, 1),
+('sys_studio_agents_vector_store', 'single', 'delete', '_Delete', 'remove', 1, 1, 1, 2),
+('sys_studio_agents_vector_store', 'single', 'duplicate', '_Duplicate', 'copy', 1, 1, 1, 3);
+
+
 -- --------------------------------------------------------
 
 
@@ -6899,6 +6917,98 @@ CREATE TABLE IF NOT EXISTS `sys_agents_assistants_chats_files` (
   UNIQUE KEY `remote_id` (`remote_id`)
 );
 
+CREATE TABLE IF NOT EXISTS `sys_agents_vector_store` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,  
+  `type` varchar(128) NOT NULL,
+  `title` varchar(255) NOT NULL DEFAULT '',
+  `topk` tinyint(4) DEFAULT 4,
+  `params` text DEFAULT NULL,
+  `params_user` text DEFAULT NULL,
+  `changed` int(11) NOT NULL DEFAULT 0,
+  `active` tinyint(4) NOT NULL DEFAULT 0,
+  PRIMARY KEY (`id`)
+);
+
+-- 1. File
+SET @j = JSON_OBJECT(
+    'folder', 'vectorstore'
+);
+INSERT INTO sys_agents_vector_store (type, title, topk, params, changed, active)
+VALUES ('file', 'File', 4, CAST(@j AS CHAR), 0, 1);
+
+-- 2. Pinecone
+SET @j = JSON_OBJECT(
+    'key', 'PINECONE_API_KEY',
+    'indexUrl', 'PINECONE_INDEX_URL'
+);
+INSERT INTO sys_agents_vector_store (type, title, topk, params, changed, active)
+VALUES ('pinecone', 'Pinecone', 4, CAST(@j AS CHAR), 0, 0);
+
+-- 3. Elasticsearch
+SET @j = JSON_OBJECT(
+    'client_params', JSON_OBJECT(
+        'endpoint', 'ELASTICSEARCH-ENDPOINT',
+        'key', 'API-KEY'
+    ),
+    'index', 'vectorstore'
+);
+INSERT INTO sys_agents_vector_store (type, title, topk, params, changed, active)
+VALUES ('elasticsearch', 'Elasticsearch', 4, CAST(@j AS CHAR), 0, 0);
+
+-- 4. Opensearch
+SET @j = JSON_OBJECT(
+    'client_params', JSON_OBJECT(
+        'base_uri', 'http://localhost:9200'
+    ),
+    'index', 'vectorstore'
+);
+INSERT INTO sys_agents_vector_store (type, title, topk, params, changed, active)
+VALUES ('opensearch', 'Opensearch', 4, CAST(@j AS CHAR), 0, 0);
+
+-- 5. Typesense
+SET @j = JSON_OBJECT(
+    'client_params', JSON_OBJECT(
+        'api_key', 'TYPESENSE_API_KEY',
+        'nodes', JSON_ARRAY(
+            JSON_OBJECT(
+                'host', 'TYPESENSE_NODE_HOST',
+                'port', 'TYPESENSE_NODE_PORT',
+                'protocol', 'TYPESENSE_NODE_PROTOCOL'
+            )
+        )
+    ),
+    'collection', 'vectorstore',
+    'vectorDimension', 1024
+);
+INSERT INTO sys_agents_vector_store (type, title, topk, params, changed, active)
+VALUES ('typesense', 'Typesense', 4, CAST(@j AS CHAR), 0, 0);
+
+-- 6. Qdrant
+SET @j = JSON_OBJECT(
+    'collectionUrl', 'http://localhost:6333/collections/neuron-ai/',
+    'key', 'QDRANT_API_KEY'
+);
+INSERT INTO sys_agents_vector_store (type, title, topk, params, changed, active)
+VALUES ('qdrant', 'Qdrant', 4, CAST(@j AS CHAR), 0, 0);
+
+-- 7. ChromaDB
+SET @j = JSON_OBJECT(
+    'collection', 'vectorstore',
+    'host', 'http://localhost:8000'
+);
+INSERT INTO sys_agents_vector_store (type, title, topk, params, changed, active)
+VALUES ('chromadb', 'ChromaDB', 5, CAST(@j AS CHAR), 0, 0);
+
+-- 8. Meilisearch
+SET @j = JSON_OBJECT(
+    'indexUid', 'MEILISEARCH_INDEXUID',
+    'host', 'http://localhost:8000',
+    'key', 'MEILISEARCH_API_KEY',
+    'embedder', 'default'
+);
+INSERT INTO sys_agents_vector_store (type, title, topk, params, changed, active)
+VALUES ('meilisearch', 'Meilisearch', 5, CAST(@j AS CHAR), 0, 0);
+
 -- --------------------------------------------------------
 
 --

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

@@ -1124,6 +1124,7 @@
     <string name="_adm_lmi_cpt_assistants"><![CDATA[Assistants]]></string>
     <string name="_adm_lmi_cpt_automators"><![CDATA[Automators]]></string>
     <string name="_adm_lmi_cpt_helpers"><![CDATA[Helpers]]></string>
+    <string name="_adm_lmi_cpt_vector_store"><![CDATA[Vector Store]]></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>

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

@@ -1108,6 +1108,7 @@
     <string name="_adm_lmi_cpt_automators"><![CDATA[Автоматизаторы]]></string>
     <string name="_adm_lmi_cpt_assistants"><![CDATA[Ассистент]]></string>
     <string name="_adm_lmi_cpt_helpers"><![CDATA[Помощники]]></string>
+    <string name="_adm_lmi_cpt_vector_store"><![CDATA[Векторное хранилище]]></string>
     <string name="_adm_lmi_cpt_badges"><![CDATA[Бейджи]]></string>
     <string name="_adm_lmi_cpt_categories"><![CDATA[Категории]]></string>
     <string name="_adm_lmi_cpt_checkout"><![CDATA[Оплата {checkout_counter}]]></string>

+ 1 - 0
studio/classes/BxDolStudioAgents.php

@@ -12,6 +12,7 @@ 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_ASSISTANTS', 'assistants');
+define('BX_DOL_STUDIO_AGENTS_TYPE_VECTOR_STORE', 'vector_store');
 
 define('BX_DOL_STUDIO_AGENTS_TYPE_DEFAULT', BX_DOL_STUDIO_AGENTS_TYPE_SETTINGS);
 

+ 24 - 0
studio/classes/BxDolStudioAgentsVectorStore.php

@@ -0,0 +1,24 @@
+<?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 BxDolStudioAgentsVectorStore extends BxTemplStudioGridAgents
+{
+    protected $_oDb;
+
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+        parent::__construct ($aOptions, $oTemplate);
+
+        $this->_sDefaultSortingOrder = 'DESC';
+
+        $this->_oDb = new BxDolStudioAgentsQuery();
+    }
+}
+
+/** @} */

+ 12 - 1
studio/template/scripts/BxBaseStudioAgents.php

@@ -37,9 +37,11 @@ class BxBaseStudioAgents extends BxDolStudioAgents
             BX_DOL_STUDIO_AGENTS_TYPE_HELPERS => ['icon' => 'mi-agt-helpers.svg'],
             BX_DOL_STUDIO_AGENTS_TYPE_ASSISTANTS => ['icon' => 'mi-agt-assistants.svg'],
             BX_DOL_STUDIO_AGENTS_TYPE_AUTOMATORS => ['icon' => 'mi-agt-automators.svg'],
+            BX_DOL_STUDIO_AGENTS_TYPE_VECTOR_STORE => ['icon' => 'mi-agt-automators.svg'],
         ];
 
         $this->aGridObjects = [
+            BX_DOL_STUDIO_AGENTS_TYPE_VECTOR_STORE => 'sys_studio_agents_vector_store',
             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_ASSISTANTS => 'sys_studio_agents_assistants',
@@ -114,7 +116,16 @@ class BxBaseStudioAgents extends BxDolStudioAgents
 
         return $this->getGrid($this->aGridObjects[BX_DOL_STUDIO_AGENTS_TYPE_AUTOMATORS]);
     }
-    
+
+    protected function getVectorstore()
+    {
+        $oTemplate = BxDolStudioTemplate::getInstance();
+        
+        $this->aPageJsOptions['sPageUrl'] .= 'vector_store';
+
+        return $this->getGrid($this->aGridObjects[BX_DOL_STUDIO_AGENTS_TYPE_VECTOR_STORE]);
+    }
+
     protected function getHelpers()
     {
         $oTemplate = BxDolStudioTemplate::getInstance();

+ 135 - 0
studio/template/scripts/BxBaseStudioAgentsVectorStore.php

@@ -0,0 +1,135 @@
+<?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 BxBaseStudioAgentsVectorStore extends BxDolStudioAgentsVectorStore
+{
+    protected $_sUrlPage;
+    protected $_sFieldName;
+
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+        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 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) === 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]]]);
+    }
+
+    protected function _delete ($mixedId)
+    {
+        $mixedResult = parent::_delete($mixedId);
+        if($mixedResult)
+            $this->_oDb->deleteAutomatorHelpers(['helper_id' => (int)$mixedId]);
+
+        return $mixedResult;
+    }
+
+    protected function _getForm($sAction = '', $aVectorStore = [])
+    {
+        $sJsObject = $this->getPageJsObject();
+    
+        if (empty($aVectorStore['params_user'])) {
+            $aVectorStore['params_user'] = $aVectorStore['params'];
+        }
+
+        $data = json_decode($aVectorStore['params_user'], true);
+        $aVectorStore['params_user'] = json_encode($data, JSON_PRETTY_PRINT);
+
+        return [
+            'form_attrs' => [
+                'id' => 'bx_std_agents_helpers_' . $sAction,
+                'action' => BX_DOL_URL_ROOT . 'grid.php?o=sys_studio_agents_vector_store&a=' . $sAction,
+                'method' => 'post',
+            ],
+            'params' => array (
+                'db' => array(
+                    'table' => 'sys_agents_vector_store',
+                    'key' => 'id',
+                    'submit_name' => 'do_submit',
+                ),
+            ),
+            'inputs' => [
+                'topk' => [
+                    'type' => 'text',
+                    'name' => 'topk',
+                    'caption' => '_sys_agents_vector_store_field_topk',
+                    'required' => true,
+                    'value' => !empty($aVectorStore['topk']) ? $aVectorStore['topk'] : '',
+                    'db' => [
+                        'pass' => 'Int'
+                    ]
+                ],
+                'params_user' => [
+                    'type' => 'textarea',
+                    'name' => 'params_user',
+                    'caption' => '_sys_agents_vector_store_field_params',
+                    'required' => false,
+                    'value' => !empty($aVectorStore['params_user']) ? $aVectorStore['params_user'] : '',
+                    'checker' => [
+                        'func' => 'Json',
+                        'params' => ['allow_empty' => true],
+                        'error' => _t('_sys_agents_vector_store_field_params_err'),
+                    ],
+                    'db' => [
+                        'pass' => 'All'
+                    ]
+                ],
+                'submit' => $this->_getFormControls(),
+            ]
+        ];
+    }
+
+    protected function _getFormEdit($sAction, $aVectorStore = [])
+    {
+        $aForm = $this->_getForm($sAction, $aVectorStore);
+        $aForm['form_attrs']['action'] .= '&id=' . $aVectorStore['id'];
+
+        return $aForm;
+    }
+
+
+}
+
+/** @} */

+ 19 - 0
studio/template/scripts_templ/BxTemplStudioAgentsVectorStore.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 BxTemplStudioAgentsVectorStore extends BxBaseStudioAgentsVectorStore
+{
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+        parent::__construct ($aOptions, $oTemplate);
+    }
+}
+
+/** @} */

Некоторые файлы не были показаны из-за большого количества измененных файлов