ローカルAI・PC実践ガイド

LM StudioをLAN内の別PCから使う方法|認証と公開範囲を確認

LM StudioをLAN内の別PCから使う方法 — 公開前に確認したい安全設定
目次

デスクトップPCに入れたモデルを、ソファで使うノートPCやタブレットから呼び出せたら便利ですよね。同じLANにある端末なら、LM StudioのAPIサーバーへつなぐ方法があります。接続する側へ、モデルをもう一つダウンロードする必要はありません。

まず、使わせる端末を決めましょう。その後、LM Studioを動かすPCの中でAPIと認証を確かめ、準備ができてからLANへ広げます。先に公開して後から認証を付けると、設定途中でもほかの端末から届く可能性があるためです。

まず、LM Studioを動かすPC自身から回答を受け取る

最初は、モデルを動かすPC自身から使ってみます。モデル一覧を取り、短い質問に回答が返るところまで進めましょう。ポートが1234なら、接続先は次の形です。

http://localhost:1234

1234は例として使っています。CLIの起動資料では、ポートを省略すると前回使った値を利用すると説明されています。まずサーバー画面に出ている実際のURLとポートを控え、この先の例も手元の値へ置き換えてください。

まず次の認証設定を済ませ、待ち受けはlocalhostのままで、下の生成例を試します。以下はLM Studio公式のChat Completions仕様に基づく案内です。本稿では二台間のリクエスト実行を確認していません。

PowerShellで一覧からモデルIDを選び、回答を受け取る

環境変数LM_API_TOKENへ用意済みのtokenを使います。値をコードへ貼り付けず、モデルを動かすPCで次を実行してください。1234は実際のポートへ合わせます。PowerShellのcurlエイリアスやJSONの引用符を避けるため、Invoke-RestMethodを使います。

$baseUrl = 'http://localhost:1234'
if (-not $env:LM_API_TOKEN) { throw '環境変数LM_API_TOKENを用意してください' }
$headers = @{ Authorization = "Bearer $env:LM_API_TOKEN" }
$models = Invoke-RestMethod -Uri "$baseUrl/v1/models" -Headers $headers
$models.data | Select-Object id
$modelId = Read-Host '一覧に出た、使う対話モデルのidを入力'
if ($modelId -notin @($models.data.id)) { throw '一覧にあるidを指定してください' }
$body = @{
    model = $modelId
    messages = @(@{ role = 'user'; content = '日本語で一文だけ挨拶してください' })
    max_tokens = 128
    stream = $false
} | ConvertTo-Json -Depth 5
$reply = Invoke-RestMethod -Method Post -Uri "$baseUrl/v1/chat/completions" `
    -Headers $headers -ContentType 'application/json; charset=utf-8' `
    -Body ([System.Text.Encoding]::UTF8.GetBytes($body))
$reply.choices[0].message.content
$reply.choices[0].finish_reason

一覧のidをそのまま指定します。表示名を推測して入力せず、LM Studioで読み込む対話用モデルと対応させてください。回答本文はchoices[0].message.contentです。finish_reasonがlengthなら生成上限に達しているので、空の回答や途中の文を成功と数えず、上限やモデルの出力を確認します。

macOS・Linuxで同じ要求を送る

こちらもLM_API_TOKENが既存の環境変数にある前提です。最初の一覧のdata内にある対話モデルのidを読み、MODEL_IDへコピーします。下の一覧のidをここへ貼るは置き換え箇所であり、実在するモデル名ではありません。

BASE_URL='http://localhost:1234'
curl --fail-with-body "$BASE_URL/v1/models" \
  -H "Authorization: Bearer $LM_API_TOKEN"
MODEL_ID='一覧のidをここへ貼る'
curl --fail-with-body "$BASE_URL/v1/chat/completions" \
  -H "Authorization: Bearer $LM_API_TOKEN" \
  -H 'Content-Type: application/json' \
  --data-binary @- <<EOF
{"model":"$MODEL_ID","messages":[{"role":"user","content":"日本語で一文だけ挨拶してください"}],"max_tokens":128,"stream":false}
EOF

JSON応答のchoicesの最初の要素にあるmessage.contentが回答です。モデルIDに引用符などJSONで特別な文字が含まれる場合は、上のPowerShell例のようにJSONを組み立てるクライアントを使ってください。ここへ掲載したコードや説明は成功ログではありません。

同じPCからでも回答が返らないなら、LANの設定へ進む前に、サーバーの起動状態、ポート、読み込んだモデル名を見ます。localhost宛てに通った短い要求は、そのまま残しておきましょう。別PCで試すときに接続先だけ替えれば、ほかの条件をそろえて比べられます。

LANへ広げる前に、認証を必須にする

