Amazonで商品を見るセール会場へ

LM Studio APIの使い方|PythonとモデルID

LM Studio APIの使い方

結論から書くと、LM StudioのAPIは、サーバーを起動して http://127.0.0.1:1234/v1 に、/v1/models で返ったidを指定して送れば、Pythonから使えます。

認証は既定で無効なので、APIキーが要るのは、Server Settingsで認証を有効にしたときだけです。

Windows 11とLM Studio 0.4.27で、lmsコマンドからサーバーを起動し、Llama 3.2 3BにPythonから送るまでを実機で確かめました(2026年10月31日)。

認証の有効化など画面でしかできない操作は、公式資料の記載として分けて書いています。

決めること当方の値確かめ方
接続先(Base URL)http://127.0.0.1:1234/v1lms server status でポートを見る
モデルIDllama-3.2-3b-instructGET /v1/models の data[].id
APIキー不要(認証は既定で無効)認証を有効にしたときだけトークンを送る
送り先POST /v1/chat/completions返事の model 欄で答えたモデルを確かめる
LM Studio APIで最初にそろえる4つ(2026年10月31日、LM Studio 0.4.27で確認)

→ 関連:LM Studioの使い方(導入とモデルのダウンロードから始めるとき)

目次

確かめた環境

  • OS:Windows 11 Pro(10.0.26200)
  • LM Studio:0.4.27(winget の ElementLabs.LMStudio で導入)
  • lms:LM Studioに付属のCLI
  • モデル:lmstudio-community/Llama-3.2-3B-Instruct-GGUF の Q4_K_M(2.02GB)
  • PC:Ryzen 5 7530U・メモリ16GB・専用GPUなし(内蔵GPUのVulkanが選ばれていた)
  • Python:3.13(追加パッケージなし)
  • 確認日:2026年10月31日

出力に出たユーザー名入りのパスは、<ユーザー名>に置き換えて載せています。

スポンサーリンク

サーバーを起動する:lms server start と待ち受け先

lms は一度LM Studioを起動してから使う(実機)

導入した直後に付属の lms から起動しようとすると、次のエラーで止まりました。

Error: No running LM Studio or Bionic app, and no valid installation was found.
Error: Failed to start or connect to a local LM Studio or Bionic API server.

LM Studioを一度起動すると、C:\Users\<ユーザー名>\.lmstudio が作られ、その中の bin をLM StudioがユーザーのPATHに足しました。

そのあとは、新しいターミナルで lms がそのまま使えます。

起動とポートの確認

lms server start
lms server status
Success! Server is now running on port 1234
The server is running on port 1234.

ポートを指定しないと前回と同じ番号で起動する、とヘルプに書かれているので、番号は毎回このメッセージで確かめます。

画面から起動する場合は、DeveloperのページでStart serverを有効にする、と公式に書かれています(画面での操作は未確認)。

出典:LM Studio 公式 Local Server(2026年10月31日確認)

待ち受けは127.0.0.1だけ、localhostは少し遅れる

Get-NetTCPConnection で見ると、1234番は127.0.0.1だけで待ち受けていました。

LocalAddress LocalPort
------------ ---------
127.0.0.1         1234

localhostで呼ぶと、先にIPv6の [::1] を試してから127.0.0.1につなぐため、/v1/models の応答が0.004秒から0.22秒に延びました。

数値で書いておけば遠回りしないので、接続先は127.0.0.1にしておくのがおすすめです。

同じネットワークのほかの機器から使うには lms server start --bind 0.0.0.0 という指定がヘルプにありますが、この記事では試していません。

モデルIDを調べる:/v1/models の id を使う

モデルを取って一覧を見る(実機)

モデルは lms get にHugging FaceのURLを渡して取りました。

lms get "https://huggingface.co/lmstudio-community/Llama-3.2-3B-Instruct-GGUF" --gguf -y
lms ls
You have 2 models, taking up 2.10 GB of disk space.

LLM                      PARAMS    ARCH     SIZE       DEVICE
llama-3.2-3b-instruct    3B        Llama    2.02 GB    Local

EMBEDDING                               PARAMS    ARCH          SIZE        DEVICE
text-embedding-nomic-embed-text-v1.5              Nomic BERT    84.11 MB    Local

保存先は C:\Users\<ユーザー名>\.lmstudio\models\lmstudio-community\Llama-3.2-3B-Instruct-GGUF で、ファイルは2,019,377,440バイトでした。

検索語だけの lms get llama-3.2-3b は「No staff picks found」で止まったので、見つからないときはURLで渡します。

一覧の2つ目の埋め込みモデルは、自分では入れておらず、最初から入っていたものです。

/v1/models の返事と、読み込み前でも並ぶこと

curl.exe http://127.0.0.1:1234/v1/models
{
  "data": [
    {
      "id": "llama-3.2-3b-instruct",
      "object": "model",
      "owned_by": "organization_owner"
    },
    {
      "id": "text-embedding-nomic-embed-text-v1.5",
      "object": "model",
      "owned_by": "organization_owner"
    }
  ],
  "object": "list"
}

