😎

librechatをLMstudioで動かす

に公開

LibreChatをLM Studioで動かす 〜モデル自動取得までの設定ガイド〜

「手元のPCで動かしてるLLMを、イケてるUIのLibreChatから使いたい!」

この記事は、そんな願いを叶えるための設定ガイドです。Dockerで動くLibreChatから、ローカルPC上のLM Studioサーバーに接続し、さらにLM Studioで読み込んでいるモデルをLibreChatに自動で認識させる方法を解説します。

設定でちょっとハマったポイントもあったので、その辺りの試行錯誤も含めて共有しますね。

TL;DR (この記事の要点・最終設定)

忙しい方向けに、最終的にこうすればOK!という設定のポイントをまとめます。詳細は各章で!

  • librechat.yamlendpoints.custom にLM Studioの設定を追加:
    • name: 好きな名前 (例: "LMStudio")
    • baseURL:
      • Docker Desktopなら: http://host.docker.internal:<ポート番号>/v1
      • Linuxなど他環境なら: http://<ホストPCのIPアドレス>:<ポート番号>/v1
      • <ポート番号> はLM Studioのサーバーポート (デフォルト: 1234)
    • apiKey: 'dummy-key' など、空でない適当な文字列を設定 (LM Studio自体は不要でもLibreChatが要求)
    • models:
      • Workspace: true を設定 (これでモデルリスト自動取得!)
      • default: ['your-favorite-model'] のように、LM Studioで使うモデル名を最低1つ指定する (設定ファイルのバリデーションを通すため)
    • titleModel: models.default で指定したモデル名のどれかを指定する。
  • docker-compose.override.yamllibrechat.yaml をマウントするのを忘れずに。
# librechat.yaml の設定例 (LMStudio部分抜粋)
endpoints:
  custom:
    - name: "LMStudio"
      # apiKey: ダミーキーを設定 (空文字はNG)
      apiKey: ${LMSTUDIO_API_KEY:-'dummy-key-required-by-librechat'}
      # baseURL: 環境に合わせて設定。'/v1' を忘れずに!
      baseURL: ${LMSTUDIO_BASE_URL:-'http://host.docker.internal:1234/v1'}
      models:
        fetch: true # ★モデルリスト自動取得を有効化
        # ↓ 最低1つのモデル名を指定 (LM Studioで読み込む予定のモデル名)
        default: ['granite-3.3-2b-instruct']
      # titleModel: defaultリスト内のモデル名と合わせる
      titleModel: 'granite-3.3-2b-instruct'
      # ... 必要なら他のオプションも ...
# docker-compose.override.yaml の例
version: '3.8'
services:
  api: # LibreChatのAPIサービス名 (環境によって異なるかも)
    volumes:
      - ./librechat.yaml:/app/librechat.yaml # ローカルのファイルをコンテナにマウント

では、各設定の詳細と、なぜこの設定になったのかを見ていきましょう!

1. 基本設定: LM StudioをLibreChatに教える

結論: まずは、LibreChatの設定ファイル (librechat.yaml) に「LM Studioっていうエンドポイントがあるよ」と教えてあげる必要があります。そして、その設定ファイルをDockerコンテナから読み込めるように、docker-compose.override.yaml でマウントします。

手順:

  1. librechat.yaml を用意(なければLibreChatの公式リポジトリなどからテンプレートを取得)し、endpoints.custom: の下にLM Studio用の設定ブロックを追加します。(設定内容は後述)
  2. docker-compose.override.yaml を作成(または編集)し、volumes: を使って librechat.yaml をコンテナ内の /app/librechat.yaml にマウントします。(上のTL;DRの例参照)

なぜこうするの?: LibreChatは起動時に librechat.yaml を読み込んで、どんなAIモデルエンドポイントが利用可能かを判断します。docker-compose.override.yaml を使うことで、元の docker-compose.yaml を変更せずに、設定ファイルだけを差し替えることができます。

2. 接続のキモ: baseURL/v1host.docker.internal が大事

結論: Dockerコンテナ内のLibreChatからホストPCのLM Studioに接続するには、baseURL の指定が超重要です。

  • Docker Desktop (Mac/Windows) の場合: http://host.docker.internal:<ポート番号>/v1
  • Linuxなどの場合: http://<ホストPCのローカルIPアドレス>:<ポート番号>/v1
  • <ポート番号> はLM Studioを起動した際のサーバーポート(デフォルトは 1234が多い)です。
  • /v1 を絶対に忘れないでください! LM StudioのAPIは /v1 パス以下にあります。

設定したら、以下のコマンドでコンテナからLM Studioにアクセスできるか確認しましょう。モデル情報がJSONで返ってくればOK!

# api は docker-compose.yaml で定義されているLibreChat APIサービス名
docker-compose exec api curl -v http://host.docker.internal:1234/v1/models
# または (Linux等の場合、IPは自身のものに置き換え)
docker-compose exec api curl -v http://192.168.1.10:1234/v1/models

