update README
Browse files
README.md
CHANGED
|
@@ -1,10 +1,70 @@
|
|
| 1 |
# uni-api
|
| 2 |
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
```
|
| 9 |
|
| 10 |
## Docker Local Deployment
|
|
@@ -21,7 +81,6 @@ yym68686/uni-api:latest
|
|
| 21 |
Or if you want to use Docker Compose, here is a docker-compose.yml example:
|
| 22 |
|
| 23 |
```yaml
|
| 24 |
-
version: "3.8"
|
| 25 |
services:
|
| 26 |
uni-api:
|
| 27 |
container_name: uni-api
|
|
@@ -60,4 +119,19 @@ docker run --user root -p 8001:8000 -dit --name uni-api \
|
|
| 60 |
-e USE_ROUND_ROBIN=True \
|
| 61 |
yym68686/uni-api:latest
|
| 62 |
docker logs -f uni-api
|
| 63 |
-
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
# uni-api
|
| 2 |
|
| 3 |
+
<p align="center">
|
| 4 |
+
<a href="https://t.me/uni_api">
|
| 5 |
+
<img src="https://img.shields.io/badge/Join Telegram Group-blue?&logo=telegram">
|
| 6 |
+
</a>
|
| 7 |
+
<a href="https://hub.docker.com/repository/docker/yym68686/uni-api">
|
| 8 |
+
<img src="https://img.shields.io/docker/pulls/yym68686/uni-api?color=blue" alt="docker pull">
|
| 9 |
+
</a>
|
| 10 |
+
</p>
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
## Introduction
|
| 14 |
+
|
| 15 |
+
这是一个统一管理大模型API的项目,可以通过一个统一的API接口调用多个后端服务,统一转换为 OpenAI 格式,支持负载均衡。目前支持的后端服务有:OpenAI、Anthropic、DeepBricks、OpenRouter、Gemini等。
|
| 16 |
+
|
| 17 |
+
## Features
|
| 18 |
+
|
| 19 |
+
- 统一管理多个后端服务
|
| 20 |
+
- 支持负载均衡
|
| 21 |
+
- 支持多个模型
|
| 22 |
+
- 支持多个API Key
|
| 23 |
+
|
| 24 |
+
## Configuration
|
| 25 |
+
|
| 26 |
+
使用api.yaml配置文件,可以配置多个模型,每个模型可以配置多个后端服务,支持负载均衡。下面是 api.yaml 配置文件的示例:
|
| 27 |
+
|
| 28 |
+
```yaml
|
| 29 |
+
providers:
|
| 30 |
+
- provider: provider_name # 服务提供商名称, 如 openai、anthropic、gemini、openrouter、deepbricks,随便取名字,必填
|
| 31 |
+
base_url: https://api.your.com/v1/chat/completions # 后端服务的API地址,必填
|
| 32 |
+
api: sk-YgS6GTi0b4bEabc4C # 提供商的API Key,必填
|
| 33 |
+
model:
|
| 34 |
+
- gpt-4o # 可以使用的模型名称,必填
|
| 35 |
+
- claude-3-5-sonnet-20240620: claude-3-5-sonnet # 重命名模型,claude-3-5-sonnet-20240620 是服务商的模型名称,claude-3-5-sonnet 是重命名后的名字,可以使用简洁的名字代替原来复杂的名称,选填
|
| 36 |
+
tools: true # 是否支持工具,如生成代码、生成文档等,选填
|
| 37 |
+
url: https://openai.com/ # 服务商的网址,选填
|
| 38 |
+
|
| 39 |
+
- provider: anthropic
|
| 40 |
+
base_url: https://api.anthropic.com/v1/messages
|
| 41 |
+
api: sk-ant-api03-bNnAOJyA-xQw_twAA
|
| 42 |
+
model:
|
| 43 |
+
- claude-3-5-sonnet-20240620: claude-3-5-sonnet # 重命名模型,claude-3-5-sonnet-20240620 是服务商的模型名称,claude-3-5-sonnet 是重命名后的名字,可以使用简洁的名字代替原来复杂的名称,选填
|
| 44 |
+
tools: true
|
| 45 |
+
|
| 46 |
+
- provider: gemini
|
| 47 |
+
base_url: https://generativelanguage.googleapis.com/v1/models/{model}:{stream}?key={api_key} # base_url 支持变量替换,{model} 会被替换为模型名称,{stream} 会被替换为 stream 参数,{api_key} 会被替换为 api_key 参数, 仅供 Gemini 模型使用,必填
|
| 48 |
+
api: AIzaSyAN2k6IRdgw
|
| 49 |
+
model:
|
| 50 |
+
- gemini-1.5-pro
|
| 51 |
+
- gemini-1.5-flash
|
| 52 |
+
tools: false
|
| 53 |
+
|
| 54 |
+
api_keys:
|
| 55 |
+
- api: sk-KjjI60Yf0JFWtfgRmXqFWyGtWUd9GZnmi3KlvowmRWpWpQRo # API Key,用户使用本服务需要 API key,必填
|
| 56 |
+
model: # 该 API Key 可以使用的模型,必填
|
| 57 |
+
- gpt-4o # 可以使用的模型名称,可以使用所有提供商提供的 gpt-4o 模型
|
| 58 |
+
- claude-3-5-sonnet # 可以使用的模型名称,可以使用所有提供商提供的 claude-3-5-sonnet 模型
|
| 59 |
+
- gemini/* # 可以使用的模型名称,仅可以使用名为 gemini 提供商提供的所有模型,其中 gemini 是 provider 名称,* 代表所有模型
|
| 60 |
+
role: admin
|
| 61 |
+
|
| 62 |
+
- api: sk-pkhf60Yf0JGyJygRmXqFQyTgWUd9GZnmi3KlvowmRWpWqrhy
|
| 63 |
+
model:
|
| 64 |
+
- anthropic/claude-3-5-sonnet # 可以使用的模型名称,仅可以使用名为 anthropic 提供商提供的 claude-3-5-sonnet 模型。其他提供商的 claude-3-5-sonnet 模型不可以使用。
|
| 65 |
+
|
| 66 |
+
preferences:
|
| 67 |
+
USE_ROUND_ROBIN: true # 是否使用轮询负载均衡,true 为使用,false 为不使用,默认为 true
|
| 68 |
```
|
| 69 |
|
| 70 |
## Docker Local Deployment
|
|
|
|
| 81 |
Or if you want to use Docker Compose, here is a docker-compose.yml example:
|
| 82 |
|
| 83 |
```yaml
|
|
|
|
| 84 |
services:
|
| 85 |
uni-api:
|
| 86 |
container_name: uni-api
|
|
|
|
| 119 |
-e USE_ROUND_ROBIN=True \
|
| 120 |
yym68686/uni-api:latest
|
| 121 |
docker logs -f uni-api
|
| 122 |
+
```
|
| 123 |
+
|
| 124 |
+
RESTful curl test
|
| 125 |
+
|
| 126 |
+
```bash
|
| 127 |
+
curl -X POST http://127.0.0.1:8000/v1/chat/completions \
|
| 128 |
+
-H "Content-Type: application/json" \
|
| 129 |
+
-H "Authorization: Bearer ${API}" \
|
| 130 |
+
-d '{"model": "gpt-4o","messages": [{"role": "user", "content": "Hello"}],"stream": true}'
|
| 131 |
+
```
|
| 132 |
+
|
| 133 |
+
## Star History
|
| 134 |
+
|
| 135 |
+
<a href="https://github.com/yym68686/uni-api/stargazers">
|
| 136 |
+
<img width="500" alt="Star History Chart" src="https://api.star-history.com/svg?repos=yym68686/uni-api&type=Date">
|
| 137 |
+
</a>
|
main.py
CHANGED
|
@@ -124,7 +124,7 @@ class ModelRequestHandler:
|
|
| 124 |
raise HTTPException(status_code=404, detail="No matching model found")
|
| 125 |
|
| 126 |
# 检查是否启用轮询
|
| 127 |
-
use_round_robin =
|
| 128 |
|
| 129 |
return await self.try_all_providers(request, matching_providers, use_round_robin)
|
| 130 |
|
|
|
|
| 124 |
raise HTTPException(status_code=404, detail="No matching model found")
|
| 125 |
|
| 126 |
# 检查是否启用轮询
|
| 127 |
+
use_round_robin = config["preferences"].get("USE_ROUND_ROBIN")
|
| 128 |
|
| 129 |
return await self.try_all_providers(request, matching_providers, use_round_robin)
|
| 130 |
|