0) 事前チェック(30秒)
- LM Studio を起動 → API タブ → “Enable Local Server” ON
- モデルを1つ Load(未ロードだと返答しません)
- 既定のエンドポイント:
http://localhost:1234/v1
(ポートは UI で確認可)
1) Python(公式 OpenAI SDK 互換で最短)
# pip install openai>=1.0.0
from openai import OpenAI
# LM Studio は OpenAI 互換。base_url とダミー api_key を指定して使います。
client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio")
resp = client.chat.completions.create(
model="あなたがLM StudioでLoad中のモデル名", # 例: "llama-3-4b-instruct"
messages=[{"role": "user", "content": "こんにちは。要約のデモをお願いします。"}],
)
print(resp.choices[0].message.content)
Python:ストリーミング(逐次表示)
from openai import OpenAI
client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio")
with client.chat.completions.stream(
model="llama-3-4b-instruct",
messages=[{"role": "user", "content": "ストリーミングのサンプルを書いて"}],
) as stream:
for event in stream:
if event.type == "chunk":
print(event.delta, end="", flush=True)
うまくいかない時は
requestsに切り替えて素朴に叩くとデバッグしやすいです。
import requests, json
url = "http://localhost:1234/v1/chat/completions"
payload = {
"model": "llama-3-4b-instruct",
"messages": [{"role": "user", "content": "Hello from raw requests"}],
}
r = requests.post(url, json=payload, timeout=60)
print(r.status_code, r.text)
2) Node.js(fetch で最短)
// node >=18 ならグローバル fetch 利用可
const res = await fetch("http://localhost:1234/v1/chat/completions", {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify({
model: "llama-3-4b-instruct",
messages: [{role: "user", content: "Node.jsから接続テスト"}],
}),
});
const data = await res.json();
console.log(data.choices[0].message.content);
3) cURL(疎通テストの定番)
curl http://localhost:1234/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model":"llama-3-4b-instruct",
"messages":[{"role":"user","content":"疎通テストです"}]
}'
4) WordPress 連携(最短ショートコード)
functions.php か小さな mu-plugin に貼るだけの超最小実装。
[lmstudio_chat prompt=”こんにちは”] で出力します。
// 最小:LM Studio へ POST して返答を表示するショートコード
add_shortcode('lmstudio_chat', function($atts){
$a = shortcode_atts(['prompt' => 'こんにちは'], $atts);
$endpoint = 'http://localhost:1234/v1/chat/completions';
$body = [
'model' => 'llama-3-4b-instruct', // LM StudioでLoad中のモデル名に合わせる
'messages' => [
['role' => 'user', 'content' => $a['prompt']]
],
];
$response = wp_remote_post($endpoint, [
'headers' => ['Content-Type' => 'application/json'],
'body' => wp_json_encode($body),
'timeout' => 30,
]);
if (is_wp_error($response)) {
return 'LM Studio API エラー: ' . esc_html($response->get_error_message());
}
$code = wp_remote_retrieve_response_code($response);
$data = json_decode(wp_remote_retrieve_body($response), true);
if ($code !== 200 || !isset($data['choices'][0]['message']['content'])) {
return 'LM Studio からの応答が不正です。';
}
return esc_html($data['choices'][0]['message']['content']);
});
- 使い方: 投稿本文に
[lmstudio_chat prompt="要約:この段落を2文で説明して"](※全角を半角に) - 本番は nonce / 権限チェック / キャッシュ を入れて堅牢化してください。
5) VS Code / CLI に“自分API”をつなぐコツ(超要点)
- VS Code拡張は多くが OpenAI 互換先を指定できます(base URL を
http://localhost:1234/v1)。 - 環境変数:
OPENAI_API_BASE=http://localhost:1234/v1/OPENAI_API_KEY=lm-studioと置くと流用しやすい。 - CLI は上の Python/Node サンプルをコマンド化すればOK。
6) RAG と API を一緒に使うには?
- UI 側(LM Studio本体)で「Docs/Knowledge を有効にした状態」でモデルをロードしておけば、
そのモデルに対する API 呼び出しでも 裏で RAG が効いた応答になります。 - バージョンにより Knowledge ソース指定のパラメータが公開されていない場合があります。
その場合は「UIで選択中の Knowledge を使う」のが安定。
(※もしあなたの版で API パラメータ指定が可能なら、後でそこだけ差し替えればOKです)
7) よくあるハマりどころ(先に潰す)
- モデル未ロード → 何も返ってこない / 500 っぽいエラー
- CORS(フロント直叩き)→ WordPress などサーバー側から叩くのが安全
- 巨大プロンプト → タイムアウト。まず疎通は短文で確認
- 外部公開するなら:Nginx で
http://localhost:1234を reverse proxy → Basic 認証 / IP 制限(超重要) - RAGが効かない → Chat 画面で Knowledge Source を選び直し → そのモデルをロードし直してから API
8) 超ミニ応用例:Python から “社内 PDF RAG モデル” を指名して呼ぶ
※バージョンにより Knowledge 指定の API パラメータが未公開のものがあります。
その場合は UI 上で RAG/Docs を紐づけたモデルをロードしてから叩いてください。
from openai import OpenAI
client = OpenAI(base_url="http://localhost:1234/v1", api_key="lm-studio")
# 例: RAG を紐づけてロード済みのモデル名を使う
r = client.chat.completions.create(
model="llama-3-4b-instruct", # RAG付きでロード中のもの
messages=[{
"role": "user",
"content": "登録済みマニュアルの手順Aを3行で要約し、該当セクション名も出して"
}],
temperature=0.2
)
print(r.choices[0].message.content)

