3行でいうと

  • つなぐ側の変更は、接続先(base_url)をローカルのアドレスにして、キーを適当な値にするのが基本です。
  • Ollamaの公式文書は、tool_choice、logprobs、nなどを非対応と明記しています。
  • 3つとも、Responses APIに対応したと公式文書に書かれていますが、会話の状態の保持は対応が分かれます。
  • コンテキスト長はOpenAIのAPIでは指定できず、Ollamaでは作る側のModelfileで決めます。

この記事は、実際に使って確かめた記録ではありません。この記事は公式の文書や論文を読んでまとめたものです。

先に結論

OpenAIのAPI向けのソフトやライブラリ(部品)は、接続先のアドレスを変えるだけで、手元のAIにつながることが多いです。3つの道具の公式文書が、そのやり方を載せています。

ただし「互換」は「全部同じ」という意味ではありません。どの項目に対応しているかは、道具ごとに違います。つなぐ前に、自分のソフトが使う項目が対応表にあるかを見てください。

前提:言葉の整理

3つの道具のつなぎ方

3つとも、標準では自分のパソコンの中(localhost)に窓口が開きます。接続先とキーは、公式文書の例では次のとおりです。

道具 接続先(base_url) キー(api_key)の扱い
Ollama http://localhost:11434/v1/ 必須だが無視される。例は 'ollama'
LM Studio http://localhost:1234/v1 例は 'lm-studio'。認証は標準では不要
llama.cpp(llama-server) http://localhost:8080/v1 例は 'sk-no-key-required'。--api-key を付ければ認証あり

LM Studioは、Developerタブの「Start server」スイッチか、lms server start でサーバーを起動します。llama.cppは、標準の待ち受けが127.0.0.1(自分のパソコンだけ)、ポートは8080です。

Ollamaの公式文書の例を、短くして載せます。公式文書の例です。この記事では、実行していません。

from openai import OpenAI

client = OpenAI(
    base_url='http://localhost:11434/v1/',
    api_key='ollama',  # required but ignored
)

chat_completion = client.chat.completions.create(
    messages=[{'role': 'user', 'content': 'Say this is a test'}],
    model='gpt-oss:20b',
)
print(chat_completion.choices[0].message.content)

OpenAIのPython部品は、base_url を引数で渡す方法のほかに、環境変数 OPENAI_BASE_URL でも指定できる、とGitHubのREADMEにあります。コードを書き換えられないソフトでも、環境変数だけで切り替えられるかもしれません。ただし、そのソフトが環境変数を読むかは、ソフトごとの話です。見立てです。

使えない機能を、道具ごとに見る

Ollama

公式の対応表(Chat Completions)の主な内容です。

項目 対応
ストリーミング、JSONモード、seed、画像入力(base64)、ツール(tools) 対応
reasoning_effort(考える量の指定) 対応
logprobs(各語の確率)、tool_choice、logit_bias、user、n 非対応
画像のURL指定 非対応(base64のみ)

Responses APIには、v0.13.3から対応しています。ただし「会話の状態を持たない形だけ」です。previous_response_id と conversation は、非対応と書かれています。embeddings(文章を数の並びにする機能)では、トークン配列の入力が非対応です。

LM Studio

公式文書が挙げる対応エンドポイントは、models、responses、chat/completions、embeddings、completionsの5つです。Chat Completionsで使えると文書にある項目は、次のとおりです。

ツール呼び出しと、JSONスキーマによる出力の指定も、別ページで説明があります。Responsesでは previous_response_id を使った続きの会話の例があり、Ollamaとの違いです。MCP(外部ツールをつなぐ共通の規格)のツールを使う例もありますが、アプリ側で有効にする必要があると書かれています。

llama.cpp

llama-serverの公式READMEは、OpenAI互換のchat completions、responses、embeddingsの窓口があると書いています。ただし「OpenAIの仕様との互換を強く主張するものではないが、経験上、多くのアプリで動く」という控えめな書き方です。

3つの対応を、一覧で比べる

公式文書に書かれている範囲だけをまとめた表です。「記載なし」は、非対応という意味ではなく、今回読んだ文書に書かれていなかった、という意味です。

機能 Ollama LM Studio llama.cpp
Chat Completions 対応 対応 対応
Responses 対応(状態なしのみ) 対応(previous_response_idの例あり) 対応(内部で変換)
ツール呼び出し 対応 対応(別ページに説明) 対応(--jinja)
JSON出力の指定 対応(response_format) 対応(JSONスキーマ) 対応(response_format)
画像入力 対応(base64) 記載なし マルチモーダル対応と記載
embeddings 対応 対応 対応(モデルによる)
logprobs 非対応 記載なし 記載なし

llama.cppのembeddingsは、モデルのプーリング(まとめ方)が「none」以外である必要があると書かれています。

コンテキスト長は、OpenAIのAPIでは決められない

OpenAIのAPIには、会話の長さ(コンテキスト長)の上限をソフト側から指定する項目がありません。Ollamaの公式文書はこの点を明記していて、変えたいときはModelfileに PARAMETER num_ctx 数値 を書いて、ollama create で新しい名前のモデルを作り、その名前を model に指定する、と説明しています。

LM Studioには、独自のREST API(/api/v1/chat)に context_length(考慮するトークン数)を渡す項目があります。ただし、OpenAI互換の窓口で同じことができるかは、今回読んだ文書では確認できていません。

「モデル名」の合わせ方

ソフトによっては、gpt-3.5-turbo のような名前が決め打ちされています。Ollamaの文書には、ollama cp llama3.2 gpt-3.5-turbo のように、手元のモデルを別名でコピーして使う方法が載っています。LM Studioは、モデル名の欄に「LM Studio上のモデル識別子」を入れると説明しています。llama.cppには --alias という、モデルの別名を付ける設定があります。

選び方の考え方

見立てです。次のように考えると、迷いにくいと思います。

よくある失敗

気をつけること

出典

更新履歴