diff --git a/main/manager-api/src/main/java/xiaozhi/common/constant/Constant.java b/main/manager-api/src/main/java/xiaozhi/common/constant/Constant.java index dbc8cf50..55f8fcdb 100644 --- a/main/manager-api/src/main/java/xiaozhi/common/constant/Constant.java +++ b/main/manager-api/src/main/java/xiaozhi/common/constant/Constant.java @@ -247,7 +247,7 @@ public interface Constant { /** * 版本号 */ - public static final String VERSION = "0.8.2"; + public static final String VERSION = "0.8.3"; /** * 无效固件URL diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentTemplateController.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentTemplateController.java new file mode 100644 index 00000000..9c8366ed --- /dev/null +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentTemplateController.java @@ -0,0 +1,158 @@ +package xiaozhi.modules.agent.controller; + +import java.util.List; +import java.util.Map; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import xiaozhi.common.constant.Constant; +import xiaozhi.common.page.PageData; +import xiaozhi.common.utils.ConvertUtils; +import xiaozhi.common.utils.Result; +import xiaozhi.common.utils.ResultUtils; +import xiaozhi.modules.agent.entity.AgentTemplateEntity; +import xiaozhi.modules.agent.service.AgentTemplateService; +import xiaozhi.modules.agent.vo.AgentTemplateVO; + +@Tag(name = "智能体模板管理") +@AllArgsConstructor +@RestController +@RequestMapping("/agent/template") +public class AgentTemplateController { + + private final AgentTemplateService agentTemplateService; + + @GetMapping("/page") + @Operation(summary = "获取模板分页列表") + @RequiresPermissions("sys:role:superAdmin") + @Parameters({ + @Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true), + @Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true), + @Parameter(name = "agentName", description = "模板名称,模糊查询") + }) + public Result> getAgentTemplatesPage( + @Parameter(hidden = true) @RequestParam Map params) { + + // 创建分页对象 + int page = Integer.parseInt(params.getOrDefault(Constant.PAGE, "1").toString()); + int limit = Integer.parseInt(params.getOrDefault(Constant.LIMIT, "10").toString()); + Page pageInfo = new Page<>(page, limit); + + // 创建查询条件 + QueryWrapper wrapper = new QueryWrapper<>(); + String agentName = (String) params.get("agentName"); + if (agentName != null && !agentName.isEmpty()) { + wrapper.like("agent_name", agentName); + } + wrapper.orderByAsc("sort"); + + // 执行分页查询 + IPage pageResult = agentTemplateService.page(pageInfo, wrapper); + + // 使用ConvertUtils转换为VO列表 + List voList = ConvertUtils.sourceToTarget(pageResult.getRecords(), AgentTemplateVO.class); + + // 修复:使用构造函数创建PageData对象,而不是无参构造+setter + PageData pageData = new PageData<>(voList, pageResult.getTotal()); + + return new Result>().ok(pageData); + } + + @GetMapping("/{id}") + @Operation(summary = "获取模板详情") + @RequiresPermissions("sys:role:superAdmin") + public Result getAgentTemplateById(@PathVariable("id") String id) { + AgentTemplateEntity template = agentTemplateService.getById(id); + if (template == null) { + return ResultUtils.error("模板不存在"); + } + + // 使用ConvertUtils转换为VO + AgentTemplateVO vo = ConvertUtils.sourceToTarget(template, AgentTemplateVO.class); + + return ResultUtils.success(vo); + } + + @PostMapping + @Operation(summary = "创建模板") + @RequiresPermissions("sys:role:superAdmin") + public Result createAgentTemplate(@Valid @RequestBody AgentTemplateEntity template) { + // 设置排序值为下一个可用的序号 + template.setSort(agentTemplateService.getNextAvailableSort()); + + boolean saved = agentTemplateService.save(template); + if (saved) { + return ResultUtils.success(template); + } else { + return ResultUtils.error("创建模板失败"); + } + } + + @PutMapping + @Operation(summary = "更新模板") + @RequiresPermissions("sys:role:superAdmin") + public Result updateAgentTemplate(@Valid @RequestBody AgentTemplateEntity template) { + boolean updated = agentTemplateService.updateById(template); + if (updated) { + return ResultUtils.success(template); + } else { + return ResultUtils.error("更新模板失败"); + } + } + + @DeleteMapping("/{id}") + @Operation(summary = "删除模板") + @RequiresPermissions("sys:role:superAdmin") + public Result deleteAgentTemplate(@PathVariable("id") String id) { + // 先查询要删除的模板信息,获取其排序值 + AgentTemplateEntity template = agentTemplateService.getById(id); + if (template == null) { + return ResultUtils.error("模板不存在"); + } + + Integer deletedSort = template.getSort(); + + // 执行删除操作 + boolean deleted = agentTemplateService.removeById(id); + if (deleted) { + // 删除成功后,重新排序剩余模板 + agentTemplateService.reorderTemplatesAfterDelete(deletedSort); + return ResultUtils.success("删除模板成功"); + } else { + return ResultUtils.error("删除模板失败"); + } + } + + + // 添加新的批量删除方法,使用不同的URL + @PostMapping("/batch-remove") + @Operation(summary = "批量删除模板") + @RequiresPermissions("sys:role:superAdmin") + public Result batchRemoveAgentTemplates(@RequestBody List ids) { + boolean deleted = agentTemplateService.removeByIds(ids); + if (deleted) { + return ResultUtils.success("批量删除成功"); + } else { + return ResultUtils.error("批量删除模板失败"); + } + } +} \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTemplateService.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTemplateService.java index 4e279c40..b10a67f9 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTemplateService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/AgentTemplateService.java @@ -25,4 +25,18 @@ public interface AgentTemplateService extends IService { * @param modelId 模型ID */ void updateDefaultTemplateModelId(String modelType, String modelId); + + /** + * 删除模板后重新排序剩余模板 + * + * @param deletedSort 被删除模板的排序值 + */ + void reorderTemplatesAfterDelete(Integer deletedSort); + + /** + * 获取下一个可用的排序序号(寻找最小的未使用序号) + * + * @return 下一个可用的排序序号 + */ + Integer getNextAvailableSort(); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTemplateServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTemplateServiceImpl.java index 581adbdd..8c562edb 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTemplateServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentTemplateServiceImpl.java @@ -10,6 +10,11 @@ import xiaozhi.modules.agent.dao.AgentTemplateDao; import xiaozhi.modules.agent.entity.AgentTemplateEntity; import xiaozhi.modules.agent.service.AgentTemplateService; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + /** * @author chenerlei * @description 针对表【ai_agent_template(智能体配置模板表)】的数据库操作Service实现 @@ -69,4 +74,48 @@ public class AgentTemplateServiceImpl extends ServiceImpl updateWrapper = new UpdateWrapper<>(); + updateWrapper.gt("sort", deletedSort) + .setSql("sort = sort - 1"); + + // 执行批量更新,将这些记录的排序值减1 + this.update(updateWrapper); + } + + @Override + public Integer getNextAvailableSort() { + // 查询所有已存在的排序值并按升序排序 + List sortValues = baseMapper.selectList(new QueryWrapper()) + .stream() + .map(AgentTemplateEntity::getSort) + .filter(Objects::nonNull) + .sorted() + .collect(Collectors.toList()); + + // 如果没有排序值,返回1 + if (sortValues.isEmpty()) { + return 1; + } + + // 寻找最小的未使用序号 + int expectedSort = 1; + for (Integer sort : sortValues) { + if (sort > expectedSort) { + // 找到空缺的序号 + return expectedSort; + } + expectedSort = sort + 1; + } + + // 如果没有空缺,返回最大序号+1 + return expectedSort; + } } diff --git a/main/manager-mobile/src/pages/settings/index.vue b/main/manager-mobile/src/pages/settings/index.vue index 798e693d..220d2338 100644 --- a/main/manager-mobile/src/pages/settings/index.vue +++ b/main/manager-mobile/src/pages/settings/index.vue @@ -222,7 +222,7 @@ function showAbout() { title: `关于${import.meta.env.VITE_APP_TITLE}`, content: `${import.meta.env.VITE_APP_TITLE}\n\n基于 Vue.js 3 + uni-app 构建的跨平台移动端管理应用,为小智ESP32智能硬件提供设备管理、智能体配置等功能。\n\n© 2025 xiaozhi-esp32-server`, title: `关于小智智控台`, - content: `小智智控台\n\n基于 Vue.js 3 + uni-app 构建的跨平台移动端管理应用,为小智ESP32智能硬件提供设备管理、智能体配置等功能。\n\n© 2025 xiaozhi-esp32-server 0.8.2`, + content: `小智智控台\n\n基于 Vue.js 3 + uni-app 构建的跨平台移动端管理应用,为小智ESP32智能硬件提供设备管理、智能体配置等功能。\n\n© 2025 xiaozhi-esp32-server 0.8.3`, showCancel: false, confirmText: '确定', }) diff --git a/main/manager-web/src/apis/module/agent.js b/main/manager-web/src/apis/module/agent.js index 66126237..bcf68a29 100644 --- a/main/manager-web/src/apis/module/agent.js +++ b/main/manager-web/src/apis/module/agent.js @@ -1,5 +1,5 @@ -import { getServiceUrl } from '../api'; import RequestService from '../httpRequest'; +import { getServiceUrl } from '../api'; export default { @@ -97,6 +97,24 @@ export default { }); }).send(); }, + + // 新增:获取智能体模板分页列表 + getAgentTemplatesPage(params, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/agent/template/page`) + .method('GET') + .data(params) + .success((res) => { + RequestService.clearRequestTime(); + callback(res); + }) + .networkFail((err) => { + console.error('获取模板分页列表失败:', err); + RequestService.reAjaxFun(() => { + this.getAgentTemplatesPage(params, callback); + }); + }).send(); + }, // 获取智能体会话列表 getAgentSessions(agentId, params, callback) { RequestService.sendRequest() @@ -265,4 +283,87 @@ export default { }); }).send(); }, + // 在文件末尾(在最后一个方法后,大括号前)添加以下方法: + // 新增智能体模板 + addAgentTemplate(templateData, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/agent/template`) + .method('POST') + .data(templateData) + .success((res) => { + RequestService.clearRequestTime(); + callback(res); + }) + .networkFail(() => { + RequestService.reAjaxFun(() => { + this.addAgentTemplate(templateData, callback); + }); + }).send(); + }, + + // 更新智能体模板 + updateAgentTemplate(templateData, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/agent/template`) + .method('PUT') + .data(templateData) + .success((res) => { + RequestService.clearRequestTime(); + callback(res); + }) + .networkFail(() => { + RequestService.reAjaxFun(() => { + this.updateAgentTemplate(templateData, callback); + }); + }).send(); + }, + + // 删除智能体模板 + deleteAgentTemplate(id, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/agent/template/${id}`) + .method('DELETE') + .success((res) => { + RequestService.clearRequestTime(); + callback(res); + }) + .networkFail(() => { + RequestService.reAjaxFun(() => { + this.deleteAgentTemplate(id, callback); + }); + }).send(); + }, + + // 批量删除智能体模板 + batchDeleteAgentTemplate(ids, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/agent/template/batch-remove`) // 修改为新的URL + .method('POST') + .data(Array.isArray(ids) ? ids : [ids]) // 确保是数组格式 + .success((res) => { + RequestService.clearRequestTime(); + callback(res); + }) + .networkFail(() => { + RequestService.reAjaxFun(() => { + this.batchDeleteAgentTemplate(ids, callback); + }); + }).send(); + }, + // 在getAgentTemplate方法后添加获取单个模板的方法 + getAgentTemplateById(templateId, callback) { + RequestService.sendRequest() + .url(`${getServiceUrl()}/agent/template/${templateId}`) + .method('GET') + .success((res) => { + RequestService.clearRequestTime(); + callback(res); + }) + .networkFail((err) => { + console.error('获取单个模板失败:', err); + RequestService.reAjaxFun(() => { + this.getAgentTemplateById(templateId, callback); + }); + }).send(); + }, } diff --git a/main/manager-web/src/components/HeaderBar.vue b/main/manager-web/src/components/HeaderBar.vue index 2042d335..e6048b00 100644 --- a/main/manager-web/src/components/HeaderBar.vue +++ b/main/manager-web/src/components/HeaderBar.vue @@ -35,11 +35,11 @@ {{ $t('header.otaManagement') }} + :style="{ filter: $route.path === '/dict-management' || $route.path === '/params-management' || $route.path === '/provider-management' || $route.path === '/server-side-management' || $route.path === '/agent-template-management' ? 'brightness(0) invert(1)' : 'None' }" /> {{ $t('header.paramDictionary') }} @@ -53,6 +53,9 @@ {{ $t('header.providerManagement') }} + + {{ $t('header.agentTemplate') }} + {{ $t('header.serverSideManagement') }} @@ -193,6 +196,10 @@ export default { goServerSideManagement() { this.$router.push('/server-side-management') }, + // 添加默认角色模板管理导航方法 + goAgentTemplateManagement() { + this.$router.push('/agent-template-management') + }, // 获取用户信息 fetchUserInfo() { userApi.getUserInfo(({ data }) => { diff --git a/main/manager-web/src/i18n/en.js b/main/manager-web/src/i18n/en.js index 14d735e0..14f4d5a6 100644 --- a/main/manager-web/src/i18n/en.js +++ b/main/manager-web/src/i18n/en.js @@ -7,6 +7,7 @@ export default { 'login.loginSuccess': 'Login successful!', // HeaderBar组件文本 + // 在header相关翻译中添加 'header.smartManagement': 'Agents', 'header.modelConfig': 'Models', 'header.userManagement': 'Users', @@ -14,6 +15,7 @@ export default { 'header.paramDictionary': 'More', 'header.paramManagement': 'Params Management', 'header.dictManagement': 'Dict Management', + 'header.agentTemplate': 'Default Role Templates', // 添加这一行 // McpToolCallDialog component text 'mcpToolCall.title': 'Tool Call', @@ -619,6 +621,7 @@ export default { 'common.deleteFailure': 'Delete Failed, Please Try Again', 'common.deleteCancelled': 'Delete Cancelled', 'common.warning': 'Warning', + 'common.tip': 'Tip', 'common.confirm': 'Confirm', 'common.cancel': 'Cancel', 'common.sensitive': 'Sensitive', @@ -998,4 +1001,49 @@ export default { 'providerDialog.selectFieldsToDelete': 'Please select fields to delete first', 'providerDialog.confirmBatchDeleteFields': 'Are you sure to delete {count} selected fields?', 'providerDialog.batchDeleteFieldsSuccess': 'Successfully deleted {count} fields', -}; \ No newline at end of file + + // agentTemplateManagement + 'agentTemplateManagement.title': 'Default Role Management', + 'agentTemplateManagement.templateName': 'Template Name', + 'agentTemplateManagement.action': 'Action', + 'agentTemplateManagement.createTemplate': 'Create Template', + 'templateQuickConfig.newTemplate': 'New Template', + 'agentTemplateManagement.editTemplate': 'Edit Template', + 'agentTemplateManagement.deleteTemplate': 'Delete Template', + 'agentTemplateManagement.deleteSuccess': 'Template deleted successfully', + 'agentTemplateManagement.batchDelete': 'Batch Delete', + 'agentTemplateManagement.batchDeleteSuccess': 'Batch deletion successful', + 'agentTemplateManagement.selectTemplate': 'Please select a template', + 'agentTemplateManagement.select': 'Select', + 'agentTemplateManagement.searchPlaceholder': 'Please enter template name to search', + 'agentTemplateManagement.search': 'Search', + 'agentTemplateManagement.serialNumber': 'Serial Number', + 'agentTemplateManagement.selectAll': 'Select All', + 'agentTemplateManagement.deselectAll': 'Deselect All', + 'agentTemplateManagement.loading': 'Loading...', + 'agentTemplateManagement.confirmSingleDelete': 'Are you sure you want to delete this template?', + 'agentTemplateManagement.confirmBatchDelete': 'Are you sure you want to delete the selected {count} templates?', + 'agentTemplateManagement.deleteFailed': 'Template deletion failed', + 'agentTemplateManagement.batchDeleteFailed': 'Template batch deletion failed', + 'agentTemplateManagement.deleteBackendError': 'Deletion failed, please check if the backend service is normal', + 'agentTemplateManagement.deleteCancelled': 'Deletion cancelled', + + // templateQuickConfig + 'templateQuickConfig.title': 'Module Quick Configuration', + 'templateQuickConfig.agentSettings.agentName': 'Nickname', + 'templateQuickConfig.agentSettings.agentNamePlaceholder': 'Please enter nickname', + 'templateQuickConfig.agentSettings.systemPrompt': 'Introduction', + 'templateQuickConfig.agentSettings.systemPromptPlaceholder': 'Please enter ntroduction', + 'templateQuickConfig.saveConfig': 'Save Configuration', + 'templateQuickConfig.resetConfig': 'Reset Configuration', + 'templateQuickConfig.configSaved': 'Configuration saved successfully', + 'templateQuickConfig.configReset': 'Configuration has been reset', + 'templateQuickConfig.confirmReset': 'Are you sure you want to reset the configuration?', + 'templateQuickConfig.saveFailed': 'Configuration save failed', + 'templateQuickConfig.confirm': 'Confirm', + 'templateQuickConfig.cancel': 'Cancel', + 'templateQuickConfig.templateNotFound': 'Template not found', + 'warning': 'Warning', + 'info': 'Info', + 'common.networkError': 'Network request failed' +} \ No newline at end of file diff --git a/main/manager-web/src/i18n/zh_CN.js b/main/manager-web/src/i18n/zh_CN.js index e80cefe1..27b0b9e0 100644 --- a/main/manager-web/src/i18n/zh_CN.js +++ b/main/manager-web/src/i18n/zh_CN.js @@ -14,6 +14,7 @@ export default { 'header.paramDictionary': '参数字典', 'header.paramManagement': '参数管理', 'header.dictManagement': '字典管理', + 'header.agentTemplate': '默认角色模板', // McpToolCallDialog组件文本 'mcpToolCall.title': '工具调用', @@ -558,7 +559,7 @@ export default { 'dictManagement.dictValue': '字典值', 'dictManagement.sort': '排序', 'dictManagement.delete': '删除', - 'dictManagement.selectAll': '全选', + 'dictManagement.selectAll': '默认角色管理', 'dictManagement.deselectAll': '取消全选', 'dictManagement.addDictType': '新增字典类型', 'dictManagement.batchDeleteDictType': '批量删除字典类型', @@ -620,6 +621,7 @@ export default { 'common.deleteFailure': '删除失败,请重试', 'common.deleteCancelled': '已取消删除', 'common.warning': '警告', + 'common.tip': '提示', 'common.confirm': '确定', 'common.cancel': '取消', 'common.sensitive': '敏感', @@ -998,4 +1000,49 @@ export default { 'providerDialog.selectFieldsToDelete': '请先选择要删除的字段', 'providerDialog.confirmBatchDeleteFields': '确定要删除选中的{count}个字段吗?', 'providerDialog.batchDeleteFieldsSuccess': '成功删除{count}个字段', -}; \ No newline at end of file + + // 默认角色模版页面文本 + 'agentTemplateManagement.title': '默认角色管理', + 'agentTemplateManagement.templateName': '模板名称', + 'agentTemplateManagement.action': '操作', + 'templateQuickConfig.saveSuccess': '配置保存成功', + 'templateQuickConfig.saveFailed': '配置保存失败', + 'agentTemplateManagement.createTemplate': '创建模板', + 'agentTemplateManagement.editTemplate': '编辑模板', + 'agentTemplateManagement.deleteTemplate': '删除模板', + 'agentTemplateManagement.deleteSuccess': '模板删除成功', + 'agentTemplateManagement.batchDelete': '批量删除', + 'agentTemplateManagement.batchDeleteSuccess': '批量删除成功', + 'agentTemplateManagement.selectTemplate': '请选择模板', + 'agentTemplateManagement.select': '选择', + 'agentTemplateManagement.searchPlaceholder': '请输入模板名称搜索', + 'agentTemplateManagement.search': '搜索', + 'agentTemplateManagement.serialNumber': '序号', + 'agentTemplateManagement.selectAll': '全选', + 'agentTemplateManagement.deselectAll': '取消全选', + 'agentTemplateManagement.loading': '拼命加载中', + 'agentTemplateManagement.confirmSingleDelete': '确定要删除这个模板吗?', + 'agentTemplateManagement.confirmBatchDelete': '确定要删除选中的 {count} 个模板吗?', + 'agentTemplateManagement.deleteFailed': '模板删除失败', + 'agentTemplateManagement.batchDeleteFailed': '模板批量删除失败', + 'agentTemplateManagement.deleteBackendError': '删除失败,请检查后端服务是否正常', + + // 模板快速配置页面文本 + 'templateQuickConfig.title': '模块快速配置', + 'templateQuickConfig.agentSettings.agentName': '助手昵称', + 'templateQuickConfig.agentSettings.agentNamePlaceholder': '请输入助手昵称', + 'templateQuickConfig.agentSettings.systemPrompt': '角色介绍', + 'templateQuickConfig.agentSettings.systemPromptPlaceholder': '请输入角色介绍', + 'templateQuickConfig.saveConfig': '保存配置', + 'templateQuickConfig.resetConfig': '重置配置', + 'templateQuickConfig.confirmReset': '确定要重置配置吗?', + 'templateQuickConfig.confirm': '确定', + 'templateQuickConfig.cancel': '取消', + 'templateQuickConfig.templateNotFound': '未找到指定模板', + 'templateQuickConfig.newTemplate': '新模板', + 'templateQuickConfig.saveSuccess': '保存成功', + 'templateQuickConfig.resetSuccess': '重置成功', + 'warning': '警告', + 'info': '提示', + 'common.networkError': '网络请求失败' +} \ No newline at end of file diff --git a/main/manager-web/src/i18n/zh_TW.js b/main/manager-web/src/i18n/zh_TW.js index ebefb838..a9f224f1 100644 --- a/main/manager-web/src/i18n/zh_TW.js +++ b/main/manager-web/src/i18n/zh_TW.js @@ -7,6 +7,7 @@ export default { 'login.loginSuccess': '登錄成功!', // HeaderBar组件文本 + // 在header相关翻译中添加 'header.smartManagement': '智能體管理', 'header.modelConfig': '模型配置', 'header.userManagement': '用戶管理', @@ -14,6 +15,7 @@ export default { 'header.paramDictionary': '參數字典', 'header.paramManagement': '參數管理', 'header.dictManagement': '字典管理', + 'header.agentTemplate': '預設角色模板', // 添加这一行 // McpToolCallDialog组件文本 'mcpToolCall.title': '工具調用', @@ -655,6 +657,7 @@ export default { 'common.deleteFailure': '刪除失敗,請重試', 'common.deleteCancelled': '已取消刪除', 'common.warning': '警告', + 'common.tip': '提示', 'common.confirm': '確定', 'common.cancel': '取消', 'common.sensitive': '敏感', @@ -998,4 +1001,49 @@ export default { 'providerDialog.selectFieldsToDelete': '請先選擇要刪除的字段', 'providerDialog.confirmBatchDeleteFields': '確定要刪除選中的{count}個字段嗎?', 'providerDialog.batchDeleteFieldsSuccess': '成功刪除{count}個字段', -}; \ No newline at end of file + + // 預設角色管理頁面文本 + 'agentTemplateManagement.title': '預設角色管理', + 'agentTemplateManagement.templateName': '模板名稱', + 'agentTemplateManagement.action': '操作', + 'agentTemplateManagement.createTemplate': '建立模板', + 'agentTemplateManagement.editTemplate': '編輯模板', + 'agentTemplateManagement.deleteTemplate': '刪除模板', + 'agentTemplateManagement.deleteSuccess': '模板刪除成功', + 'agentTemplateManagement.batchDelete': '批次刪除', + 'agentTemplateManagement.batchDeleteSuccess': '批次刪除成功', + 'agentTemplateManagement.selectTemplate': '請選擇模板', + 'agentTemplateManagement.select': '選擇', + 'agentTemplateManagement.searchPlaceholder': '請輸入模板名稱搜尋', + 'agentTemplateManagement.search': '搜尋', + 'agentTemplateManagement.serialNumber': '序號', + 'agentTemplateManagement.selectAll': '全選', + 'agentTemplateManagement.deselectAll': '取消全選', + 'agentTemplateManagement.loading': '拼命加載中', + 'agentTemplateManagement.confirmSingleDelete': '確定要刪除這個模板嗎?', + 'agentTemplateManagement.confirmBatchDelete': '確定要刪除選中的 {count} 個模板嗎?', + 'agentTemplateManagement.deleteFailed': '模板刪除失敗', + 'agentTemplateManagement.batchDeleteFailed': '批次刪除失敗', + 'agentTemplateManagement.deleteBackendError': '刪除失敗,請檢查後端服務是否正常', + 'agentTemplateManagement.deleteCancelled': '已取消刪除', + + // 模板快速配置 + 'templateQuickConfig.title': '模組快速設定', + 'templateQuickConfig.agentSettings.agentName': '助手暱稱', + 'templateQuickConfig.agentSettings.agentNamePlaceholder': '請輸入助手暱稱', + 'templateQuickConfig.agentSettings.systemPrompt': '角色介紹', + 'templateQuickConfig.agentSettings.systemPromptPlaceholder': '請輸入角色介紹', + 'templateQuickConfig.saveConfig': '保存配置', + 'templateQuickConfig.resetConfig': '重置配置', + 'templateQuickConfig.configSaved': '配置保存成功', + 'templateQuickConfig.configReset': '配置已重置', + 'templateQuickConfig.confirmReset': '確定要重置配置嗎?', + 'templateQuickConfig.confirm': '確定', + 'templateQuickConfig.cancel': '取消', + 'templateQuickConfig.templateNotFound': '未找到指定模板', + 'templateQuickConfig.newTemplate': '新模板', + 'error': '錯誤', + 'warning': '警告', + 'info': '提示', + 'common.networkError': '網路請求失敗' +} \ No newline at end of file diff --git a/main/manager-web/src/router/index.js b/main/manager-web/src/router/index.js index 867e6c2d..58cd099f 100644 --- a/main/manager-web/src/router/index.js +++ b/main/manager-web/src/router/index.js @@ -124,6 +124,29 @@ const routes = [ return import('../views/ProviderManagement.vue') } }, + // 添加默认角色管理路由 + { + path: '/agent-template-management', + name: 'AgentTemplateManagement', + component: function () { + return import('../views/AgentTemplateManagement.vue') + } + }, + // 添加模板快速配置路由 + { + path: '/template-quick-config', + name: 'TemplateQuickConfig', + component: function () { + return import('../views/TemplateQuickConfig.vue') + } + }, + { + path: '/provider-management', + name: 'ProviderManagement', + component: function () { + return import('../views/ProviderManagement.vue') + } + }, ] const router = new VueRouter({ base: process.env.VUE_APP_PUBLIC_PATH || '/', diff --git a/main/manager-web/src/views/AgentTemplateManagement.vue b/main/manager-web/src/views/AgentTemplateManagement.vue new file mode 100644 index 00000000..d09738d8 --- /dev/null +++ b/main/manager-web/src/views/AgentTemplateManagement.vue @@ -0,0 +1,633 @@ + + + + + diff --git a/main/manager-web/src/views/TemplateQuickConfig.vue b/main/manager-web/src/views/TemplateQuickConfig.vue new file mode 100644 index 00000000..024e120f --- /dev/null +++ b/main/manager-web/src/views/TemplateQuickConfig.vue @@ -0,0 +1,478 @@ + + + + + \ No newline at end of file diff --git a/main/xiaozhi-server/config/logger.py b/main/xiaozhi-server/config/logger.py index 2431beaa..919d05d0 100644 --- a/main/xiaozhi-server/config/logger.py +++ b/main/xiaozhi-server/config/logger.py @@ -5,7 +5,7 @@ from config.config_loader import load_config from config.settings import check_config_file from datetime import datetime -SERVER_VERSION = "0.8.2" +SERVER_VERSION = "0.8.3" _logger_initialized = False