この記事を作った動機

 LibreChat を使っているうちに、色々躓いたことがあったので記録したい。躓いたことでなくてもまとめておきたいことは書きたい。

前提条件

環境構築をしたディレクトリが以下のパスになっている

 LibreChat の Docker 関連のファイルが以下のディレクトリにある事を前提に進める。通常であれば、各個人に合わせて作業して良い。私の場合はあくまで以下のパスにあるというだけである。

~/LibreChat

LLM サーバの構成と、LibreChatの関係

 以下の図のような関係になっている事を前提にする。

LLM server configulation

MainDesktop エンドポイント

  • エンドポイントまでのアドレスとポート番号の仮定
    http://192.168.x.a:8080/v1
  • 詳細な役割の説明
     純粋に llama.cpp を動かして1つのモデルを読み込んでいる LLM サーバ専用(Gemma-4-31Bを動かす専用)に割り当てた PC である。LibreChat はここではホストしていない。Intel ARC の XPU 環境であり、LM Studio ではそのポテンシャルを引き出せないため、llama.cpp を専用にコンパイルしてセットアップしてある。OpenAI 互換 API 経由で利用可能にしてある。

DataServer エンドポイント

  • エンドポイントまでのアドレスとポート番号の仮定
    http://192.168.x.b:1234/v1
  • 詳細な役割の説明
     LM Studio を使って LLM を動かしている。こちらは、MainDesktop と異なり、NVIDIA の CUDA 環境であるため、LM Studio でポテンシャルを引き出すことができることから、LM Studio を使っている。LM Studio 標準の開発者機能から、OpenAI 互換 API 経由で利用可能にしてある。基本的に LM Studio の LLM サーバーが、LibreChat の要求に答えて選択されたモデルを自動的にロードし動かしてくれるため、いろんなモデルを動かすために使う。

その他諸々

  • Linux 環境である
  • dockerdocker-composeパッケージが入っている
  • 全ては LAN 内で行われ、グローバル空間からのアクセスはできないようにしてある環境である。外出先からの利用はすべて VPN を通じて行う。

基本的な操作

設定ファイル保存場所

~/LibreChat/librechat.yaml

設定反映方法 (librechat.yaml)

 私の場合は、~/LibreChatにおいて以下のスクリプトをrestart.shとして配置し、実行することでlibrechat.yamlの変更内容を反映できる事を確認した。docker グループに入っていないユーザは、管理者権限を付与してコマンドを実行することで docker を操作できる。

#!/bin/bash
sudo docker compose down
sudo docker compose up -d

エンドポイント (OpenAI API 互換サーバ) の追加方法

 今回は、例として LM Studio の開発者モードで動かすことができる LLM サーバ (エンドポイント) を追加する例を以下に示す。前提として、既に LM Studio の LLM サーバーは動いていることがある。OpenAI 互換 APIサーバのエンドポイントは、custom セクションの中に記述する。利用可能なモデルは、LM Studio に対して、LibreChat が自動取得するように今回は設定しており、fetch: trueとしている。これについては注意点があり、lm-studio-のネットワーク設定の制限の引っかかっているを参照すること。

エンドポイントの追加前の設定例

# ...
endpoints:
  custom:
    - name: 'MainDesktop'
      apiKey: 'not-needed'
      baseURL: 'http://192.168.x.a:8080/v1'
      models:
        default: ['Gemma-4-31B']
        fetch: false
      titleConvo: true
      titleModel: 'Gemma-4-31B'
      modelDisplayLabel: 'Gemma-4-31B'

modelSpecs:
  list:
    - name: "Main"
      label: "Default: Llama-CPP"
      description: "My primary local model"
      preset:
        endpoint: "custom"
        model: "Gemma-4-31B"
# ...

エンドポイントの追加後の設定例

# ...
endpoints:
  custom:
    - name: 'MainDesktop'
      apiKey: 'not-needed'
      baseURL: 'http://192.168.x.a:8080/v1'
      models:
        default: ['Gemma-4-31B']
        fetch: false
      titleConvo: true
      titleModel: 'Gemma-4-31B'
      modelDisplayLabel: 'Gemma-4-31B'
    - name: 'DataServer'
      apiKey: 'not-needed'
      baseURL: 'http://192.168.x.b:1234/v1'
      models: 
        default: ['test-model'] 
        fetch: true

modelSpecs:
  list:
    - name: "Main"
      label: "Default: Llama-CPP"
      description: "My primary local model"
      preset:
        endpoint: "custom"
        model: "Gemma-4-31B"
# ...

躓いたこと

LM Studio の API サーバーを使いたい