ここに至る経緯 (ハマりポイント):

  • 127.0.0.1 の罠: 最初、baseURLhttp://127.0.0.1:1234/v1 を指定したら、全く繋がりませんでした。よく考えたら 127.0.0.1 はDockerコンテナ自身を指すので当たり前でした😅
  • /v1 忘れ: 次にホストのIPアドレス (http://192.168.1.10:1234) を指定したのですが、これでもダメ。curl で叩いてみるとわかるのですが、LM StudioのAPIエンドポイントは /v1 が必要だったんですね。Docker Desktopなら host.docker.internal という便利な名前でホストPCを参照できるので、これを使うのが楽です。

3. モデルリスト自動取得 (Workspace: true) の正しい設定

結論: LM Studioで読み込んでいるモデルをLibreChatのUIに自動で反映させたいですよね!それには librechat.yaml で以下のように設定します。

  • models: ブロック内で Workspace: true を指定します。
  • default: ['any-valid-model-name'] のように、default キーに モデル名のリストを必ず指定 します。このリストには、実際にLM Studioで使う予定のモデル名を最低1つ入れてください。

この設定により、LibreChatは起動時やモデル選択時にLM Studioの /v1/models エンドポイントにアクセスし、利用可能なモデルリストを取得してくれます。Workspace: true の場合、models ブロック内に個別のモデル定義(model: 'local-model' など)を書く必要は基本的にありません。

ここに至る経緯 (ハマりポイント):

これが一番ハマったかもしれません...。

  1. 手動設定はOK: 最初は Workspace: false で、default: に使いたいモデル名を列挙し、各モデルの設定も書く方法で動いていました。でも、モデルを変えるたびに yaml を編集するのは面倒...。
  2. Workspace: true にしたら消えた!? ドキュメントを参考に Workspace: true に変更し、手動でのモデルリスト指定 (default: や個別定義) を削除したら、LibreChatのUIからLM Studioの項目が消えました😭 ログを見ると Invalid custom config file: models.default: Required と怒られています。どうやら models.default は必須項目のようです。
  3. default: [] (空リスト) でもダメ: じゃあ、必須なら空のリスト default: [] を指定すればいいのでは?と思って試したところ、今度は Invalid custom config file: models.default: Array must contain at least 1 element(s) というエラーが...。リストは空じゃダメらしい。
  4. 解決!: 結局、Workspace: true で自動取得する場合でも、models.default には最低1つ、有効なモデル名を指定しておく必要がある、というのが正解でした。これは設定ファイルのバリデーションルールを満たすため、そしておそらく自動取得に失敗した際のフォールバック用だと思われます。

4. 見落としがちな設定: apiKeytitleModel

結論: あと2つ、注意点があります。

  • apiKey: LM Studio自体はAPIキー不要ですが、LibreChatのカスタムエンドポイント設定では apiKey が必須項目になっています。空文字だとエラーになるので、'dummy-key''not-needed' など、適当な文字列を設定してください。
  • titleModel: 会話履歴のタイトルを自動生成する際に使われるモデルを指定します。このモデル名は、models.default リストに含まれているモデル名のいずれかを指定する必要があります。Workspace: true の場合も、models.default に書いたモデル名を指定しておきましょう。
# librechat.yaml の設定例 (抜粋)
endpoints:
  custom:
    - name: "LMStudio"
      # apiKey: ダミーでOK!空はダメ!
      apiKey: 'dummy-key-required-by-librechat'
      baseURL: 'http://host.docker.internal:1234/v1'
      models:
        fetch: true
        default: ['granite-3.3-2b-instruct', 'another-model']
      # titleModel: default リスト内のモデル名を指定
      titleModel: 'granite-3.3-2b-instruct'
      # ...

ここに至る経緯 (ハマりポイント):

  • 謎の Missing API Key エラー: LM Studioのサーバー設定でAPIキーを要求しないようにしていても、LibreChat側で apiKey を空にすると Missing API Key for LMStudio. エラーが出ました。これはLibreChat側の仕様のようで、ダミーのキーを入れることで回避できました。
  • titleModel の不一致: Workspace: true にした際、titleModel を古い設定のままにしていたらエラーになったことがありました。models.default と連動しているようなので、ここも忘れずに更新しましょう。

5. おまけ: YAMLエラーとの戦い

結論: librechat.yaml はYAMLファイルなので、インデント(字下げ)が超重要です。インデントがズレていると、LibreChat起動時に ZodError というスキーマ検証エラーがログに出力されます。

対処法: エラーメッセージの中に path: [ 'endpoints', 'custom', 0, 'models', 'default' ] のような形で、問題箇所のヒントが示されています。これを頼りに、librechat.yaml のインデントやスペルミスがないか、よーく確認しましょう。エディタのYAMLリンター機能を使うのもおすすめです。

おわりに

これで、Docker上のLibreChatからローカルのLM Studioを快適に利用できるようになったはずです!特に baseURL の指定方法と、Workspace: true を使う際の models.default の扱いは少し癖がありましたが、一度設定してしまえばモデルの追加・削除も楽になりますね。

この記事が、同じようにLibreChatとLM Studioの連携を目指す方の助けになれば嬉しいです。Happy Chatting!

Discussion