From 98cd1bae800b9a91563a62b6b3ae3512e95fb704 Mon Sep 17 00:00:00 2001 From: Habermehl <37908699+00make@users.noreply.github.com> Date: Sat, 15 Feb 2025 01:36:20 +0800 Subject: [PATCH] =?UTF-8?q?update:=20=E6=B7=BB=E5=8A=A0Gemini=20LLM?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=B9=B6=E6=9B=B4=E6=96=B0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.yaml | 6 ++- core/providers/llm/gemini/gemini.py | 80 +++++++++++++++++++++++++++++ requirements.txt | 1 + 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 core/providers/llm/gemini/gemini.py diff --git a/config.yaml b/config.yaml index 644592a7..7c7a1ed2 100644 --- a/config.yaml +++ b/config.yaml @@ -82,7 +82,7 @@ LLM: # 可在这里找到你的api key https://bigmodel.cn/usercenter/proj-mgmt/apikeys model_name: glm-4-flash url: https://open.bigmodel.cn/api/paas/v4/ - api_key: 你的ChatGLMLLM api key + api_key: 47ab8569b25f4c3d8ea25830a33a64ca.4cF037cViBB1df5o OllamaLLM: # 定义LLM API类型 type: ollama @@ -95,6 +95,10 @@ LLM: # 如果使用DifyLLM,配置文件里prompt(提示词)是无效的,需要在dify控制台设置提示词 base_url: https://api.dify.cn/v1 api_key: 你的DifyLLM api key + GeminiLLM: + type: gemini + api_key: 你的gemini api key + model_name: "gemini-1.5-pro" # gemini-1.5-pro 是免费的 TTS: # 当前支持的type为edge、doubao,可自行适配 EdgeTTS: diff --git a/core/providers/llm/gemini/gemini.py b/core/providers/llm/gemini/gemini.py new file mode 100644 index 00000000..ef1351cd --- /dev/null +++ b/core/providers/llm/gemini/gemini.py @@ -0,0 +1,80 @@ +import logging +import google.generativeai as genai +from core.providers.llm.base import LLMProviderBase + +logger = logging.getLogger(__name__) + +class LLMProvider(LLMProviderBase): + def __init__(self, config): + """初始化Gemini LLM Provider""" + self.model_name = config.get("model_name", "gemini-1.5-pro") + self.api_key = config.get("api_key") + + if not self.api_key or "你" in self.api_key: + logger.error("你还没配置Gemini LLM的密钥,请在配置文件中配置密钥,否则无法正常工作") + return + + try: + # 初始化Gemini客户端 + genai.configure(api_key=self.api_key) + self.model = genai.GenerativeModel(self.model_name) + + # 设置生成参数 + self.generation_config = { + "temperature": 0.7, + "top_p": 0.9, + "top_k": 40, + "max_output_tokens": 2048, + } + self.chat = None + except Exception as e: + logger.error(f"Gemini初始化失败: {e}") + self.model = None + + def response(self, session_id, dialogue): + """生成Gemini对话响应""" + if not self.model: + yield "【Gemini服务未正确初始化】" + return + + try: + # 处理对话历史 + chat_history = [] + for msg in dialogue[:-1]: # 历史对话 + role = "model" if msg["role"] == "assistant" else "user" + content = msg["content"].strip() + if content: + chat_history.append({ + "role": role, + "parts": [content] + }) + + # 获取当前消息 + current_msg = dialogue[-1]["content"] + + # 创建新的聊天会话 + chat = self.model.start_chat(history=chat_history) + + # 发送消息并获取流式响应 + response = chat.send_message( + current_msg, + stream=True, + generation_config=self.generation_config + ) + + # 处理流式响应 + for chunk in response: + if hasattr(chunk, 'text') and chunk.text: + yield chunk.text + + except Exception as e: + error_msg = str(e) + logger.error(f"Gemini响应生成错误: {error_msg}") + + # 针对不同错误返回友好提示 + if "Rate limit" in error_msg: + yield "【Gemini服务请求太频繁,请稍后再试】" + elif "Invalid API key" in error_msg: + yield "【Gemini API key无效】" + else: + yield f"【Gemini服务响应异常: {error_msg}】" diff --git a/requirements.txt b/requirements.txt index 4674fd45..2e69445e 100755 --- a/requirements.txt +++ b/requirements.txt @@ -8,5 +8,6 @@ pydub==0.25.1 funasr==1.2.3 torchaudio==2.2.2 openai==1.61.0 +google-generativeai==0.8.4 edge_tts==7.0.0 httpx==0.27.2 \ No newline at end of file