ChatGPTクローンのLibreChatでAmazon Bedrock Claude3を使う！

## この記事の目的
ChatGPTクローンを手軽に立ち上げる際に「[LibreChat](https://www.librechat.ai/)」は有力な選択肢になります。
実はLibreChatは「[LiteLLM](https://www.litellm.ai/)」というライブラリーを通じて、Amazon Bedrockを使うことも可能です。
しかし日本語の記事がほとんど見当たらないため、この記事でその手順を記します。

## LibreChatとは？
LibreChat は、複数のプロバイダーの最先端言語モデルを単一のインターフェースで利用できるようにする、無料のオープンソースAIチャットプラットフォームです。幅広いカスタマイズオプション、革新的な機能強化、AIサービスのシームレスな統合により、LibreChatは比類のない会話体験を提供します。

### LibreChatを選ぶ理由
🔓 **オープンソースかつ無料**
LibreChatは完全にオープンソースのプロジェクトであるため、制限や有料サブスクリプションなしに、ソフトウェアを自由に使用、変更、配布できます。

🤖 **複数プロバイダーのAIサポート**
LibreChatは、OpenAI、Azure、Anthropic、Googleなど、幅広いAIプロバイダーをサポートしています。異なるモデル間をシームレスに切り替え、それぞれの独自の機能を活用できます。

💻 **カスタマイズ可能で拡張性が高い**
モジュール設計と幅広いカスタマイズオプションにより、LibreChatは特定のニーズに合わせて調整できます。カスタムプリセットの作成と共有、プラグインの統合、プロジェクト開発への貢献も可能です。

## LibreChatのAmazon Bedrockサポート状況
前述のように、LibreChatは、OpenAI、Azure、Anthropic、GoogleなどのAIプロバイダーをサポートしています。
一方で、Amazon Bedrockを直接的にはサポートしていません。
これについては、以下のIssueのやりとりが参考になると思います。
https://github.com/danny-avila/LibreChat/issues/2620
このissueによると `Yup, adding native bedrock support is planned!` ということなので、対応予定はあるようです。
一方で、`You may could use LiteLLM as a temporary workaround. https://docs.litellm.ai/docs/providers/bedrock`
というコメントもあり、当面はLiteLLMを使う方法が紹介されています。

この記事では、LiteLLMを使っていきます。

## 手順の概要
まず前提として、今回の手順ではローカル環境にDockerを用いてLibreChatを立ち上げます。
もちろん、クラウドサービスにデプロイすることも可能ですが、その部分については触れません。（Bedrock固有の内容ではなくなるため）

手順としては、大きく2段階になります。

1. AWSでBedrockのモデルを有効化する
1. LibreChatに対してAmazon Bedrock接続の設定を行う

## 手順の詳細
### 1. AWSでBedrockのモデルを有効化する
この手順はここで詳細は説明せずに関連するリンクだけ提示します。
まずAWS公式のページは[こちら](https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/setting-up.html)です。
しかし、モデルを有効化するだけの場合にはこれを読んでも目的に到達することが難しいと思います。
したがって、みのるんさんの[Qiita記事#モデル有効化](https://qiita.com/minorun365/items/1a6d223e4227e201a509#%E3%83%A2%E3%83%87%E3%83%AB%E6%9C%89%E5%8A%B9%E5%8C%96)も貼っておきます。

### 2. LibreChatに対してAmazon Bedrock接続の設定を行う

以下のファイルを作成・編集して設定を行います。

- docker-compose.override.yml 
- litellm/config.yaml 
- librechat.yaml
- .env

#### docker-compose.override.yml
ここでは、
- apiサービスの設定ファイルのsourceを追加
- litellmサービスの定義

を行います。

```yaml:docker-compose.override.yml
version: '3.4'

# Please consult our docs for more info: https://www.librechat.ai/docs/configuration/docker_override

services:
# USE LIBRECHAT CONFIG FILE
  api:
    volumes:
    - type: bind
      source: ./librechat.yaml
      target: /app/librechat.yaml
# configure LiteLLM
  litellm:
    image: ghcr.io/berriai/litellm:main-latest
    environment:
      - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
      - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
      - AWS_REGION_NAME=${AWS_REGION_NAME}
    volumes:
      - ./litellm/config.yaml:/app/config.yaml
    ports:
      - "127.0.0.1:3000:3000"
    command:
      - /bin/sh
      - -c
      - |
        pip install async_generator
        litellm --config '/app/config.yaml' --host 0.0.0.0 --port 3000 --num_workers 8
    entrypoint: []

```

#### litellm/config.yaml 

Bedrock Claude3のモデルリストを定義します。

```yaml:litellm/config.yaml
model_list:
  - model_name: claude-3-opus
    litellm_params:
      model: bedrock/anthropic.claude-3-opus-20240229-v1:0
      max_tokens: 4096
  - model_name: claude-3-sonnet
    litellm_params:
      model: bedrock/anthropic.claude-3-sonnet-20240229-v1:0
      max_tokens: 4096
  - model_name: claude-3-haiku
    litellm_params:
      model: bedrock/anthropic.claude-3-haiku-20240307-v1:0
      max_tokens: 4096

litellm_settings:
  drop_params: True
  set_verbose: True

general_settings:
  master_key: sk-1234

```

#### librechat.yaml

customのエンドポイントとしてAmazon Bedrockを設定します。

```yaml:librechat.yaml
model_list:
  - model_name: claude-3-opus
    litellm_params:
      model: bedrock/anthropic.claude-3-opus-20240229-v1:0
      max_tokens: 4096
  - model_name: claude-3-sonnet
    litellm_params:
      model: bedrock/anthropic.claude-3-sonnet-20240229-v1:0
      max_tokens: 4096
  - model_name: claude-3-haiku
    litellm_params:
      model: bedrock/anthropic.claude-3-haiku-20240307-v1:0
      max_tokens: 4096

litellm_settings:
  drop_params: True
  set_verbose: True

general_settings:
  master_key: sk-1234

```

#### .env
:::note warn
当然ながら.envはgitにコミットしないでください。（.gitigonreにもともと含まれています）
なお、アクセスキーについては、「Bedrockの読み取り権限のみを保持するポリシーをアタッチする」など最小限の権限にすることを強くお勧めします。
:::
.env.exampleをコピーし、以下の記述を追加してください。

```
# 追加箇所だけ記載(XXXXXXXXXの箇所は適宜変更してください)
#==================================================#
# AWS configuration                                #
#==================================================#
AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXX
AWS_REGION_NAME=XXXXXXXXXX

```

## 動作の様子
以下のようにChatGPTクローンとして最低限のチャット機能が動作します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/66433964-3052-3a06-e15d-738898667348.png)


## 参考記事

https://autoize.com/deploy-anthropic-claude-3-with-ai-models-as-a-service/

https://blog.gmo.media/internal-chatgpt

https://zenn.dev/gmomedia/articles/c5fb80dd75468c