Janz Blog

Janz Blog

部署自己的网页chatgpt

237
2024-12-03

之前一直使用NextChat作为自己的Ai前端使用的,但是这个客户端最大的问题是不能同步记录,或者说同步很难用,所以使用自己的服务器部署了自己用也可以分享给朋友使用的LibreChat,它复刻了网页版的ChatGPT,同时新版本也带来了agents的功能来替代插件功能,使其拥有了更加灵活的能力。

部署内容

  • LibreChat——一个类似于网页版ChatGPT的web客户端
  • New-Api/Uni-Api——中转代理api
  • [可选]LibreChat Agents——让LibreChat实现联网搜索

Docker Compose部署LibreChat

  1. 克隆仓库

$ git clone https://github.com/danny-avila/LibreChat.git && cd LibreChat

  1. 复制.env

$ cp .env.example .env

  1. (可选)配置.env

默认LibreChat已经有几种官方的模型,例如openai,Claude,Google等,如果使用的是官方的服务,那么可以不用配置.env​直接启动即可,我自己使用了第三方的api中转,所以需要配置一下环境变量,主要是两个变量OPENAI_API_KEY​和OPENAI_REVERSE_PROXY​注意OPENAI_REVERSE_PROXY​的值需要写到/v1​。

  1. 启动

$ docker compose up -d

  1. 访问http://localhost:3080/

参考文档:www.librechat.ai/docs/local/docker

Uni-Api

