Web 検索機能を内蔵した大規模言語モデルを自分のコードから呼び出したいとき、Perplexity の Sonar API は選択肢として有力です。openai パッケージの base_url を変えるだけで既存の OpenAI SDK がそのまま使えるので、OpenAI を触ったことがあれば移行コストはほぼゼロです。
この記事では Ubuntu 24.04 の Docker コンテナで環境を作り、実際に Python から Perplexity の Sonar モデルを呼び出す手順を説明します。インストールから API クライアントの初期化、エラーハンドリングまで、実際に動かした出力を載せています。
注意
Perplexity API の利用には API キーが必要です。https://www.perplexity.ai/settings/api でアカウントを作成してキーを取得してください。本記事の環境構築手順(Python・パッケージインストール)は Ubuntu 24.04 Docker で実測しています。API レスポンスの出力例はコードの構造を示す例示(illustrative)です。
この記事のポイント
- Ubuntu 24.04 に
openai 2.43.0をインストールし、base_url 1行変更で Perplexity API を呼び出せた(2026-06-22 実測) - Perplexity API エンドポイントは
api.perplexity.ai、TLS 確立まで約 23ms(Docker からの実測) - モデルは
sonar(バランス型)とsonar-pro(高精度・引用付き)の2本が主力 - Web 検索付きなので「最新情報を含む回答」が必要な用途に向いている
- ストリーミングも openai SDK の
stream=Trueで対応できる

前提環境
この記事のコマンドは次の環境で動作確認しています。
| 項目 | バージョン |
|---|---|
| OS | Ubuntu 24.04.4 LTS(docker run –rm ubuntu:24.04) |
| Python | 3.12.3 |
| openai SDK | 2.43.0 |
| httpx | 0.28.1 |
| 確認日 | 2026-06-22 |
Perplexity API とは
Perplexity AI が提供する推論 API です。一般的な LLM と異なり、モデルがリアルタイム Web 検索を実行してから回答を生成するので、最新のニュースや価格情報を含む質問にも対応できます。
技術的な特徴として重要なのは、OpenAI API と互換性のあるエンドポイントを採用している点です。openai SDK を使い、base_url を https://api.perplexity.ai に変えるだけで呼び出せます。LangChain や LlamaIndex を使っているコードでも乗り換えコストが小さいのが理由です。

主要モデルの選び方
用途に応じて次の基準で選ぶのが現実的です。
- 日常的な検索・Q&A →
sonar(コスト効率が良い) - 引用付きの精度が必要 →
sonar-pro - 調査レポートを生成したい →
sonar-deep-research - 推論ステップを見せたい →
sonar-reasoning/sonar-reasoning-pro - Web 検索なしで純粋に LLM を使う →
r1-1776
手順1:Ubuntu 24.04 に Python と openai をインストールする
Ubuntu 24.04 には Python 3 が含まれていますが、pip と仮想環境は別途インストールします。
$ sudo apt-get install -y python3 python3-pip python3-venv
Setting up python3 (3.12.3-0ubuntu2.1) …
Setting up python3-pip (24.0+dfsg-1ubuntu1.3) …
Setting up python3-venv (3.12.3-0ubuntu2.1) …
$ python3 –version
Python 3.12.3
$ pip3 –version
pip 24.0 from /usr/lib/python3/dist-packages/pip (python 3.12)
仮想環境を作成してから openai をインストールします。
$ source ~/perp_env/bin/activate
(perp_env) $
(perp_env) $ pip install openai httpx
Collecting openai
Collecting httpx
…
Successfully installed annotated-types-0.7.0 anyio-4.14.0
certifi-2026.6.17 distro-1.9.0 h11-0.16.0 httpcore-1.0.9
httpx-0.28.1 idna-3.18 jiter-0.15.0 openai-2.43.0
pydantic-2.13.4 pydantic-core-2.46.4 sniffio-1.3.1
tqdm-4.68.3 typing-extensions-4.15.0 typing-inspection-0.4.2

インストール後に import が通るか確認します。
openai import OK
(perp_env) $ python3 -c “import httpx; print(‘httpx’, httpx.__version__)”
httpx 0.28.1
手順2:API キーを環境変数に設定する
Perplexity API キーは pplx-... で始まる文字列です。スクリプトにベタ書きせず、環境変数として渡します。
# .bashrc や .env ファイルに書いておくと毎回入力しなくてよい
(perp_env) $ echo $PPLX_API_KEY
pplx-xxxxxxxxxxxx
注意:API キーの取り扱い
API キーを GitHub リポジトリにコミットしないでください。.env ファイルで管理する場合は .gitignore に必ず追加します。
手順3:Perplexity API クライアントを初期化する
openai SDK を使う場合、変更点は base_url の指定だけです。実際にコンテナ内で動作を確認しました。


import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ[“PPLX_API_KEY”],
base_url=”https://api.perplexity.ai”, # ← ここだけ変更
)
print(“base_url:”, client.base_url)
print(“timeout:”, client.timeout)
(perp_env) $ python3 perp_client.py
base_url: https://api.perplexity.ai
timeout: Timeout(connect=5.0, read=600, write=600, pool=600)
接続先エンドポイントの疎通も確認できました。API キーなしで叩くと 401 が返るので、ネットワーク経路は正常という証明になります。

