前因
公司需要一个集中统一的AI使用平台,我们最早用的是NextChat,最初是使用了一个统一的OpenAI的key,来使用Chatgpt3.5/Chatgpt4之类。
但是随着AI的蓬勃发展,单纯的chatgpt很显然是不够的,我们还希望使用Claude Sonnet
,还希望使用更新的Deepseek
等,我们需要一个能够支持AWS Bedrock
体系的proxy,后来我们选择了one-api,使用one-api到是比较方便,可以快速对接各个平台,比如看看我们这里:
本来使用的好好的,但是突然之间他就不更新了,不支持最新的AWS Bedrock的Claude Sonnet3.7
以及 Deepseek-r1
,搞得我这边只好想想别的办法了,还好,找到了,那就是使用LiteLLM来部署。
NextChat介绍
NextChat是一个AI聊天工具UI,可以比较完整的支持大量的现有大模型,可以自由添加和切换不同厂商的不同LLM,还能快速一键部署。我们最近2年一直在使用这个作为公司内部使用大模型的前端。
界面比较清爽,使用比较舒适,而且更新也很频繁,让人放心(一个项目如果不更新,那么很快就会被淘汰,比如我们不再使用的one-api)。
可以看看这个UI的一些官方界面:
LiteLLM介绍
LiteLLM是一个开源的代理库,支持多种AI平台,包括OpenAI、Anthropic、AWS Bedrock、Cohere、HuggingFace、Azure、Anthropic、Cerebrium等。
你可以使用它的python sdk来调用这些AI平台,也可以使用它的代理服务来代理这些AI平台。
调用API
调用很简单,就是综合了各个平台的sdk,然后封装成一个统一的接口,使用起来很方便。
先安装python sdk
pip install litellm
from litellm import completion
import os
## set ENV variables
os.environ["OPENAI_API_KEY"] = "your-openai-key"
os.environ["ANTHROPIC_API_KEY"] = "your-anthropic-key"
messages = [{ "content": "Hello, how are you?","role": "user"}]
# openai call
response = completion(model="openai/gpt-4o", messages=messages)
# anthropic call
response = completion(model="anthropic/claude-3-sonnet-20240229", messages=messages)
print(response)
代理服务
代理服务也很简单,就是一个代理服务,支持多种协议,比如http、grpc、websocket等。
代理服务的好处是,你可以使用它来代理多个AI平台,这样就可以让多个AI平台共用一个代理服务,这样就可以避免多个AI平台共用同一个key的问题。
pip install 'litellm[proxy]'
实战部署
很显然,我们公司需要的是LiteLLM的代理能力(他们自己也称为网关gateway能力)。
编写配置文件
我这里有一个OpenAI的key, 一个Bedrock的key, 下面是我的配置:
config.yaml:
model_list:
- model_name: "openai/*"
litellm_params:
model: "openai/*"
api_key: "这里是我的openai key"
- model_name: sonnet-3-7
litellm_params:
model: bedrock/us.anthropic.claude-3-7-sonnet-20250219-v1:0
aws_access_key_id: 这里是我的aws key
aws_secret_access_key: 这里是我的aws secret key
aws_region_name: us-east-1
- model_name: sonnet-3-5
litellm_params:
model: bedrock/anthropic.claude-3-5-sonnet-20240620-v1:0
aws_access_key_id: 这里是我的aws key
aws_secret_access_key: 这里是我的aws secret key
aws_region_name: us-east-1
- model_name: deepseek-r1
litellm_params:
model: bedrock/converse/us.deepseek.r1-v1:0
aws_access_key_id: 这里是我的aws key
aws_secret_access_key: 这里是我的aws secret key
aws_region_name: us-east-1
litellm_settings:
modify_params: true
drop_params: true
启动LiteLLM代理服务
使用docker启动LiteLLM代理服务:
docker run -d -p 4000:4000 -v $(pwd)/config.yaml:/app/config.yaml ghcr.io/berriai/litellm:main-latest --config /app/config.yaml
如果是windows电脑,这里的$(pwd)
很有可能出现路径问题,你就直接换成你的本地路径,比如:
docker run -d -p 4000:4000 -v D:/litellm/config.yaml:/app/config.yaml ghcr.io/berriai/litellm:main-latest --config /app/config.yaml
启动next-chat
使用docker启动nextchat:
docker run -d -p 3000:3000 -e CODE=123123 -e BASE_URL="http://host.docker.internal:4000" -e OPENAI_API_KEY="sk-1234" -e CUSTOM_MODELS="-all,+gpt-4o@OpenAI,+o3-mini@OpenAI,+sonnet-3-5@OpenAI,+deepseek-r1@OpenAI,+sonnet-3-7@OpenAI" yidadaa/chatgpt-next-web
这里解释一下,code是nextchat的访问码,后面会提到使用方式。
-e 是添加环境变量,BASE_URL是API的基础地址,我这里是使用了LiteLLM的地址,然后 OPENAI_API_KEY是前面litellm的key(我们可以修改一下默认key), 主要是这里的CUSTOM_MODELS,先 -all就是去掉所有的默认模型(不-all的话会出来一大堆没用的),然后再添加。 这里的+gpt-4o@OpenAI是表示用OpenAI这个供应商家的gpt-4o模型,这个好理解,那么后面的+sonnet-3-5@OpenAI,+deepseek-r1@OpenAI,+sonnet-3-7@OpenAI为何也是用OpenAI这个供应商呢?因为LiteLLM是支持使用OpenAI统一的chatgpt的接口格式的,我们让nextchat认为我们就在用OpenAI。
我告诉你我在用OpenAI格式
然后我的地址和key也都是自定义的,告诉你了,那么你就把我当成是一个OpenAI的模型好了。
注意:BASE_URL中是Docker预留的本机解析的DNS,我这单机测试的时候使用的,如果把这个写成127.0.0.1或者localhost会报错。比如:
docker run -d -p 3000:3000 -e CODE=123123 -e BASE_URL="http://127.0.0.1:4000" -e OPENAI_API_KEY="sk-1234" -e CUSTOM_MODELS="-all,+gpt-4o@OpenAI,+o3-mini@OpenAI,+sonnet-3-5@OpenAI,+deepseek-r1@OpenAI,+sonnet-3-7@OpenAI" yidadaa/chatgpt-next-web
那么会一直提示错误
因为这是Docker网络隔离问题,因为我的LiteLLM也是在docker里面部署的,nextchat是在另一个docker里面部署的,他们是两个隔离的环境,如果nextchat需要使用LiteLLM, 那么需要在nextchat的docker里面添加LiteLLM的ip地址,因为LiteLLM是4000:4000,映射到主机上的,我们需要用一个主机的本地ip(而不是上面的127.0.0.1这种本地回环ip)或者docker提前预留的DNS名host.docker.internal
这样就找得到了。
使用本机ip地址也可以,比如ipconfig一下,查看地址:
然后:
docker run -d -p 3000:3000 -e CODE=123123 -e BASE_URL="http://10.30.110.196:4000" -e OPENAI_API_KEY="sk-1234" -e CUSTOM_MODELS="-all,+gpt-4o@OpenAI,+o3-mini@OpenAI,+sonnet-3-5@OpenAI,+deepseek-r1@OpenAI,+sonnet-3-7@OpenAI" yidadaa/chatgpt-next-web
如果是生产使用的话,一般会用nginx来反代LiteLLM,这样就可以避免上面的问题了,上面的BASE_URL就是具体配置的域名信息比如https://litellm.xxx.com 即可了
查看效果
LiteLLM代理和NextChat的UI都部署之后,就可以看看效果了:
进去先在设置里面填写部署时候的code:
对话页面就可以看到多个大模型了,可以点击切换按钮切换模型:
可以看看deepseek-r1的效果了:
生产部署
要上生产的话,最好使用docker-compose来统一部署
在config.yaml文件的同级目录中添加docker-compose.yaml文件,内容如下:
version: '3.8'
services:
litellm:
image: ghcr.io/berriai/litellm:main-latest
container_name: litellm
ports:
- "4000:4000"
volumes:
- ./config.yaml:/app/config.yaml # 确保配置文件在项目目录下
command: --config /app/config.yaml
restart: unless-stopped
chatgpt-web:
image: yidadaa/chatgpt-next-web
container_name: chatgpt-web
ports:
- "3000:3000"
environment:
CODE: "123123"
BASE_URL: "http://litellm:4000" # 使用服务名代替 IP
OPENAI_API_KEY: "sk-1234"
CUSTOM_MODELS: "-all,+gpt-4o@OpenAI,+o3-mini@OpenAI,+sonnet-3-5@OpenAI,+deepseek-r1@OpenAI,+sonnet-3-7@OpenAI"
depends_on:
- litellm
restart: unless-stopped
确保前面的config.yaml文件和docker-compose.yaml文件在同一个目录下,
然后执行以下命令:
docker-compose up -d
即可启动,启动成功:
然后访问: http://localhost:3000 即可
但是我这里除了给nextchat用,还需要给其他同事使用api来调用,因此打算部署起来,这个用nginx反代一下就可以了,反代之后的域名替换掉上面的BASE_URL即可。
评论区