Przeglądaj źródła

Ticket #4988 - Agents: Assistants should accept files the same as images.

AntonLV 1 rok temu
rodzic
commit
481bd63f9a

+ 25 - 0
inc/classes/BxDolAI.php

@@ -431,6 +431,11 @@ class BxDolAIMessage
      * @var mixed - an array of message parts (text, image_url) or a string.
      */
     protected $_mixedContent;
+    
+    /**
+     * @var array - an array of of files attached to the message.
+     */
+    protected $_aAttachments;
 
     public function __construct($sType)
     {
@@ -446,6 +451,11 @@ class BxDolAIMessage
     {
         return $this->_mixedContent;
     }
+
+    public function getAttachments()
+    {
+        return $this->_aAttachments;
+    }
 }
 
 class BxDolAIMessageString extends BxDolAIMessage
@@ -485,6 +495,21 @@ class BxDolAIMessageArray extends BxDolAIMessage
             ]
         ];
     }
+
+    public function addAttachments($mixedAttachments, $mixedTools = false)
+    {
+        if(!is_array($mixedAttachments))
+            $mixedAttachments = [$mixedAttachments];
+
+        if(!$mixedTools)
+            $mixedTools = [['type' => 'file_search']];
+
+        foreach($mixedAttachments as $sAttachment)
+            $this->_aAttachments[] = [
+                'file_id' => $sAttachment,
+                'tools' => $mixedTools
+            ];
+    }
 }
 
 class BxDolAIMessages

+ 47 - 0
inc/classes/BxDolAIModel.php

@@ -16,6 +16,9 @@ class BxDolAIModel extends BxDol
     protected $_sKey;
     protected $_aParams;
 
