SabaKore

VPSのOllamaを、自分のアプリからOpenAI互換APIで呼ぶ

Ollamaは、OpenAIのAPIと同じ形式のエンドポイントを持っています。そのため、OpenAI向けに書いたプログラムは、 接続先を自分のサーバーに替えるだけで動くことがあります。ここでは、VPSで動かしているOllamaを、 手元のPCから呼ぶ方法を説明します。先にOllamaのインストール手順を済ませて、モデルを取得しておいてください。

1手元のPCから、トンネルでつなぐ

Ollamaを外に公開せず、SSHの通り道を借ります。手元のPCで、次を実行したままにします。

ssh -N -L 11434:localhost:11434 ユーザー名@サーバーのIPアドレス

これで、手元の http://localhost:11434 が、VPSのOllamaにつながります。

2curlで試す

OpenAIと同じ形式の /v1/chat/completions に送ります。 モデル名は、取得済みのものを指定します。

curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3.2:3b",
    "messages": [{ "role": "user", "content": "VPSとは何ですか。一文で答えてください。" }]
  }'

ほかに、/v1/models(取得済みのモデルの一覧)、/v1/embeddings(文章の数値化。検索や社内文書への質問に使う)、/v1/completions も使えます。

3Pythonで呼ぶ(OpenAIのライブラリを使う)

OpenAIの公式ライブラリを入れます。

pip install openai

接続先(base_url)を、トンネルの先に替えるだけです。api_key は必須の引数ですが、Ollamaは値を無視します。

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1/",
    api_key="ollama",  # 必須の引数だが、Ollamaは無視する
)

reply = client.chat.completions.create(
    model="llama3.2:3b",
    messages=[{"role": "user", "content": "VPSとは何ですか。一文で答えてください。"}],
)
print(reply.choices[0].message.content)

4既存のアプリに使うときの注意

  • 接続先を替える:アプリの設定にある「APIのベースURL」を、http://localhost:11434/v1/ に替えます。
  • モデル名が固定のアプリ:gpt-3.5-turbo のような名前を前提にしている場合は、取得済みのモデルに別名を付けます。
    ollama cp llama3.2:3b gpt-3.5-turbo
  • 会話の長さ(コンテキスト)を変えたいとき:OpenAI形式のリクエストには、その指定がありません。num_ctx を書いたModelfileから、別名のモデルを作ってそれを呼びます。 ただし、長くするほどメモリが増えます(メモリの見積もりツール)。
  • 使えない機能:tool_choice、logprobs、画像のURL指定などは未対応です。 対応していない値は、無視されずに400のエラーになります。

よくある質問

APIキーは何を入れればよいですか

OpenAI向けのライブラリは値の入力を求めますが、Ollamaはその値を無視します。公式の例では 'ollama' と書いています。何を入れても動きますが、これは認証ではありません。

OpenAIの機能は、すべて使えますか

使えない項目があります。たとえば tool_choice、logprobs、画像のURL指定(Base64の画像は使えます)は対応していません。対応していない値は無視されず、400のエラーが返ります。

インターネットに公開してよいですか

お勧めしません。Ollamaには認証がありません。自分のPCからは、SSHトンネルでつないでください(Ollamaのインストール手順の「手順5」)。

ToolkITBoxのAIツール・解説と併用する

姉妹サイトの、この記事と相性のいいページです。

内容はOllama公式のドキュメント(OpenAI compatibility)で確認した範囲です。バージョンアップで対応が変わることがあります。