クラウドアクセス¶
blueqat.cloud は、Blueqatクラウドサービス(https://qapi.blueqat.app)
へ回路を送信します — マネージドなシミュレータと実機量子コンピュータを、
ローカル実行と同じ Circuit API で使えます。
APIキー¶
キーは https://mcp.blueqat.app/login で取得できます。認証情報は次の 優先順位で解決されます:
現在のプロセスでの
blueqat.cloud.configure(api_key=...)環境変数
BLUEQAT_API_KEY設定ファイル
~/.blueqat/config.json
import blueqat.cloud as cloud
cloud.save_api_key("YOUR_API_KEY") # 所有者のみ (0600) の権限で保存
cloud.me() # アカウントのプラン・上限・残クォータ
クラウドでの回路実行¶
blueqat.cloud をインポートすると 'cloud' バックエンドが登録
されます。結果はSDKのローカル規約に揃えられるため、そのまま置き換えられます:
import blueqat.cloud
from blueqat import Circuit
from blueqat.utils import Z
c = Circuit(2).h[0].cx[0, 1]
c.m[:].run(backend='cloud', shots=100) # Counter('00', '11', ...)
c.run(backend='cloud') # 状態ベクトル (torch.Tensor)
c.run(backend='cloud', amplitude='11') # 単一の確率振幅
c.run(backend='cloud', hamiltonian=1.0 * Z[0]) # 期待値
名前付きブロックとスライスはワイヤ形式向けに自動展開され、ハミルトニアンの 恒等(定数)項はローカルで加算し直されます。
その他のエンドポイント¶
cloud.health() # サービス稼働確認 (キー不要)
cloud.circuit_info(c) # サーバ側での検証・統計
cloud.vqe_run(h, n_qubits=2) # クラウドでVQE
cloud.qaoa_run(qubo_terms) # QUBOのQAOA
実機量子コンピュータ¶
cloud.hardware_status() # QPU の状態(鍵なしで見られます)
cloud.hardware_qpus() # 使える QPU の一覧
cloud.hardware_calibration() # 量子ビットごとの誤り率とコヒーレンス時間
cloud.hardware_next_window() # 次に投入を受け付ける時間帯
cloud.hardware_quote(shots=100, payer="me") # 投入する前に費用を見る
job = cloud.submit_hardware_job(c, shots=100, confirm=True)
cloud.hardware_jobs() # 最近投入したジョブ
cloud.hardware_job(job["task_id"]) # 1件の状態
cloud.hardware_job_result(job["task_id"]) # 終わっていれば結果
cloud.cancel_hardware_job(job["task_id"]) # 待ち行列にいるうちなら取消
submit_hardware_jobはconfirm=Trueを必ず求めます。実機は実際に費用が
かかり、アカウントの割り当ての範囲でしか動かないためです。書いたとおりの量子ビット
番号を保ちたいときはpreserve_layout=Trueを渡してください(既定では
サービス側が割り当て直します)。
動いたかどうか分からないとき¶
通信の失敗が、いつも「実行されなかった」を意味するとは限りません。このサービスは Cloudflare の後ろにあり、524 は応答が始まらないまま 100 秒ほど沈黙したときに 出ます。これは「処理にかけてよい時間の上限」ではなく「沈黙の上限」です。要求自体は 既に届いていて、しかも終わっている可能性があります。手元の待ち時間切れも同じです。
この場合は素のエラーではなく CloudOutcomeUnknownが
上がるので、「起きなかった」と「起きたかどうか分からない」を区別できます。
try:
job = cloud.submit_hardware_job(c, shots=100, confirm=True)
except cloud.CloudOutcomeUnknown:
# そのまま投げ直さないでください。既に待ち行列にいるかもしれず、
# 実機ジョブの二重投入は枠と費用をもう一度使います。
for j in cloud.hardware_jobs()["jobs"]:
print(j["task_id"], j["status"])
CloudOutcomeUnknownはRuntimeErrorの子なので、既に
RuntimeErrorを捕まえている書き方はそのまま動きます。接続を拒否された場合は
従来どおり普通のエラーです。何も送られていないので、動いているはずがないからです。
MCP連携¶
同梱の MCPサーバ は cloud_run_circuit と
cloud_hardware_status ツールを公開しており、APIキーを設定した
LLMクライアントからローカルだけでなくクラウドでも回路を実行できます。
テスト¶
HTTPトランスポートは注入可能で、ネットワークなしのテストが書けます:
cloud.configure(transport=lambda method, path, payload, key, endpoint: {...})