Skip to content

Commit

Permalink
Ticket unacms#4711 - Automations: Assistants.
Browse files Browse the repository at this point in the history
  • Loading branch information
AntonLV committed Aug 1, 2024
1 parent c9c8883 commit 23eb24b
Show file tree
Hide file tree
Showing 13 changed files with 350 additions and 8 deletions.
15 changes: 15 additions & 0 deletions agents.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

bx_import('BxDolLanguages');

$sTool = bx_process_input(bx_get('t'));

/**
* Work with Providers
*/
Expand All @@ -35,4 +37,17 @@
}
}

/**
* Work with Assistants
*/
if($sTool == 'asst' && ($iId = bx_get('id')) !== false) {
$oAssistant = BxDolAIAssistant::getObjectInstance((int)$iId);

if(($sAction = bx_get('a')) !== false) {
$sAction = 'processAction' . bx_gen_method_name(bx_process_input($sAction));
if(method_exists($oAssistant, $sAction))
$oAssistant->$sAction();
}
}

/** @} */
205 changes: 205 additions & 0 deletions inc/classes/BxDolAIAssistant.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
<?php defined('BX_DOL') or die('hack attempt');
/**
* Copyright (c) UNA, Inc - https://una.io
* MIT License - https://opensource.org/licenses/MIT
*
* @defgroup UnaCore UNA Core
* @{
*/

class BxDolAIAssistant extends BxDol
{
protected static $_sFileText = 'sys_asst_text.json';
protected static $_sFileFaq = 'sys_asst_faq.json';

protected $_oDb;

protected $_iId;
protected $_aData;

public function __construct($aAssistant)
{
parent::__construct();

if(empty($aAssistant) || !is_array($aAssistant))
$this->_log("Unexpected value provided for the credentials");

$this->_oDb = new BxDolAIQuery();

$this->_iId = (int)$aAssistant['id'];
$this->_aData = $aAssistant;
}

/**
* Get assistant object instance by ID
* @param $iId assistant ID
* @return object instance or false on error
*/
public static function getObjectInstance($iId)
{
$sPrefix = 'BxDolAIAssistant!';

if(isset($GLOBALS['bxDolClasses'][$sPrefix . $iId]))
return $GLOBALS['bxDolClasses'][$sPrefix . $iId];

$aAssistant = BxDolAIQuery::getAssistantObject($iId);
if(!$aAssistant)
return false;

$o = new BxDolAIAssistant($aAssistant);
return ($GLOBALS['bxDolClasses'][$sPrefix . $iId] = $o);
}

public function getModelObject()
{
return BxDolAI::getInstance()->getModelObject($this->_aData['model_id']);
}

public function processActionAddKnowledge()
{
$sAction = 'add_knowledge';
$oTemplate = BxDolTemplate::getInstance();

$aForm = $this->_getForm($sAction, ['id' => $this->_iId]);
$oForm = new BxTemplFormView($aForm);
$oForm->initChecker();

if($oForm->isSubmittedAndValid()) {
$oAIModel = $this->getModelObject();

$sType = $oForm->getCleanValue('type');

$sFile = self::${'_sFile' . ucfirst($sType)};
$aFile = $this->_oDb->getFilesBy(['sample' => 'assistant_id', 'assistant_id' => $this->_iId, 'name' => $sFile]);

$aContent = [];
if(!empty($aFile) && is_array($aFile) && !empty($aFile['ai_file_id'])) {
$sContent = $oAIModel->callFilesRetrieveContent($aFile['ai_file_id']);
$aContent = json_decode($sContent, true);

if(!$oAIModel->callVectorStoresFilesDelete($this->_aData['ai_vs_id'], $aFile['ai_file_id']))
return echoJson([]);

if(!$oAIModel->callFilesDelete($aFile['ai_file_id']))
return echoJson([]);

$this->_oDb->deleteFiles(['id' => $aFile['id']]);
}

switch($sType) {
case 'text':
$aContent[] = bx_process_input($oForm->getCleanValue('text'));
break;

case 'faq':
$aContent[] = [
'question' => bx_process_input($oForm->getCleanValue('faq_q')),
'answer' => bx_process_input($oForm->getCleanValue('faq_a'))
];
break;
}

$aFileResponse = $oAIModel->callFiles(['content' => json_encode($aContent), 'name' => $sFile, 'mime' => 'application/json']);
if(!$aFileResponse)
return echoJson([]);

if(!$oAIModel->callVectorStoresFiles($this->_aData['ai_vs_id'], ['file_id' => $aFileResponse['id']]))
return echoJson([]);

$this->_oDb->insertFile([
'name' => $sFile,
'assistant_id' => $this->_iId,
'added' => time(),
'ai_file_id' => $aFileResponse['id'],
'ai_file_size' => $aFileResponse['bytes']
]);

return echoJson(['msg' => _t('_sys_agents_assistants_msg_knowledge_added')]);
}

$sFormId = $oForm->getId();
$sContent = BxTemplFunctions::getInstance()->popupBox($sFormId . '_popup', _t('_sys_agents_assistants_popup_add_knowledge'), $oTemplate->parseHtmlByName('agents_form.html', [
'form_id' => $sFormId,
'form' => $oForm->getCode(true),
]));

return echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false]]]);
}