エンドポイントの指定が間違っている (Linux 環境特有)

 Linux 環境の Docker では、host.docker.internal を Docker のホストマシンの localhost にアクセスするために使うことができない。私は単純にホストマシンの物理 NIC に割り当てられている IP(192.168.x.b) を直接指定することにした。

LM Studio のネットワーク設定の制限の引っかかっている

 Docker コンテナからのアクセスは別のネットワークからのアクセスとなるからか、以下の設定をしないと LM Studio のログにはアクセスできたように見えても、LibreChatは動作しなかった。動作に失敗したときのLibreChatの設定は、costomエンドポイントの設定をすべて無視して、デフォルトのOpenAIなどのリスティングしかしなくなる。つまりは、今まで正常に動いていたエンドポイントまで巻き添えにして、機能しなくなるので注意する。

LM Studio ネットワーク設定の様子

エンドポイントとモデル名を変更したら、過去のチャットを継続できなくなった

 LibreChat の場合は、既存のセッションに対して柔軟でないらしく、既存のLLM サーバに対するエンドポイント名とモデル名を変更すると、セッションを継続して利用できなくなってしまう。

 具体的には、設定を以下のように変更したあと、過去のセッションにアクセスすると、“モデル選択"と表示されそのままでは新しいプロンプトを受け付けず、かと行って新しく設定したセッションを選択しても、新しいセッションに飛ばされて、過去のセッションは継続できないということになった。

  • 古い設定の例 (librechat.yaml)
# ...
endpoints:
  custom:
    - name: 'Llama-CPP'
      apiKey: 'not-needed'
      baseURL: 'http://192.168.x.a:8080/v1'
      models:
        default: ['Local-Custom']
        fetch: false
      titleConvo: true
      titleModel: 'Local-Custom'
      modelDisplayLabel: 'Llama.cpp'

modelSpecs:
  list:
    - name: "Llama-CPP"
      label: "Default: Llama-CPP"
      description: "My primary local model"
      preset:
        endpoint: "custom"
        model: "Local-Custom"
# ...
  • 新しい設定の例 (librechat.yaml)
# ...
endpoints:
  custom:
    - name: 'MainDesktop'
      apiKey: 'not-needed'
      baseURL: 'http://192.168.x.a:8080/v1'
      models:
        default: ['Gemma-4-31B']
        fetch: false
      titleConvo: true
      titleModel: 'Gemma-4-31B'
      modelDisplayLabel: 'Gemma-4-31B'

modelSpecs:
  list:
    - name: "Main"
      label: "Default: Llama-CPP"
      description: "My primary local model"
      preset:
        endpoint: "custom"
        model: "Gemma-4-31B"
# ...

 これに関しては、LibreChat が docker コンテナのスタックに含んでいる DB にアクセスして、古いセッションのエンドポイント名とモデル名を過去のものから新しいものに更新すること(Gemma4提案)で、古いセッションでも継続して利用できるようになる事を確認した。以下に DB の操作例を示す。

DB 操作例の前提

  • 古いモデル名
    Local-Custom
  • 新しいモデル名
    Gemma-4-31B
  • 古いエンドポイント名
    Llama-CPP
  • 新しいエンドポイント名
    MainDesktop
  • DB コンテナ名
    chat-mongodb

DB にアクセス

docker exec -it chat-mongodb mongosh

モデル名変更

use LibreChat;
db.conversations.distinct("model");
-- [
--   'Gemma-4-31B',
--   'Local-Custom',
--   'gemini-3-flash-preview',
--   'google/gemma-3n-e4b'
-- ]
db.conversations.updateMany(
  { model: "Local-Custom" }, 
  { $set: { model: "Gemma-4-31B" } }
);
-- {
--   acknowledged: true,
--   insertedId: null,
--   matchedCount: 486,
--   modifiedCount: 486,
--   upsertedCount: 0
-- }
db.conversations.distinct("model")
-- [ 'Gemma-4-31B', 'gemini-3-flash-preview', 'google/gemma-3n-e4b' ]

エンドポイント名変更

db.conversations.distinct("endpoint")
-- [ 'DataServer', 'Llama-CPP', 'MainDesktop', 'google' ]
db.conversations.updateMany(
  { endpoint: "Llama-CPP" }, 
  { $set: { endpoint: "MainDesktop" } }
);
-- {
--   acknowledged: true,
--   insertedId: null,
--   matchedCount: 486,
--   modifiedCount: 486,
--   upsertedCount: 0
-- }
db.conversations.distinct("endpoint")
-- [ 'DataServer', 'MainDesktop', 'google' ]

関連する記事

使った画像とか

参考にしたサイトとか