Max Nardit
ローカル LLM

Share2Agent で Web ページを LM Studio に送る方法

LM Studio で動くローカル LLM モデルで Web ページを処理します。Share2Agent はページコンテンツを抽出し、LM Studio の OpenAI 互換 API を呼び出す Webhook レシーバーに送ります。データをクラウドに送ることなく、任意のページを要約、翻訳、分析できます。


前提条件

  • LM Studio がインストールされ、モデルがロード済み (lmstudio.ai)
  • LM Studio 内で ローカルサーバーが起動している ("Developer" タブ)
  • Share2Agent Chrome 拡張機能がインストール済み
  • Python 3.10+

ステップ 1: LM Studio サーバーを起動する

  1. LM Studio を開いてモデルをロードします (例: Llama 3.2、Mistral、Phi-3)。
  2. Developer タブに移動します。
  3. Start Server をクリックします。サーバーはデフォルトで http://localhost:1234 で動作します。
  4. 動作を確認します。
bash
curl http://localhost:1234/v1/models

ロード済みモデルを示す JSON レスポンスが返るはずです。


ステップ 2: Webhook レシーバーを作成する

このスクリプトは Share2Agent からページを受信し、LM Studio の OpenAI 互換エンドポイントにコンテンツを送ります。

これを lmstudio_receiver.py として保存します。

python
#!/usr/bin/env python3
"""Share2Agent → LM Studio webhook receiver."""
 
import json
import urllib.request
from datetime import datetime
from http.server import HTTPServer, BaseHTTPRequestHandler
from pathlib import Path
 
PORT = 9876
OUTPUT_DIR = Path.home() / "share2agent-lmstudio"
LM_STUDIO_URL = "http://localhost:1234/v1/chat/completions"
DEFAULT_PROMPT = "Summarize this article in 3-5 bullet points."
 
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
 
 
def call_lm_studio(prompt: str, content: str) -> str:
    payload = json.dumps({
        "messages": [
            {"role": "system", "content": prompt},
            {"role": "user", "content": content},
        ],
        "temperature": 0.3,
        "max_tokens": 2048,
        "stream": False,
    }).encode()
    req = urllib.request.Request(
        LM_STUDIO_URL,
        data=payload,
        headers={"Content-Type": "application/json"},
    )
    with urllib.request.urlopen(req, timeout=120) as resp:
        data = json.loads(resp.read())
        return data["choices"][0]["message"]["content"]
 
 
class Handler(BaseHTTPRequestHandler):
    def do_POST(self):
        length = int(self.headers.get("Content-Length", 0))
        data = json.loads(self.rfile.read(length))
 
        title = data.get("title", "untitled")
        content = data.get("content", "")
        comment = data.get("comment", "").strip()
        prompt = comment if comment else DEFAULT_PROMPT
 
        print(f"Processing: {title[:60]}...")
        result = call_lm_studio(prompt, content)
 
        # Save result
        ts = datetime.now().strftime("%Y-%m-%d-%H%M")
        slug = title[:40].lower().replace(" ", "-")
        out = OUTPUT_DIR / f"{ts}-{slug}.md"
        out.write_text(
            f"# {title}\n\n"
            f"**Prompt:** {prompt}\n"
            f"**Source:** {data.get('url', '')}\n\n"
            f"---\n\n{result}\n"
        )
        print(f"Saved: {out.name}")
 
        self.send_response(200)
        self.send_header("Content-Type", "application/json")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.end_headers()
        self.wfile.write(json.dumps({"status": "ok"}).encode())
 
    def do_OPTIONS(self):
        self.send_response(204)
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Access-Control-Allow-Methods", "POST, OPTIONS")
        self.send_header("Access-Control-Allow-Headers", "Content-Type")
        self.end_headers()
 
 
if __name__ == "__main__":
    print(f"LM Studio receiver on :{PORT}")
    HTTPServer(("0.0.0.0", PORT), Handler).serve_forever()

Ollama との重要な違い: LM Studio は Ollama の generate エンドポイントではなく、OpenAI のチャット補完フォーマット (messages 配列を持つ /v1/chat/completions) を使います。Share2Agent のコメントがシステムプロンプトに、ページコンテンツがユーザーメッセージになります。


ステップ 3: レシーバーを起動する

bash
python3 -u lmstudio_receiver.py

ステップ 4: Share2Agent を設定する

  1. Chrome で Share2Agent 拡張機能のアイコンをクリックします。
  2. Settings を開きます。
  3. Webhook URLhttp://localhost:9876 に設定します。
  4. 保存します。

ステップ 5: ページを処理する

  1. 任意の Web ページに移動します。
  2. Share2Agent のアイコンをクリックします。
  3. comment フィールドに指示を入力します。
    • Summarize the key arguments
    • Extract all API endpoints mentioned
    • Translate to German
    • List action items from this meeting notes page
  4. Share をクリックします。

コメントを空にすると、デフォルトの要約プロンプトが使われます。

結果は ~/share2agent-lmstudio/ に保存されます。

~/share2agent-lmstudio/2026-03-28-1430-react-server-components.md

カスタマイズ

モデルの選択: LM Studio は現在ロード中のモデルを使います。LM Studio の UI でモデルを切り替えれば、コードの変更は不要です。

Temperature とトークン数: スクリプト内の temperature (0.0 = 決定的、1.0 = 創造的) と max_tokens を調整して、出力のスタイルと長さをコントロールします。

サーバーポート: LM Studio のサーバーポートを変更した場合は、LM_STUDIO_URL 変数を更新します。


次のステップ

  • モデルルーティングを追加: コメント内のキーワード (例: "creative:" や "precise:") を解析し、temperature を動的に調整します。
  • 読み物リスト処理を構築: 複数の記事を共有した後、保存された全結果を読み込んで統合された要約を生成する 2 つ目のスクリプトを実行します。
  • 他の OpenAI 互換ツールに接続: LM Studio は OpenAI API フォーマットを話すので、レシーバーのコードを変えずに任意の互換バックエンド (vLLM、llama.cpp サーバーなど) に置き換えられます。
Share2Agent で Web ページを LM Studio に送る