3行でいうと
- つなぐ側の変更は、接続先(base_url)をローカルのアドレスにして、キーを適当な値にするのが基本です。
- Ollamaの公式文書は、tool_choice、logprobs、nなどを非対応と明記しています。
- 3つとも、Responses APIに対応したと公式文書に書かれていますが、会話の状態の保持は対応が分かれます。
- コンテキスト長はOpenAIのAPIでは指定できず、Ollamaでは作る側のModelfileで決めます。
この記事は、実際に使って確かめた記録ではありません。この記事は公式の文書や論文を読んでまとめたものです。
先に結論
OpenAIのAPI向けのソフトやライブラリ(部品)は、接続先のアドレスを変えるだけで、手元のAIにつながることが多いです。3つの道具の公式文書が、そのやり方を載せています。
ただし「互換」は「全部同じ」という意味ではありません。どの項目に対応しているかは、道具ごとに違います。つなぐ前に、自分のソフトが使う項目が対応表にあるかを見てください。
前提:言葉の整理
- API:ほかのソフトから、AIに質問を送って答えを受け取るための窓口です。
- OpenAI互換:OpenAIのAPIと同じ形の依頼を受け付ける、という意味です。ソフト側は「相手がOpenAIかどうか」を、接続先のアドレスだけで見分けます。
- base_url:接続先のアドレスです。OpenAIの公式の部品(Pythonなど)は、この値を差し替えられます。
- Chat CompletionsとResponses:OpenAIのAPIの2つの形です。OpenAIの文書は、Chat Completionsも引き続きサポートするが、新しい開発にはResponsesを勧める、と書いています。
- ツール呼び出し:AIが「この関数を呼んでほしい」と依頼を返し、ソフトが実行して結果を返す仕組みです。AIが自分でコードを実行するわけではありません(LM Studioの文書もそう説明しています)。
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で使えると文書にある項目は、次のとおりです。
- model、messages、temperature、top_p、top_k、max_tokens、stream、stop
- presence_penalty、frequency_penalty、logit_bias、repeat_penalty、seed
ツール呼び出しと、JSONスキーマによる出力の指定も、別ページで説明があります。Responsesでは previous_response_id を使った続きの会話の例があり、Ollamaとの違いです。MCP(外部ツールをつなぐ共通の規格)のツールを使う例もありますが、アプリ側で有効にする必要があると書かれています。
llama.cpp
llama-serverの公式READMEは、OpenAI互換のchat completions、responses、embeddingsの窓口があると書いています。ただし「OpenAIの仕様との互換を強く主張するものではないが、経験上、多くのアプリで動く」という控えめな書き方です。
- ツール呼び出しは
--jinjaの指定で使えるとあります。READMEの一覧では、jinjaは標準で有効です。モデルによっては、--chat-template-fileで別のテンプレートを指定する必要があるとも書かれています。 - Responsesの窓口は、内部でChat Completionsの依頼に変換して処理する、と説明されています。
- チャットの書式は、モデルに合うテンプレートがあれば最適に使えますが、標準ではChatMLが使われると書かれています。
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 という、モデルの別名を付ける設定があります。
選び方の考え方
見立てです。次のように考えると、迷いにくいと思います。
- まずは、使うソフトの設定画面に「base URL」の欄があるかを見ます。ない場合は、つなげない可能性が高いです。
- 画像、ツール、JSON出力など、必要な機能を先に決めて、上の表で対応を見ます。
- 続きの会話をサーバー側に覚えさせる使い方(previous_response_id)が要るなら、公式文書の範囲ではOllamaは合いません。
- 設定を細かく触りたいならllama.cpp、画面で管理したいならLM Studioやollamaのアプリ、という使い分けが考えられます。
よくある失敗
- キーを空にする:Ollamaの公式の例は「required but ignored(必須だが無視される)」とコメントしています。空にせず、適当な値を入れてください。
- アドレスの末尾の /v1 を忘れる:3つの公式文書とも、/v1 までを接続先に含めています。
- モデル名が合わない:各道具が知っている名前を、そのまま書く必要があります。
- 会話が途中で切れる:コンテキスト長が小さいことが原因かもしれません。Ollamaの場合は、上の節のとおりModelfileで決めます。
- ネットワーク越しに開く:標準は自分のパソコンだけです。他の端末から使うときは、安全の設定が先に必要です。別の記事(外出先から使う方法)で扱います。
気をつけること
- この記事は、実際に使って確かめた記録ではありません。公式文書に書かれた内容の整理です。
- 対応表は更新されます。Ollamaの文書は、Responsesの対応をv0.13.3で加えたと書いています。お使いのバージョンで、文書と同じかは確認できていません。
- 「対応」と書かれていても、モデルが対応していなければ動きません。たとえばツール呼び出しや画像入力は、モデル側の能力に左右されます。
- LM Studioの文書のTypeScript例は、引数名が
baseUrlと書かれています。Ollamaの文書のJavaScript例はbaseURLです。写すときは、お使いの部品の公式の書き方と照らしてください。 - OpenAIのAPIの仕様は、OpenAI側でも変わります。この記事は2026年10月8日に読んだ文書にもとづきます。
出典
- OpenAI compatibility(Ollama Docs、Ollama、2026年10月8日確認)
- OpenAI Compatibility Endpoints(LM Studio Docs、LM Studio、2026年10月8日確認)
- Chat Completions(LM Studio Docs、LM Studio、2026年10月8日確認)
- Responses(LM Studio Docs、LM Studio、2026年10月8日確認)
- Tool Use(LM Studio Docs、LM Studio、2026年10月8日確認)
- Structured Output(LM Studio Docs、LM Studio、2026年10月8日確認)
- Chat(LM Studio REST API、LM Studio、2026年10月8日確認)
- Authentication(LM Studio Docs、LM Studio、2026年10月8日確認)
- LM Studio Server(LM Studio Docs、LM Studio、2026年10月8日確認)
- LLaMA.cpp HTTP Server README(llama.cpp、ggml-org、2026年10月8日確認)
- Migrate to the Responses API(OpenAI Developers、OpenAI、2026年10月8日確認)
- openai-python README(GitHub、OpenAI、2026年10月8日確認)
更新履歴
- 2026年10月25日 書き方を直しました。
- 前:運営者が使っていないと読める書き方 → いま:「この記事は、実際に使って確かめた記録ではありません」。公式の資料を読んでまとめた記事で、使い心地は書いていない、という意味に直した