LM StudioのDeveloper画面でServer Settingsを開き、Require Authenticationを有効にします。公式の認証資料によると、API token認証は0.4.0以降の機能で、既定では必須になっていません。LAN用の設定を始める前に、自分の版と設定を確認してください。

Manage Tokensで、どの接続用か分かる名前のtokenを作ります。権限は、モデルを使うために必要な操作を選びましょう。値は作成後に再表示できないので、その場でコピーし、自分の秘密情報の保管先へ保存してください。

接続するアプリからは、次のヘッダーを要求に付けます。<API_TOKEN>を、作成したtokenの値へ置き換えます。

Authorization: Bearer <API_TOKEN>

tokenは接続するための秘密情報です。公開リポジトリや共有チャット、利用者へ渡すブラウザー用JavaScriptには入れないでください。画面やログを見せるときも、値が映り込んでいないか確かめます。

待ち受け先はまだlocalhostのままにして、同じ保護対象APIへtokenなし、tokenありの順に要求を送ります。たとえば/v1/modelsなら、なしでは認証エラー、正しいtokenありではモデル一覧が返ることを見ます。認証を有効にした後は、REST APIもSDKもtokenが必要になります。

接続させるLANと端末を決める

次は、LM StudioのPCと、使わせる別PCやタブレットが、どのWi-FiやLANにつながっているかを確認します。家庭用と来客用のWi-Fiが分かれていれば、名前が似ていても同じ接続先とは限りません。社内の端末なら、管理者の接続方針に合わせてください。

tokenで利用者を確かめることと、通信を暗号化することは別です。この記事のhttp://には暗号化の設定を含めていません。信頼できない共有ネットワークへtokenや機密情報を送らず、そこで使う必要がある場合は暗号化された経路を別に用意します。

Windows Firewallも、必要なアプリまたはポートと、接続させる端末・アドレス範囲へ許可を絞ります。適用先をプライベートネットワークだけにするのかも見てください。接続のためにファイアウォール全体を無効にせず、ノートPCでは自宅のルールが外出先でも働かないかを確かめましょう。

接続させる範囲が決まったら、サーバーPCのLAN内IP、ポート、認証の有効状態、許可する端末とWi-Fiを控えます。次は、その情報から別PCで使うURLを作ります。

待ち受けを切り替え、別PCから使うURLを確認する

サーバーへ接続中のアプリがあれば作業を終え、サーバーを停止してから設定を変えます。Server SettingsのServe on Local Networkを有効にして起動すると、サーバーに表示されるAPIのURLが変わります。認証が有効なことも再確認してください。

CLIを使う場合、公式のLAN公開手順は次の指定を案内しています。ポートを省略した例なので、起動後に実際の値を確認します。

lms server start --bind 0.0.0.0

0.0.0.0は、サーバーPCのすべてのIPv4インターフェースで接続を待つ指定です。接続する別PCへ入力するURLではありません。LANやVPNを複数使っていれば、それらも待ち受けの対象になるため、決めた接続元の制限と合うかを見てください。

かがり

別のPCでも、localhostって入れれば使えるの?

ロコ

そのPC自身につながってしまうんだよ。認証を確かめてから、モデルを動かすPCのアドレスを使おう。

別PCからは、LM Studioを動かすPCのLAN内IPへ接続します。たとえばサーバーのIPが192.168.1.50、ポートが1234なら、次のURLです。

http://192.168.1.50:1234

192.168.1.50は例です。サーバーに表示された自分のアドレスへ替えてください。別PCでlocalhostや127.0.0.1と書くと、その別PC自身を指します。モデルを動かすデスクトップPCへ届かないので、ここは取り違えやすいところです。

別PCでも、認証なしの拒否と認証ありの成功を確かめる

許可した端末で、先ほど同じPC内から試した保護対象APIを呼びます。まずtokenなし、次に正しいtokenありで比べましょう。ホーム画面を開けただけでは、APIに認証が掛かっているかまでは確かめられません。

モデル一覧をcurlで試すなら、tokenなしは次の形になります。WindowsのPowerShellでは、先頭のcurlをcurl.exeにしてください。

curl -i http://192.168.1.50:1234/v1/models

tokenありの要求では、URLを変えずにAuthorizationヘッダーを追加します。次は、tokenを環境変数LM_API_TOKENへ用意したmacOS・Linuxの例です。値は手元の秘密情報の管理方法で用意し、公開するコードや要求JSONへ直接書かないようにしましょう。

curl -i http://192.168.1.50:1234/v1/models -H "Authorization: Bearer $LM_API_TOKEN"

PowerShellでは、curl.exeを使い、ヘッダーを-H "Authorization: Bearer $env:LM_API_TOKEN"とします。

