diff --git a/README.md b/README.md index 0dcd708a..6789f8f6 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,8 @@ xiaogpt --hardware LX06 --mute_xiaoai --use_chatgpt_api xiaogpt --hardware LX06 --mute_xiaoai --stream # 如果你想使用 google 的 gemini xiaogpt --hardware LX06 --mute_xiaoai --use_gemini --gemini_key ${gemini_key} +# 如果你想使用自己的 google gemini 服务 +python3 xiaogpt.py --hardware LX06 --mute_xiaoai --use_gemini --gemini_key ${gemini_key} --gemini_api_domain ${gemini_api_domain} # 如果你想使用阿里的通义千问 xiaogpt --hardware LX06 --mute_xiaoai --use_qwen --qen_key ${qwen_key} # 如果你想用 edge-tts @@ -101,6 +103,8 @@ python3 xiaogpt.py --hardware LX06 --mute_xiaoai --stream python3 xiaogpt.py --hardware LX06 --mute_xiaoai --use_glm --glm_key ${glm_key} # 如果你想使用 google 的 gemini python3 xiaogpt.py --hardware LX06 --mute_xiaoai --use_gemini --gemini_key ${gemini_key} +# 如果你想使用自己的 google gemini 服务 +python3 xiaogpt.py --hardware LX06 --mute_xiaoai --use_gemini --gemini_key ${gemini_key} --gemini_api_domain ${gemini_api_domain} # 如果你想使用阿里的通义千问 python3 xiaogpt.py --hardware LX06 --mute_xiaoai --use_qwen --qen_key ${qwen_key} # 如果你想使用 LangChain+SerpApi 实现上网检索或其他本地服务(目前仅支持 stream 模式) @@ -155,6 +159,7 @@ ChatGLM [文档](http://open.bigmodel.cn/doc/api#chatglm_130b) | serpapi_api_key | serpapi的key 参考 [SerpAPI](https://serpapi.com/) | | | | glm_key | chatglm 的 apikey | | | | gemini_key | gemini 的 apikey [参考](https://makersuite.google.com/app/apikey) | | | +| gemini_api_domain | gemini 的自定义域名 [参考](https://github.com/antergone/palm-netlify-proxy) | | | qwen_key | qwen 的 apikey [参考](https://help.aliyun.com/zh/dashscope/developer-reference/api-details) | | | | cookie | 小爱账户cookie (如果用上面密码登录可以不填) | | | | mi_did | 设备did | | | @@ -175,11 +180,9 @@ ChatGLM [文档](http://open.bigmodel.cn/doc/api#chatglm_130b) | bing_cookie_path | NewBing使用的cookie路径,参考[这里]获取 | 也可通过环境变量 `COOKIE_FILE` 设置 | | | bing_cookies | NewBing使用的cookie字典,参考[这里]获取 | | | | deployment_id | Azure OpenAI 服务的 deployment ID | 参考这个[如何找到deployment_id](https://github.com/yihong0618/xiaogpt/issues/347#issuecomment-1784410784) | | -| api_base | 如果需要替换默认的api,或者使用Azure OpenAI 服务 | 例如:`https://abc-def.openai.azure.com/` | | +| api_base | 如果需要替换默认的api,或者使用Azure OpenAI 服务 | 例如:`https://abc-def.openai.azure.com/` | | volc_access_key | 火山引擎的 access key 请在[这里](https://console.volcengine.com/iam/keymanage/)获取 | | | | volc_secret_key | 火山引擎的 secret key 请在[这里](https://console.volcengine.com/iam/keymanage/)获取 | | | - - [这里]: https://github.com/acheong08/EdgeGPT#getting-authentication-required ## 注意 diff --git a/xiao_config.json.example b/xiao_config.json.example index e546afa5..e9a63b2d 100644 --- a/xiao_config.json.example +++ b/xiao_config.json.example @@ -5,6 +5,7 @@ "openai_key": "", "glm_key": "", "gemini_key": "", + "gemini_api_domain": "", "qwen_key": "", "serpapi_api_key": "", "cookie": "", diff --git a/xiaogpt/bot/gemini_bot.py b/xiaogpt/bot/gemini_bot.py index f3ac6341..5fc64d4e 100644 --- a/xiaogpt/bot/gemini_bot.py +++ b/xiaogpt/bot/gemini_bot.py @@ -12,7 +12,7 @@ "temperature": 0.7, "top_p": 1, "top_k": 1, - "max_output_tokens": 2048, + "max_output_tokens": 4096, } safety_settings = [ @@ -32,10 +32,26 @@ class GeminiBot(ChatHistoryMixin, BaseBot): name = "Gemini" - def __init__(self, gemini_key: str) -> None: + def __init__(self, gemini_key: str, gemini_api_domain: str) -> None: import google.generativeai as genai - genai.configure(api_key=gemini_key) + from google.auth import api_key + + credentials = api_key.Credentials(gemini_key) + if len(gemini_api_domain) > 0: + print("Use custom gemini_api_domain: " + gemini_api_domain) + credentials._universe_domain = gemini_api_domain + genai.configure( + transport="rest", + credentials=credentials, + client_options={ + "api_endpoint": "https://" + gemini_api_domain, + "universe_domain": gemini_api_domain, + }, + ) + else: + genai.configure(api_key=gemini_key) + self.history = [] model = genai.GenerativeModel( model_name="gemini-pro", @@ -46,11 +62,13 @@ def __init__(self, gemini_key: str) -> None: @classmethod def from_config(cls, config): - return cls(gemini_key=config.gemini_key) + return cls( + gemini_key=config.gemini_key, gemini_api_domain=config.gemini_api_domain + ) async def ask(self, query, **options): - self.convo.send_message(query) - message = self.convo.last.text.strip() + response = self.convo.send_message(query) + message = response.text.strip() print(message) if len(self.convo.history) > 10: self.convo.history = self.convo.history[2:] diff --git a/xiaogpt/cli.py b/xiaogpt/cli.py index 09c4ac3c..eff2f89b 100644 --- a/xiaogpt/cli.py +++ b/xiaogpt/cli.py @@ -37,6 +37,11 @@ def main(): dest="gemini_key", help="gemini api key", ) + parser.add_argument( + "--gemini_api_domain", + dest="gemini_api_domain", + help="custom gemini api domain", + ) parser.add_argument( "--qwen_key", dest="qwen_key", diff --git a/xiaogpt/config.py b/xiaogpt/config.py index 913eff9f..20912433 100644 --- a/xiaogpt/config.py +++ b/xiaogpt/config.py @@ -56,6 +56,9 @@ class Config: gemini_key: str = os.getenv("GEMINI_KEY", "") # keep the old rule qwen_key: str = os.getenv("DASHSCOPE_API_KEY", "") # keep the old rule serpapi_api_key: str = os.getenv("SERPAPI_API_KEY", "") + gemini_api_domain: str = os.getenv( + "GEMINI_API_DOMAIN", "" + ) # 自行部署的 Google Gemini 代理 volc_access_key: str = os.getenv("VOLC_ACCESS_KEY", "") volc_secret_key: str = os.getenv("VOLC_SECRET_KEY", "") proxy: str | None = None