import json from config.logger import setup_logging import requests from core.providers.llm.base import LLMProviderBase from core.utils.util import check_model_key TAG = __name__ logger = setup_logging() class LLMProvider(LLMProviderBase): def __init__(self, config): self.api_key = config["api_key"] self.base_url = config.get("base_url") self.detail = config.get("detail", False) self.variables = config.get("variables", {}) model_key_msg = check_model_key("FastGPTLLM", self.api_key) if model_key_msg: logger.bind(tag=TAG).error(model_key_msg) def response(self, session_id, dialogue, **kwargs): # 取最后一条用户消息 last_msg = next(m for m in reversed(dialogue) if m["role"] == "user") # 发起流式请求 with requests.post( f"{self.base_url}/chat/completions", headers={"Authorization": f"Bearer {self.api_key}"}, json={ "stream": True, "chatId": session_id, "detail": self.detail, "variables": self.variables, "messages": [{"role": "user", "content": last_msg["content"]}], }, stream=True, ) as r: for line in r.iter_lines(): if line: try: if line.startswith(b"data: "): if line[6:].decode("utf-8") == "[DONE]": break data = json.loads(line[6:]) if "choices" in data and len(data["choices"]) > 0: delta = data["choices"][0].get("delta", {}) if ( delta and "content" in delta and delta["content"] is not None ): content = delta["content"] if "" in content: continue if "" in content: continue yield content except json.JSONDecodeError as e: continue except Exception as e: continue def response_with_functions(self, session_id, dialogue, functions=None): logger.bind(tag=TAG).error( f"fastgpt暂未实现完整的工具调用(function call),建议使用其他意图识别" )