Merge branch 'py-bump-test' into dependabot/pip/main/xiaozhi-server/numpy-2.3.4

This commit is contained in:
hrz
2025-11-12 17:48:16 +08:00
committed by GitHub
51 changed files with 7709 additions and 241 deletions
+10 -1
View File
@@ -147,7 +147,15 @@ plugins:
- ".wav"
- ".p3"
refresh_time: 300 # 刷新音乐列表的时间间隔,单位为秒
search_from_ragflow:
# 知识库的描述信息,方便大语言模型知道什么时候调用
description: "当用户问xxx时,调用本方法,使用知识库中的信息回答问题"
# ragflow接口配置
base_url: "http://192.168.0.8"
# ragflow api访问令牌
api_key: "ragflow-xxx"
# ragflow知识库id
dataset_ids: ["123456789"]
# 声纹识别配置
voiceprint:
# 声纹接口地址
@@ -239,6 +247,7 @@ Intent:
functions:
- change_role
- get_weather
# - search_from_ragflow
# - get_news_from_chinanews
- get_news_from_newsnow
# play_music是服务器自带的音乐播放,hass_play_music是通过home assistant控制的独立外部程序音乐播放
+1 -1
View File
@@ -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.6"
SERVER_VERSION = "0.8.7"
_logger_initialized = False
+2 -2
View File
@@ -798,9 +798,9 @@ class ConnectionHandler:
if tools_call is not None and len(tools_call) > 0:
tool_call_flag = True
if tools_call[0].id is not None:
if tools_call[0].id is not None and tools_call[0].id != "":
function_id = tools_call[0].id
if tools_call[0].function.name is not None:
if tools_call[0].function.name is not None and tools_call[0].function.name != "":
function_name = tools_call[0].function.name
if tools_call[0].function.arguments is not None:
function_arguments += tools_call[0].function.arguments
@@ -71,6 +71,19 @@ class ServerPluginExecutor(ToolExecutor):
for func_name in all_required_functions:
func_item = all_function_registry.get(func_name)
if func_item:
# 从函数注册中获取描述
fun_description = (
self.config.get("plugins", {})
.get(func_name, {})
.get("description", "")
)
if fun_description is not None and len(fun_description) > 0:
if "function" in func_item.description and isinstance(
func_item.description["function"], dict
):
func_item.description["function"][
"description"
] = fun_description
tools[func_name] = ToolDefinition(
name=func_name,
description=func_item.description,
@@ -66,7 +66,9 @@ class PromptManager:
def _load_base_template(self):
"""加载基础提示词模板"""
try:
template_path = self.config.get("prompt_template", "agent-base-prompt.txt")
template_path = self.config.get("prompt_template", None)
if not template_path:
template_path = "agent-base-prompt.txt"
cache_key = f"prompt_template:{template_path}"
# 先从缓存获取
@@ -117,8 +119,12 @@ class PromptManager:
def _get_current_time_info(self) -> tuple:
"""获取当前时间信息"""
from .current_time import get_current_date, get_current_weekday, get_current_lunar_date
from .current_time import (
get_current_date,
get_current_weekday,
get_current_lunar_date,
)
today_date = get_current_date()
today_weekday = get_current_weekday()
lunar_date = get_current_lunar_date() + "\n"
@@ -192,9 +198,7 @@ class PromptManager:
try:
# 获取最新的时间信息(不缓存)
today_date, today_weekday, lunar_date = (
self._get_current_time_info()
)
today_date, today_weekday, lunar_date = self._get_current_time_info()
# 获取缓存的上下文信息
local_address = ""
@@ -226,7 +230,8 @@ class PromptManager:
emojiList=EMOJI_List,
device_id=device_id,
client_ip=client_ip,
*args, **kwargs
*args,
**kwargs,
)
device_cache_key = f"device_prompt:{device_id}"
self.cache_manager.set(
@@ -0,0 +1,98 @@
import requests
import sys
from config.logger import setup_logging
from plugins_func.register import register_function, ToolType, ActionResponse, Action
TAG = __name__
logger = setup_logging()
# 定义基础的函数描述模板
SEARCH_FROM_RAGFLOW_FUNCTION_DESC = {
"type": "function",
"function": {
"name": "search_from_ragflow",
"description": "从知识库中查询信息",
"parameters": {
"type": "object",
"properties": {"question": {"type": "string", "description": "查询的问题"}},
"required": ["question"],
},
},
}
@register_function(
"search_from_ragflow", SEARCH_FROM_RAGFLOW_FUNCTION_DESC, ToolType.SYSTEM_CTL
)
def search_from_ragflow(conn, question=None):
# 确保字符串参数正确处理编码
if question and isinstance(question, str):
# 确保问题参数是UTF-8编码的字符串
pass
else:
question = str(question) if question is not None else ""
base_url = conn.config["plugins"]["search_from_ragflow"].get("base_url", "")
api_key = conn.config["plugins"]["search_from_ragflow"].get("api_key", "")
dataset_ids = conn.config["plugins"]["search_from_ragflow"].get("dataset_ids", [])
url = base_url + "/api/v1/retrieval"
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
# 确保payload中的字符串都是UTF-8编码
payload = {"question": question, "dataset_ids": dataset_ids}
try:
# 使用ensure_ascii=False确保JSON序列化时正确处理中文
response = requests.post(
url,
json=payload,
headers=headers,
timeout=5,
verify=False,
)
# 显式设置响应的编码为utf-8
response.encoding = "utf-8"
response.raise_for_status()
# 先获取文本内容,然后手动处理JSON解码
response_text = response.text
import json
result = json.loads(response_text)
if result.get("code") != 0:
error_detail = response.get("error", {}).get("detail", "")
# 安全地记录错误信息
logger.bind(tag=TAG).error(
"从RAGflow获取信息失败,原因:%s", str(error_detail)
)
return ActionResponse(Action.RESPONSE, None, "RAG接口返回异常")
chunks = result.get("data", {}).get("chunks", [])
contents = []
for chunk in chunks:
content = chunk.get("content", "")
if content:
# 安全地处理内容字符串
if isinstance(content, str):
contents.append(content)
elif isinstance(content, bytes):
contents.append(content.decode("utf-8", errors="replace"))
else:
contents.append(str(content))
# 构建适合大模型的上下文内容(每段前加编号,段间两个换行)
context_text = "\n\n".join(
f"{i+1}. {c.strip()}" for i, c in enumerate(contents[:5])
)
if not context_text:
context_text = "根据知识库查询结果,没有相关信息。"
return ActionResponse(Action.REQLLM, context_text, None)
except Exception as e:
# 使用安全的方式记录异常,避免编码问题
logger.bind(tag=TAG).error("从RAGflow获取信息失败,原因:%s", str(e))
return ActionResponse(Action.RESPONSE, None, "RAG接口返回异常")
+16 -13
View File
@@ -1,27 +1,30 @@
pyyml==0.0.2
# 本项目推荐环境是python3.10
# 以下暂时不推荐升级的依赖
torch==2.2.2
silero_vad==6.0.0
websockets==14.2
opuslib_next==1.1.2
torchaudio==2.2.2
# 以下是可升级的依赖
pyyml==0.0.2
silero_vad==6.1.0
websockets==15.0.1
opuslib_next==1.1.5
numpy==2.3.4
pydub==0.25.1
funasr==1.2.3
torchaudio==2.2.2
openai==2.6.1
funasr==1.2.7
openai==2.7.1
google-generativeai==0.8.5
edge_tts==7.2.3
httpx==0.27.2
aiohttp==3.12.15
aiohttp_cors==0.7.0
ormsgpack==1.11.0
httpx==0.28.1
aiohttp==3.13.2
aiohttp_cors==0.8.1
ormsgpack==1.12.0
ruamel.yaml==0.18.16
loguru==0.7.3
requests==2.32.5
cozepy==0.19.0
cozepy==0.20.0
mem0ai==1.0.0
bs4==0.0.2
modelscope==1.23.2
sherpa_onnx==1.12.11
sherpa_onnx==1.12.15
mcp==1.20.0
cnlunar==0.2.0
PySocks==1.7.1