結論から書くと、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/v1 | lms server status でポートを見る |
| モデルID | llama-3.2-3b-instruct | GET /v1/models の data[].id |
| APIキー | 不要(認証は既定で無効) | 認証を有効にしたときだけトークンを送る |
| 送り先 | POST /v1/chat/completions | 返事の model 欄で答えたモデルを確かめる |
→ 関連: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 statusSuccess! 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 1234localhostで呼ぶと、先に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 lsYou 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以降の機能で、有効にする手順は公式では次のとおりです。
- Developersのページを開き、Server Settingsで認証の切り替えをオンにする
- Manage Tokens から Create Token を押し、名前と権限を決める
- 表示されたトークンを控える(あとから再表示されない)
- リクエストの 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/modelsHTTP 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 method | Base URL を /v1 までにする |
| OpenAI形式を /api/v1/chat へ | HTTP 400、’input’ is required | /v1/chat/completions へ送る |
| 読み込み前に違うID | HTTP 400、No models loaded | /v1/models のidを写す |
| 読み込み済みで違うID | HTTP 200、別のモデルが答える | 返事の model 欄を見る |
| 読み込み前に正しいID | 32.18秒後に答え(2回目は6.6秒) | 最初の1回は読み込み待ち |
とくに注意したいのは /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 |
| 向いている用途 | 既存の互換クライアント | モデルの管理・状態を持つ会話 |
本文の形も違い、OpenAI形式のJSONを /api/v1/chat に送ると、上の表のとおりHTTP 400になりました。
出典:LM Studio 公式 REST API(2026年10月31日確認)、OpenAI Compatibility Endpoints(同)
使い終わったら止める
lms unload --all
lms server stopUnloading "llama-3.2-3b-instruct"...
Unloaded 1 model.
Stopped the server on port 1234.サーバーを止めても、LM Studio本体は裏で動いたままだったので、使わないときはアプリも終了します。
モデルのファイルは残るので、次は lms server start からすぐ再開できる状態です。
まとめと次にやること
- lms server start で起動し、表示されたポートを控える
- 接続先は http://127.0.0.1:1234/v1 と数字で書く
- /v1/models のうち、種類がLLMのidをそのまま写す
- Pythonで1回送り、返事の model 欄と本文を確かめる
- 認証を有効にしたときだけ、トークンを環境変数から付ける
つながったあとは、次の記事が続きになります。
- モデルのダウンロードと画面の使い方:LM Studioの使い方
- 日本語で使うモデルを選ぶ:ローカルLLMのおすすめモデル
- 読み込みで落ちる:ローカルLLMのメモリ不足の切り分け
- PCで扱える規模を知る:ローカルLLMに必要なスペック
