Geminiのネットワークプロキシ: クライアント接続の設定と切り分け
google-genaiをHTTP CONNECTプロキシ経由で出し、TLSはオンのまま、死んだホップとAPI拒否を分け、トンネルをGoogleアクセスとして扱わない。
この案内は、google-genai 2.30.1をHTTP CONNECTプロキシ経由で出したい開発者向けです。確認はループバックオリジンとダミーホップを使い、Google口座は使いません。Top ProxyはIPを売りません。ここにも無料の鍵はありません。動くトンネルはAPIアクセスではありません。
01Geminiクライアントを一つ選び、固定する
Geminiは製品の一族です。消費者向けWebアプリ、Gemini Developer API、Vertex AIまたはGemini Enterprise Agent Platform、Gemini CLIは、プロキシのつまみを共有しません。混ぜると、ブラウザを調べているあいだPythonプロセスは直接出たままになります。この手順は一つのクライアントに留まります。Google Gen AI Python SDKがGemini Developer APIと話す経路です。
Gemini API文書(参照日2026年10月15日、最終更新2026年10月13日UTC)は、そのAPIをプロンプトから本番への道と説明します。プロキシは文書化していません。プロキシ配線はSDKのREADMEにあります。利用可能地域(最終更新2026年4月28日)は、AI StudioとAPI向けの国一覧です。プロキシは、欠けた地域、確認済み年齢、請求口座を足しません。
importするものを固定してください。この実行はPython 3.14.6、google-genai 2.30.1、httpx 0.28.1、実験CA向けの openssl バイナリとしてLibreSSL 3.3.6を使いました。PyPIはその日に2.30.1を掲げていました。導入したクライアントは、Gemini Developer APIの既定を https://generativelanguage.googleapis.com/ と v1beta にしていました。Vertexは別のコンストラクタと別のホストです。ここでは触れません。
- 実際に走らせるPythonでvenvを作ってください。この機械は
/opt/homebrew/bin/python3.14を使いました。 google-genai==2.30.1を導入してください。あとのホイールにHTTPスタックを書き換えさせないでください。- プロキシに触る前に版を印字してください。google-genaiとhttpxの行を残します。

