mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-22 15:13:55 +08:00
* function call功能完善,增加天气查询,支持插件式扩展 * 增加角色切换功能,通过切换system提示词,修改角色认知 * 增加插件管理系统,可以通过语音加载和卸载插件 * docs: 添加命令操作 (#329) * docs: 添加命令操作 * feat: 添加 docker-setup.sh 脚本以简化服务端部署 - 新增 docker-setup.sh 脚本,自动创建目录结构、下载语音识别模型和配置文件,并检查文件完整性。 - 更新 Deployment.md 文档,提供一键执行脚本的说明和使用示例。 * docs: 更新 Deployment.md,添加环境访问 GitHub 的注意事项 * refactor: 更新 docker-setup.sh 脚本以支持多操作系统下载命令 - 修改脚本以检测操作系统类型,并根据不同系统选择合适的下载命令(curl 或 wget)。 - 优化错误处理,确保在下载失败时提供清晰的提示信息。 - 更新 Deployment.md 文档,调整懒人脚本的使用说明,增加手动部署的步骤。 * Update docker-setup.sh * Update docker-setup.sh --------- Co-authored-by: 欣南科技 <huangrongzhuang@xin-nan.com> * update:优化插件加载的配置提示 * update:增加自动安装脚本的操作说明 * update:优化插件配置,去掉旧版本的时间设定 --------- Co-authored-by: 玄凤科技 <eric230308@gmail.com> Co-authored-by: TinsFox <fox@tinsfox.com> Co-authored-by: hrz <1710360675@qq.com>
85 lines
2.8 KiB
Python
85 lines
2.8 KiB
Python
from config.logger import setup_logging
|
|
from enum import Enum
|
|
|
|
TAG = __name__
|
|
|
|
logger = setup_logging()
|
|
|
|
|
|
class ToolType(Enum):
|
|
NONE = (1, "调用完工具后,不做其他操作")
|
|
WAIT = (2, "调用工具,等待函数返回")
|
|
CHANGE_SYS_PROMPT = (3, "修改系统提示词,切换角色性格或职责")
|
|
SYSTEM_CTL = (4, "系统控制,影响正常的对话流程,如退出、播放音乐等,需要传递conn参数")
|
|
|
|
def __init__(self, code, message):
|
|
self.code = code
|
|
self.message = message
|
|
|
|
|
|
class Action(Enum):
|
|
NOTFOUND = (0, "没有找到函数")
|
|
NONE = (1, "啥也不干")
|
|
RESPONSE = (2, "直接回复")
|
|
REQLLM = (3, "调用函数后再请求llm生成回复")
|
|
|
|
def __init__(self, code, message):
|
|
self.code = code
|
|
self.message = message
|
|
|
|
class ActionResponse:
|
|
def __init__(self, action: Action, result, response):
|
|
self.action = action # 动作类型
|
|
self.result = result # 动作产生的结果
|
|
self.response = response # 直接回复的内容
|
|
|
|
class FunctionItem:
|
|
def __init__(self, name, description, func, type):
|
|
self.name = name
|
|
self.description = description
|
|
self.func = func
|
|
self.type = type
|
|
|
|
# 初始化函数注册字典
|
|
all_function_registry = {}
|
|
|
|
def register_function(name, desc, type=None):
|
|
"""注册函数到函数注册字典的装饰器"""
|
|
def decorator(func):
|
|
all_function_registry[name] = FunctionItem(name, desc, func, type)
|
|
logger.bind(tag=TAG).debug(f"函数 '{name}' 已加载,可以注册使用")
|
|
return func
|
|
return decorator
|
|
|
|
class FunctionRegistry:
|
|
def __init__(self):
|
|
self.function_registry = {}
|
|
self.logger = setup_logging()
|
|
|
|
def register_function(self, name):
|
|
# 查找all_function_registry中是否有对应的函数
|
|
func = all_function_registry.get(name)
|
|
if not func:
|
|
self.logger.bind(tag=TAG).error(f"函数 '{name}' 未找到")
|
|
return None
|
|
self.function_registry[name] = func
|
|
self.logger.bind(tag=TAG).info(f"函数 '{name}' 注册成功")
|
|
return func
|
|
|
|
def unregister_function(self, name):
|
|
# 注销函数,检测是否存在
|
|
if name not in self.function_registry:
|
|
self.logger.bind(tag=TAG).error(f"函数 '{name}' 未找到")
|
|
return False
|
|
self.function_registry.pop(name, None)
|
|
self.logger.bind(tag=TAG).info(f"函数 '{name}' 注销成功")
|
|
return True
|
|
|
|
def get_function(self, name):
|
|
return self.function_registry.get(name)
|
|
|
|
def get_all_functions(self):
|
|
return self.function_registry
|
|
|
|
def get_all_function_desc(self):
|
|
return [func.description for _, func in self.function_registry.items()] |