具体的にPythonやWordPressにAPI接続する最短コード例

LM Studio で RAG運用 TECH

0) 事前チェック(30秒)

  1. LM Studio を起動 → API タブ → “Enable Local Server” ON
  2. モデルを1つ Load(未ロードだと返答しません)
  3. 既定のエンドポイント: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/v1OPENAI_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)