-o /dev/null –max-time 15 https://api.perplexity.ai/chat/completions
HTTP_CODE:401
TIME_TOTAL:0.195108s
{“error”:{“message”:”Invalid API key provided.”,”type”:”invalid_api_key”,”code”:401}}
TLS 確立まで 23.5ms、総応答時間 195ms でした(Ubuntu 24.04 Docker から計測)。401 レスポンスの中身を見ると、エラーメッセージの構造が OpenAI のものとほぼ同じです。これが「OpenAI 互換 API」の意味するところです。
手順4:Sonar モデルに質問を送る
基本的な呼び出し方です。model には Sonar モデルの ID を、messages には OpenAI と同じ形式でチャット履歴を渡します。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ[“PPLX_API_KEY”],
base_url=”https://api.perplexity.ai”,
)
response = client.chat.completions.create(
model=”sonar”,
messages=[
{“role”: “system”, “content”: “日本語で簡潔に答えてください。”},
{“role”: “user”, “content”: “Ubuntu 24.04 の最新カーネルバージョンは?”},
],
)
print(response.choices[0].message.content)
print(“\\n— 引用ソース —“)
if hasattr(response, “citations”):
for url in response.citations:
print(url)
注意:APIレスポンス例は例示です
以下の出力例は Perplexity API のレスポンス構造を示す参考例です。実際の回答内容は呼び出し時点の Web 検索結果によって変わります。手元の API キーで実行してください。
Ubuntu 24.04 LTS(Noble Numbat)のカーネルは Linux 6.8 系が搭載されており、
HWE(Hardware Enablement)スタックを使うと 6.11 以降も利用できます。
— 引用ソース —
https://ubuntu.com/kernel/lifecycle
https://packages.ubuntu.com/noble/linux-image-generic
Web 検索付きなので、回答の末尾に引用ソースの URL が付いてきます。response.citations フィールドがその一覧です。ここが通常の LLM との大きな違いで、出典を示せるのでチャットボットや調査ツールに組み込みやすいです。
手順5:ストリーミングで出力をリアルタイム受信する
長い回答を待つ間に UI がフリーズするのを防ぐには、ストリーミングを使います。OpenAI と同じ stream=True で対応できます。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ[“PPLX_API_KEY”],
base_url=”https://api.perplexity.ai”,
)
with client.chat.completions.stream(
model=”sonar”,
messages=[{“role”: “user”, “content”: “Python の非同期処理を簡単に説明して”}],
) as stream:
for text in stream.text_stream:
print(text, end=””, flush=True)
print() # 改行
ストリームは context manager(with 文)で使います。stream.text_stream でテキストのチャンクが順番に届くので、flush=True で即時出力します。正直、ここで詰まった人を見かけるのは flush=True を忘れてバッファに溜まったまま最後に一気に出力されるパターンです。
手順6:sonar-pro で引用付き高精度回答を得る
sonar-pro はコンテキスト長が 200K tokens で、より精度の高い引用付き回答を返します。model を変えるだけで切り替えられます。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ[“PPLX_API_KEY”],
base_url=”https://api.perplexity.ai”,
)
response = client.chat.completions.create(
model=”sonar-pro”, # ← Pro モデルに変更
messages=[
{“role”: “system”, “content”: “詳細な引用付きで回答してください。”},
{“role”: “user”, “content”: “2026年のDockerの最新バージョンと変更点は?”},
],
max_tokens=1024,
)
print(response.choices[0].message.content)
print(“引用数:”, len(response.citations) if hasattr(response, “citations”) else 0)
よくあるエラーと解決策
①AuthenticationError:APIキーが無効
環境変数 PPLX_API_KEY が未設定か、値が間違っています。echo $PPLX_API_KEY で確認してください。
②RateLimitError:レートリミット超過
リクエストが多すぎます。time.sleep() でウェイトを入れるか、max_retries=3 を OpenAI クライアントに渡すと SDK が自動でリトライしてくれます。
③ModuleNotFoundError:openai が入っていない
仮想環境を source ~/perp_env/bin/activate で有効にしてから実行しているか確認します。プロンプトに (perp_env) が表示されていない場合は仮想環境に入っていません。
エラーハンドリングを入れた実用コード
本番で使うなら、最低限の例外処理を入れておきます。
import os
from openai import OpenAI, AuthenticationError, RateLimitError, APIStatusError
def ask_perplexity(question: str, model: str = “sonar”) -> str | None:
client = OpenAI(
api_key=os.environ[“PPLX_API_KEY”],
base_url=”https://api.perplexity.ai”,
)
try:
resp = client.chat.completions.create(
model=model,
messages=[{“role”: “user”, “content”: question}],
)
return resp.choices[0].message.content
except AuthenticationError:
print(“APIキーが無効です。PPLX_API_KEY を確認してください。”)
except RateLimitError:
print(“レートリミット超過。しばらく待ってから再試行してください。”)
except APIStatusError as e:
print(f”APIエラー {e.status_code}: {e.message}”)
return None
if __name__ == “__main__”:
result = ask_perplexity(“Ubuntuの最新LTSは何ですか?”)
if result:
print(result)
まとめ
- Ubuntu 24.04 に
apt install python3 python3-pip python3-venvで Python 3.12.3 / pip 24.0 が入る(実測確認) pip install openaiで openai 2.43.0 が入り、base_url="https://api.perplexity.ai"の 1 行で Perplexity API クライアントが動く(実測確認)- エンドポイントへの接続は TLS 確立まで 23.5ms、総応答 195ms(Ubuntu 24.04 Docker から計測)
- Web 検索付きの
sonarが汎用、引用精度が必要ならsonar-pro、推論タスクにはsonar-reasoningを選ぶ - ストリーミングは
client.chat.completions.stream()、エラーはAuthenticationError/RateLimitErrorをそれぞれ捕捉する
API キーさえあれば 10 分で動かせます。最初のリクエストが通った瞬間、回答の末尾に引用 URL が並ぶのを見るとかなり実感があります。
本格的にサーバーに組み込むなら、VPS の選択も重要です。



コメント