update:简化intent_llm代码

This commit is contained in:
hrz
2025-03-28 14:13:54 +08:00
parent 62845cfcf1
commit 05356b6652
7 changed files with 90 additions and 312 deletions
+16 -213
View File
@@ -4,8 +4,7 @@ import uuid
from core.handle.sendAudioHandle import send_stt_message
from core.handle.helloHandle import checkWakeupWords
from core.utils.util import remove_punctuation_and_length
import re
import asyncio
from core.utils.dialogue import Message
from loguru import logger
TAG = __name__
@@ -65,242 +64,46 @@ async def process_intent_result(conn, intent_result, original_text):
try:
# 尝试将结果解析为JSON
intent_data = json.loads(intent_result)
# 检查是否有function_call
if "function_call" in intent_data:
# 直接从意图识别获取了function_call
logger.bind(tag=TAG).info(f"检测到function_call格式的意图结果: {intent_data['function_call']['name']}")
function_name = intent_data["function_call"]["name"]
function_args = intent_data["function_call"]["arguments"]
if function_name == "continue_chat":
return False
function_args = None
if "arguments" in intent_data["function_call"]:
function_args = intent_data["function_call"]["arguments"]
# 确保参数是字符串格式的JSON
if isinstance(function_args, dict):
function_args = json.dumps(function_args)
function_call_data = {
"name": function_name,
"id": str(uuid.uuid4().hex),
"arguments": function_args
}
# 处理特定类型的函数调用
if function_name == "get_weather":
logger.bind(tag=TAG).info(f"识别到天气查询意图")
# 先发送消息确认
await send_stt_message(conn, original_text)
# 使用executor执行函数调用和结果处理
def process_weather_query():
# 直接调用函数
result = conn.func_handler.handle_llm_function_call(conn, function_call_data)
if result:
# 获取当前最新的文本索引
text_index = conn.tts_last_text_index + 1 if hasattr(conn, 'tts_last_text_index') else 0
# 处理函数调用结果
conn._handle_function_result(result, function_call_data, text_index)
# 将函数执行放在线程池中
conn.executor.submit(process_weather_query)
return True
elif function_name == "play_music":
logger.bind(tag=TAG).info(f"识别到音乐播放意图")
# 先发送消息确认
await send_stt_message(conn, original_text)
# 使用executor执行函数调用和结果处理
def process_music_query():
# 直接调用函数
result = conn.func_handler.handle_llm_function_call(conn, function_call_data)
if result:
# 获取当前最新的文本索引
text_index = conn.tts_last_text_index + 1 if hasattr(conn, 'tts_last_text_index') else 0
# 处理函数调用结果
conn._handle_function_result(result, function_call_data, text_index)
# 将函数执行放在线程池中
conn.executor.submit(process_music_query)
return True
elif function_name == "get_news":
logger.bind(tag=TAG).info(f"识别到新闻查询意图")
# 先发送消息确认
await send_stt_message(conn, original_text)
# 使用executor执行函数调用和结果处理
def process_news_query():
# 直接调用函数
result = conn.func_handler.handle_llm_function_call(conn, function_call_data)
if result:
# 获取当前最新的文本索引
text_index = conn.tts_last_text_index + 1 if hasattr(conn, 'tts_last_text_index') else 0
# 处理函数调用结果
conn._handle_function_result(result, function_call_data, text_index)
# 将函数执行放在线程池中
conn.executor.submit(process_news_query)
return True
else:
# 其他类型的函数调用,尝试直接执行
# 先发送消息确认
await send_stt_message(conn, original_text)
# 使用executor执行函数调用和结果处理
def process_function_call():
result = conn.func_handler.handle_llm_function_call(conn, function_call_data)
if result:
# 获取当前最新的文本索引
text_index = conn.tts_last_text_index + 1 if hasattr(conn, 'tts_last_text_index') else 0
# 处理函数调用结果
conn._handle_function_result(result, function_call_data, text_index)
# 将函数执行放在线程池中
conn.executor.submit(process_function_call)
return True
# 处理传统意图格式
elif "intent" in intent_data:
intent = intent_data["intent"]
# 处理退出意图
if "结束聊天" in intent:
logger.bind(tag=TAG).info(f"识别到退出意图: {intent}")
# 如果是明确的离别意图,发送告别语并关闭连接
await send_stt_message(conn, original_text)
conn.executor.submit(conn.chat_and_close, original_text)
return True
# 其他不需要特殊处理的意图,让常规聊天流程处理
return False
except json.JSONDecodeError:
# 如果不是有效的JSON,尝试兼容旧格式
intent = intent_result
# 处理退出意图
if "结束聊天" in intent:
logger.bind(tag=TAG).info(f"识别到退出意图: {intent}")
# 如果是明确的离别意图,发送告别语并关闭连接
await send_stt_message(conn, original_text)
conn.executor.submit(conn.chat_and_close, original_text)
return True
# 处理播放音乐意图
if "播放音乐" in intent:
logger.bind(tag=TAG).info(f"识别到音乐播放意图: {intent}")
# 获取歌曲名称
song_name = extract_text_in_brackets(intent)
# 先发送消息确认
await send_stt_message(conn, original_text)
# 构造合适的音乐播放函数调用
function_id = str(uuid.uuid4().hex)
function_name = "play_music"
function_arguments = '{ "song_name": ' + (f'"{song_name}"' if song_name else '"random"') + ' }'
function_call_data = {
"name": function_name,
"id": function_id,
"arguments": function_arguments
}
# 使用executor执行函数调用和结果处理
def process_music_query():
# 直接调用函数
def process_function_call():
conn.dialogue.put(Message(role="user", content=original_text))
result = conn.func_handler.handle_llm_function_call(conn, function_call_data)
if result:
# 获取当前最新的文本索引
text_index = conn.tts_last_text_index + 1 if hasattr(conn, 'tts_last_text_index') else 0
# 处理函数调用结果
conn._handle_function_result(result, function_call_data, text_index)
# 将函数执行放在线程池中
conn.executor.submit(process_music_query)
conn.executor.submit(process_function_call)
return True
# 处理查询天气意图
if "查询天气" in intent:
logger.bind(tag=TAG).info(f"识别到天气查询意图: {intent}")
# 获取地点
location = extract_text_in_brackets(intent)
# 先发送消息确认
await send_stt_message(conn, original_text)
# 构造合适的天气查询函数调用
function_id = str(uuid.uuid4().hex)
function_name = "get_weather"
function_arguments = '{ "location": ' + (f'"{location}"' if location and location != "当前位置" else 'null') + ', "lang": "zh_CN" }'
function_call_data = {
"name": function_name,
"id": function_id,
"arguments": function_arguments
}
# 使用executor执行函数调用和结果处理
def process_weather_query():
# 直接调用函数
result = conn.func_handler.handle_llm_function_call(conn, function_call_data)
if result:
# 获取当前最新的文本索引
text_index = conn.tts_last_text_index + 1 if hasattr(conn, 'tts_last_text_index') else 0
# 处理函数调用结果
conn._handle_function_result(result, function_call_data, text_index)
# 将函数执行放在线程池中
conn.executor.submit(process_weather_query)
return True
# 处理查询新闻意图
if "查询新闻" in intent or "播报新闻" in intent or "看新闻" in intent:
logger.bind(tag=TAG).info(f"识别到新闻查询意图: {intent}")
# 获取新闻类别
category = extract_text_in_brackets(intent)
# 先发送消息确认
await send_stt_message(conn, original_text)
# 构造合适的新闻查询函数调用
function_id = str(uuid.uuid4().hex)
function_name = "get_news"
# 判断是否是查询详情
detail = "详情" in intent or "详细" in intent
# 构造参数JSON字符串
if detail:
function_arguments = '{ "detail": true, "lang": "zh_CN" }'
else:
function_arguments = '{ "category": ' + (f'"{category}"' if category else 'null') + ', "detail": false, "lang": "zh_CN" }'
function_call_data = {
"name": function_name,
"id": function_id,
"arguments": function_arguments
}
# 使用executor执行函数调用和结果处理
def process_news_query():
# 直接调用函数
result = conn.func_handler.handle_llm_function_call(conn, function_call_data)
if result:
# 获取当前最新的文本索引
text_index = conn.tts_last_text_index + 1 if hasattr(conn, 'tts_last_text_index') else 0
# 处理函数调用结果
conn._handle_function_result(result, function_call_data, text_index)
# 将函数执行放在线程池中
conn.executor.submit(process_news_query)
return True
except Exception as e:
return False
except json.JSONDecodeError as e:
logger.bind(tag=TAG).error(f"处理意图结果时出错: {e}")
# 默认返回False,表示继续常规聊天流程
return False
return False
def extract_text_in_brackets(s):