31 Commits
0.7.8 ... ninja

Author SHA1 Message Date
Clivia
a26235aba2 feat gpts的部署说明 2024-03-16 10:29:10 +08:00
Clivia
c6c3a6d93a Update ninja-image.yml 2024-03-08 21:43:00 +08:00
Clivia
00fbda47c7 feat flask直接启动,解决部分机cpu占用过大问题 2024-03-08 21:32:27 +08:00
Clivia
8b9c44b285 feat simply flask run 2024-03-08 14:30:48 +08:00
Clivia
27b9591723 feat simply flask run 2024-03-08 14:30:01 +08:00
Yanyutin753
e7f97f4104 支持gpt-4-gizmo-XXX,填错自动回退gpt-3.5-turbo 2024-03-04 15:08:26 +08:00
Clivia
36bd2901fc 优化部署说明 2024-03-04 09:42:07 +08:00
Clivia
c10d11e6d2 修改部署说明 2024-03-03 23:46:20 +08:00
Clivia
7bd55e3468 修改部署说明 2024-02-27 22:54:02 +08:00
Clivia
5a40b35df1 更新部署说明 2024-02-27 22:53:11 +08:00
Clivia
509b233694 修改部署说明 2024-02-27 22:46:55 +08:00
Clivia
129bbafe08 fix gpts.json is not accessible 2024-02-27 17:29:10 +08:00
Clivia
0214512b13 优化部署说明 2024-02-26 15:38:13 +08:00
Clivia
46d2b9cb43 适配GPTs配置 2024-02-26 14:44:33 +08:00
Clivia
e3d8cc2139 适配GPTs 2024-02-26 14:43:41 +08:00
Clivia
1fc6fa7784 支持gpt-4-gizmo-XXX,动态配置GPTS 2024-02-26 14:14:13 +08:00
Clivia
aae4fd64d7 动态适配gpts 2024-02-26 14:08:07 +08:00
Clivia
cd983f0a0c Update main.py 2024-02-26 14:04:04 +08:00
Clivia
76993fcce8 Rename docker-deploy.yml to ninja-image.yml 2024-02-20 01:28:26 +08:00
Clivia
fa645a80d8 Update docker-deploy.yml 2024-02-20 01:27:59 +08:00
Clivia
1e3e233adc 更新KEY_FOR_GPTS_INFO 2024-02-20 01:14:46 +08:00
Clivia
002ff558b0 优化gpts结构 2024-02-19 21:52:50 +08:00
Clivia
6f66431bb5 Update docker-compose.yml 2024-02-17 17:45:57 +08:00
Clivia
d815bf991e Update docker-compose.yml 2024-02-17 17:44:06 +08:00
Clivia
10488aeaa5 修正自定义更新access_token异常 2024-02-17 02:09:20 +08:00
Clivia
97f1c4f45f Update main.py 2024-02-14 21:57:14 +08:00
Clivia
0d0ae4a95a 适配ninja 2024-02-14 21:40:00 +08:00
Clivia
37b0dd7c36 适配ninja 2024-02-14 21:35:48 +08:00
Clivia
4a852bd070 适配ninja 2024-02-14 21:31:50 +08:00
Clivia
0ca230a853 适配ninja 2024-02-14 21:17:40 +08:00
Clivia
6eeadb49ac 修改适配ninja 2024-02-14 21:10:59 +08:00
9 changed files with 139 additions and 129 deletions

View File

@@ -42,5 +42,6 @@ jobs:
push: true
tags: |
yangclivia/pandora-to-api:${{ steps.tag_name.outputs.tag }}
yangclivia/pandora-to-api:0.7.7
platforms: linux/amd64,linux/arm64
build-args: TARGETPLATFORM=${{ matrix.platform }}

View File