確かめたいのは、tokenなしが認証エラーで拒否され、tokenありはモデル一覧を受け取れることです。期待した結果と違う場合は、返ってきたエラーから次に見る場所を決めます。

かがり

どっちもつながらないわ。認証が強すぎるのかしら……。

ロコ

まだ認証のところまで届いていないかもしれないよ。まず同じPCから通るか、次に別PCが同じIPとポートを見ているか確かめよう。

タイムアウトや接続拒否では、認証を調べるところまで届いていない可能性があり、「認証で守られている」とは判断できません。同じPCからtoken付きで一覧を取れるのに別PCだけタイムアウトするなら、先にLANの待ち受け、接続先、Firewallへ戻ります。認証を無効にして通す方法では、どこが原因だったかを切り分けにくくなります。反対に、別PCまで認証エラーが返ったならサーバーへ届く経路は通っているので、次はヘッダーとtokenの権限を見ます。以下は確認の進め方で、本稿で二台を接続して得た検証結果ではありません。

得られた結果 次にすること
どちらも接続できない サーバーの起動、実際のIPとポート、待ち受け、端末間の経路とFirewallを確認する
tokenなしは認証エラー、ありはモデル一覧が返る 同じ端末から短い生成要求を送ってみる
tokenありでも認証・権限エラーになる ヘッダー、tokenの有効性、その操作の権限を確認する
tokenなしでも保護対象APIが成功する サーバーを停止し、接続先と認証設定を確認してから試し直す

一覧を受け取れたら、冒頭の生成例を別PCでも実行します。PowerShellは$baseUrl、macOS・LinuxはBASE_URLを、たとえばhttp://192.168.1.50:1234のような実際のLAN内IPへ替えます。tokenはその別PCの環境変数にも用意し、モデルID・入力・生成上限はlocalhostで成功した要求とそろえます。回答が返れば、そのURLと要求を使いたいアプリへ設定できます。管理者が認めた範囲で、許可していない端末からは届かないことも確かめましょう。

一覧は返るのに生成だけ失敗する場合は、エラー本文とサーバーのログを照らして次を分けます。

生成要求の結果 戻る場所
認証・権限エラー 同じtokenを送っているか、生成操作が許可されているか
モデルが見つからない・読み込みに失敗する modelが一覧のidと一致するか、対話モデルをサーバー側で読み込めるか、メモリに余裕があるか
要求形式のエラー /v1/chat/completionsへのPOSTか、Content-Type、model、messagesの構造が例と合うか

ブラウザーだけ失敗する場合に、CORSを確認する

デスクトップアプリや自作サーバーでは使えるのに、ブラウザー上のアプリだけ失敗するなら、ブラウザーのエラーを見ます。APIとアプリのオリジン、つまりURLの方式・ホスト・ポートの組み合わせが違う場合、CORSの設定が関係することがあります。

CORSが必要と分かった場合、CLIでは次のように指定できます。サーバーを停止し、1234を実際のポートへ合わせてから起動します。LANへの待ち受けを続ける例です。

lms server start --bind 0.0.0.0 --port 1234 --cors

--corsでCORSを有効にします。このときも、Server Settingsで必須にした認証は維持してください。起動後はURLと認証状態をもう一度見ます。公式の起動資料も、CORSを使う場合は認証を推奨しています。

CORSが扱うのはブラウザーからのアクセスです。token認証やFirewallの代わりにはならず、IPやポート、モデルの読み込みの問題も解決しません。ブラウザーだけで失敗しているのかを先に分けると、関係のない設定を増やさずに済みます。

同じLANで使う設定ができたら、必要な機能を一つずつ足す

初回は、認証を必須にしたサーバーと、許可した別端末の間で、短い生成が通れば一段落です。構成を控えてから、必要な機能を一つずつ足してみましょう。複数モデルや長い文脈、Web連携、MCPまで同時に変えなければ、困ったときにも戻る場所が分かります。

外出先からも使いたくなったら、VPNなどの経路を別に検討します。LANで使えたからといって、ルーターのポート転送でそのままインターネットへ公開しないでください。使わせる相手、認証、通信の保護を改めて決めてから進めましょう。

まとめ

  • LM Studioは既定でlocalhostへ待ち受け、--bind 0.0.0.0またはServe on Local NetworkでLANから接続できる
  • 127.0.0.1以外へbindすると接続範囲が広がるため、LM Studio公式も認証の有効化を推奨している
  • API token認証はLM Studio 0.4.0以降で利用でき、認証を有効にするとREST APIやSDKの要求に有効なtokenが必要になる
  • LAN公開とインターネット公開は分け、ルーターのport forwardingなどで直接外部公開しない

公式サイト

各リンクから、配布元のファイルや説明を開けます。