protected function _getForm($sAction, $aAssistant = [])
{
$aForm = [
'form_attrs' => [
'id' => 'bx_agents_assistants_' . $sAction,
'action' => BX_DOL_URL_ROOT . bx_append_url_params('agents.php', ['t' => 'asst', 'a' => $sAction]),
'method' => 'post',
],
'params' => [
'db' => [
'submit_name' => 'do_submit',
],
],
'inputs' => [],
];

switch($sAction) {
case 'add_knowledge';
$aForm['inputs'] = [
'id' => [
'type' => 'hidden',
'name' => 'id',
'value' => $aAssistant['id'],
],
'type' => [
'type' => 'select',
'name' => 'type',
'caption' => _t('_sys_agents_assistants_field_kwg_type'),
'value' => '',
'values' => [
['key' => 'text', 'value' => _t('_sys_agents_assistants_field_kwg_type_text')],
['key' => 'faq', 'value' => _t('_sys_agents_assistants_field_kwg_type_faq')]
],
'attrs' => ['onchange' => "javascript:bx_aa_ak_type_change(this)"],
],
'text' => [
'type' => 'textarea',
'name' => 'text',
'caption' => _t('_sys_agents_assistants_field_kwg_text'),
'value' => '',
'tr_attrs' => ['df' => '1', 'dt' => 'text']
],
'faq_q' => [
'type' => 'text',
'name' => 'faq_q',
'caption' => _t('_sys_agents_assistants_field_kwg_faq_q'),
'value' => '',
'tr_attrs' => ['df' => '1', 'dt' => 'faq', 'style' => 'display:none']
],
'faq_a' => [
'type' => 'textarea',
'name' => 'faq_a',
'caption' => _t('_sys_agents_assistants_field_kwg_faq_a'),
'value' => '',
'tr_attrs' => ['df' => '1', 'dt' => 'faq', 'style' => 'display:none']
],
'submit' => [
'type' => 'input_set',
0 => [
'type' => 'submit',
'name' => 'do_submit',
'value' => _t('_sys_submit'),
],
1 => [
'type' => 'reset',
'name' => 'close',
'value' => _t('_sys_close'),
'attrs' => ['class' => 'bx-def-margin-sec-left', 'onclick' => '$(\'.bx-popup-applied:visible\').dolPopupHide();'],
],
],
];
break;
}

return $aForm;
}
}
9 changes: 9 additions & 0 deletions inc/classes/BxDolAIModelGpt40.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class BxDolAIModelGpt40 extends BxDolAIModel

protected $_sEndpointFiles;
protected $_sEndpointFilesRetrieve;
protected $_sEndpointFilesRetrieveContent;
protected $_sEndpointFilesDelete;

protected $_sEndpointVectorStores;
Expand Down Expand Up @@ -48,6 +49,7 @@ public function __construct($aModel)

$this->_sEndpointFiles = 'https://api.openai.com/v1/files';
$this->_sEndpointFilesRetrieve = $this->_sEndpointFiles . '/%s';
$this->_sEndpointFilesRetrieveContent = $this->_sEndpointFiles . '/%s/content';
$this->_sEndpointFilesDelete = $this->_sEndpointFilesRetrieve;

$this->_sEndpointVectorStores = 'https://api.openai.com/v1/vector_stores';
Expand Down Expand Up @@ -375,6 +377,13 @@ public function callFilesRetrieve($sFileId)
return $mixedResponse;
}

public function callFilesRetrieveContent($sFileId)
{
return bx_file_get_contents(sprintf($this->_sEndpointFilesRetrieveContent, $sFileId), [], 'get', [
"Authorization: Bearer " . $this->_sKey
]);
}

public function callFilesDelete($sFileId, $aParams = [])
{
$aData = [];
Expand Down
21 changes: 19 additions & 2 deletions inc/classes/BxDolAIQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,17 @@ static public function getProviderIdByName($sName)
'name' => $sName
]);
}

static public function getAssistantObject($iId)
{
$oDb = BxDolDb::getInstance();

$aAssistant = $oDb->getRow("SELECT * FROM `sys_agents_assistants` WHERE `id` = :id", ['id' => $iId]);
if(!$aAssistant || !is_array($aAssistant))
return false;

return $aAssistant;
}

public function getModelsBy($aParams = [])
{
Expand Down Expand Up @@ -689,8 +700,14 @@ public function getFilesBy($aParams = [])
];

$sWhereClause .= " AND `taf`.`assistant_id`=:assistant_id";
break;


if(!empty($aParams['name'])) {
$aMethod['name'] = 'getRow';
$aMethod['params'][1]['name'] = $aParams['name'];

$sWhereClause .= " AND `taf`.`name`=:name";
}
break;
}

$aMethod['params'][0] = "SELECT " . $sSelectClause . "
Expand Down
15 changes: 15 additions & 0 deletions inc/js/functions.js
Original file line number Diff line number Diff line change
Expand Up @@ -1591,4 +1591,19 @@ function bx_redirect_for_external_links_open (sHref)
window.open(sUrlRoot + 'page.php?i=redirect&url=' + encodeURIComponent(sHref), '_blank').focus();
}

function bx_agents_action(oElement, sTool, sAction, aParams)
{
var oDate = new Date();
var sQueryUrl = sUrlRoot + 'agents.php';
var oQueryParams = jQuery.extend({}, {t: sTool, a: sAction, _t:oDate.getTime()}, aParams != undefined ? aParams : {});

jQuery.post (
sQueryUrl,
oQueryParams,
function(oData) {
processJsonData(oData);
},
'json'
);
}
/** @} */
9 changes: 5 additions & 4 deletions install/sql/system.sql
Original file line number Diff line number Diff line change
Expand Up @@ -5482,10 +5482,11 @@ INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable

INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon_only`, `confirm`, `active`, `order`) VALUES
('sys_studio_agents_assistants', 'independent', 'add', '_sys_agents_assistants_btn_add', '', 0, 0, 1, 1),
('sys_studio_agents_assistants', 'single', 'chats', '_sys_agents_assistants_btn_chats', '', 0, 0, 1, 1),
('sys_studio_agents_assistants', 'single', 'files', '_sys_agents_assistants_btn_files', '', 0, 0, 1, 2),
('sys_studio_agents_assistants', 'single', 'edit', '_Edit', 'pencil-alt', 1, 0, 1, 3),
('sys_studio_agents_assistants', 'single', 'delete', '_Delete', 'remove', 1, 1, 1, 4),
('sys_studio_agents_assistants', 'single', 'chats', '_sys_agents_assistants_btn_chats', 'comments', 1, 0, 1, 1),
('sys_studio_agents_assistants', 'single', 'files', '_sys_agents_assistants_btn_files', 'folder', 1, 0, 1, 2),
('sys_studio_agents_assistants', 'single', 'codes', '_sys_agents_assistants_btn_codes', 'code', 1, 0, 1, 3),
('sys_studio_agents_assistants', 'single', 'edit', '_Edit', 'pencil-alt', 1, 0, 1, 4),
('sys_studio_agents_assistants', 'single', 'delete', '_Delete', 'remove', 1, 1, 1, 5),
('sys_studio_agents_assistants', 'bulk', 'delete', '_Delete', '', 0, 1, 1, 1);

-- GRID: Agents Assistants Chats
Expand Down
12 changes: 12 additions & 0 deletions modules/boonex/english/data/langs/system/en.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2236,9 +2236,13 @@
<string name="_sys_agents_assistants_txt_prompt"><![CDATA[Prompt]]></string>
<string name="_sys_agents_assistants_txt_added"><![CDATA[Added]]></string>
<string name="_sys_agents_assistants_txt_assistant"><![CDATA[Assistant]]></string>
<string name="_sys_agents_assistants_txt_codes_onclick"><![CDATA[onClick code for a link]]></string>
<string name="_sys_agents_assistants_txt_codes_button"><![CDATA[Button HTML code]]></string>
<string name="_sys_agents_assistants_txt_add_knowledge"><![CDATA[Add knowledge]]></string>
<string name="_sys_agents_assistants_btn_add"><![CDATA[Add Assistant]]></string>
<string name="_sys_agents_assistants_btn_chats"><![CDATA[Chats]]></string>
<string name="_sys_agents_assistants_btn_files"><![CDATA[Files]]></string>
<string name="_sys_agents_assistants_btn_codes"><![CDATA[Get codes]]></string>
<string name="_sys_agents_assistants_field_name"><![CDATA[Name]]></string>
<string name="_sys_agents_assistants_field_model_id"><![CDATA[Model]]></string>
<string name="_sys_agents_assistants_field_profile_id"><![CDATA[Profile]]></string>
Expand Down Expand Up @@ -2276,6 +2280,14 @@
<string name="_sys_agents_assistants_files_btn_delete"><![CDATA[Delete file]]></string>
<string name="_sys_agents_assistants_files_field_file"><![CDATA[File]]></string>
<string name="_sys_agents_assistants_files_popup_add"><![CDATA[Add File]]></string>
<string name="_sys_agents_assistants_field_kwg_type"><![CDATA[Type]]></string>
<string name="_sys_agents_assistants_field_kwg_type_text"><![CDATA[Text]]></string>
<string name="_sys_agents_assistants_field_kwg_type_faq"><![CDATA[Question with answer]]></string>
<string name="_sys_agents_assistants_field_kwg_text"><![CDATA[Text]]></string>
<string name="_sys_agents_assistants_field_kwg_faq_q"><![CDATA[Question]]></string>
<string name="_sys_agents_assistants_field_kwg_faq_a"><![CDATA[Answer]]></string>
<string name="_sys_agents_assistants_popup_add_knowledge"><![CDATA[Add Knowledge]]></string>
<string name="_sys_agents_assistants_msg_knowledge_added"><![CDATA[Knowledge was added.]]></string>

<string name="_sys_audit_content_info_popup_title"><![CDATA[Information]]></string>
<string name="_sys_audit_action_edit_content"><![CDATA[Content edited]]></string>
Expand Down
12 changes: 12 additions & 0 deletions modules/boonex/russian/data/langs/system/ru.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2212,9 +2212,13 @@
<string name="_sys_agents_assistants_txt_prompt"><![CDATA[Инструкции]]></string>
<string name="_sys_agents_assistants_txt_added"><![CDATA[Добавлено]]></string>
<string name="_sys_agents_assistants_txt_assistant"><![CDATA[Ассистент]]></string>
<string name="_sys_agents_assistants_txt_codes_onclick"><![CDATA[onClick код для ссылки]]></string>
<string name="_sys_agents_assistants_txt_codes_button"><![CDATA[HTML-код кнопки]]></string>
<string name="_sys_agents_assistants_txt_add_knowledge"><![CDATA[Добавить знания]]></string>
<string name="_sys_agents_assistants_btn_add"><![CDATA[Добавить ассистента]]></string>
<string name="_sys_agents_assistants_btn_chats"><![CDATA[Чаты]]></string>
<string name="_sys_agents_assistants_btn_files"><![CDATA[Файлы]]></string>
<string name="_sys_agents_assistants_btn_codes"><![CDATA[Получить коды]]></string>
<string name="_sys_agents_assistants_field_name"><![CDATA[Название]]></string>
<string name="_sys_agents_assistants_field_model_id"><![CDATA[Модель]]></string>
<string name="_sys_agents_assistants_field_profile_id"><![CDATA[Профиль]]></string>
Expand Down Expand Up @@ -2252,6 +2256,14 @@
<string name="_sys_agents_assistants_files_btn_delete"><![CDATA[Удалить файл]]></string>
<string name="_sys_agents_assistants_files_field_file"><![CDATA[Файл]]></string>
<string name="_sys_agents_assistants_files_popup_add"><![CDATA[Добавить файл]]></string>
<string name="_sys_agents_assistants_field_kwg_type"><![CDATA[Тип]]></string>
<string name="_sys_agents_assistants_field_kwg_type_text"><![CDATA[Текст]]></string>
<string name="_sys_agents_assistants_field_kwg_type_faq"><![CDATA[Вопрос с ответом]]></string>
<string name="_sys_agents_assistants_field_kwg_text"><![CDATA[Текст]]></string>
<string name="_sys_agents_assistants_field_kwg_faq_q"><![CDATA[Вопрос]]></string>
<string name="_sys_agents_assistants_field_kwg_faq_a"><![CDATA[Ответ]]></string>
<string name="_sys_agents_assistants_popup_add_knowledge"><![CDATA[Добавить знания]]></string>
<string name="_sys_agents_assistants_msg_knowledge_added"><![CDATA[Знания были добавлены.]]></string>

<string name="_sys_audit_content_info_popup_title"><![CDATA[Информация]]></string>
<string name="_sys_audit_action_edit_content"><![CDATA[Контент изменен]]></string>
Expand Down
Loading

0 comments on commit 23eb24b

Please sign in to comment.