@@ -1,46 +0,0 @@
name: xyhelper Build and Push Docker Image
on:
release:
types: [created]
workflow_dispatch:
inputs:
tag:
description: 'Tag Name'
required: true
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Set tag name
id: tag_name
run: |
if [ "${{ github.event_name }}" = "release" ]; then
echo "::set-output name=tag::${GITHUB_REF#refs/tags/}"
elif [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "::set-output name=tag::${{ github.event.inputs.tag }}"
fi
- name: Build and push Docker image with Release tag
uses: docker/build-push-action@v2
with:
context: .
file: ./Dockerfile
push: true
tags: |
yangclivia/pandora-to-api:${{ steps.tag_name.outputs.tag }}
platforms: linux/amd64,linux/arm64
build-args: TARGETPLATFORM=${{ matrix.platform }}

View File

@@ -10,15 +10,13 @@ COPY . /app
# 设置环境变量
ENV PYTHONUNBUFFERED=1
RUN chmod +x /app/start.sh
RUN apt update && apt install -y jq
RUN chmod +x /app/main.py
# # 设置 pip 源为清华大学镜像
# RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 安装任何所需的依赖项
RUN pip install --no-cache-dir flask flask_apscheduler gunicorn requests Pillow flask-cors tiktoken fake_useragent redis websocket-client pysocks requests[socks] websocket-client[optional]
RUN pip install --no-cache-dir flask flask_apscheduler requests Pillow flask-cors tiktoken fake_useragent redis websocket-client pysocks requests[socks] websocket-client[optional]
# 在容器启动时运行 Flask 应用
CMD ["/app/start.sh"]
CMD ["python3", "main.py"]

View File

@@ -1,29 +1,21 @@
## 项目简介
## 0.7.7 ninja版本项目简介
![Docker Image Size (tag)](https://img.shields.io/docker/image-size/yangclivia/pandora-to-api/0.7.7)![Docker Pulls](https://img.shields.io/docker/pulls/yangclivia/pandora-to-api)[![GitHub Repo stars](https://img.shields.io/github/stars/Yanyutin753/RefreshToV1Api?style=social)](https://github.com/Yanyutin753/refresh-gpt-chat/stargazers)
> [!IMPORTANT]
>
> Respect `xyhelper` ,Respect `ninja` , Respect `Wizerd`
> Respect Zhile大佬 , Respect Wizerd
感谢xyhelper、ninja和Wizerd大佬们的付出,敬礼!!!
感谢pandoraNext和Wizerd的付出敬礼
本项目支持:
1.xyhelper `proxy` 模式下的 `backend-api免费接口` 转为 `/v1/chat/completions` 接口,支持流式和非流式响应。
1.ninja `proxy` 模式下的 `backend-api` 转为 `/v1/chat/completions` 接口,支持流式和非流式响应。
2.xyhelper `proxy` 模式下的 `backend-api免费接口` 转为 `/v1/images/generations` 接口
2.ninja `proxy` 模式下的 `backend-api` 转为 `/v1/images/generations` 接口
3. 支持直接把refresh_token作为请求key方便接入one_api
4. 支持 gpt-4-mobile 、gpt-4-s 、基本所有的GPTS
* **xyhelper 的 免费 backend-api 接口,无需打码**
* **xyhelper接口每分钟最多请求30次介意请绕行**
* 我是开发者,我想自行修改功能->前往源码库 https://github.com/xyhelper/chatgpt-mirror-server
* 我没服务器,也没有官网账号,只想使用->前往官网购买我们运营的会员服务 https://www.xyhelper.com.cn
* 我想做商业用途,我想自己运营->老板里面请 https://www.xyhelper.com.cn/access
* 我有服务器,我想自己部署->请继续阅读本文档(有条件的话给个star吧)
如果本项目对你有帮助的话,请点个小星星吧~
如果有什么在项目的使用过程中的疑惑或需求,欢迎加入 Community Telegram Channel: [Inker 的魔法世界](https://t.me/InkerWorld) 来和大家一起交流一下~
@@ -42,7 +34,7 @@
- [x] 支持 gpt-3.5-turbo
- [x] 支持 gpts
- [x] 支持 动态gpts
- [x] 支持 流式输出
@@ -67,13 +59,13 @@
## 注意
> [!CAUTION]
> 1. 本项目的运行需要 xyhelper 的免费接口
> 1. 本项目的运行需要 ninja
>
> 2. 本项目实际为将来自 `/v1/chat/completions` 的请求转发到xyhelper免费接口的 `/backend-api/conversation` 接口,因此本项目并不支持高并发操作,请不要接入如 `沉浸式翻译` 等高并发项目。
> 2. 本项目实际为将来自 `/v1/chat/completions` 的请求转发到ninja的 `/backend-api/conversation` 接口,因此本项目并不支持高并发操作,请不要接入如 `沉浸式翻译` 等高并发项目。
>
> 3. 本项目支持使用apple平台的refresh_token作为请求key.
>
> 4. 本项目并不能绕过 OpenAI 和 xyhelper 官方的限制,只提供便利,不提供绕过。
> 4. 本项目并不能绕过 OpenAI 和 ninja 官方的限制,只提供便利,不提供绕过。
>
> 5. 提问的艺术:当出现项目不能正常运行时,请携带 `DEBUG` 级别的日志在 `Issue` 或者社区群内提问,否则将开启算命模式~
@@ -103,9 +95,9 @@
- `process_threads`: 用于设置线程数,如果不需要设置,可以保持不变,如果需要设置,可以设置为需要设置的值,如果设置为 `1`,则会强制设置为单线程模式。
- `upstream_base_url`: xyhelper 的免费接口地址,如:`https://demo.xyhelper.cn`,注意:不要以 `/` 结尾。
- `upstream_base_url`: ninja 的部署地址,如:`https://pandoranext.com`,注意:不要以 `/` 结尾。可以填写为本项目可以访问到的 PandoraNext 的内网地址。
- `upstream_api_prefix`: 默认为""
- `upstream_api_prefix`: PandoraNext Proxy 模式下的 API 前缀
- `backend_container_url`: 用于dalle模型生成图片的时候展示所用需要设置为使用如 [ChatGPT-Next-Web](https://github.com/ChatGPTNextWebTeam/ChatGPT-Next-Web) 的用户可以访问到的本项目地址,如:`http://1.2.3.4:50011`,同原环境变量中的 `UPLOAD_BASE_URL`
@@ -151,8 +143,7 @@ PS. 注意arkose_urls中的地址需要支持PandoraNext的Arkose Token获取
- `enableOai`:用于设置是否使用官网通过refresh_token刷新access_token仅在 `enableOai``true` 时生效。
- `xyhelper_refreshToAccess_Url`:用于设置使用xyhelper来进行使用refresh_token刷新access_token,enableOai为false的时候必填
- 默认为"https://demo.xyhelper.cn/applelogin"
- `ninja_refreshToAccess_Url`:用于设置使用ninja来进行使用refresh_token刷新access_token,enableOai为false的时候必填
- `redis`
@@ -166,7 +157,9 @@ PS. 注意arkose_urls中的地址需要支持PandoraNext的Arkose Token获取
## GPTS配置说明
如果需要使用 GPTS需要修改 `gpts.json` 文件其中每个对象的key即为调用对应 GPTS 的时候使用的模型名称,而 `id` 则为对应的模型id`id` 对应每个 GPTS 的链接的后缀。配置多个GPTS的时候用逗号隔开。
### 使用 GPTS
1. 可修改 `gpts.json` 文件其中每个对象的key即为调用对应 GPTS 的时候使用的模型名称,而 `id` 则为对应的模型id`id` 对应每个 GPTS 的链接的后缀。配置多个GPTS的时候用逗号隔开。
例如PandoraNext的官方 GPTS 的链接为:`https://chat.oaifree.com/g/g-CFsXuTRfy-pandoranextzhu-shou`,则该模型的 `id` 的值应为 `g-CFsXuTRfy-pandoranextzhu-shou`,而模型名可以自定义。
@@ -183,7 +176,16 @@ PS. 注意arkose_urls中的地址需要支持PandoraNext的Arkose Token获取
}
```
注意:使用该配置的时候需要保证正确填写 `docker-compose.yml` 的环境变量 `KEY_FOR_GPTS_INFO`,同时该变量设置的 `key` 允许访问所有配置的 GPTS。
2. 直接请求的时候加上相应的gpt-4-gizmo-XXXXXX等同于上面的id的值
```json
{
"stream":true,
"model":"gpt-4-gizmo-XXXX",
"messages": [{"role": "user", "content": "你是什么模型"}]
}
```
注意:使用该配置的时候需要保证正确填写 `config.json` 文件的环境变量 `KEY_FOR_GPTS_INFO`,同时该变量设置的 `key` 允许访问所有配置的 GPTS。
## 绘图接口使用说明
@@ -191,7 +193,7 @@ PS. 注意arkose_urls中的地址需要支持PandoraNext的Arkose Token获取
请求方式:`POST`
请求头:正常携带 `Authorization``Content-Type` 即可,`Authorization` 的值为 `Bearer <refresh_token>``Content-Type` 的值为 `application/json`
请求头:正常携带 `Authorization``Content-Type` 即可,`Authorization` 的值为 `Bearer <ninja 的 fk>``Content-Type` 的值为 `application/json`
请求体格式示例:
@@ -324,19 +326,20 @@ PS. 注意arkose_urls中的地址需要支持PandoraNext的Arkose Token获取
## 示例
以ChatGPT-Next-Web项目的docker-compose部署为例这里提供一个简单的部署配置文件示例
[ChatGPT-Next-Web](https://github.com/Yanyutin753/ChatGPT-Next-Web-LangChain-Gpt-4-All)项目插件版的docker-compose部署为例支持完全适配项目,这里提供一个简单的部署配置文件示例:
```
version: '3'
services:
chatgpt-next-web:
image: yidadaa/chatgpt-next-web
image: yangclivia/chatgpt-next-web-langchain
ports:
- "50013:3000"
environment:
- CUSTOM_MODELS=-all,+gpt-3.5-turbo,+gpt-4-s,+gpt-4-mobile,+gpt-4-vision-preview,+gpt-4-gizmo-XXX
- OPENAI_API_KEY=<正确的refresh_token>
- BASE_URL=<backend-to-api容器地址>
- CUSTOM_MODELS=+gpt-4-s,+gpt-4-mobile,+<gpts.json 中的模型名>
- CUSTOM_MODELS=-gpt-4-0613,-gpt-4-32k,-gpt-4-32k-0613,-gpt-4-turbo-preview,-gpt-4-1106-preview,-gpt-4-0125-preview,-gpt-3.5-turbo-0125,-gpt-3.5-turbo-0613,-gpt-3.5-turbo-1106,-gpt-3.5-turbo-16k,-gpt-3.5-turbo-16k-0613,+gpt-3.5-turbo,+gpt-4,+gpt-4-mobile,+gpt-4-vision-preview,+gpt-4-mobile,+<gpts.json 中的模型名>
```
@@ -351,17 +354,20 @@ services:
![api-2](https://github.com/Ink-Osier/PandoraToV1Api/assets/133617214/37c0381f-a70a-42bb-83f1-1491053240b7)
### 读文件
![api-3](https://github.com/Yanyutin753/xyhelperToV1Api_refresh/assets/132346501/e1f2e770-cd33-4af0-a0c7-5ddabf1c076d)
### 绘图
![api-3](https://github.com/Ink-Osier/PandoraToV1Api/assets/133617214/8eea9436-12ee-46b1-86c1-67e7e97da83a)
![api-4](https://github.com/Ink-Osier/PandoraToV1Api/assets/133617214/8eea9436-12ee-46b1-86c1-67e7e97da83a)
### GPT-4-Mobile
![api-4](https://github.com/Ink-Osier/PandoraToV1Api/assets/133617214/2eb4fd4f-7c66-4a1f-a54a-3c280a36e509)
![api-5](https://github.com/Ink-Osier/PandoraToV1Api/assets/133617214/2eb4fd4f-7c66-4a1f-a54a-3c280a36e509)
### GPTS
![api-5](https://github.com/Ink-Osier/PandoraToV1Api/assets/133617214/299df56a-d245-4920-8892-94e1a9cc644a)
![api-6](https://github.com/Ink-Osier/PandoraToV1Api/assets/133617214/299df56a-d245-4920-8892-94e1a9cc644a)
### Bot 模式
@@ -388,4 +394,4 @@ services:
## Star History
[![Star History Chart](https://api.star-history.com/svg?repos=Yanyutin753/xyhelperV1Api_refresh&type=Date)](https://star-history.com/#Yanyutin753/xyhelperV1Api_refresh&Date)
[![Star History Chart](https://api.star-history.com/svg?repos=Yanyutin753/ninjaToV1Api_refresh&type=Date)](https://star-history.com/#Yanyutin753/ninjaToV1Api_refresh&Date)

View File

@@ -4,7 +4,7 @@
"process_workers": 2,
"process_threads": 2,
"proxy": "",
"upstream_base_url": "https://demo.xyhelper.cn",
"upstream_base_url": "",
"upstream_api_prefix": "",
"backend_container_url": "",
"backend_container_api_prefix": "",
@@ -27,7 +27,7 @@
"refresh_ToAccess": {
"stream_sleep_time": 0,
"enableOai":"true",
"xyhelper_refreshToAccess_Url": "https://demo.xyhelper.cn/applelogin"
"ninja_refreshToAccess_Url": ""
},
"redis": {
"host": "redis",

View File

@@ -1 +1,5 @@
{}
{
"gpt-4-classic": {
"id":"g-YyyyMT9XH-chatgpt-classic"
}
}

View File

@@ -2,7 +2,7 @@ version: '3'
services:
backend-to-api:
image: yangclivia/pandora-to-api:0.7.8
image: yangclivia/pandora-to-api:0.7.7
restart: always
ports:
- "50011:33333"

129
main.py
View File

@@ -62,10 +62,10 @@ BOT_MODE_ENABLED_CODE_BLOCK_OUTPUT = BOT_MODE.get('enabled_plugin_output', 'fals
BOT_MODE_ENABLED_PLAIN_IMAGE_URL_OUTPUT = BOT_MODE.get('enabled_plain_image_url_output', 'false').lower() == 'true'
# xyhelperToV1Api_refresh
# ninjaToV1Api_refresh
REFRESH_TOACCESS = CONFIG.get('refresh_ToAccess', {})
REFRESH_TOACCESS_ENABLEOAI = REFRESH_TOACCESS.get('enableOai', 'true').lower() == 'true'
REFRESH_TOACCESS_XYHELPER_REFRESHTOACCESS_URL = REFRESH_TOACCESS.get('xyhelper_refreshToAccess_Url', '')
REFRESH_TOACCESS_NINJA_REFRESHTOACCESS_URL = REFRESH_TOACCESS.get('ninja_refreshToAccess_Url', '')
STEAM_SLEEP_TIME = REFRESH_TOACCESS.get('steam_sleep_time', 0)
NEED_DELETE_CONVERSATION_AFTER_RESPONSE = CONFIG.get('need_delete_conversation_after_response',
@@ -198,15 +198,12 @@ def oaiGetAccessToken(refresh_token):
return None
# xyhelper获得access_token
def xyhelperGetAccessToken(getAccessTokenUrl, refresh_token):
# ninja获得access_token
def ninjaGetAccessToken(getAccessTokenUrl, refresh_token):
try:
logger.info("将通过这个网址请求access_token" + getAccessTokenUrl)
data = {
'refresh_token': refresh_token,
}
response = requests.post(getAccessTokenUrl, data=data)
headers = {"Authorization": "Bearer " + refresh_token}
response = requests.post(getAccessTokenUrl, headers=headers)
if not response.ok:
logger.error("Request 失败: " + response.text.strip())
return None
@@ -230,7 +227,7 @@ def updateGptsKey():
if REFRESH_TOACCESS_ENABLEOAI:
access_token = oaiGetAccessToken(KEY_FOR_GPTS_INFO)
else:
access_token = xyhelperGetAccessToken(REFRESH_TOACCESS_XYHELPER_REFRESHTOACCESS_URL, KEY_FOR_GPTS_INFO)
access_token = ninjaGetAccessToken(REFRESH_TOACCESS_NINJA_REFRESHTOACCESS_URL, KEY_FOR_GPTS_INFO)
if access_token.startswith("eyJhb"):
KEY_FOR_GPTS_INFO_ACCESS_TOKEN = access_token
logging.info("KEY_FOR_GPTS_INFO_ACCESS_TOKEN被更新:" + KEY_FOR_GPTS_INFO_ACCESS_TOKEN)
@@ -276,17 +273,17 @@ def add_config_to_global_list(base_url, proxy_api_prefix, gpts_data):
if gizmo_info:
redis_client.set(model_id, str(gizmo_info))
logger.info(f"Cached gizmo info for {model_name}, {model_id}")
# 检查模型名称是否已经在列表中
if gizmo_info and not any(d['name'] == model_name for d in gpts_configurations):
gpts_configurations.append({
'name': model_name,
'id': model_id,
'config': gizmo_info
})
else:
logger.info(f"Model already exists in the list, skipping...")
if gizmo_info:
# 检查模型名称是否已经在列表中
if not any(d['name'] == model_name for d in gpts_configurations):
gpts_configurations.append({
'name': model_name,
'id': model_id,
'config': gizmo_info
})
else:
logger.info(f"Model already exists in the list, skipping...")
def generate_gpts_payload(model, messages):
@@ -324,9 +321,9 @@ scheduler.start()
# PANDORA_UPLOAD_URL = 'files.pandoranext.com'
VERSION = '0.7.8'
VERSION = '0.7.7.3'
# VERSION = 'test'
UPDATE_INFO = '项目将脱离ninja使用xyhelperxyhelper_refreshToAccess_Url等配置需修改'
UPDATE_INFO = 'flask直接启动解决部分机cpu占用过大问题'
# UPDATE_INFO = '【仅供临时测试使用】 '
# 解析响应中的信息
@@ -405,7 +402,7 @@ with app.app_context():
logger.info(f"REFRESH_TOACCESS_ENABLEOAI: {REFRESH_TOACCESS_ENABLEOAI}")
if not REFRESH_TOACCESS_ENABLEOAI:
logger.info(f"REFRESH_TOACCESS_XYHELPER_REFRESHTOACCESS_URL: {REFRESH_TOACCESS_XYHELPER_REFRESHTOACCESS_URL}")
logger.info(f"REFRESH_TOACCESS_NINJA_REFRESHTOACCESS_URL: {REFRESH_TOACCESS_NINJA_REFRESHTOACCESS_URL}")
if BOT_MODE_ENABLED:
logger.info(f"enabled_markdown_image_output: {BOT_MODE_ENABLED_MARKDOWN_IMAGE_OUTPUT}")
@@ -413,10 +410,10 @@ with app.app_context():
logger.info(f"enabled_bing_reference_output: {BOT_MODE_ENABLED_BING_REFERENCE_OUTPUT}")
logger.info(f"enabled_plugin_output: {BOT_MODE_ENABLED_CODE_BLOCK_OUTPUT}")
# xyhelperToV1Api_refresh
# ninjaToV1Api_refresh
logger.info(f"REFRESH_TOACCESS_ENABLEOAI: {REFRESH_TOACCESS_ENABLEOAI}")
logger.info(f"REFRESH_TOACCESS_XYHELPER_REFRESHTOACCESS_URL: {REFRESH_TOACCESS_XYHELPER_REFRESHTOACCESS_URL}")
logger.info(f"REFRESH_TOACCESS_NINJA_REFRESHTOACCESS_URL: {REFRESH_TOACCESS_NINJA_REFRESHTOACCESS_URL}")
logger.info(f"STEAM_SLEEP_TIME: {STEAM_SLEEP_TIME}")
if not BASE_URL:
@@ -864,10 +861,14 @@ def send_text_prompt_and_get_response(messages, api_key, stream, model):
# 查找模型配置
model_config = find_model_config(model)
if model_config:
if model_config or 'gpt-4-gizmo-' in model:
# 检查是否有 ori_name
ori_model_name = model_config.get('ori_name', model)
logger.info(f"原模型名: {ori_model_name}")
if model_config:
ori_model_name = model_config.get('ori_name', model)
logger.info(f"原模型名: {ori_model_name}")
else:
logger.info(f"请求模型名: {model}")
ori_model_name = model
if ori_model_name == 'gpt-4-s':
payload = {
# 构建 payload
@@ -918,6 +919,53 @@ def send_text_prompt_and_get_response(messages, api_key, stream, model):
"force_paragen": False,
"force_rate_limit": False
}
elif 'gpt-4-gizmo-' in model:
payload = generate_gpts_payload(model, formatted_messages)
if not payload:
global gpts_configurations
# 假设 model是 'gpt-4-gizmo-123'
split_name = model.split('gpt-4-gizmo-')
model_id = split_name[1] if len(split_name) > 1 else None
gizmo_info = fetch_gizmo_info(BASE_URL, PROXY_API_PREFIX, model_id)
logging.info(gizmo_info)
# 如果成功获取到数据,则将其存入 Redis
if gizmo_info:
redis_client.set(model_id, str(gizmo_info))
logger.info(f"Cached gizmo info for {model}, {model_id}")
# 检查模型名称是否已经在列表中
if not any(d['name'] == model for d in gpts_configurations):
gpts_configurations.append({
'name': model,
'id': model_id,
'config': gizmo_info
})
else:
logger.info(f"Model already exists in the list, skipping...")
payload = generate_gpts_payload(model, formatted_messages)
else:
payload = {
# 构建 payload
"action": "next",
"messages": formatted_messages,
"parent_message_id": str(uuid.uuid4()),
"model": "text-davinci-002-render-sha",
"timezone_offset_min": -480,
"suggestions": [
"What are 5 creative things I could do with my kids' art? I don't want to throw them away, but it's also so much clutter.",
"I want to cheer up my friend who's having a rough day. Can you suggest a couple short and sweet text messages to go with a kitten gif?",
"Come up with 5 concepts for a retro-style arcade game.",
"I have a photoshoot tomorrow. Can you recommend me some colors and outfit options that will look good on camera?"
],
"history_and_training_disabled": False,
"arkose_token": None,
"conversation_mode": {
"kind": "primary_assistant"
},
"force_paragen": False,
"force_rate_limit": False
}
logger.debug('KEY_FOR_GPTS_INFO is not accessible')
else:
payload = generate_gpts_payload(model, formatted_messages)
if not payload:
@@ -1161,7 +1209,7 @@ def generate_actions_allow_payload(author_role, author_name, target_message_id,
"action": "next",
"messages": [
{
"id": generate_custom_uuid_v4(),
"id": str(uuid.uuid4()),
"author": {
"role": author_role,
"name": author_name
@@ -2012,7 +2060,7 @@ def old_data_fetcher(upstream_response, data_queue, stop_event, last_data_time,
"id": chat_message_id,
"object": "chat.completion.chunk",
"created": timestamp,
"model": message.get("metadata", {}).get("model_slug"),
"model": model,
"choices": [
{
"index": 0,
@@ -2248,7 +2296,7 @@ def chat_completions():
messages = data.get('messages')
model = data.get('model')
accessible_model_list = get_accessible_model_list()
if model not in accessible_model_list:
if model not in accessible_model_list and not 'gpt-4-gizmo-' in model:
return jsonify({"error": "model is not accessible"}), 401
stream = data.get('stream', False)
@@ -2266,7 +2314,7 @@ def chat_completions():
if REFRESH_TOACCESS_ENABLEOAI:
api_key = oaiGetAccessToken(api_key)
else:
api_key = xyhelperGetAccessToken(REFRESH_TOACCESS_XYHELPER_REFRESHTOACCESS_URL, api_key)
api_key = ninjaGetAccessToken(REFRESH_TOACCESS_NINJA_REFRESHTOACCESS_URL, api_key)
if not api_key.startswith("eyJhb"):
return jsonify({"error": "refresh_token is wrong or refresh_token url is wrong!"}), 401
add_to_dict(refresh_token, api_key)
@@ -2406,7 +2454,7 @@ def images_generations():
# messages = data.get('messages')
model = data.get('model')
accessible_model_list = get_accessible_model_list()
if model not in accessible_model_list:
if model not in accessible_model_list and not 'gpt-4-gizmo-' in model:
return jsonify({"error": "model is not accessible"}), 401
prompt = data.get('prompt', '')
@@ -2431,7 +2479,7 @@ def images_generations():
refresh_token = api_key
api_key = oaiGetAccessToken(api_key)
else:
api_key = xyhelperGetAccessToken(REFRESH_TOACCESS_XYHELPER_REFRESHTOACCESS_URL, api_key)
api_key = ninjaGetAccessToken(REFRESH_TOACCESS_NINJA_REFRESHTOACCESS_URL, api_key)
if not api_key.startswith("eyJhb"):
return jsonify({"error": "refresh_token is wrong or refresh_token url is wrong!"}), 401
add_to_dict(refresh_token, api_key)
@@ -2611,7 +2659,7 @@ def updateRefresh_dict():
if REFRESH_TOACCESS_ENABLEOAI:
access_token = oaiGetAccessToken(key)
else:
access_token = xyhelperGetAccessToken(REFRESH_TOACCESS_XYHELPER_REFRESHTOACCESS_URL, key)
access_token = ninjaGetAccessToken(REFRESH_TOACCESS_NINJA_REFRESHTOACCESS_URL, key)
if not access_token.startswith("eyJhb"):
logger.debug("refresh_token is wrong or refresh_token url is wrong!")
error_num += 1
@@ -2619,18 +2667,17 @@ def updateRefresh_dict():
success_num += 1
logging.info("更新成功: " + str(success_num) + ", 失败: " + str(error_num))
logger.info(f"==========================================")
logging.info("开始更新KEY_FOR_GPTS_INFO_ACCESS_TOKEN和GPTS配置信息.......")
logging.info("开始更新KEY_FOR_GPTS_INFO_ACCESS_TOKEN和GPTS配置信息......")
# 加载配置并添加到全局列表
gpts_data = load_gpts_config("./data/gpts.json")
add_config_to_global_list(BASE_URL, PROXY_API_PREFIX, gpts_data)
accessible_model_list = get_accessible_model_list()
logger.info(f"当前可用 GPTS 列表: {accessible_model_list}")
# 检查列表中是否有重复的模型名称
if len(accessible_model_list) != len(set(accessible_model_list)):
raise Exception("检测到重复的模型名称,请检查环境变量或配置文件......")
raise Exception("检测到重复的模型名称,请检查环境变量或配置文件")
logging.info("更新KEY_FOR_GPTS_INFO_ACCESS_TOKEN和GPTS配置信息成功......")
logger.info(f"当前可用 GPTS 列表: {accessible_model_list}")
logger.info(f"==========================================")
@@ -2639,4 +2686,4 @@ scheduler.add_job(id='updateRefresh_run', func=updateRefresh_dict, trigger='cron
# 运行 Flask 应用
if __name__ == '__main__':
app.run(host='0.0.0.0')
app.run(host='0.0.0.0', port=33333, threaded=True)

View File

@@ -31,4 +31,4 @@ echo "PROCESS_WORKERS: ${PROCESS_WORKERS}"
echo "PROCESS_THREADS: ${PROCESS_THREADS}"
# 启动 Gunicorn 并使用 tee 命令同时输出日志到文件和控制台
exec gunicorn -w ${PROCESS_WORKERS} --threads ${PROCESS_THREADS} --bind 0.0.0.0:33333 main:app --access-logfile - --error-logfile -
exec gunicorn -w ${PROCESS_WORKERS} --threads ${PROCESS_THREADS} --bind 0.0.0.0:33333 main:app --access-logfile - --error-logfile - --timeout 60