From 938e729a7572a8bdb06e260e5d9eb1aab8597c05 Mon Sep 17 00:00:00 2001 From: Wizerd Date: Tue, 2 Jan 2024 13:00:48 +0800 Subject: [PATCH] =?UTF-8?q?[feat]=20=E6=94=AF=E6=8C=81=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89Arkose=20Token=E8=8E=B7=E5=8F=96url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Readme.md | 4 ++++ data/config.json | 2 ++ main.py | 51 +++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/Readme.md b/Readme.md index 7ac5578..b646ecf 100644 --- a/Readme.md +++ b/Readme.md @@ -113,6 +113,10 @@ - `use_oaiusercontent_url`: 是否使用OpenAI官方图片域名,可选值为:`true`、`false`,默认为 `false`,如果设置为 `true`,则会使用OpenAI的图片域名,否则使用 `backend_container_url` 参数的值作为图片域名。如果设置为 `true`,则 `backend_container_url` 可以不填且图片不会下载到image文件夹中。 +- `custom_arkose_url`: 是否需要自定义Arkose Token获取地址,可选值为:`true`、`false`,默认为 `false`,如果设置为 `true`,则会使用 `arkose_urls` 参数的值作为Arkose Token获取地址,否则使用默认的PandoraNext Arkose Token获取地址。 + +- `arkose_urls`: Arkose Token获取地址,如果 `custom_arkose_url` 为 `false`,则该参数无效,如果 `custom_arkose_url` 为 `true`,则该参数必填,且需要填写为可以获取Arkose Token的地址列表,例如:`https://arkose-proxy-1.pandoranext.com/,https://arkose-proxy-2.pandoranext.com/`,支持同时设置多个Arkose Token获取地址,从前往后轮询调用,如果第一个获取失败则自动从第二个获取,以此类推。 + - `bot_mode` - `enabled`: 用于设置是否开启 Bot 模式,可选值为:`true`、`false`,默认为 `false`,开启 Bot 模式后,将可以自定义联网插件的引引用、绘图插件的markdown格式的图片以及插件执行过程的输出,仅建议在 QQ、微信机器人等 Bot 项目中开启,网页应用请不要开启。 diff --git a/data/config.json b/data/config.json index 1bdb1df..13bdaad 100644 --- a/data/config.json +++ b/data/config.json @@ -13,6 +13,8 @@ "gpt_3_5_new_name": "gpt-3.5-turbo", "need_delete_conversation_after_response": "true", "use_oaiusercontent_url": "false", + "custom_arkose_url": "false", + "arkose_urls": "", "bot_mode": { "enabled": "false", "enabled_markdown_image_output": "false", diff --git a/main.py b/main.py index 8b1673d..357a3dc 100644 --- a/main.py +++ b/main.py @@ -58,6 +58,11 @@ NEED_DELETE_CONVERSATION_AFTER_RESPONSE = CONFIG.get('need_delete_conversation_a USE_OAIUSERCONTENT_URL = CONFIG.get('use_oaiusercontent_url', 'false').lower() == 'true' +CUSTOM_ARKOSE = CONFIG.get('custom_arkose_url', 'false').lower() == 'true' + +ARKOSE_URLS = CONFIG.get('arkose_urls', "") + + # 设置日志级别 log_level_dict = { 'DEBUG': logging.DEBUG, @@ -175,9 +180,9 @@ CORS(app, resources={r"/images/*": {"origins": "*"}}) PANDORA_UPLOAD_URL = 'files.pandoranext.com' -VERSION = '0.4.0' +VERSION = '0.4.1' # VERSION = 'test' -UPDATE_INFO = '支持文件生成' +UPDATE_INFO = '支持自定义Arkose Token获取url列表' # UPDATE_INFO = '【仅供临时测试使用】 ' with app.app_context(): @@ -249,6 +254,11 @@ with app.app_context(): logger.info(f"use_oaiusercontent_url: {USE_OAIUSERCONTENT_URL}") + logger.info(f"custom_arkose_url: {CUSTOM_ARKOSE}") + + if CUSTOM_ARKOSE: + logger.info(f"arkose_urls: {ARKOSE_URLS}") + logger.info(f"==========================================") @@ -296,13 +306,32 @@ with app.app_context(): # 定义获取 token 的函数 def get_token(): - url = f"{BASE_URL}{PROXY_API_PREFIX}/api/arkose/token" - payload = {'type': 'gpt-4'} - response = requests.post(url, data=payload) - if response.status_code == 200: - return response.json().get('token') - else: - return None + # 从环境变量获取 URL 列表,并去除每个 URL 周围的空白字符 + api_urls = [url.strip() for url in ARKOSE_URLS.split(",")] + + for url in api_urls: + if not url: + continue + + full_url = f"{url}/api/arkose/token" + payload = {'type': 'gpt-4'} + + try: + response = requests.post(full_url, data=payload) + if response.status_code == 200: + token = response.json().get('token') + # 确保 token 字段存在且不是 None 或空字符串 + if token: + logger.debug(f"成功从 {url} 获取 arkose token") + return token + else: + logger.error(f"获取的 token 响应无效: {token}") + else: + logger.error(f"获取 arkose token 失败: {response.status_code}, {response.text}") + except requests.RequestException as e: + logger.error(f"请求异常: {e}") + + return None import os @@ -640,6 +669,10 @@ def send_text_prompt_and_get_response(messages, api_key, stream, model): payload = generate_gpts_payload(model, formatted_messages) if not payload: raise Exception('model is not accessible') + if ori_model_name != 'gpt-3.5-turbo': + if CUSTOM_ARKOSE: + token = get_token() + payload["arkose_token"] = token logger.debug(f"payload: {payload}") response = requests.post(url, headers=headers, json=payload, stream=True) # print(response)