save code
This commit is contained in:
+20
-3
@@ -2,6 +2,7 @@ from __future__ import annotations
|
||||
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
from typing import Optional
|
||||
from collections import deque
|
||||
|
||||
@@ -18,7 +19,7 @@ class LLMService:
|
||||
self._model = (settings.llm_model or "").strip()
|
||||
self._base_url = (settings.llm_base_url or "").strip()
|
||||
self._history: deque[dict] = deque(maxlen=12) # 6 turns (user+assistant)
|
||||
self._system_prompt = "请用中文口语化简短回复,1-2句。"
|
||||
self._system_prompt = (settings.llm_system_prompt or "").strip() or "请用中文口语化简短回复,1-2句。"
|
||||
|
||||
if not settings.llm_api_key:
|
||||
self._error = "missing LLM api key: set LLM_API_KEY or DEEPSEEK_API_KEY"
|
||||
@@ -51,6 +52,22 @@ class LLMService:
|
||||
self._error = str(exc)
|
||||
logger.warning("LLM online mode unavailable: %s", exc)
|
||||
|
||||
@staticmethod
|
||||
def _normalize_reply_text(text: str) -> str:
|
||||
cleaned = (text or "").strip()
|
||||
if not cleaned:
|
||||
return ""
|
||||
cleaned = cleaned.replace("\r", "\n")
|
||||
cleaned = re.sub(r"```.*?```", "", cleaned, flags=re.S)
|
||||
cleaned = re.sub(r"`([^`]*)`", r"\1", cleaned)
|
||||
cleaned = re.sub(r"\*\*(.*?)\*\*", r"\1", cleaned)
|
||||
cleaned = re.sub(r"\*(.*?)\*", r"\1", cleaned)
|
||||
cleaned = re.sub(r"\s*([,。!?;:、,.!?;:])\s*", r"\1", cleaned)
|
||||
cleaned = re.sub(r"(?<=[\u4e00-\u9fff])\s+(?=[\u4e00-\u9fff])", "", cleaned)
|
||||
cleaned = re.sub(r"\n+", " ", cleaned)
|
||||
cleaned = re.sub(r"\s{2,}", " ", cleaned)
|
||||
return cleaned.strip()
|
||||
|
||||
async def reply_with_meta(self, text: str) -> tuple[str, str]:
|
||||
if not self._ready or self._client is None:
|
||||
return f"收到:{text}。这是本地兜底回复。", "fallback"
|
||||
@@ -60,9 +77,9 @@ class LLMService:
|
||||
model=self._model,
|
||||
messages=[{"role": "system", "content": self._system_prompt}, *list(self._history), {"role": "user", "content": text}],
|
||||
max_tokens=settings.llm_max_tokens,
|
||||
temperature=0.7,
|
||||
temperature=max(0.1, min(1.2, settings.llm_temperature)),
|
||||
)
|
||||
content = (resp.choices[0].message.content or "").strip()
|
||||
content = self._normalize_reply_text(resp.choices[0].message.content or "")
|
||||
if content:
|
||||
self._history.append({"role": "user", "content": text})
|
||||
self._history.append({"role": "assistant", "content": content})
|
||||
|
||||
Reference in New Issue
Block a user