diff --git a/module/admin/config.php b/module/admin/config.php index ffc6f6111c..0c2b5f1223 100755 --- a/module/admin/config.php +++ b/module/admin/config.php @@ -16,7 +16,7 @@ $config->admin->menuGroup['dev'] = array('dev', 'entry', 'editor'); $config->admin->menuGroup['extension'] = array('extension'); $config->admin->menuGroup['convert'] = array('convert'); $config->admin->menuGroup['platform'] = array('system', 'repo', 'account', 'host', 'serverroom', 'ops', 'tree', 'domain', 'deploy', 'service'); -$config->admin->menuGroup['ai'] = array('ai|adminindex', 'ai|prompts', 'ai|promptview', 'ai|conversations', 'ai|models', 'ai|modelcreate', 'ai|modelview', 'ai|modeledit', 'ai|editmodel', 'ai|promptassignrole', 'ai|promptselectdatasource', 'ai|promptsetpurpose', 'ai|promptsettargetform', 'ai|promptfinalize', 'ai|promptedit', 'ai|miniprograms', 'ai|createminiprogram', 'ai|editminiprogram', 'ai|configuredminiprogram', 'ai|editminiprogramcategory', 'ai|miniprogramview'); +$config->admin->menuGroup['ai'] = array('ai|adminindex', 'ai|prompts', 'ai|promptview', 'ai|conversations', 'ai|models', 'ai|modelcreate', 'ai|modelview', 'ai|modeledit', 'ai|editmodel', 'ai|promptassignrole', 'ai|promptselectdatasource', 'ai|promptsetpurpose', 'ai|promptsettargetform', 'ai|promptfinalize', 'ai|promptedit', 'ai|miniprograms', 'ai|createminiprogram', 'ai|editminiprogram', 'ai|configuredminiprogram', 'ai|editminiprogramcategory', 'ai|miniprogramview', 'ai|assistants', 'ai|assistantcreate', 'ai|assistantview', 'ai|assistantedit'); $config->admin->menuModuleGroup['model']['custom|set'] = array('project', 'issue', 'risk', 'opportunity', 'nc'); $config->admin->menuModuleGroup['model']['custom|required'] = array('project', 'build'); diff --git a/module/admin/lang/de.php b/module/admin/lang/de.php index 4f7ed6158b..e32a61c7a0 100755 --- a/module/admin/lang/de.php +++ b/module/admin/lang/de.php @@ -215,5 +215,6 @@ $lang->admin->ai->model = 'Language Models'; $lang->admin->ai->conversation = 'Conversations'; $lang->admin->ai->miniPrograms = 'Mini Programs'; $lang->admin->ai->prompt = 'Prompts'; +$lang->admin->ai->assistant = 'AI Assistant'; include dirname(__FILE__) . '/menu.php'; diff --git a/module/admin/lang/en.php b/module/admin/lang/en.php index b1fd4f7c3c..006e6a13a6 100755 --- a/module/admin/lang/en.php +++ b/module/admin/lang/en.php @@ -215,5 +215,6 @@ $lang->admin->ai->model = 'Language Models'; $lang->admin->ai->conversation = 'Conversations'; $lang->admin->ai->miniPrograms = 'Mini Programs'; $lang->admin->ai->prompt = 'Prompts'; +$lang->admin->ai->assistant = 'AI Assistant'; include dirname(__FILE__) . '/menu.php'; diff --git a/module/admin/lang/fr.php b/module/admin/lang/fr.php index 82bc218754..521752e7b4 100755 --- a/module/admin/lang/fr.php +++ b/module/admin/lang/fr.php @@ -215,5 +215,6 @@ $lang->admin->ai->model = 'Language Models'; $lang->admin->ai->conversation = 'Conversations'; $lang->admin->ai->miniPrograms = 'Mini Programs'; $lang->admin->ai->prompt = 'Prompts'; +$lang->admin->ai->assistant = 'AI Assistant'; include dirname(__FILE__) . '/menu.php'; diff --git a/module/admin/lang/menu.php b/module/admin/lang/menu.php index 7c0eba1e00..4974e4f6e5 100644 --- a/module/admin/lang/menu.php +++ b/module/admin/lang/menu.php @@ -236,9 +236,11 @@ if($config->vision != 'or') { $lang->admin->menuList->ai['subMenu']['prompts'] = array('link' => "{$lang->admin->ai->prompt}|ai|prompts|", 'alias' => 'promptview,promptassignrole,promptselectdatasource,promptsetpurpose,promptsettargetform,promptfinalize,promptedit'); $lang->admin->menuList->ai['subMenu']['miniPrograms'] = array('link' => "{$lang->admin->ai->miniPrograms}|ai|miniPrograms|", 'alias' => 'miniprograms,createminiprogram,editminiprogram,configuredminiprogram,editminiprogramcategory,miniprogramview'); + $lang->admin->menuList->ai['subMenu']['assistants'] = array('link' => "{$lang->admin->ai->assistant}|ai|assistants|", 'alias' => 'assistantview,assistantcreate,assistantedit'); $lang->admin->menuList->ai['menuOrder']['5'] = 'prompts'; $lang->admin->menuList->ai['menuOrder']['10'] = 'miniPrograms'; + $lang->admin->menuList->ai['menuOrder']['20'] = 'assistants'; } if($config->edition != 'max' and $config->edition != 'ipd') diff --git a/module/admin/lang/zh-cn.php b/module/admin/lang/zh-cn.php index 82fab620f3..be2bb78bce 100755 --- a/module/admin/lang/zh-cn.php +++ b/module/admin/lang/zh-cn.php @@ -215,5 +215,6 @@ $lang->admin->ai->model = '语言模型'; $lang->admin->ai->conversation = '会话'; $lang->admin->ai->miniPrograms = '小程序'; $lang->admin->ai->prompt = '提词'; +$lang->admin->ai->assistant = 'AI 助手'; include dirname(__FILE__) . '/menu.php'; diff --git a/module/ai/config/actions.php b/module/ai/config/actions.php index e93f3da9ad..2d88bb2b03 100644 --- a/module/ai/config/actions.php +++ b/module/ai/config/actions.php @@ -2,8 +2,9 @@ global $lang, $app; $config->ai->actions = new stdclass(); -$config->ai->actions->modelview = array('mainActions' => array('modelenable', 'modeldisable', 'modeltestconnection'), 'suffixActions' => array('modeledit', 'modeldelete')); -$config->ai->actions->models = array('modelenable|modeldisable', 'modeledit'); +$config->ai->actions->modelview = array('mainActions' => array('modelenable', 'modeldisable', 'modeltestconnection'), 'suffixActions' => array('modeledit', 'modeldelete')); +$config->ai->actions->models = array('modelenable|modeldisable', 'modeledit'); +$config->ai->actions->assistants = array('assistantpublish|assistantwithdraw', 'assistantedit'); $config->ai->actionList = array(); $config->ai->actionList['modelenable']['icon'] = 'magic'; @@ -28,3 +29,16 @@ $config->ai->actionList['modeldelete']['icon'] = 'trash'; $config->ai->actionList['modeldelete']['text'] = $lang->delete; $config->ai->actionList['modeldelete']['hint'] = $lang->delete; $config->ai->actionList['modeldelete']['url'] = 'javascript:confirmDelete("{id}")'; + +$config->ai->actionList['assistantpublish']['icon'] = 'publish'; +$config->ai->actionList['assistantpublish']['text'] = $lang->ai->assistants->publish; +$config->ai->actionList['assistantpublish']['hint'] = $lang->ai->assistants->publish; +$config->ai->actionList['assistantpublish']['url'] = array('module' => 'ai', 'method' => 'assistantpublish', 'params' => 'assistantID={id}'); +$config->ai->actionList['assistantwithdraw']['icon'] = 'ban-circle'; +$config->ai->actionList['assistantwithdraw']['text'] = $lang->ai->assistants->withdraw; +$config->ai->actionList['assistantwithdraw']['hint'] = $lang->ai->assistants->withdraw; +$config->ai->actionList['assistantwithdraw']['url'] = 'javascript:confirmWithdraw("{id}")'; +$config->ai->actionList['assistantedit']['icon'] = 'edit'; +$config->ai->actionList['assistantedit']['text'] = $lang->ai->assistants->edit; +$config->ai->actionList['assistantedit']['hint'] = $lang->ai->assistants->edit; +$config->ai->actionList['assistantedit']['url'] = array('module' => 'ai', 'method' => 'assistantedit', 'params' => 'assistantID={id}'); diff --git a/module/ai/config/dtable.php b/module/ai/config/dtable.php index a065071a68..932b391fd4 100644 --- a/module/ai/config/dtable.php +++ b/module/ai/config/dtable.php @@ -11,3 +11,12 @@ $config->ai->dtable->models['createdDate'] = array('name' => 'createdDate', 'tit $config->ai->dtable->models['vendor'] = array('name' => 'vendor', 'title' => $lang->ai->models->vendor, 'flex' => 'auto', 'type' => 'text', 'sortType' => true, 'minWidth' => 120, 'align' => 'center'); $config->ai->dtable->models['usesProxy'] = array('name' => 'usesProxy', 'title' => $lang->ai->models->usesProxy, 'type' => 'status', 'statusMap' => $lang->ai->models->proxyStatusList, 'minWidth' => 120); $config->ai->dtable->models['actions'] = array('title' => $lang->actions, 'type' => 'actions', 'width' => 100, 'fixed' => 'right', 'align' => 'center', 'menu' => $config->ai->actions->models, 'list' => $config->ai->actionList); + +$config->ai->dtable->assistants = array(); +$config->ai->dtable->assistants['id'] = array('name' => 'id', 'title' => $lang->idAB, 'type' => 'id', 'sortType' => true); +$config->ai->dtable->assistants['name'] = array('name' => 'name', 'title' => $lang->ai->assistants->name, 'flex' => 1, 'type' => 'link', 'link' => array('module' => 'ai', 'method' => 'assistantview', 'params' => 'assistantID={id}')); +$config->ai->dtable->assistants['model'] = array('name' => 'model', 'title' => $lang->ai->assistants->refModel, 'flex' => 'auto', 'type' => 'text', 'sortType' => true, 'minWidth' => 120,); +$config->ai->dtable->assistants['status'] = array('name' => 'enabled', 'title' => $lang->statusAB, 'flex' => 'auto', 'type' => 'status', 'statusMap' => $lang->ai->assistants->statusList, 'minWidth' => 80); +$config->ai->dtable->assistants['createdDate'] = array('name' => 'createdDate', 'title' => $lang->ai->assistants->createdDate, 'flex' => 'auto', 'type' => 'datetime', 'minWidth' => 120); +$config->ai->dtable->assistants['publishedDate'] = array('name' => 'publishedDate', 'title' => $lang->ai->assistants->publishedDate, 'flex' => 'auto', 'type' => 'datetime', 'minWidth' => 120,); +$config->ai->dtable->assistants['actions'] = array('title' => $lang->actions, 'type' => 'actions', 'width' => 100, 'fixed' => 'right', 'align' => 'center', 'menu' => $config->ai->actions->assistants, 'list' => $config->ai->actionList); \ No newline at end of file diff --git a/module/ai/control.php b/module/ai/control.php index f06d396c8b..8a15374068 100644 --- a/module/ai/control.php +++ b/module/ai/control.php @@ -281,6 +281,41 @@ class ai extends control return $this->send(array('result' => 'success', 'message' => $this->lang->ai->models->testConnectionResult->success)); } + /** + * List assistants. + * @param string $orderBy + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * @access public + * @return void + */ + public function assistants($orderBy = 'id_asc', $recTotal = 0, $recPerPage = 20, $pageID = 1) + { + $this->app->loadClass('pager', $static = true); + $pager = new pager($recTotal, $recPerPage, $pageID); + + + $assistants = $this->ai->getAssistants($pager, $orderBy); + $models = $this->ai->getLanguageModels('', false); + $assistants = array_map(function ($assistant) use ($models) + { + $assistant->model = current(array_filter($models, function ($model) use ($assistant) + { + return $model->id == $assistant->modelId; + }))->name; + + if(empty($assistant->publishedDate)) $assistant->publishedDate = '-'; + return $assistant; + }, $assistants); + + $this->view->assistants = $assistants; + $this->view->orderBy = $orderBy; + $this->view->pager = $pager; + $this->view->title = $this->lang->ai->assistants->title; + $this->display(); + } + /** * create an assistant. * diff --git a/module/ai/lang/de.php b/module/ai/lang/de.php index ea3b7fc78e..c01c9b8fae 100644 --- a/module/ai/lang/de.php +++ b/module/ai/lang/de.php @@ -966,3 +966,26 @@ $lang->ai->engineeredPrompts->askForFunctionCalling = array((object)array('role' $lang->ai->aiResponseException = array(); $lang->ai->aiResponseException['notFunctionCalling'] = 'The response is not a function calling'; + +$lang->ai->assistants = new stdclass(); +$lang->ai->assistants->title = 'AI Assistant'; +$lang->ai->assistants->create = 'Add Assistant'; +$lang->ai->assistants->edit = 'Edit Assistant'; +$lang->ai->assistants->name = 'Assistant Name'; +$lang->ai->assistants->refModel = 'Referenced Language Model'; +$lang->ai->assistants->createdDate = 'Creation Time'; +$lang->ai->assistants->publishedDate = 'Publication Time'; +$lang->ai->assistants->desc = 'Description'; +$lang->ai->assistants->descPlaceholder = 'Please briefly describe the functions of this AI assistant and the experience it can bring to users.'; +$lang->ai->assistants->systemMessage = 'System Built-in Message'; +$lang->ai->assistants->systemMessagePlaceholder = 'You can give this AI dialogue a "persona", for example, "You are a weekly report assistant, you will generate a formatted weekly report based on the input content".'; +$lang->ai->assistants->greetings = 'Greetings'; +$lang->ai->assistants->greetingsPlaceholder = 'You can set the greeting message for this AI dialogue, for example, "Hello, I am your weekly report assistant, are you still troubled by writing weekly reports? Try sending me a week\'s work?"'; +$lang->ai->assistants->publish = 'Publish'; +$lang->ai->assistants->withdraw = 'Withdraw'; + +$lang->ai->assistants->statusList = array(); +$lang->ai->assistants->statusList['0'] = 'Unpublished'; +$lang->ai->assistants->statusList['off'] = 'Unpublished'; +$lang->ai->assistants->statusList['1'] = 'Published'; +$lang->ai->assistants->statusList['on'] = 'Published'; \ No newline at end of file diff --git a/module/ai/lang/en.php b/module/ai/lang/en.php index 4215182668..0f35c72d6c 100644 --- a/module/ai/lang/en.php +++ b/module/ai/lang/en.php @@ -966,3 +966,26 @@ $lang->ai->engineeredPrompts->askForFunctionCalling = array((object)array('role' $lang->ai->aiResponseException = array(); $lang->ai->aiResponseException['notFunctionCalling'] = 'The response is not a function calling'; + +$lang->ai->assistants = new stdclass(); +$lang->ai->assistants->title = 'AI Assistant'; +$lang->ai->assistants->create = 'Add Assistant'; +$lang->ai->assistants->edit = 'Edit Assistant'; +$lang->ai->assistants->name = 'Assistant Name'; +$lang->ai->assistants->refModel = 'Referenced Language Model'; +$lang->ai->assistants->createdDate = 'Creation Time'; +$lang->ai->assistants->publishedDate = 'Publication Time'; +$lang->ai->assistants->desc = 'Description'; +$lang->ai->assistants->descPlaceholder = 'Please briefly describe the functions of this AI assistant and the experience it can bring to users.'; +$lang->ai->assistants->systemMessage = 'System Built-in Message'; +$lang->ai->assistants->systemMessagePlaceholder = 'You can give this AI dialogue a "persona", for example, "You are a weekly report assistant, you will generate a formatted weekly report based on the input content".'; +$lang->ai->assistants->greetings = 'Greetings'; +$lang->ai->assistants->greetingsPlaceholder = 'You can set the greeting message for this AI dialogue, for example, "Hello, I am your weekly report assistant, are you still troubled by writing weekly reports? Try sending me a week\'s work?"'; +$lang->ai->assistants->publish = 'Publish'; +$lang->ai->assistants->withdraw = 'Withdraw'; + +$lang->ai->assistants->statusList = array(); +$lang->ai->assistants->statusList['0'] = 'Unpublished'; +$lang->ai->assistants->statusList['off'] = 'Unpublished'; +$lang->ai->assistants->statusList['1'] = 'Published'; +$lang->ai->assistants->statusList['on'] = 'Published'; \ No newline at end of file diff --git a/module/ai/lang/fr.php b/module/ai/lang/fr.php index 4215182668..0f35c72d6c 100644 --- a/module/ai/lang/fr.php +++ b/module/ai/lang/fr.php @@ -966,3 +966,26 @@ $lang->ai->engineeredPrompts->askForFunctionCalling = array((object)array('role' $lang->ai->aiResponseException = array(); $lang->ai->aiResponseException['notFunctionCalling'] = 'The response is not a function calling'; + +$lang->ai->assistants = new stdclass(); +$lang->ai->assistants->title = 'AI Assistant'; +$lang->ai->assistants->create = 'Add Assistant'; +$lang->ai->assistants->edit = 'Edit Assistant'; +$lang->ai->assistants->name = 'Assistant Name'; +$lang->ai->assistants->refModel = 'Referenced Language Model'; +$lang->ai->assistants->createdDate = 'Creation Time'; +$lang->ai->assistants->publishedDate = 'Publication Time'; +$lang->ai->assistants->desc = 'Description'; +$lang->ai->assistants->descPlaceholder = 'Please briefly describe the functions of this AI assistant and the experience it can bring to users.'; +$lang->ai->assistants->systemMessage = 'System Built-in Message'; +$lang->ai->assistants->systemMessagePlaceholder = 'You can give this AI dialogue a "persona", for example, "You are a weekly report assistant, you will generate a formatted weekly report based on the input content".'; +$lang->ai->assistants->greetings = 'Greetings'; +$lang->ai->assistants->greetingsPlaceholder = 'You can set the greeting message for this AI dialogue, for example, "Hello, I am your weekly report assistant, are you still troubled by writing weekly reports? Try sending me a week\'s work?"'; +$lang->ai->assistants->publish = 'Publish'; +$lang->ai->assistants->withdraw = 'Withdraw'; + +$lang->ai->assistants->statusList = array(); +$lang->ai->assistants->statusList['0'] = 'Unpublished'; +$lang->ai->assistants->statusList['off'] = 'Unpublished'; +$lang->ai->assistants->statusList['1'] = 'Published'; +$lang->ai->assistants->statusList['on'] = 'Published'; \ No newline at end of file diff --git a/module/ai/lang/zh-cn.php b/module/ai/lang/zh-cn.php index 7e94076660..68fe783626 100644 --- a/module/ai/lang/zh-cn.php +++ b/module/ai/lang/zh-cn.php @@ -966,3 +966,26 @@ $lang->ai->engineeredPrompts->askForFunctionCalling = array((object)array('role' $lang->ai->aiResponseException = array(); $lang->ai->aiResponseException['notFunctionCalling'] = 'AI 提词执行返回值结构不正确,请重试(可能可以通过优化提词来解决)'; + +$lang->ai->assistants = new stdclass(); +$lang->ai->assistants->title = 'AI 助手'; +$lang->ai->assistants->create = '添加助手'; +$lang->ai->assistants->edit = '编辑助手'; +$lang->ai->assistants->name = '助手名称'; +$lang->ai->assistants->refModel = '引用语言模型'; +$lang->ai->assistants->createdDate = '创建时间'; +$lang->ai->assistants->publishedDate = '发布时间'; +$lang->ai->assistants->desc = '简介'; +$lang->ai->assistants->descPlaceholder = '请简述此AI助手的功能及可以给使用者带来的体验。'; +$lang->ai->assistants->systemMessage = '系统内置消息'; +$lang->ai->assistants->systemMessagePlaceholder = '您可以赋予此AI对话“人设”,例如,“你是一个周报小助手,会根据输入的内容生成格式化的周报”。'; +$lang->ai->assistants->greetings = '问候语'; +$lang->ai->assistants->greetingsPlaceholder = '您可以设置此AI对话的打招呼文案,例如,“哈喽,我是你的周报小助手,还在为写周报困扰吗,试试将一周的工作发送给我试试?”'; +$lang->ai->assistants->publish = '发布'; +$lang->ai->assistants->withdraw = '下架'; + +$lang->ai->assistants->statusList = array(); +$lang->ai->assistants->statusList['0'] = '未发布'; +$lang->ai->assistants->statusList['off'] = '未发布'; +$lang->ai->assistants->statusList['1'] = '已发布'; +$lang->ai->assistants->statusList['on'] = '已发布'; \ No newline at end of file diff --git a/module/ai/model.php b/module/ai/model.php index 40f832987d..73c11b3202 100644 --- a/module/ai/model.php +++ b/module/ai/model.php @@ -56,6 +56,14 @@ class aiModel extends model { if($object->enabled == '0') return false; } + elseif (strtolower($action) === 'assistantpublish') + { + if($object->enabled == '1') return false; + } + elseif (strtolower($action) === 'assistantwithdraw') + { + if($object->enabled == '0') return false; + } return true; } @@ -2713,6 +2721,14 @@ class aiModel extends model return true; } + public function getAssistants($pager = null, $orderBy = 'id_desc') + { + return $this->dao->select('*')->from(TABLE_AI_ASSISTANT) + ->orderBy($orderBy) + ->page($pager) + ->fetchAll(); + } + /** * create an assistant. * @param object $assistant diff --git a/module/ai/ui/assistants.html.php b/module/ai/ui/assistants.html.php new file mode 100644 index 0000000000..3d326b3e4a --- /dev/null +++ b/module/ai/ui/assistants.html.php @@ -0,0 +1,29 @@ + $lang->ai->assistants->create, + 'url' => createLink('ai', 'assistantcreate'), + 'data-app' => $app->tab, + 'icon' => 'plus', + 'class' => 'btn primary', + )) + ) +); + +$assistants = initTableData($assistants, $config->ai->dtable->assistants, $this->ai); + +dtable +( + set::cols($config->ai->dtable->assistants), + set::data($assistants), + set::orderBy($orderBy), + set::sortLink(inlink('assistants', "orderBy={name}_{sortType}&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}")), + set::footPager(usePager()), +); +