+    protected $_mixedError;
+    protected $_bError;
+
     public function __construct($aModel)
     {
         parent::__construct();
@@ -30,6 +33,9 @@ class BxDolAIModel extends BxDol
         $this->_sCaption = _t($aModel['title']);
         $this->_sKey = !empty($aModel['key']) ? $aModel['key'] : BxDolAI::getDefaultApiKey();
         $this->_aParams = !empty($aModel['params']) ? json_decode($aModel['params'], true) : [];
+
+        $this->_mixedError = null;
+        $this->_bError = false;
     }
 
     /**
@@ -72,6 +78,47 @@ class BxDolAIModel extends BxDol
         $this->_aParams = array_merge($this->_aParams, $aParams);
     }
 
+    public function isError()
+    {
+        return $this->_bError;
+    }
+
+    public function getError()
+    {
+        return $this->_bError ? $this->_mixedError : false;
+    }
+
+    public function getErrorMessage()
+    {
+        if(!$this->_bError)
+            return false;
+
+        if(is_string($this->_mixedError))
+            return $this->_mixedError;
+
+        if(is_array($this->_mixedError) && !empty($this->_mixedError['message']))
+            return $this->_mixedError['message'];
+
+        return _t('_sys_agents_err_failed');
+    }
+
+    public function setError($mixedError)
+    {
+        if(empty($mixedError))
+            return false;
+
+        $this->_mixedError = $mixedError;
+        $this->_bError = true;
+
+        return true;
+    }
+
+    public function resetError()
+    {
+        $this->_mixedError = null;
+        $this->_bError = false;
+    }
+
     public function getResponseInit($sType, $aMessage, $aParams = [])
     {
         // Should be overwritten to get init call response.

+ 5 - 3
inc/classes/BxDolAIModelGpt40.php

@@ -81,7 +81,7 @@ class BxDolAIModelGpt40 extends BxDolAIModel
         if(!is_a($oMessage, 'BxDolAIMessage'))
             return false;
 
-        $aResponse = $this->call(['messages' => [['role' => 'user', 'content' => $oMessage->getContent()]]]);
+        $aResponse = $this->call(['messages' => [['role' => 'user', 'content' => $oMessage->getContent(), 'attachments' => $oMessage->getAttachments()]]]);
         if(!isset($aResponse['id'], $aResponse['object']) || $aResponse['object'] != 'thread')
             return false;
 
@@ -143,7 +143,7 @@ class BxDolAIModelGpt40 extends BxDolAIModel
             $mixedMessage = $mixedMessage->getLast();
 
         $sThreadId = $aParams['thread_id'];
-        if($mixedMessage->isAi() || !$this->callMessages($sThreadId, ['role' => 'user', 'content' => $mixedMessage->getContent()]))
+        if($mixedMessage->isAi() || !$this->callMessages($sThreadId, ['role' => 'user', 'content' => $mixedMessage->getContent(), 'attachments' => $mixedMessage->getAttachments()]))
             return false;
 
         $aResponse = $this->callRuns($sThreadId, [
@@ -465,7 +465,9 @@ class BxDolAIModelGpt40 extends BxDolAIModel
 
         $aResponse = json_decode($sResponse, true);
         if(isset($aResponse['error'])) {
-            $this->_log($aResponse['error']);
+            $this->setError($aResponse['error']);
+
+            $this->_log(['endpoint' => $sEndpoint, 'method' => $sMethod, 'error' => $aResponse['error']]);
             return false;
         }
 

Plik diff jest za duży
+ 0 - 0
install/sql/system.sql


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

@@ -2312,7 +2312,7 @@
     <string name="_sys_agents_assistants_chats_popup_add"><![CDATA[Add chat]]></string>
     <string name="_sys_agents_assistants_chats_popup_edit"><![CDATA[Edit chat]]></string>
     <string name="_sys_agents_assistants_chats_msg_loading"><![CDATA[I'm thinking. Please wait.]]></string>
-    <string name="_sys_agents_assistants_chats_err_no_response"><![CDATA[Cannot get response]]></string>
+    <string name="_sys_agents_assistants_chats_err_no_response"><![CDATA[Cannot get response. Check log file for more info.]]></string>
     <string name="_sys_agents_assistants_files_txt_name"><![CDATA[Name]]></string>
     <string name="_sys_agents_assistants_files_txt_size"><![CDATA[Size]]></string>
     <string name="_sys_agents_assistants_files_txt_status"><![CDATA[Status]]></string>
@@ -2335,6 +2335,7 @@
     <string name="_sys_agents_assistants_popup_add_knowledge"><![CDATA[Add Knowledge]]></string>
     <string name="_sys_agents_assistants_popup_ask"><![CDATA[Ask Assistant]]></string>
     <string name="_sys_agents_assistants_msg_knowledge_added"><![CDATA[Knowledge was added.]]></string>
+    <string name="_sys_agents_err_failed"><![CDATA[Error occurred. Try to check log file for more info.]]></string>
 
   <string name="_sys_audit_content_info_popup_title"><![CDATA[Information]]></string>
   <string name="_sys_audit_action_edit_content"><![CDATA[Content edited]]></string>

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

@@ -2288,7 +2288,7 @@
         <string name="_sys_agents_assistants_chats_popup_add"><![CDATA[Добавить чат]]></string>
         <string name="_sys_agents_assistants_chats_popup_edit"><![CDATA[Редактировать чат]]></string>
         <string name="_sys_agents_assistants_chats_msg_loading"><![CDATA[Я думаю. Пожалуйста, подождите.]]></string>
-        <string name="_sys_agents_assistants_chats_err_no_response"><![CDATA[Невозможно получить ответ]]></string>
+        <string name="_sys_agents_assistants_chats_err_no_response"><![CDATA[Невозможно получить ответ. Проверьте файл журнала для получения дополнительной информации.]]></string>
         <string name="_sys_agents_assistants_files_txt_name"><![CDATA[Название]]></string>
         <string name="_sys_agents_assistants_files_txt_size"><![CDATA[Размер]]></string>
         <string name="_sys_agents_assistants_files_txt_status"><![CDATA[Статус]]></string>
@@ -2311,6 +2311,7 @@
         <string name="_sys_agents_assistants_popup_add_knowledge"><![CDATA[Добавить знания]]></string>
         <string name="_sys_agents_assistants_popup_ask"><![CDATA[Ask Assistant]]></string>
         <string name="_sys_agents_assistants_msg_knowledge_added"><![CDATA[Знания были добавлены.]]></string>
+        <string name="_sys_agents_err_failed"><![CDATA[Произошла ошибка. Попробуйте проверить файл журнала для получения дополнительной информации.]]></string>
 
   <string name="_sys_audit_content_info_popup_title"><![CDATA[Информация]]></string>
   <string name="_sys_audit_action_edit_content"><![CDATA[Контент изменен]]></string>

+ 75 - 7
studio/classes/BxDolStudioAgentsAsstChatsCmts.php

@@ -25,6 +25,8 @@ class BxDolStudioAgentsAsstChatsCmts extends BxTemplCmts
 
     public function __construct($sSystem, $iId, $iInit = true, $oTemplate = false)
     {
+        $this->_sTableImages = 'sys_agents_assistants_chats_files';
+
         parent::__construct($sSystem, $iId, $iInit, $oTemplate);
 
         if ($oTemplate)
@@ -132,10 +134,26 @@ class BxDolStudioAgentsAsstChatsCmts extends BxTemplCmts
                             $oTranscoder = BxDolTranscoderImage::getObjectInstance($this->getTranscoderPreviewName());
 
                             foreach($aFiles as $aFile) {
-                                if(!$oTranscoder || !$oTranscoder->isMimeTypeSupported($aFile['mime_type']))
+                                $sFileUrl = $oStorage->getFileUrlById($aFile['image_id']);
+                                if(!$sFileUrl)
                                     continue;
 
-                                $oMessage->addImageUrl($oStorage->getFileUrlById($aFile['image_id']));
+                                //--- Add image as part of message's content.
+                                if($oTranscoder && $oTranscoder->isMimeTypeSupported($aFile['mime_type'])) {
+                                    $oMessage->addImageUrl($sFileUrl);
+                                    continue;
+                                }
+
+                                //--- Add non-image file as attchment.
+                                if(($sFileContent = bx_file_get_contents($sFileUrl))) {
+                                    $aFile = $oAIModel->callFiles([
+                                        'content' => $sFileContent, 
+                                        'name' => $aFile['file_name'], 
+                                        'mime' => $aFile['mime_type']
+                                    ]);
+                                    if($aFile !== false)
+                                        $oMessage->addAttachments($aFile['id']);
+                                }
                             }
                         }
                     }
@@ -148,10 +166,20 @@ class BxDolStudioAgentsAsstChatsCmts extends BxTemplCmts
                         ]);
                     }
 
-                    if(!empty($sThreadId) && ($sResponse = $oAIModel->getResponse(BX_DOL_AI_ASSISTANT, $oMessage, ['thread_id' => $sThreadId, 'assistant_id' => $sAssistantId])) !== false) {
-                        $this->_oQuery->updateComments(['cmt_text' => $sResponse], ['cmt_id' => $iCmtId]);
+                    if(!empty($sThreadId)) {
+                        $sResponse = $oAIModel->getResponse(BX_DOL_AI_ASSISTANT, $oMessage, [
+                            'thread_id' => $sThreadId, 
+                            'assistant_id' => $sAssistantId
+                        ]);
+
+                        if($sResponse === false && $oAIModel->isError())
+                            $sResponse = $oAIModel->getErrorMessage();
+
+                        if($sResponse) {
+                            $this->_oQuery->updateComments(['cmt_text' => $sResponse], ['cmt_id' => $iCmtId]);
 
-                        $aCmt['cmt_text'] = $sResponse;
+                            $aCmt['cmt_text'] = $sResponse;
+                        }
                     }
                 }
             }
@@ -205,6 +233,29 @@ class BxDolStudioAgentsAsstChatsCmts extends BxTemplCmts
         return $mixedResult;
     }
 
+    public function registerTranscoders()
+    {
+        parent::registerTranscoders();
+
+        $aTranscoders = [
+            $this->getTranscoderPreviewName()
+        ];
+
+        BxDolTranscoderImage::registerHandlersArray($aTranscoders);
+    }
+
+    public function unregisterTranscoders()
+    {
+        parent::unregisterTranscoders();
+
+        $aTranscoders = [
+            $this->getTranscoderPreviewName()
+        ];
+
+        BxDolTranscoderImage::unregisterHandlersArray($aTranscoders);
+        BxDolTranscoderImage::cleanupObjectsArray($aTranscoders);
+    }
+
     protected function _getActionsBox(&$aCmt, $aBp = [], $aDp = [])
     {
         if(!$this->isAllowDelete())
@@ -233,8 +284,10 @@ class BxDolStudioAgentsAsstChatsCmts extends BxTemplCmts
     {
         $oForm = parent::_getForm($sAction, $iId, $aDp);
 
-        $oForm->aInputs['cmt_text']['caption'] = '';
-        $oForm->aInputs['cmt_text']['db']['pass'] = 'xss';
+        if(isset($oForm->aInputs['cmt_text'])) {
+            $oForm->aInputs['cmt_text']['caption'] = '';
+            $oForm->aInputs['cmt_text']['db']['pass'] = 'xss';
+        }           
 
         if(isset($oForm->aInputs['cmt_submit']))
             $oForm->aInputs['cmt_submit']['value'] = $this->_oTemplate->parseIcon('arrow-right');
@@ -242,6 +295,21 @@ class BxDolStudioAgentsAsstChatsCmts extends BxTemplCmts
         return $oForm;
     }
 
+    protected function _getFormObject($sAction = BX_CMT_ACTION_POST)
+    {
+        $oResult = parent::_getFormObject($sAction);
+        if(!isset($oResult->aInputs['cmt_image']))
+            return $oResult;
+
+        $oResult->aInputs['cmt_image'] = array_merge($oResult->aInputs['cmt_image'], [
+            'storage_object' => 'sys_agents_assistants_chats_files',
+            'images_transcoder' => 'sys_agents_assistants_chats_files_preview',
+            'upload_buttons_titles' => ['HTML5' => 'paperclip']
+        ]);
+
+        return $oResult;
+    }
+
     protected function _getTmplVarsText($aCmt)
     {
         $bLoad = $this->_isShowAnswerLoad($aCmt);

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików