mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-25 16:43:55 +08:00
🦄 refactor(log): colorful log
This commit is contained in:
@@ -1,10 +1,11 @@
|
||||
import logging
|
||||
from config.logger import setup_logging
|
||||
import requests
|
||||
import json
|
||||
import re
|
||||
from core.providers.llm.base import LLMProviderBase
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
TAG = __name__
|
||||
logger = setup_logging()
|
||||
|
||||
# 定义用于匹配中文标点符号的正则表达式(包括句号、感叹号、问号、分号)
|
||||
punctuation_pattern = re.compile(r'([。!?;])')
|
||||
@@ -27,7 +28,7 @@ class LLMProvider(LLMProviderBase):
|
||||
"query": last_msg["content"],
|
||||
"stream": True
|
||||
}
|
||||
logger.info(f"发送到 Coze API 的请求数据: {json.dumps(data, ensure_ascii=False)}")
|
||||
logger.bind(tag=TAG).info(f"发送到 Coze API 的请求数据: {json.dumps(data, ensure_ascii=False)}")
|
||||
|
||||
headers = {
|
||||
'Authorization': f'Bearer {self.personal_access_token}',
|
||||
@@ -43,7 +44,7 @@ class LLMProvider(LLMProviderBase):
|
||||
json=data,
|
||||
stream=True
|
||||
)
|
||||
logger.info(f"请求状态: {response.status_code}")
|
||||
logger.bind(tag=TAG).info(f"请求状态: {response.status_code}")
|
||||
|
||||
if response.status_code == 200:
|
||||
# 对每一行流数据进行处理,不做跨块累积
|
||||
@@ -54,7 +55,7 @@ class LLMProvider(LLMProviderBase):
|
||||
# 使用 utf-8 解码,错误部分用替换符
|
||||
line = line_bytes.decode('utf-8', errors='replace')
|
||||
except Exception as e:
|
||||
logger.error(f"解码失败: {e}")
|
||||
logger.bind(tag=TAG).error(f"解码失败: {e}")
|
||||
continue
|
||||
if line.startswith("data:"):
|
||||
data_str = line[len("data:"):].strip()
|
||||
@@ -63,7 +64,7 @@ class LLMProvider(LLMProviderBase):
|
||||
try:
|
||||
data_chunk = json.loads(data_str)
|
||||
except json.JSONDecodeError as e:
|
||||
logger.error(f"JSON解析失败: {e} 数据: {line}")
|
||||
logger.bind(tag=TAG).error(f"JSON解析失败: {e} 数据: {line}")
|
||||
continue
|
||||
msg = data_chunk.get("message", {})
|
||||
if msg.get("role") == "assistant" and msg.get("type") == "answer":
|
||||
@@ -88,8 +89,8 @@ class LLMProvider(LLMProviderBase):
|
||||
if content.strip():
|
||||
yield content.strip()
|
||||
else:
|
||||
logger.error(f"请求失败,状态码: {response.status_code}")
|
||||
logger.bind(tag=TAG).error(f"请求失败,状态码: {response.status_code}")
|
||||
yield f"【Coze服务响应异常:请求失败,状态码 {response.status_code}】"
|
||||
except Exception as e:
|
||||
logger.error(f"Error in Coze response generation: {e}")
|
||||
logger.bind(tag=TAG).error(f"Error in Coze response generation: {e}")
|
||||
yield "【Coze服务响应异常】"
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import json
|
||||
import logging
|
||||
from config.logger import setup_logging
|
||||
import requests
|
||||
from core.providers.llm.base import LLMProviderBase
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
TAG = __name__
|
||||
logger = setup_logging()
|
||||
|
||||
class LLMProvider(LLMProviderBase):
|
||||
def __init__(self, config):
|
||||
@@ -35,5 +35,5 @@ class LLMProvider(LLMProviderBase):
|
||||
yield event['answer']
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error in response generation: {e}")
|
||||
logger.bind(tag=TAG).error(f"Error in response generation: {e}")
|
||||
yield "【服务响应异常】"
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import logging
|
||||
from config.logger import setup_logging
|
||||
import google.generativeai as genai
|
||||
from core.providers.llm.base import LLMProviderBase
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
TAG = __name__
|
||||
logger = setup_logging()
|
||||
|
||||
class LLMProvider(LLMProviderBase):
|
||||
def __init__(self, config):
|
||||
@@ -11,7 +12,7 @@ class LLMProvider(LLMProviderBase):
|
||||
self.api_key = config.get("api_key")
|
||||
|
||||
if not self.api_key or "你" in self.api_key:
|
||||
logger.error("你还没配置Gemini LLM的密钥,请在配置文件中配置密钥,否则无法正常工作")
|
||||
logger.bind(tag=TAG).error("你还没配置Gemini LLM的密钥,请在配置文件中配置密钥,否则无法正常工作")
|
||||
return
|
||||
|
||||
try:
|
||||
@@ -28,7 +29,7 @@ class LLMProvider(LLMProviderBase):
|
||||
}
|
||||
self.chat = None
|
||||
except Exception as e:
|
||||
logger.error(f"Gemini初始化失败: {e}")
|
||||
logger.bind(tag=TAG).error(f"Gemini初始化失败: {e}")
|
||||
self.model = None
|
||||
|
||||
def response(self, session_id, dialogue):
|
||||
@@ -69,7 +70,7 @@ class LLMProvider(LLMProviderBase):
|
||||
|
||||
except Exception as e:
|
||||
error_msg = str(e)
|
||||
logger.error(f"Gemini响应生成错误: {error_msg}")
|
||||
logger.bind(tag=TAG).error(f"Gemini响应生成错误: {error_msg}")
|
||||
|
||||
# 针对不同错误返回友好提示
|
||||
if "Rate limit" in error_msg:
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import logging
|
||||
from config.logger import setup_logging
|
||||
import requests, json
|
||||
from core.providers.llm.base import LLMProviderBase
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
TAG = __name__
|
||||
logger = setup_logging()
|
||||
|
||||
|
||||
class LLMProvider(LLMProviderBase):
|
||||
@@ -41,5 +42,5 @@ class LLMProvider(LLMProviderBase):
|
||||
yield json_response["response"]
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error in Ollama response generation: {e}")
|
||||
logger.bind(tag=TAG).error(f"Error in Ollama response generation: {e}")
|
||||
yield "【Ollama服务响应异常】"
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import logging
|
||||
from config.logger import setup_logging
|
||||
import openai
|
||||
from core.providers.llm.base import LLMProviderBase
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
TAG = __name__
|
||||
logger = setup_logging()
|
||||
|
||||
|
||||
class LLMProvider(LLMProviderBase):
|
||||
@@ -14,7 +15,7 @@ class LLMProvider(LLMProviderBase):
|
||||
else:
|
||||
self.base_url = config.get("url")
|
||||
if "你" in self.api_key:
|
||||
logger.error("你还没配置LLM的密钥,请在配置文件中配置密钥,否则无法正常工作")
|
||||
logger.bind(tag=TAG).error("你还没配置LLM的密钥,请在配置文件中配置密钥,否则无法正常工作")
|
||||
self.client = openai.OpenAI(api_key=self.api_key, base_url=self.base_url)
|
||||
|
||||
def response(self, session_id, dialogue):
|
||||
@@ -32,4 +33,4 @@ class LLMProvider(LLMProviderBase):
|
||||
if content: # 仅在content非空时生成
|
||||
yield content
|
||||
except Exception as e:
|
||||
logger.error(f"Error in response generation: {e}")
|
||||
logger.bind(tag=TAG).error(f"Error in response generation: {e}")
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
import asyncio
|
||||
import logging
|
||||
from config.logger import setup_logging
|
||||
import os
|
||||
import numpy as np
|
||||
import opuslib
|
||||
from pydub import AudioSegment
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
TAG = __name__
|
||||
logger = setup_logging()
|
||||
|
||||
|
||||
class TTSProviderBase(ABC):
|
||||
@@ -26,14 +27,14 @@ class TTSProviderBase(ABC):
|
||||
asyncio.run(self.text_to_speak(text, tmp_file))
|
||||
if not os.path.exists(tmp_file):
|
||||
max_repeat_time = max_repeat_time - 1
|
||||
logger.error(f"语音生成失败: {text}:{tmp_file},再试{max_repeat_time}次")
|
||||
logger.bind(tag=TAG).error(f"语音生成失败: {text}:{tmp_file},再试{max_repeat_time}次")
|
||||
|
||||
if max_repeat_time > 0:
|
||||
logger.info(f"语音生成成功: {text}:{tmp_file},重试{5 - max_repeat_time}次")
|
||||
logger.bind(tag=TAG).info(f"语音生成成功: {text}:{tmp_file},重试{5 - max_repeat_time}次")
|
||||
|
||||
return tmp_file
|
||||
except Exception as e:
|
||||
logger.info(f"Failed to generate TTS file: {e}")
|
||||
logger.bind(tag=TAG).info(f"Failed to generate TTS file: {e}")
|
||||
return None
|
||||
|
||||
@abstractmethod
|
||||
|
||||
@@ -3,10 +3,12 @@ import uuid
|
||||
import json
|
||||
import base64
|
||||
import requests
|
||||
import logging
|
||||
from config.logger import setup_logging
|
||||
from datetime import datetime
|
||||
from core.providers.tts.base import TTSProviderBase
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
TAG = __name__
|
||||
logger = setup_logging()
|
||||
|
||||
class TTSProvider(TTSProviderBase):
|
||||
def __init__(self, config, delete_audio_file):
|
||||
@@ -62,4 +64,4 @@ class TTSProvider(TTSProviderBase):
|
||||
with open(output_file, "wb") as file:
|
||||
file.write(resp.content)
|
||||
else:
|
||||
logger.error(f"GPT_SoVITS_V2 TTS请求失败: {resp.status_code} - {resp.text}")
|
||||
logger.bind(tag=TAG).error(f"GPT_SoVITS_V2 TTS请求失败: {resp.status_code} - {resp.text}")
|
||||
|
||||
Reference in New Issue
Block a user