因为默认的LibreChat没有国内的大模型代理,配置起来比较麻烦,加上有一些模型没有的api请求地址和openai不同,所以出现了不少二次分发key的代理集合,可以把各家的模型接入到一起使用类openai的方式接入,只需要配置一处,即可以随处使用。我主要使用的有两个:

  • New-Api:大而全的集合代理,带有统计系统,适合于运营
  • Uni-Api:只有集合提供商的功能,没有其他的功能,非常的简介,甚至目前还没有前端,我目前使用的就是这个。
  1. compose.yml文件

    services:
      uni-api:
        container_name: uniapi
        image: yym68686/uni-api:latest
        ports:
         - '0.0.0.0:8010:8000'
        volumes:
          - ./api.yaml:/home/api.yaml # 如果已经设置 CONFIG_URL,不需要挂载配置文件
          - ./uniapi_db:/home/data # 如果不想保存统计数据,不需要挂载该文件夹
        restart: always
    
  2. api.yaml文件
    官网有示例,我只配置了中转openai的代理和硅基流动,官方配置详细示例

    providers:
      - provider: api # 服务提供商名称, 如 openai、anthropic、gemini、openrouter,随便取名字,必填
        base_url: https://xxxxx/v1/chat/completions # 后端服务的API地址,必填
        api: sk-Z1JMOZyECWvAkoPiE49dD221B59xxxxxxxxxxxx # 提供商的API Key,必填
        # model: # 选填,如果不配置 model,会自动通过 base_url 和 api 通过 /v1/models 端点获取可用的所有模型。
        #   - gpt-4o # 可以使用的模型名称,必填
        #   - claude-3-5-sonnet-20240620: claude-3-5-sonnet # 重命名模型,claude-3-5-sonnet-20240620 是服务商的模型名称,claude-3-5-sonnet 是重命名后的名字,可以使用简洁的名字代替原来复杂的名称,选填
        #   - dall-e-3
        tools: true
      - provider: siliconflow
        base_url: https://api.siliconflow.cn/v1/chat/completions
        api: # 支持多个 API Key,多个 key 自动开启轮训负载均衡,至少一个 key,必填
          - sk-jueqfzdklhewxkajbelgtxxxxxxxxxxxxxxxxxxxxxxxxxxx
          - sk-sspwxmxmvoksgsqjuefnnxxxxxxxxxxxxxxxxxxxxxxxxxxx
        # model:
        #   - Qwen/QwQ-32B-Preview
        #   - Qwen/Qwen2.5-Coder-32B-Instruct
        #   - claude-3-5-sonnet-20240620: claude-3-5-sonnet # 重命名模型,claude-3-5-sonnet-20240620 是服务商的模型名称,claude-3-5-sonnet 是重命名后的名字,可以使用简洁的名字代替原来复杂的名称,选填
        # tools: true # 是否支持工具,如生成代码、生成文档等,默认是 true,选填
    
    api_keys:
      - api: sk-WifWIaIxCvS2dJc_hBQvFxxxxxxxxxxxxxxxxxxxxx # API Key,用户使用本服务需要 API key,必填
        model: # 该 API Key 可以使用的模型,必填。默认开启渠道级轮询负载均衡,每次请求模型按照 model 配置的顺序依次请求。与 providers 里面原始的渠道顺序无关。因此你可以设置每个 API key 请求顺序不一样。
          - api/* # 可以使用的模型名称,可以使用所有提供商提供的 gpt-4o 模型
          - siliconflow/* # 可以使用的模型名称,可以使用所有提供商提供的 claude-3-5-sonnet 模型
          # - gemini/* # 可以使用的模型名称,仅可以使用名为 gemini 提供商提供的所有模型,其中 gemini 是 provider 名称,* 代表所有模型
        role: admin
    
    preferences: # 全局配置
      model_timeout: # 模型超时时间,单位为秒,默认 100 秒,选填
        gpt-4o: 10 # 模型 gpt-4o 的超时时间为 10 秒,gpt-4o 是模型名称,当请求 gpt-4o-2024-08-06 等模型时,超时时间也是 10 秒
        claude-3-5-sonnet: 10 # 模型 claude-3-5-sonnet 的超时时间为 10 秒,当请求 claude-3-5-sonnet-20240620 等模型时,超时时间也是 10 秒
        default: 10 # 模型没有设置超时时间,使用默认的超时时间 10 秒,当请求的不在 model_timeout 里面的模型时,超时时间默认是 10 秒,不设置 default,uni-api 会使用 环境变量 TIMEOUT 设置的默认超时时间,默认超时时间是 100 秒
        o1-mini: 30 # 模型 o1-mini 的超时时间为 30 秒,当请求名字是 o1-mini 开头的模型时,超时时间是 30 秒
        o1-preview: 100 # 模型 o1-preview 的超时时间为 100 秒,当请求名字是 o1-preview 开头的模型时,超时时间是 100 秒
      cooldown_period: 300 # 渠道冷却时间,单位为秒,默认 300 秒,选填。当模型请求失败时,会自动将该渠道排除冷却一段时间,不再请求该渠道,冷却时间结束后,会自动将该模型恢复,直到再次请求失败,会重新冷却。当 cooldown_period 设置为 0 时,不启用冷却机制。
      error_triggers: # 错误触发器,当模型返回的消息包含错误触发器中的任意一个字符串时,该渠道会自动返回报错。选填
        - The bot's usage is covered by the developer
        - process this request due to overload or policy
    
  3. 启动
    $ docker compose up -d

配置LibreChat使用自定义渠道

  1. 添加docker-compose.override.yml​内容如下

    services:
      api:
        volumes:
        - type: bind
          source: ./librechat.yaml
          target: /app/librechat.yaml
    
  2. 添加librechat.yaml​内容如下,注意备注修改

    version: 1.1.5
    cache: true
    endpoints:
      custom:
        - name: "Selfapi"
          apiKey: "" # 上面填写的api_keys中的api
          baseURL: "http://uniapi:8000/v1" # uni-api的地址,如果用docker 桥接模式可以用容器名:端口的形式
          models:
            default: ["Qwen/QwQ-32B-Preview", "Qwen/Qwen2.5-Coder-32B-Instruct", "o1-mini", "o1-preview", "gpt-4o-mini", "gpt-4o", "claude-3-5-sonnet", "command-r-plus"]
            fetch: true
          titleConvo: true
          titleModel: "QwQ-32B-Preview"
          summarize: false
          summaryModel: "QwQ-32B-Preview"
          forcePrompt: false
          modelDisplayLabel: "Selfapi"
          dropParams:
            - "stop"
            - "user"
            - "presence_penalty"
            - "frequency_penalty"
    

参考文档:librechat.yaml配置

  1. 重启LibreChat即可

配置Agents使LibreChat支持联网搜索

agents​必然是Librechat的一大杀器,继承于插件,容易配置。

  1. 配置.env​启用agents
    添加EXPERIMENTAL_AGENTS=true​到.env​文件

  2. 申请google search key
    申请地址,需要拿到引擎id和json的api key

  3. 把google申请的添加到.env​配置文件

    GOOGLE_SEARCH_API_KEY="" #json api key
    GOOGLE_CSE_ID="" 引擎id
    
  4. 配置agents
    M1ZlGLpoJB9NbYQ.png
    kdmoAZb6x4uCgV8.png​​taZxfAlIL5ebnWK.png

  5. 提供的模型中需要支持函数调用,另外需要搭配一些prompt才好。

后记

Ai还是需要有一个好的Prompt才好用的。