Update LLM configuration to support FastGPT integration. Modify requirements to include fastgpt-python-sdk, enhance greeting messages, and adjust LLM service creation to handle app_id. Implement welcome text fetching for FastGPT and improve context handling in the pipeline based on LLM provider. Update related configurations and properties for better integration.

This commit is contained in:
Xin Wang
2026-05-26 14:15:26 +08:00
parent 3dfff0c937
commit 97deca0f57
7 changed files with 180 additions and 24 deletions

View File

@@ -4,6 +4,9 @@ import json
from dataclasses import dataclass, field
from pathlib import Path
SUPPORTED_LLM_PROVIDERS = frozenset({"openai", "fastgpt"})
_LLM_PROVIDER_ALIASES = {"llm": "openai", "openai": "openai", "fastgpt": "fastgpt"}
@dataclass(frozen=True)
class ServerConfig:
@@ -99,10 +102,17 @@ class AgentConfig:
@dataclass(frozen=True)
class LLMConfig:
"""LLM backend selection via ``provider``.
Set ``provider`` to ``"openai"`` (alias ``"llm"``) for OpenAI-compatible chat
completions, or ``"fastgpt"`` for FastGPT server-side memory via ``chat_id``.
"""
provider: str = "openai"
api_key: str = ""
base_url: str | None = None
model: str = "gpt-4o-mini"
app_id: str | None = None
temperature: float | None = 0.7
chat_id: str | None = None
variables: dict[str, str] = field(default_factory=dict)
@@ -110,6 +120,19 @@ class LLMConfig:
timeout_sec: float = 60.0
send_system_prompt: bool = False
@property
def is_fastgpt(self) -> bool:
return self.provider == "fastgpt"
@property
def is_openai(self) -> bool:
return self.provider == "openai"
@property
def uses_local_context_history(self) -> bool:
"""Whether the pipeline should seed and maintain local LLM context history."""
return not self.is_fastgpt or self.send_system_prompt
@dataclass(frozen=True)
class STTConfig:
@@ -186,8 +209,11 @@ def config_from_dict(data: dict) -> EngineConfig:
stt["language"] = None
llm = _dict(services.get("llm"))
llm["provider"] = _normalize_llm_provider(llm.get("provider", LLMConfig().provider))
if llm.get("chat_id") == "":
llm["chat_id"] = None
if llm.get("app_id") == "":
llm["app_id"] = None
if not isinstance(llm.get("variables"), dict):
llm["variables"] = {}
@@ -227,3 +253,14 @@ def config_from_dict(data: dict) -> EngineConfig:
def _dict(value: object) -> dict:
return dict(value) if isinstance(value, dict) else {}
def _normalize_llm_provider(value: object) -> str:
provider = str(value or LLMConfig().provider).strip().lower()
normalized = _LLM_PROVIDER_ALIASES.get(provider)
if normalized is None:
supported = ", ".join(sorted(SUPPORTED_LLM_PROVIDERS | {"llm"}))
raise ValueError(
f"services.llm.provider must be one of: {supported}; got {value!r}"
)
return normalized