READMEのProxy節(httpx既定のあたり)は、SDKが同期と非同期の両方でhttpxを使うと書いています。google-genai[aiohttp] はより速い非同期経路向けの追加で、httpxに合わせ trust_env=True です。この実行ではその追加は導入していません。aiohttpが何かを経路したふりはしません。SOCKS5は httpx[socks] と HttpOptions.client_args のあとだけ文書化されています。こちらも未測定です。実際に動いた経路はHTTP CONNECTです。
api_key を genai.Client へ渡すか、初期化の前に GEMINI_API_KEY / GOOGLE_API_KEY を設定してください。APIキーの設定は口座の作業です。実験はダミー文字列 lab-not-a-google-key をループバックオリジンへ使いました。そのキーは機械からGoogleへ出ていません。
02Clientを組み立てる前にHTTPSPROXYを設定する
READMEは率直です。httpxもaiohttpも、環境から urllib.request.getproxies を読みます。クライアントを組み立てる前にプロキシを設定してください。
export HTTPS_PROXY='http://USER:PASS@PROXY_HOST:PROXY_PORT'
export SSL_CERT_FILE='/path/to/extra-ca.pem'
SSL_CERT_FILE は任意です。公開CA上の本番Geminiには、私的CAファイルは要りません。実験が要ったのは、オリジン証明書をローカルで作ったからです。導入した2.30.1は、ここで余分な仕事をします。_api_client.py は ssl.create_default_context(cafile=os.environ.get('SSL_CERT_FILE', certifi.where())) でSSLコンテキストを組む、とあります。SDK作者の言葉では、httpxは自分では SSL_CERT_FILE を取らないからです。変数は Client(...) の前にexportしてください。あとからexportしても、生きているクライアントには遡りません。
HTTPS_PROXY のuserinfoはプロキシ認証です。Gemini APIキーではありません。APIキーは Client(api_key=...) か GEMINI_API_KEY へ入れてください。プロキシURLをログへ出すなら、パスワードを消してください。プロセス一覧は、一瞬でも環境を見ます。
同じREADMEは、SOCKS5を HTTPS_PROXY ではなくhttpxの引数で示します。
from google import genai
from google.genai import types
client = genai.Client(
api_key="YOUR_API_KEY",
http_options=types.HttpOptions(
client_args={"proxy": "http://USER:PASS@PROXY_HOST:PROXY_PORT"},
timeout=60000,
retry_options=types.HttpRetryOptions(attempts=1),
),
)
HttpOptions.timeout はミリ秒です。2.30.1はhttpxの前に / 1000.0 で変換します。このビルドで retry_options=None は、tenacityが1回で止まる意味です。トラブルシューティングは、Python SDKが一時的な誤りを最大4回、約1秒から最大60秒で再試行するとまだ書いています。そのページの日付は2026年10月13日です。導入したクライアントは、HttpRetryOptions を渡さないとその動きをしません。ホップを切り分けるあいだは、死んだポートへ指数バックオフを見るより、attempts=1 を置きます。
- 対象がHTTPSなら
HTTPS_PROXYだけをexportしてください。GeminiはHTTPSです。この実行はHTTP_PROXYを設定しませんでした。そのときurllib.request.getproxies()は{'https': 'http://127.0.0.1:62748'}を返しました。 - プロキシにループバックを見せたいときは、
NO_PROXYを空にしてください。残ったNO_PROXY=localhostはホップを飛ばし、成功に見えます。 - 環境を設定したあとで
genai.Clientを組み立ててください。終わったら閉じてください。
明示的な client_args={'proxy': ...} は、文書化されたもう一つの入口です。この実行でもCONNECTを送りました。シェルがすでに HTTPS_PROXY を持ち、争いたくないときに使ってください。
03自分で制御できる対象で経路を証明する
ステータス200は弱い証人です。直接もプロキシ経由も、どちらも200を返せます。ホップのログか、オリジンの刻印が要ります。実験は HttpOptions.base_url を https://127.0.0.1:PORT/ へ向け、google-genaiが generativelanguage.googleapis.com を開かないようにしました。オリジンはSIMULATEDと印を付けたJSONで答えました。それが経路の証明です。モデルの答えでも、クォータ確認でも、地域通過でもありません。
自分の確認は、公開実験より小さくて構いません。導入したクライアント、自分のプロキシ、自分の対象が要ります。ループバックで足ります。verify を切らないでください。ホップが退屈になるまで、これをGoogleへ向けないでください。
import os
from google import genai
from google.genai import types
os.environ["HTTPS_PROXY"] = "http://USER:PASS@PROXY_HOST:PROXY_PORT"
client = genai.Client(
api_key="YOUR_API_KEY",
http_options=types.HttpOptions(
timeout=60000,
retry_options=types.HttpRetryOptions(attempts=1),
),
)
try:
response = client.models.generate_content(
model="gemini-flash-latest",
contents="ping",
)
print(response.text)
finally:
client.close()
base_url を未設定のままにすると、その断片はGoogleと話します。ループバック確認は話しません。保存した結果のポートは死んでいます。まだ動いているプロキシからホストとポートを写してください。
- プロキシ環境も
client_argsのプロキシも無しで、一度呼んでください。直接は模擬テキストを返しました。ダミーのCONNECTプロキシはアイドルのままでした。proxy_events=0。 HTTPS_PROXYをhttp://127.0.0.1:PROXY_PORTへexportし、もう一度呼んでください。プロキシはCONNECT 127.0.0.1:ORIGIN_PORTを記録しました。オリジンは同じSIMULATEDテキストを返しました。getproxiesはhttpsキーだけを示しました。client_args={'proxy': 'http://127.0.0.1:PROXY_PORT'}で、HTTPS_PROXYなしで繰り返してください。CONNECTは再び起きました。二つの入口、一つのトンネル型です。

ブラウザの自分のIPは、ブラウザの出口を示します。このPythonプロセスは示しません。プロキシチェッカーは、ホストがHTTPまたはSOCKS5に答えるかを教えます。端点を貼る前には使えます。それでもgoogle-genaiではありません。
04TLSをオンのままにし、資格情報をログに出さない
HTTPプロキシ越しのHTTPSは、CONNECTのあと、そのトンネル越しにオリジンへTLSです。プロキシURLは http://... のままです。https:// のプロキシURLは、プロキシ自身へのTLSを意味します。この実行はそれを測っていません。
実験CAは、127.0.0.1 のサブジェクト代替名付きの1日証明書でした。SSL_CERT_FILE はそのCAを指しました。検証はオンのままです。同じプロキシクライアントを SSL_CERT_FILE なしで走らせると、CONNECTは成功したまま、httpxは CERTIFICATE_VERIFY_FAILED: unable to get local issuer certificate を包む ConnectError を上げました。ホップは問題ありませんでした。信頼ストアが問題でした。人が飛ばし、verify=False を足して終わりにするのが、その場合です。

