mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-22 15:13:55 +08:00
* add home assistant * update home assistant remark * update config * update:优化文档 --------- Co-authored-by: ck3 <kyriechen03@qq.com> Co-authored-by: Kyrie Chen <794103684@qq.com> Co-authored-by: hrz <1710360675@qq.com>
63 lines
2.4 KiB
Python
63 lines
2.4 KiB
Python
import requests
|
|
from requests.exceptions import RequestException
|
|
from config.logger import setup_logging
|
|
from core.providers.llm.base import LLMProviderBase
|
|
|
|
TAG = __name__
|
|
logger = setup_logging()
|
|
|
|
|
|
class LLMProvider(LLMProviderBase):
|
|
def __init__(self, config):
|
|
self.agent_id = config.get("agent_id") # 对应 agent_id
|
|
self.api_key = config.get("api_key")
|
|
self.base_url = config.get("base_url", config.get("url")) # 默认使用 base_url
|
|
self.api_url = f"{self.base_url}/api/conversation/process" # 拼接完整的 API URL
|
|
|
|
def response(self, session_id, dialogue):
|
|
print(dialogue)
|
|
try:
|
|
# home assistant语音助手自带意图,无需使用xiaozhi ai自带的,只需要把用户说的话传递给home assistant即可
|
|
|
|
# 提取最后一个 role 为 'user' 的 content
|
|
input_text = None
|
|
if isinstance(dialogue, list): # 确保 dialogue 是一个列表
|
|
# 逆序遍历,找到最后一个 role 为 'user' 的消息
|
|
for message in reversed(dialogue):
|
|
if message.get("role") == "user": # 找到 role 为 'user' 的消息
|
|
input_text = message.get("content", "")
|
|
break # 找到后立即退出循环
|
|
|
|
# 构造请求数据
|
|
payload = {
|
|
"text": input_text,
|
|
"agent_id": self.agent_id,
|
|
"conversation_id": session_id # 使用 session_id 作为 conversation_id
|
|
}
|
|
# 设置请求头
|
|
headers = {
|
|
"Authorization": f"Bearer {self.api_key}",
|
|
"Content-Type": "application/json"
|
|
}
|
|
|
|
# 发起 POST 请求
|
|
response = requests.post(self.api_url, json=payload, headers=headers)
|
|
|
|
# 检查请求是否成功
|
|
response.raise_for_status()
|
|
|
|
# 解析返回数据
|
|
data = response.json()
|
|
speech = data.get("response", {}).get("speech", {}).get("plain", {}).get("speech", "")
|
|
|
|
# 返回生成的内容
|
|
if speech:
|
|
yield speech
|
|
else:
|
|
logger.bind(tag=TAG).warning("API 返回数据中没有 speech 内容")
|
|
|
|
except RequestException as e:
|
|
logger.bind(tag=TAG).error(f"HTTP 请求错误: {e}")
|
|
except Exception as e:
|
|
logger.bind(tag=TAG).error(f"生成响应时出错: {e}")
|