Perplexity API on Ubuntu — Sonar検索モデルをPythonから呼び出す

ローカルLLM

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 で対応できる
Ubuntu 24.04でPython + openai環境セットアップ(実測)
Ubuntu 24.04でPython + openai環境セットアップ(実測)

前提環境

この記事のコマンドは次の環境で動作確認しています。

項目 バージョン
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_urlhttps://api.perplexity.ai に変えるだけで呼び出せます。LangChain や LlamaIndex を使っているコードでも乗り換えコストが小さいのが理由です。

Perplexity Sonarモデル一覧(公式情報)
Perplexity Sonarモデル一覧(公式情報)

主要モデルの選び方

用途に応じて次の基準で選ぶのが現実的です。

  • 日常的な検索・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 と仮想環境は別途インストールします。




ubuntu@linuxlab: ~
$ sudo apt-get update
$ 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 をインストールします。




ubuntu@linuxlab: ~
$ python3 -m venv ~/perp_env
$ 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
pip install openai 実ログ(Ubuntu 24.04)
pip install openai 実ログ(Ubuntu 24.04)

インストール後に import が通るか確認します。




ubuntu@linuxlab: ~
(perp_env) $ python3 -c “from openai import OpenAI; print(‘openai import OK’)”
openai import OK
(perp_env) $ python3 -c “import httpx; print(‘httpx’, httpx.__version__)”
httpx 0.28.1

手順2:API キーを環境変数に設定する

Perplexity API キーは pplx-... で始まる文字列です。スクリプトにベタ書きせず、環境変数として渡します。




ubuntu@linuxlab: ~
(perp_env) $ export PPLX_API_KEY=”pplx-xxxxxxxxxxxx”
# .bashrc や .env ファイルに書いておくと毎回入力しなくてよい
(perp_env) $ echo $PPLX_API_KEY
pplx-xxxxxxxxxxxx

注意:API キーの取り扱い

API キーを GitHub リポジトリにコミットしないでください。.env ファイルで管理する場合は .gitignore に必ず追加します。

手順3:Perplexity API クライアントを初期化する

openai SDK を使う場合、変更点は base_url の指定だけです。実際にコンテナ内で動作を確認しました。

Perplexity APIクライアント初期化ターミナル(Playwright撮影)
Perplexity APIクライアント初期化ターミナル(Playwright撮影)
OpenAI SDKでPerplexityクライアント初期化(実測)
OpenAI SDKでPerplexityクライアント初期化(実測)



ubuntu@linuxlab: ~ (perp_env)
(perp_env) $ cat perp_client.py
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 が返るので、ネットワーク経路は正常という証明になります

Perplexity APIエンドポイント接続テスト(実測)
Perplexity APIエンドポイント接続テスト(実測)



ubuntu@linuxlab: ~
$ curl -s -w “\nHTTP_CODE:%{http_code}\nTIME_TOTAL:%{time_total}s” \
-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 と同じ形式でチャット履歴を渡します。




ubuntu@linuxlab: ~ (perp_env)
(perp_env) $ cat ask_sonar.py
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@linuxlab: ~ (perp_env) — 出力例(illustrative)
(perp_env) $ python3 ask_sonar.py
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 で対応できます。




ubuntu@linuxlab: ~ (perp_env)
(perp_env) $ cat stream_sonar.py
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 managerwith 文)で使います。stream.text_stream でテキストのチャンクが順番に届くので、flush=True で即時出力します。正直、ここで詰まった人を見かけるのは flush=True を忘れてバッファに溜まったまま最後に一気に出力されるパターンです。

手順6:sonar-pro で引用付き高精度回答を得る

sonar-pro はコンテキスト長が 200K tokens で、より精度の高い引用付き回答を返します。model を変えるだけで切り替えられます。




ubuntu@linuxlab: ~ (perp_env)
(perp_env) $ cat ask_sonar_pro.py
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キーが無効




ubuntu@linuxlab: ~ (perp_env)
openai.AuthenticationError: Error code: 401 – {‘error’: {‘message’: ‘Invalid API key provided.’, ‘type’: ‘invalid_api_key’, ‘code’: 401}}

環境変数 PPLX_API_KEY が未設定か、値が間違っています。echo $PPLX_API_KEY で確認してください。

②RateLimitError:レートリミット超過




ubuntu@linuxlab: ~ (perp_env)
openai.RateLimitError: Error code: 429 – {‘error’: {‘type’: ‘rate_limit_exceeded’}}

リクエストが多すぎます。time.sleep() でウェイトを入れるか、max_retries=3 を OpenAI クライアントに渡すと SDK が自動でリトライしてくれます。

③ModuleNotFoundError:openai が入っていない




ubuntu@linuxlab: ~ (perp_env)
ModuleNotFoundError: No module named ‘openai’

仮想環境を source ~/perp_env/bin/activate で有効にしてから実行しているか確認します。プロンプトに (perp_env) が表示されていない場合は仮想環境に入っていません。

エラーハンドリングを入れた実用コード

本番で使うなら、最低限の例外処理を入れておきます。




ubuntu@linuxlab: ~ (perp_env)
(perp_env) $ cat perp_robust.py
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 が並ぶのを見るとかなり実感があります。

著者アイコン
著者アイコン

Perplexity の実質的なメリットは「Web 検索を自分で実装しなくていい」点です。SerpAPI などを組み合わせるより手軽で、引用 URL も自動で付いてくるので出典管理が楽になります。VPS で動かすバックエンドや社内チャットに組み込む用途には向いています。

本格的にサーバーに組み込むなら、VPS の選択も重要です。

コメント

タイトルとURLをコピーしました