大功告成

This commit is contained in:
xsl
2026-03-27 17:10:41 +08:00
parent 22a5f31847
commit f24de38e94
30 changed files with 2310 additions and 404 deletions
+19 -3
View File
@@ -1,6 +1,7 @@
from __future__ import annotations
import logging
import os
from typing import Optional
from collections import deque
@@ -15,23 +16,37 @@ class LLMService:
self._error: Optional[str] = None
self._client = None
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句。"
if not settings.llm_api_key:
self._error = "missing LLM api key: set LLM_API_KEY or DEEPSEEK_API_KEY"
return
# If DeepSeek key is provided but no explicit base URL override,
# route to DeepSeek-compatible OpenAI endpoint by default.
if (
os.getenv("DEEPSEEK_API_KEY")
and not os.getenv("LLM_BASE_URL")
and not os.getenv("DEEPSEEK_BASE_URL")
and (self._base_url.lower() == "https://api.openai.com/v1" or not self._base_url)
):
self._base_url = "https://api.deepseek.com/v1"
if not self._model:
base = (settings.llm_base_url or "").lower()
self._model = "deepseek-chat" if "deepseek.com" in base else "gpt-4o-mini"
base = self._base_url.lower()
self._model = "deepseek-chat" if "deepseek" in base else "gpt-4o-mini"
try:
from openai import AsyncOpenAI
self._client = AsyncOpenAI(
api_key=settings.llm_api_key,
base_url=settings.llm_base_url,
base_url=self._base_url,
timeout=settings.llm_timeout,
)
self._ready = True
self._error = None
except Exception as exc: # pragma: no cover
self._error = str(exc)
logger.warning("LLM online mode unavailable: %s", exc)
@@ -67,6 +82,7 @@ class LLMService:
return {
"ready": self._ready,
"model": self._model,
"base_url": self._base_url,
"history_items": len(self._history),
"error": self._error,
}