Support downloading configuration files from external URLs.
Browse files- README.md +3 -0
- docker-compose.yml +2 -0
- main.py +16 -1
- utils.py +17 -14
README.md
CHANGED
|
@@ -92,6 +92,8 @@ services:
|
|
| 92 |
uni-api:
|
| 93 |
container_name: uni-api
|
| 94 |
image: yym68686/uni-api:latest
|
|
|
|
|
|
|
| 95 |
ports:
|
| 96 |
- 8001:8000
|
| 97 |
volumes:
|
|
@@ -120,6 +122,7 @@ set -eu
|
|
| 120 |
docker pull yym68686/uni-api:latest
|
| 121 |
docker rm -f uni-api
|
| 122 |
docker run --user root -p 8001:8000 -dit --name uni-api \
|
|
|
|
| 123 |
-v ./api.yaml:/home/api.yaml \
|
| 124 |
yym68686/uni-api:latest
|
| 125 |
docker logs -f uni-api
|
|
|
|
| 92 |
uni-api:
|
| 93 |
container_name: uni-api
|
| 94 |
image: yym68686/uni-api:latest
|
| 95 |
+
environment:
|
| 96 |
+
- CONFIG_URL=http://file_url/api.yaml
|
| 97 |
ports:
|
| 98 |
- 8001:8000
|
| 99 |
volumes:
|
|
|
|
| 122 |
docker pull yym68686/uni-api:latest
|
| 123 |
docker rm -f uni-api
|
| 124 |
docker run --user root -p 8001:8000 -dit --name uni-api \
|
| 125 |
+
-e CONFIG_URL=http://file_url/api.yaml \
|
| 126 |
-v ./api.yaml:/home/api.yaml \
|
| 127 |
yym68686/uni-api:latest
|
| 128 |
docker logs -f uni-api
|
docker-compose.yml
CHANGED
|
@@ -2,6 +2,8 @@ services:
|
|
| 2 |
uni-api:
|
| 3 |
container_name: uni-api
|
| 4 |
image: yym68686/uni-api:latest
|
|
|
|
|
|
|
| 5 |
ports:
|
| 6 |
- 8001:8000
|
| 7 |
volumes:
|
|
|
|
| 2 |
uni-api:
|
| 3 |
container_name: uni-api
|
| 4 |
image: yym68686/uni-api:latest
|
| 5 |
+
environment:
|
| 6 |
+
- CONFIG_URL=http://file_url/api.yaml
|
| 7 |
ports:
|
| 8 |
- 8001:8000
|
| 9 |
volumes:
|
main.py
CHANGED
|
@@ -7,7 +7,7 @@ from contextlib import asynccontextmanager
|
|
| 7 |
from fastapi import FastAPI, HTTPException, Depends
|
| 8 |
|
| 9 |
from models import RequestModel
|
| 10 |
-
from utils import config, api_keys_db, api_list, error_handling_wrapper, get_all_models, verify_api_key, post_all_models
|
| 11 |
from request import get_payload
|
| 12 |
from response import fetch_response, fetch_response_stream
|
| 13 |
|
|
@@ -21,6 +21,21 @@ async def lifespan(app: FastAPI):
|
|
| 21 |
# 启动时的代码
|
| 22 |
timeout = httpx.Timeout(connect=15.0, read=10.0, write=30.0, pool=30.0)
|
| 23 |
app.state.client = httpx.AsyncClient(timeout=timeout)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
yield
|
| 25 |
# 关闭时的代码
|
| 26 |
await app.state.client.aclose()
|
|
|
|
| 7 |
from fastapi import FastAPI, HTTPException, Depends
|
| 8 |
|
| 9 |
from models import RequestModel
|
| 10 |
+
from utils import config, api_keys_db, api_list, error_handling_wrapper, get_all_models, verify_api_key, post_all_models, update_config
|
| 11 |
from request import get_payload
|
| 12 |
from response import fetch_response, fetch_response_stream
|
| 13 |
|
|
|
|
| 21 |
# 启动时的代码
|
| 22 |
timeout = httpx.Timeout(connect=15.0, read=10.0, write=30.0, pool=30.0)
|
| 23 |
app.state.client = httpx.AsyncClient(timeout=timeout)
|
| 24 |
+
import os
|
| 25 |
+
import json
|
| 26 |
+
# 新增: 从环境变量获取配置URL并拉取配置
|
| 27 |
+
config_url = os.environ.get('CONFIG_URL')
|
| 28 |
+
if config_url:
|
| 29 |
+
try:
|
| 30 |
+
response = await app.state.client.get(config_url)
|
| 31 |
+
response.raise_for_status()
|
| 32 |
+
config_data = json.loads(response.text)
|
| 33 |
+
# 更新配置
|
| 34 |
+
global config, api_keys_db, api_list
|
| 35 |
+
config, api_keys_db, api_list = update_config(config_data)
|
| 36 |
+
except Exception as e:
|
| 37 |
+
logger.error(f"Error fetching or parsing config from {config_url}: {str(e)}")
|
| 38 |
+
|
| 39 |
yield
|
| 40 |
# 关闭时的代码
|
| 41 |
await app.state.client.aclose()
|
utils.py
CHANGED
|
@@ -5,25 +5,28 @@ from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
|
| 5 |
|
| 6 |
from log_config import logger
|
| 7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
# 读取YAML配置文件
|
| 9 |
def load_config():
|
| 10 |
try:
|
| 11 |
with open('./api.yaml', 'r') as f:
|
| 12 |
conf = yaml.safe_load(f)
|
| 13 |
-
|
| 14 |
-
model_dict = {}
|
| 15 |
-
for model in provider['model']:
|
| 16 |
-
if type(model) == str:
|
| 17 |
-
model_dict[model] = model
|
| 18 |
-
if type(model) == dict:
|
| 19 |
-
model_dict.update({new: old for old, new in model.items()})
|
| 20 |
-
model_dict.update({old: old for old, new in model.items()})
|
| 21 |
-
provider['model'] = model_dict
|
| 22 |
-
conf['providers'][index] = provider
|
| 23 |
-
api_keys_db = conf['api_keys']
|
| 24 |
-
api_list = [item["api"] for item in api_keys_db]
|
| 25 |
-
# logger.info(json.dumps(conf, indent=4, ensure_ascii=False))
|
| 26 |
-
return conf, api_keys_db, api_list
|
| 27 |
except FileNotFoundError:
|
| 28 |
logger.error("配置文件 'api.yaml' 未找到。请确保文件存在于正确的位置。")
|
| 29 |
return [], [], []
|
|
|
|
| 5 |
|
| 6 |
from log_config import logger
|
| 7 |
|
| 8 |
+
def update_config(config_data):
|
| 9 |
+
for index, provider in enumerate(config_data['providers']):
|
| 10 |
+
model_dict = {}
|
| 11 |
+
for model in provider['model']:
|
| 12 |
+
if type(model) == str:
|
| 13 |
+
model_dict[model] = model
|
| 14 |
+
if type(model) == dict:
|
| 15 |
+
model_dict.update({new: old for old, new in model.items()})
|
| 16 |
+
model_dict.update({old: old for old, new in model.items()})
|
| 17 |
+
provider['model'] = model_dict
|
| 18 |
+
config_data['providers'][index] = provider
|
| 19 |
+
api_keys_db = config_data['api_keys']
|
| 20 |
+
api_list = [item["api"] for item in api_keys_db]
|
| 21 |
+
# logger.info(json.dumps(conf, indent=4, ensure_ascii=False))
|
| 22 |
+
return config_data, api_keys_db, api_list
|
| 23 |
+
|
| 24 |
# 读取YAML配置文件
|
| 25 |
def load_config():
|
| 26 |
try:
|
| 27 |
with open('./api.yaml', 'r') as f:
|
| 28 |
conf = yaml.safe_load(f)
|
| 29 |
+
return update_config(conf)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
except FileNotFoundError:
|
| 31 |
logger.error("配置文件 'api.yaml' 未找到。请确保文件存在于正确的位置。")
|
| 32 |
return [], [], []
|