Ollama Web Searchは、Ollamaが2025年9月24日に公開したWeb検索APIです。ローカルで動かすモデルに検索結果を渡して、学習データより新しい情報を答えさせる用途で使います。本記事では、公式ドキュメントとSDKのソースコードを2026年9月26日時点で確認し、APIキーの設定、REST・Python・JavaScriptでの呼び出し方、2026年8月の料金改定後の扱いを整理しました。PythonとJavaScriptのSDKは、公式サンプルと挙動が違う点をSDK単体で実行して確かめました(実APIへの検索リクエストや検索エージェント全体の動作までは含みません)。
まとめ:Ollama Web Searchの要点
- エンドポイントは
POST https://ollama.com/api/web_search(検索)と/api/web_fetch(ページ取得)の2本。検索件数は既定5件、最大10件。 - 利用には無料のOllamaアカウントとAPIキーが必要。キーは環境変数
OLLAMA_API_KEYに入れてBearer認証で送る。 - 推論はローカルでも、検索クエリはollama.comへ送られる。社外に出せないクエリを扱うなら使わない。
- 2026年9月時点の料金ページにWeb検索の単価や無料枠の数値は載っていない。上限を超えると429が返る前提で実装する。
- Python SDKは既定3件で、キー未設定のままimportし、その後に環境変数へキーを設定しても、モジュール関数の既定クライアントには反映されない。JavaScript SDKは文字列を渡すと例外になる。どちらも公式サンプルと挙動が違う。
以下、仕組み、認証、呼び出し方、料金、外部ツール連携の順に解説します。
Ollama Web Searchの仕組みと提供範囲
Ollamaは、LlamaやQwen、gpt-ossなどのオープンモデルを自分のPCやサーバーで動かすためのツールです。Web Searchはその周辺機能で、検索そのものはOllama社のクラウド(ollama.com)が担います。ローカルのモデルが検索結果を受け取り、回答を組み立てる分担です。
web_searchとweb_fetchの違い
| API | 入力 | 返り値 | 用途 |
|---|---|---|---|
| web_search | query(必須)、max_results(既定5・最大10) | results[](title・url・content) | 候補ページを探す |
| web_fetch | url(必須) | title・content・links[] | 1ページの本文を読む |
web_searchが返す content は本文の抜粋です。詳細まで読ませたいときは、エージェントがweb_searchでURLを見つけ、web_fetchで本文を取りに行く2段構えになります。公式の検索エージェント例もこの形です。
ローカル推論時の検索クエリの送信先
モデルがローカルで動いていても、検索クエリと取得したいURLはollama.comへ送られます。公式FAQは、クラウド機能を止める方法として ~/.ollama/server.json に "disable_ollama_cloud": true を書くか、環境変数 OLLAMA_NO_CLOUD=1 を設定する手順を示しています。この設定はOllama本体に適用され、SDKやcURLからollama.comへの直接通信は遮断しません。設定後にOllamaを再起動すると、本体経由のクラウドモデルとWeb検索が無効になり、ログに Ollama cloud disabled: true と出ます。完全オフラインを求められる環境では、Web Searchは最初から選択肢に入りません。
APIキーの発行と認証設定
APIキーの発行とOLLAMA_API_KEYへの設定
ollama.comにサインインし、https://ollama.com/settings/keys でキーを作成します。公式ドキュメントの記載は「A free Ollama account is required」で、有料プランは必須ではありません。発行したキーは環境変数に入れておくと、cURL・Python・JavaScriptのどれからも同じ設定で使えます。
export OLLAMA_API_KEY="発行したキー"
キーはブラウザで動くコードやGitリポジトリに含めないでください。公式の認証ドキュメントも、キーをブラウザ側のコードとソース管理の外に置くよう求めています。
「Web search requires an Ollama account」と表示される条件
このメッセージはOllamaデスクトップアプリのチャット画面に出るものです。アプリのソース(app/ui/app/src/components/ChatForm.tsx)を読むと、未サインインのままWeb検索ボタンを押すとこの表示に切り替わります。アプリ上の操作でサインインするか、ターミナルで ollama signin を実行すれば解消します。
そもそも検索ボタンが見当たらない場合は、選んでいるモデルがツール呼び出し(tools)に対応していないか、クラウド機能が無効になっています。ボタンの表示条件は「tools対応モデル」かつ「クラウド無効化の設定がない」の2つです。
サインイン済みローカルサーバーの実験的検索API
Ollama本体のv0.18.0(2026年3月14日)以降には、ローカルサーバーに /api/experimental/web_search と /api/experimental/web_fetch が追加されています。サーバーのサインイン情報でollama.comへ中継する作りで、クライアント側からAPIキーを送る必要はありません。OpenClawなどの連携ツールはこの経路を使っており、公式のOpenClaw連携ページにも「ローカルモデルでのWeb検索には ollama signin が必要」とあります。ただし名前のとおりexperimentalで、公開APIリファレンスには載っていません。自作アプリから使うなら、仕様が固まっている https://ollama.com/api/web_search を直接呼ぶほうが安全です。
REST APIの呼び出し方(cURL)
検索は次の1リクエストで試せます。件数を変えたいときは max_results を1〜10の範囲で付けます。
curl https://ollama.com/api/web_search \
--header "Authorization: Bearer $OLLAMA_API_KEY" \
--header "Content-Type: application/json" \
-d '{"query": "ollama new engine", "max_results": 3}'
レスポンスは {"results": [{"title": ..., "url": ..., "content": ...}]} の形です。ページ本文を取得するweb_fetchは、URLを1つ渡します。
curl https://ollama.com/api/web_fetch \
--header "Authorization: Bearer $OLLAMA_API_KEY" \
--header "Content-Type: application/json" \
-d '{"url": "https://ollama.com/blog/web-search"}'
返り値の links にはページ内のリンク一覧が入ります。エージェントに次のページを辿らせる材料になりますが、そのまま全部をモデルに渡すとコンテキストを圧迫します。
PythonとJavaScriptからの呼び出し
Python:ollama 0.6.0以降のweb_search()と認証設定
Web検索の関数はPythonライブラリ0.6.0(2025年9月24日)で追加されました。2026年9月時点の最新は0.6.2です。
python -m pip install "ollama>=0.6.0"
上のコマンドをターミナルで実行した後、次のコードをPythonファイルに保存して実行します。
import ollama
res = ollama.web_search("ollama new engine", max_results=5)
for r in res.results:
print(r.title, r.url)
page = ollama.web_fetch("https://ollama.com/blog/web-search")
print(page.title, len(page.content))
注意点が2つあります。1つ目は件数の既定値です。web_search() のシグネチャは max_results: int = 3 で、REST APIの既定5件より少なくなっています。5件ほしいなら明示してください。
2つ目はキーを読むタイミングです。ollama.web_search() などのモジュール関数は、import時に作られる既定クライアントを使い、クライアントは生成時に OLLAMA_API_KEY を読みます。ollama 0.6.2で、import ollama の後に os.environ["OLLAMA_API_KEY"] を設定して呼んだところ、ValueError: Authorization header with Bearer token is required for web search で止まりました。キーは起動前に環境変数で渡すか、設定後に ollama.Client() を作り直して、そのインスタンスから呼びます。
JavaScript:webSearch()のオブジェクト引数
npmの ollama(2026年9月時点の最新は0.6.3)では、webSearch() と webFetch() の引数がオブジェクトです。公式ドキュメントのWeb search章には client.webSearch("what is ollama?") と文字列を渡す例がありますが、0.6.3で実行すると Query is required の例外になりました。
Node.js環境で npm install [email protected] を実行し、次のコードを search.mjs に保存して node search.mjs で実行します。
import { Ollama } from "ollama";
const client = new Ollama({
headers: { Authorization: `Bearer ${process.env.OLLAMA_API_KEY}` },
});
const res = await client.webSearch({ query: "ollama new engine" });
const page = await client.webFetch({ url: "https://ollama.com" });
件数の指定にも差があります。型定義上のプロパティ名は maxResults で、送信内容を横取りして確認すると、ボディに {"maxResults":3} のまま入っていました。REST APIの仕様書にあるパラメータ名は max_results です。返却件数は検索語によって指定上限を下回るため、results の長さだけでは指定が反映されたかを判定できません。件数指定を確実に送る必要がある場合は、REST APIへ max_results を指定して直接リクエストします。
ツール呼び出しによる検索エージェントの実装
web_searchとweb_fetchは、Pythonライブラリでは関数をそのまま tools に渡せます。モデルが検索の要否を判断し、必要なときだけ呼び出す作りです。
from ollama import chat, web_search, web_fetch
tools = {"web_search": web_search, "web_fetch": web_fetch}
messages = [{"role": "user", "content": "Ollamaの最新リリースの変更点は?"}]
while True:
res = chat(model="qwen3:4b", messages=messages,
tools=[web_search, web_fetch], think=True,
options={"num_ctx": 32768})
messages.append(res.message)
if not res.message.tool_calls:
print(res.message.content)
break
for call in res.message.tool_calls:
fn = tools.get(call.function.name)
out = fn(**call.function.arguments) if fn else "unknown tool"
messages.append({"role": "tool", "tool_name": call.function.name,
"content": str(out)[:8000]})
公式例と同じく、ツールの結果は8,000文字で切り詰めています。検索結果は数千トークンに達することがあり、公式ドキュメントはコンテキスト長を少なくとも約32,000トークンに広げるよう推奨しています。モデルはtools対応のものを選びます。公式例は qwen3:4b です。ツール呼び出しの一般的な仕組みはAIツール使用(Tool Use)の仕組みと実装判断で解説しています。
料金と無料枠(2026年8月の改定後)
公開時のブログは「個人向けに十分な無料枠があり、より高いレート制限はOllamaのクラウドで提供する」と説明していました。その後、2026年8月31日にトークン単価制の新料金プランが導入されました。新規契約は新料金ですが、既存契約は旧料金体系を継続でき、利用者が設定画面で新料金へ移行できます。
| プラン | 月額 | 含まれる利用枠 | 同時実行 |
|---|---|---|---|
| Free | $0 | スターターモデル向けの少量 | 1 |
| Pro | $20(年$200) | $60分 | 3 |
| Max | $100 | $300分 | 10 |
| Team | $500 | $1,000分(共有) | 10 |
この表はクラウドモデルの推論に関する枠です。2026年9月26日に公式の料金ページと2026年8月31日の改定告知を確認したところ、Web検索の単価や無料枠の回数はどちらにも記載がありませんでした。Web検索の公式ドキュメントも「無料アカウントが必要」と書くのみで、上限の数値は非公開です。
実装では、上限到達を例外ではなく通常の分岐として扱います。OllamaのAPIはレート制限の超過時にHTTP 429を返す仕様なので、429を受けたら待って再試行し、同じクエリの結果はキャッシュして呼び出し回数を減らします。料金を理由にプランを決めるなら、ollama.com/settings/usage で実際の消費を見てからにしてください。
MCP・Open WebUI・コーディングエージェントからの利用
MCPサーバー経由(Cline・Codex・Goose)
公式はPython製のMCPサーバー(ollama-pythonリポジトリの examples/web-search-mcp.py)を用意しており、MCP対応クライアントにweb_searchとweb_fetchを追加できます。Codexなら ~/.codex/config.toml に次を書きます。
[mcp_servers.web_search]
command = "uv"
args = ["run", "path/to/web-search-mcp.py"]
env = { "OLLAMA_API_KEY" = "発行したキー" }
Clineは「Manage MCP Servers」から同じ内容をJSONで登録します。CodexをOllamaのモデルで動かす手順はollama launch codex-appの手順にまとめています。
Open WebUIの検索エンジン設定
Open WebUIは検索エンジンの選択肢に ollama_cloud を持っており、内部で https://ollama.com/api/web_search を呼びます。管理画面のWeb検索設定で選ぶか、起動時の環境変数で指定します。Open WebUIは ENABLE_PERSISTENT_CONFIG の既定値がTrueで、一度保存した管理画面の設定を環境変数より優先します。環境変数を書き換えて再起動しても反映されないときは、管理画面で検索エンジンとAPIキーを直してください。最後にチャット入力欄でWeb検索をオンにします。
ENABLE_WEB_SEARCH=true
WEB_SEARCH_ENGINE=ollama_cloud
OLLAMA_CLOUD_API_KEY=発行したキー
古い解説に出てくる ENABLE_RAG_WEB_SEARCH は旧名で、v0.6.10のソースでは既に ENABLE_WEB_SEARCH へ改称されています。Open WebUI自体の導入はOpen WebUIの機能・インストール・APIキー発行、ファイルを読ませるRAG構成はOllamaとOpen WebUIでRAGチャットを実現する方法を参照してください。
Pi・OpenClawのWeb検索の自動設定
コーディングエージェントのPiでは、@ollama/pi-web-search パッケージがweb検索とfetchのツールを提供します。ollama launch pi で起動すればパッケージの導入と更新は自動で、手動なら pi install npm:@ollama/pi-web-search です。OpenClawも ollama launch openclaw で起動するとOllamaのWeb検索が自動で有効になります。Piの設定全体はPi(pi-coding-agent)をローカルLLMで動かす設定手順で扱っています。
Ollama Web Searchを使うべきでない場面と代替手段
検索基盤を自前で運用せず、APIキーで呼び出せる点が利点です。ただし、次の条件に当てはまるなら採用を見送ります。
- 検索クエリ自体が機密(顧客名、未発表の製品名、社内システム名など)で、社外送信の承認が取れない。
- 1回で10件を超える検索結果が必要、または検索エンジンや地域を指定したい。APIの入力はqueryとmax_resultsだけです。
- 上限や単価が公開されていないサービスに、SLAを前提とした本番処理を載せられない。
代替手段は理由によって分かれます。件数や検索エンジンを自分で決めたいなら、自前でホストするメタ検索エンジンSearXNGが候補で、Open WebUIでも searxng を選べます。ただしSearXNGは外部の検索サービスへ検索語を中継する仕組みなので、機密クエリの問題は解決しません。検索語そのものを社外へ出せない場合は、社内文書だけを対象にした検索基盤やRAGを選びます。どちらも運用の手間は自分で引き受けることになるため、プロトタイプや個人利用ならOllama Web Searchのほうが早く動きます。
よくある質問
Ollama Web Searchは無料で使えますか?
無料のOllamaアカウントでAPIキーを発行すれば使えます。ただし2026年9月時点で、無料枠の回数や有料時の単価は公式に公開されていません。上限を超えるとHTTP 429が返るため、再試行とキャッシュを前提に組み込みます。
OLLAMA_API_KEYはどこで取得しますか?
ollama.comにサインインし、https://ollama.com/settings/keys で作成します。取得したキーは環境変数 OLLAMA_API_KEY に設定し、Authorization: Bearer ヘッダーで送ります。
ローカルのモデルだけでWeb検索できますか?
できません。検索はollama.comのクラウドで実行されるため、インターネット接続とアカウントが必要です。OLLAMA_NO_CLOUD=1 を設定してOllamaを再起動すると、Ollama本体経由のWeb検索は無効になります。ただし、SDKやcURLからollama.comへ直接送る検索リクエストは、この設定では遮断されません。
Ollamaアプリで「Web search requires an Ollama account」と出たらどうすればいいですか?
未サインインの状態で検索ボタンを押したときの表示です。アプリからサインインするか、ターミナルで ollama signin を実行してください。ボタン自体が出ない場合は、tools対応のモデルを選んでいるか、クラウド無効化の設定が入っていないかを確認します。
1回の検索で何件まで取得できますか?
REST APIは既定5件、最大10件です。Pythonライブラリの web_search() は既定値が3件なので、5件以上ほしいときは max_results を明示します。