- 既定の検証経路を残してください。CAファイルを渡すのは、オリジンが私的なときだけです。
- TLSのトレースバックを祝う前に、プロキシログでCONNECTを確認してください。トレースバックは、プロキシが飛ばされた証明ではありません。
Proxy-Authorization、x-goog-api-key、プロキシuserinfoを消してください。実験プロキシはhas_proxy_authorization: falseを記録しました。ダミーホップにBasic認証が無かったからです。ベンダーのホップには、たぶんあります。
実験CAをシステムの信頼ストアへ写さないでください。この実行はmacOSの信頼に触れていません。子プロセスの SSL_CERT_FILE で足りました。
05死んだホップと、Googleに見える誤りを分ける
トラブルシューティングは、クライアントSDKの問題とバックエンドの問題を分けます。429と503は再試行してください。400、402、403は再試行しないでください。それらは無効なキー、空の前払いクレジット、または悪い構文であり、不安定なソケットではありません。TCPが完了しなければ、どれも起きません。
この実行は、同じ導入クライアントで三つの失敗を強制しました。
閉じたループバックポートを client_args プロキシにすると、ConnectError が上がりました。0.001秒で [Errno 61] Connection refused です。CONNECTログはありません。オリジンはリクエストを見ていません。それが死んだホップです。
生きているCONNECTホップ越しの模擬オリジン403は、ClientError を上げました。本文がSIMULATEDと書いた 403 PERMISSION_DENIED です。CONNECTは記録されました。オリジンはヒットを数えました。転送は動きました。アプリケーションが拒みました。本物のGoogleでは、そのクラスの誤りは口座、請求、または方針です。「別のプロキシを買えばモデルが現れる」ではありません。
1.5秒眠るオリジンに対する200msの HttpOptions.timeout は、ReadTimeout を上げました。0.205秒で The read operation timed out です。CONNECTは記録されました。トンネルは上がっていました。予算が足りませんでした。

| 観察 | 例外 | CONNECT記録 | オリジン到達 | 変えること |
|---|---|---|---|---|
| 直接、信頼した実験CA | なし | いいえ | はい | 対照。プロキシはアイドルのまま |
HTTPS_PROXY のみ | なし | はい | はい | このクライアントの経路は証明された |
client_args プロキシ | なし | はい | はい | 明示的なhttpxプロキシ引数 |
| プロキシは稼働、実験CAなし | ConnectError TLS発行者 | はい | いいえ | CAを直す。検証を切らない |
| 死んだプロキシポート | ConnectError 拒否 | いいえ | いいえ | ホストとポート。APIキーではない |
| プロキシ越しの模擬403 | ClientError 403 | はい | はい | 口座またはリクエスト。ホップはすでに動いていた |
| 200msタイムアウト、遅いオリジン | ReadTimeout | はい | 完了した本文なし | タイムアウト予算。CONNECTではない |
モバイルとデータセンターのカタログページは、その表から救いません。モバイルプロキシとデータセンタープロキシが変えるのは、見せるIPです。google-genaiの誤りのクラスは書き換えません。このSDKが実際に使ったプロトコルはHTTPです。SOCKS5は、httpx[socks] を導入して測るまで、READMEの追加のままです。
06HTTP CONNECTを、開けるカタログ端点に合わせる
ベンダーがHTTPとして文書化したホップを選び、ベンダーが文書化したユーザー名とパスワードを使ってください。そのあと、自分のフィクスチャに対してgoogle-genaiを証明します。有料ゲートウェイは呼んでいません。
Oxylabsのレジデンシャルプロキシ(参照日2026年10月15日)はHTTP入口を文書化しています。Decodoのレジデンシャルクイックスタート(同日)は、HTTPプロキシURLとして gate.decodo.com:7000 を文書化しています。英語カタログはその製品をまだsmartproxy-comとして掲げています。生きているカードで形を比べてください。OxylabsとSmartproxy / Decodoです。カタログの適合であり、プール試験ではありません。
- スキームを、2.30.1が実際に送ったものへ合わせてください。HTTP CONNECTです。プロキシ自身へのHTTPSプロキシURLは別の製品です。
- ベンダー接頭辞はプロキシユーザーへ付け、
GEMINI_API_KEYへ付けないでください。 - ホストのHTTP対SOCKSだけが要るなら、到達はプロキシチェッカーで確認できます。SDKは自分のプロセスで証明してください。

このクライアントを指名できるホップから出し、TLSをオンのままにし、トンネルを権利として扱わないでください。
GeminiのPython SDKにプロキシを設定するには?
動くプロキシは、Geminiが答える意味ですか?
TLS検証を切るべきですか?
SOCKS5は対応していますか?
トラブルシューティングに、見えない再試行が書いてあるのはなぜですか?
ブラウザの自分のIPページでSDKを証明できますか?
関連記事
レジデンシャルプロキシとは何か、どう動くか
レジデンシャルプロキシは一般向けISPのアドレスから出ます。プール、スティッキーセッション、サイトから見えるもの、購入前に供給元へ聞くことを説明します。
4分2026年のスクレイピング向けプロキシ: 購入チェックリスト
2026年のスクレイピング購入は、供給元ではなく相手から始めます。出自、セッション、地理、課金、本番前の実地試験のチェックリストです。
5分スティッキーとローテーション: セッション制御の仕組み
スティッキーとローテーション: リクエストごととタイマーのローテーションの動き、スティッキーが新しいIPに勝つとき、CookieとIP変更の関係、セッションIDの自分での試験。
8分