この時点の lms ps は「No models are currently loaded.」で、メモリに読み込む前から一覧に並んでいました。

公式のList Modelsにも、Just-In-Time読み込みが有効なら、ダウンロード済みのモデルがすべて並ぶことがあると書かれています。

埋め込み用のモデルも同じ一覧に混ざるので、チャットに使うのは種類がLLMのidです。

種類まで見たいときは、独自APIの /api/v1/models が type(embedding など)や size_bytes、loaded_instances を返します。

出典:LM Studio 公式 List Models(2026年10月31日確認)

IDを間違えても、読み込み済みのモデルが答えることがある(実機)

llama-3.2-3b-instruct を読み込んだ状態で、わざと llama-3.2-3b や no-such-model と送ると、どちらもHTTP 200で答えが返りました。

  "model": "llama-3.2-3b-instruct",
        "content": "Hello from you!",
HTTP 200

返事の model 欄は llama-3.2-3b-instruct で、答えたのは送ったIDではなく読み込み済みのモデルです。

lms unload –all で外してから同じように送ると、今度はHTTP 400になりました。

"message": "No models loaded. Please load a model in the developer page or use the 'lms load' command.",
"type": "invalid_request_error",
"param": "model"
HTTP 400

つまり、答えが返ったことは、指定したモデルが動いた証拠になりません。

複数のモデルを使い分けるときは、返事の model 欄が送ったIDと同じかを確かめてください。

Pythonから送る:追加パッケージなしの最小コード

次のコードを lmstudio_chat.py という名前で、UTF-8で保存します。

引数なしならモデルIDの一覧、IDを渡すとそのモデルに短いあいさつを頼みます。

import argparse
import json
import os
import urllib.error
import urllib.request

parser = argparse.ArgumentParser(description="LM StudioのローカルAPIを確認")
parser.add_argument("model", nargs="?", help="一覧に表示されたチャットモデルのID")
args = parser.parse_args()

base_url = "http://127.0.0.1:1234/v1"
headers = {"Content-Type": "application/json"}
token = os.environ.get("LM_API_TOKEN")
if token:
    headers["Authorization"] = "Bearer " + token

def request(path, payload=None):
    body = None if payload is None else json.dumps(payload).encode("utf-8")
    req = urllib.request.Request(base_url + path, data=body, headers=headers)
    with urllib.request.urlopen(req, timeout=120) as response:
        return json.load(response)

try:
    if args.model is None:
        result = request("/models")
        for item in result.get("data", []):
            print(item["id"])
        if not result.get("data"):
            print("モデルがありません。LM Studioのダウンロード・読み込みを確認してください。")
    else:
        result = request("/chat/completions", {
            "model": args.model,
            "messages": [{"role": "user", "content": "日本語で短い挨拶を1文だけ返してください。"}],
            "stream": False,
            "max_tokens": 256
        })
        print(result["choices"][0]["message"]["content"])
except urllib.error.HTTPError as error:
    print("HTTP", error.code)
    print(error.read().decode("utf-8", errors="replace"))
    raise SystemExit(1)
except urllib.error.URLError as error:
    print("接続エラー:", error.reason)
    raise SystemExit(1)
except TimeoutError:
    print("時間内に応答しませんでした。サーバーログとモデルの読み込み状態を確認してください。")
    raise SystemExit(1)

実行した結果と、かかった時間

py lmstudio_chat.py
py lmstudio_chat.py "llama-3.2-3b-instruct"
llama-3.2-3b-instruct
text-embedding-nomic-embed-text-v1.5

お日当りです。

1回目はモデルの読み込みから始まるので32.18秒かかり、すぐ続けた2回目は6.6秒でした。

1回目のあとの lms ps では、モデルが読み込まれ、60分使わなければ外れる設定(TTL 60m)になっていました。

IDENTIFIER               MODEL                    STATUS    SIZE       CONTEXT    PARALLEL    LOAD CONFIG    DEVICE    TTL
llama-3.2-3b-instruct    llama-3.2-3b-instruct    IDLE      2.02 GB    8192       4           LM Studio      Local     60m / 1h

答えの「お日当りです。」のとおり、3Bのモデルは日本語が不自然で、ここで確かめたのは通信の流れだけです。

日本語で使うモデルの選び方は、ローカルLLMのおすすめモデルにまとめています。

返事のJSONのどこを読むか

同じ送り先をcurlで呼んだときの返事は、次の形でした(英語で頼んだ例)。

{
  "object": "chat.completion",
  "model": "llama-3.2-3b-instruct",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Hello, how are you?",
        "reasoning_content": "",
        "tool_calls": []
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 44,
    "completion_tokens": 7,
    "total_tokens": 51
  }
}

本文は choices[0].message.content、答えたモデルは model、使ったトークン数は usage で読めます。

公式のChat Completionsの例は openai のPythonライブラリを使っていますが、この記事ではそのライブラリは入れて試していません。

出典:LM Studio 公式 Chat Completions(2026年10月31日確認)

APIキーは要る?認証を有効にしたときだけトークンを送る

