侧边栏壁纸
博主头像
翻斗

开始一件事最好是昨天,其次是现在

  • 累计撰写 45 篇文章
  • 累计创建 45 个标签
  • 累计收到 3 条评论
AI

LiteLLM + NextChat部署多账号AI聊天系统

翻斗
2025-03-25 / 0 评论 / 0 点赞 / 153 阅读 / 5,274 字

前因

公司需要一个集中统一的AI使用平台,我们最早用的是NextChat,最初是使用了一个统一的OpenAI的key,来使用Chatgpt3.5/Chatgpt4之类。

但是随着AI的蓬勃发展,单纯的chatgpt很显然是不够的,我们还希望使用Claude Sonnet,还希望使用更新的Deepseek等,我们需要一个能够支持AWS Bedrock体系的proxy,后来我们选择了one-api,使用one-api到是比较方便,可以快速对接各个平台,比如看看我们这里:
20250322171826

本来使用的好好的,但是突然之间他就不更新了,不支持最新的AWS Bedrock的Claude Sonnet3.7 以及 Deepseek-r1,搞得我这边只好想想别的办法了,还好,找到了,那就是使用LiteLLM来部署。

NextChat介绍

NextChat是一个AI聊天工具UI,可以比较完整的支持大量的现有大模型,可以自由添加和切换不同厂商的不同LLM,还能快速一键部署。我们最近2年一直在使用这个作为公司内部使用大模型的前端。
界面比较清爽,使用比较舒适,而且更新也很频繁,让人放心(一个项目如果不更新,那么很快就会被淘汰,比如我们不再使用的one-api)。
可以看看这个UI的一些官方界面:
20250325143810

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 

那么会一直提示错误

20250322173731

因为这是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一下,查看地址:
20250322174103

然后:

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:
20250322174736
对话页面就可以看到多个大模型了,可以点击切换按钮切换模型:
20250322174635

可以看看deepseek-r1的效果了:
20250322174859

生产部署

要上生产的话,最好使用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文件在同一个目录下,
20250322175939
然后执行以下命令:

docker-compose up -d

即可启动,启动成功:
20250322180038

然后访问: http://localhost:3000 即可

但是我这里除了给nextchat用,还需要给其他同事使用api来调用,因此打算部署起来,这个用nginx反代一下就可以了,反代之后的域名替换掉上面的BASE_URL即可。

0

评论区