Geminiのネットワークプロキシ: クライアント接続の設定と切り分け

8分

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は別のコンストラクタと別のホストです。ここでは触れません。

  1. 実際に走らせるPythonでvenvを作ってください。この機械は /opt/homebrew/bin/python3.14 を使いました。
  2. google-genai==2.30.1 を導入してください。あとのホイールにHTTPスタックを書き換えさせないでください。
  3. プロキシに触る前に版を印字してください。google-genaiとhttpxの行を残します。
固定したgoogle-genai 2.30.1、httpx 0.28.1、Python 3.14.6、LibreSSL 3.3.6

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 を置きます。

  1. 対象がHTTPSなら HTTPS_PROXY だけをexportしてください。GeminiはHTTPSです。この実行は HTTP_PROXY を設定しませんでした。そのとき urllib.request.getproxies() は {'https': 'http://127.0.0.1:62748'} を返しました。
  2. プロキシにループバックを見せたいときは、NO_PROXY を空にしてください。残った NO_PROXY=localhost はホップを飛ばし、成功に見えます。
  3. 環境を設定したあとで 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と話します。ループバック確認は話しません。保存した結果のポートは死んでいます。まだ動いているプロキシからホストとポートを写してください。

  1. プロキシ環境も client_args のプロキシも無しで、一度呼んでください。直接は模擬テキストを返しました。ダミーのCONNECTプロキシはアイドルのままでした。proxy_events=0。
  2. HTTPS_PROXY を http://127.0.0.1:PROXY_PORT へexportし、もう一度呼んでください。プロキシは CONNECT 127.0.0.1:ORIGIN_PORT を記録しました。オリジンは同じSIMULATEDテキストを返しました。getproxies はhttpsキーだけを示しました。
  3. client_args={'proxy': 'http://127.0.0.1:PROXY_PORT'} で、HTTPS_PROXY なしで繰り返してください。CONNECTは再び起きました。二つの入口、一つのトンネル型です。
HTTPS_PROXYがループバックでCONNECTを送り、模擬のgenerateContentテキストを返した

ブラウザの自分の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なしではCONNECTは成功し、そのあとTLSが失敗した
  1. 既定の検証経路を残してください。CAファイルを渡すのは、オリジンが私的なときだけです。
  2. TLSのトレースバックを祝う前に、プロキシログでCONNECTを確認してください。トレースバックは、プロキシが飛ばされた証明ではありません。
  3. 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のあとの模擬403
観察例外CONNECT記録オリジン到達変えること
直接、信頼した実験CAなしいいえはい対照。プロキシはアイドルのまま
HTTPS_PROXY のみなしはいはいこのクライアントの経路は証明された
client_args プロキシなしはいはい明示的なhttpxプロキシ引数
プロキシは稼働、実験CAなしConnectError TLS発行者はいいいえCAを直す。検証を切らない
死んだプロキシポートConnectError 拒否いいえいいえホストとポート。APIキーではない
プロキシ越しの模擬403ClientError 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です。カタログの適合であり、プール試験ではありません。

  1. スキームを、2.30.1が実際に送ったものへ合わせてください。HTTP CONNECTです。プロキシ自身へのHTTPSプロキシURLは別の製品です。
  2. ベンダー接頭辞はプロキシユーザーへ付け、GEMINI_API_KEY へ付けないでください。
  3. ホストのHTTP対SOCKSだけが要るなら、到達はプロキシチェッカーで確認できます。SDKは自分のプロセスで証明してください。
Oxylabs — レジデンシャルとデータセンタープロキシ
Oxylabs — レジデンシャルとデータセンタープロキシ4.0771

Oxylabsはレジデンシャル、モバイル、ISP、データセンタープロキシを、月$30からのひとつの月次契約で売っています。支払いはカード、電信送金、AliPay、PayPalです。

10か国
$0.45
1GBあたり
Decodo(Smartproxy) — レジデンシャルとデータセンタープロキシ
Decodo(Smartproxy) — レジデンシャルとデータセンタープロキシ4.22118

Decodo(旧Smartproxy)はレジデンシャルとデータセンタープロキシを売っています。レジデンシャルは月次プランなしで1GBあたり$4、または3 GBから1GBあたり$3.75の月次パックです。支払いはカード、PayPal、Alipay、Google/Apple Pay、暗号資産(制限あり)です。

83か国
$0.38
1GBあたり
ループバックのgoogle-genai確認から実行した、短い結果表

このクライアントを指名できるホップから出し、TLSをオンのままにし、トンネルを権利として扱わないでください。

GeminiのPython SDKにプロキシを設定するには?

genai.Clientの前にHTTPS_PROXYをHTTPプロキシURLへexportするか、HttpOptions.client_args={'proxy': 'http://host:port'} を渡してください。google-genai 2.30.1は既定でhttpxを使います。環境を設定したあとでクライアントを組み立て、終わったら閉じてください。

動くプロキシは、Geminiが答える意味ですか?

違います。CONNECTログはホップを証明します。口座、請求、クォータ、モデル、公開された地域一覧は別です。ループバックのSIMULATED JSONはGoogleの結果ではありません。

TLS検証を切るべきですか?

切らないでください。この実行は検証をオンのままにしました。実験CAなしでもCONNECTは成功し、クライアントは欠けた発行者でConnectErrorを上げました。CAファイルを直してください。検証を無効にしないでください。

SOCKS5は対応していますか?

SDKのREADMEは、pip install httpx[socks] のあと、socks5 URL付きのHttpOptions.client_argsなら対応すると書いています。この手順はその追加を導入せず、SOCKSも測っていません。

トラブルシューティングに、見えない再試行が書いてあるのはなぜですか?

2026年10月13日のトラブルシューティングページは、Python SDKが一時的な誤りを最大4回再試行すると書いています。導入した2.30.1はretry_optionsを未設定のままにし、その経路は1回で止まります。再試行が要るならHttpRetryOptionsを渡してください。ホップを調べるあいだはattemptsを1にしてください。

ブラウザの自分のIPページでSDKを証明できますか?

できません。/ja/my-ip はブラウザを示します。google-genaiは別のプロセスです。このクライアントからのプロキシログか、オリジンの刻印を使ってください。