公式の認証のページには、既定ではAPIリクエストに認証は要らない、と書かれています。

認証はLM Studio 0.4.0以降の機能で、有効にする手順は公式では次のとおりです。

  1. Developersのページを開き、Server Settingsで認証の切り替えをオンにする
  2. Manage Tokens から Create Token を押し、名前と権限を決める
  3. 表示されたトークンを控える(あとから再表示されない)
  4. リクエストの Authorization ヘッダーに Bearer とトークンを付けて送る

出典:LM Studio 公式 Authentication(2026年10月31日確認)

この認証の切り替えは画面でしかできず、lms のヘルプにも項目が無かったため、有効にした状態と401などの返事は確かめていません。

認証が無効だと、でたらめなトークンでも通る(実機)

認証が無効のまま、存在しないトークンを付けて /v1/models を呼ぶと、HTTP 200で一覧が返りました。

curl.exe -s -o NUL -w "HTTP %{http_code}" -H "Authorization: Bearer dummy-not-a-token" http://127.0.0.1:1234/v1/models
HTTP 200

このため、手元で通ったからといって、トークンが正しいとは言えません。

「OpenAI互換」は送り方の形の話で、LM StudioにつなぐためにOpenAIのAPIキーを取る必要はありません。

公式の例にある api_key="lm-studio" は仮の値で、認証を有効にしたサーバーでは、発行したトークンに置き換えます。

上のコードは、環境変数 LM_API_TOKEN があればそれを付けて送るので、トークンをコードに直接書かずに済みます。

エラーの切り分け:実機で出た返事

同じPCのPythonとcurlで、わざと間違えたときの返事をまとめました。

やったこと返事直し方
サーバーを止めて実行接続エラー: [WinError 10061](curlは終了コード7)lms server start
/v1 を二重に書いたHTTP 200 で Unexpected endpoint or methodBase URL を /v1 までにする
OpenAI形式を /api/v1/chat へHTTP 400、’input’ is required/v1/chat/completions へ送る
読み込み前に違うIDHTTP 400、No models loaded/v1/models のidを写す
読み込み済みで違うIDHTTP 200、別のモデルが答える返事の model 欄を見る
読み込み前に正しいID32.18秒後に答え(2回目は6.6秒)最初の1回は読み込み待ち
LM Studio 0.4.27で起こした間違いと返事(2026年10月31日)

とくに注意したいのは /v1 の二重で、HTTPの番号は200なのに、本文が error になっていました。

{"error":"Unexpected endpoint or method. (GET /v1/v1/models)"}
HTTP 200

番号だけで成否を見るアプリでは、つながったように見えて答えが空になるので、本文の error も読みます。

サーバーを止めたときのPythonの表示は、次の1行でした。

接続エラー: [WinError 10061] 対象のコンピューターによって拒否されたため、接続できませんでした。

Ollamaでも同じ切り分けが使えるので、Ollamaに接続できない原因と対処も参考になります。

/v1 と /api/v1 は別のAPI

LM Studioには、ここで使ったOpenAI互換の /v1 のほかに、独自のREST APIが /api/v1 にあります。

項目OpenAI互換(/v1)独自REST(/api/v1)
チャット/v1/chat/completions/api/v1/chat
モデル一覧/v1/models/api/v1/models
読み込み・取得なしmodels/load・unload・download
向いている用途既存の互換クライアントモデルの管理・状態を持つ会話
公式のREST APIの説明から(2026年10月31日確認)

本文の形も違い、OpenAI形式のJSONを /api/v1/chat に送ると、上の表のとおりHTTP 400になりました。

出典:LM Studio 公式 REST API(2026年10月31日確認)、OpenAI Compatibility Endpoints(同)

使い終わったら止める

lms unload --all
lms server stop
Unloading "llama-3.2-3b-instruct"...
Unloaded 1 model.
Stopped the server on port 1234.

サーバーを止めても、LM Studio本体は裏で動いたままだったので、使わないときはアプリも終了します。

モデルのファイルは残るので、次は lms server start からすぐ再開できる状態です。

スポンサーリンク

まとめと次にやること

  1. lms server start で起動し、表示されたポートを控える
  2. 接続先は http://127.0.0.1:1234/v1 と数字で書く
  3. /v1/models のうち、種類がLLMのidをそのまま写す
  4. Pythonで1回送り、返事の model 欄と本文を確かめる
  5. 認証を有効にしたときだけ、トークンを環境変数から付ける

つながったあとは、次の記事が続きになります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

須澤 元貴のアバター 須澤 元貴 代表社員

MOTOKI合同会社 代表社員。
アニメ・映像業界とゲーム業界で、2D・UI・3D・アニメーション制作、映像編集、ツール制作に携わってきました。
現在はWordPressを中心にWebサイトの制作とカスタマイズを手がけています。
著書に『Unity デザイナーズ・バイブル』『Unityゲーム プログラミング・バイブル 2nd Generation』(ボーンデジタル)。
岡山県出身、埼玉県在住。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

生成AIのおすすめ書籍

周辺機器の優先度

目次