<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ChatGPT on KnightLiブログ</title>
        <link>https://knightli.com/ja/tags/chatgpt/</link>
        <description>Recent content in ChatGPT on KnightLiブログ</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja</language>
        <lastBuildDate>Thu, 21 May 2026 08:33:14 +0800</lastBuildDate><atom:link href="https://knightli.com/ja/tags/chatgpt/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Google I/O後、GPTとGeminiのサブスクリプションはどちらを選ぶべきか？一般ユーザーと開発者向け比較</title>
        <link>https://knightli.com/ja/2026/05/21/gpt-vs-gemini-subscription-after-google-io-2026/</link>
        <pubDate>Thu, 21 May 2026 08:33:14 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/05/21/gpt-vs-gemini-subscription-after-google-io-2026/</guid>
        <description>&lt;p&gt;Google I/O 2026の後、AIサブスクリプションの選び方はかなり複雑になりました。&lt;/p&gt;
&lt;p&gt;以前は比較的単純でした。文章作成、質問応答、プログラミング、ファイル分析なら、多くの人はまずChatGPTを検討し、Google Search、Android、Gmail、Docs、YouTubeを深く使う人だけがGeminiを考える、という流れでした。しかし今は違います。GoogleはI/OでGemini 3.5 Flash、Gemini Omni、Antigravity 2.0、Gemini API Managed Agents、Google AI Studio、AI Ultraをまとめて打ち出し、Geminiエコシステムは「選択肢の一つ」から「強い競争軸」へ変わり始めています。&lt;/p&gt;
&lt;p&gt;この記事では抽象的なモデルベンチマークではなく、実際の問いに答えます。一般ユーザー、開発者、コンテンツクリエイター、企業ユーザーは、GPT / ChatGPTとGemini / Google AIのどちらを契約すべきなのでしょうか。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：AIサブスクリプションの価格、利用枠、地域、モデル提供状況はすぐ変わります。この記事の執筆日は2026年5月21日です。契約前にはOpenAIとGoogleの最新ページを確認してください。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;まず結論&#34;&gt;まず結論
&lt;/h2&gt;&lt;p&gt;主力サブスクリプションを一つだけ選ぶなら、次の考え方で十分です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日常的な文章作成、質問応答、ファイル分析、一般的なオフィス作業、中国語と英語の混在利用：ChatGPT Plusを優先。&lt;/li&gt;
&lt;li&gt;高頻度のコーディング、Codex、複雑な推論、プロジェクト単位のコード作業：ChatGPT Plus / Proを優先し、利用枠に応じてアップグレードを判断。&lt;/li&gt;
&lt;li&gt;Gmail、Docs、Drive、Android、SearchなどGoogleエコシステムを深く使う：Gemini / Google AI Proを優先。&lt;/li&gt;
&lt;li&gt;動画、AI映像、Google Flow、YouTube Shorts、Gemini Omniが中心：Google AI Pro / Ultraを優先。&lt;/li&gt;
&lt;li&gt;Antigravity、Gemini API Managed Agents、AI StudioからAndroidへのワークフローが必要：Google AI Pro / Ultraを重点的に見る。&lt;/li&gt;
&lt;li&gt;企業チーム：個人向けプランだけで判断せず、Business / Enterprise、Workspace、権限、監査、データ境界を見る。&lt;/li&gt;
&lt;li&gt;予算が限られる場合：主力の有料プランを一つ契約し、もう一方は無料枠または従量課金APIで使う方が、二つの上位プランを同時契約するより現実的。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一言でいえば、GPTは汎用生産性とコード支援の主力であり、Google I/O後のGeminiはGoogleエコシステム内のシステム級AIスイートに近づいています。&lt;/p&gt;
&lt;h2 id=&#34;google-io後geminiは何が変わったか&#34;&gt;Google I/O後、Geminiは何が変わったか
&lt;/h2&gt;&lt;p&gt;Google I/O 2026によって、Geminiの価値はGemini App単体だけでは決まらなくなりました。&lt;/p&gt;
&lt;p&gt;重要な変化は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Gemini 3.5 Flash&lt;/code&gt;：promptからactionまでの高速モデルとして位置づけられ、実際のAgentワークフローを意識している。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Gemini Omni&lt;/code&gt;：任意の入力からコンテンツを作成し、現時点では動画を起点に、多モーダル作成と自然言語による反復編集を支える。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Google Antigravity 2.0&lt;/code&gt;：開発者向けのagent-first development platformで、複数Agentの編成とコーディングを扱う。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Gemini API Managed Agents&lt;/code&gt;：API経由で、推論、ツール利用、コード実行ができるホスト型Agentを作成できる。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Google AI Studio&lt;/code&gt;：prompt playgroundから、モバイル、Androidネイティブアプリ生成、Antigravityプロジェクト出力へ広がっている。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Google AI Ultra&lt;/code&gt;：I/O後に追加された月額$100のプランで、開発者、技術責任者、知識労働者、高度なクリエイターを対象にしている。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;さらに重要なのは、GoogleがGemini Appの利用枠を従来の日次prompt制限から&lt;code&gt;compute-used&lt;/code&gt;モデルへ移行したことです。複雑な動画、コード、長文コンテキストのタスクは多くの枠を消費し、単純なテキストタスクは少なく済みます。枠は5時間ごとに更新され、週次制限に達するまで使えます。&lt;/p&gt;
&lt;p&gt;これは、GoogleがGeminiのサブスクリプションを「モデル + アプリ + クリエイティブ + 開発ツール + Googleエコシステム」の入口として作ろうとしていることを示しています。&lt;/p&gt;
&lt;h2 id=&#34;chatgpt--gptは誰に向いているか&#34;&gt;ChatGPT / GPTは誰に向いているか
&lt;/h2&gt;&lt;p&gt;ChatGPTの強みは今も大きく、AIを日常業務の主力として使う人に特に向いています。&lt;/p&gt;
&lt;p&gt;OpenAIの現在の価格ページとヘルプ文書によれば、ChatGPT FreeではGPT-5.5 Instantなどの基本機能を利用できます。PlusではGPT-5.5 Thinking、より多いメッセージとアップロード枠、強化された画像生成、deep research、agent mode、Projects、Tasks、カスタムGPT、拡張されたCodex利用が提供されます。Proではさらに高い利用枠、GPT-5.5 Pro、より大きいCodex利用枠、最大級のdeep researchとagent modeが提供されます。&lt;/p&gt;
&lt;p&gt;ChatGPTに向く場面は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文章作成、要約、翻訳、リライト。&lt;/li&gt;
&lt;li&gt;複雑な質問応答と構造化分析。&lt;/li&gt;
&lt;li&gt;ファイルアップロード、表計算分析、調査レポート。&lt;/li&gt;
&lt;li&gt;プログラミングQ&amp;amp;A、コードレビュー、リファクタリング提案。&lt;/li&gt;
&lt;li&gt;Codexによるリポジトリ作業。&lt;/li&gt;
&lt;li&gt;多言語コンテンツ制作。&lt;/li&gt;
&lt;li&gt;モデル品質と回答の安定性を重視しつつ、Google製品への依存が強くない場合。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一般ユーザーにとって、ChatGPT Plusは今も最も安定した主力サブスクリプションです。カバー範囲が広く、学習コストが低く、中国語と英語のタスクもバランスよく扱えます。&lt;/p&gt;
&lt;p&gt;開発者にとって、ChatGPTの重要点はチャットだけではなくCodexです。OpenAIのヘルプ文書では、条件を満たすChatGPTプランでCodexを利用でき、利用枠はプランによって変わると説明されています。コード修正、PR、リファクタリング、テスト修正にCodexを多用するなら、サブスクリプション選びではCodex枠も一緒に考える必要があります。&lt;/p&gt;
&lt;h2 id=&#34;gemini--google-aiは誰に向いているか&#34;&gt;Gemini / Google AIは誰に向いているか
&lt;/h2&gt;&lt;p&gt;Google I/O後、Geminiの強みはよりはっきりしました。Googleエコシステムとの結びつきが深いことです。&lt;/p&gt;
&lt;p&gt;Google AIサブスクリプションは、Gemini App内のモデル枠だけではありません。Gemini Omni、Google Flow、Antigravity、AI Studio、一部のYouTube Premium / Lite特典、Workspace / Android / Searchエコシステムの機能も含みます。GoogleはAI Ultraを$100およびそれ以上の上位プランに広げ、開発者、技術責任者、知識労働者、高度なクリエイターを強調しています。&lt;/p&gt;
&lt;p&gt;Geminiに向く場面は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gmail、Docs、Drive、Sheets、Slides、Androidを深く使っている。&lt;/li&gt;
&lt;li&gt;AIをGoogle Search、YouTube、Workspaceの中に入れたい。&lt;/li&gt;
&lt;li&gt;Gemini Omni、Google Flow、動画生成、動画編集に関心がある。&lt;/li&gt;
&lt;li&gt;Antigravity、Gemini API Managed Agents、AI Studio mobileを試したい。&lt;/li&gt;
&lt;li&gt;超長文コンテキストで文書を理解したい。&lt;/li&gt;
&lt;li&gt;Googleエコシステムアプリ、Androidネイティブアプリ、Workspace自動化を作る。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Googleのヘルプページによると、Gemini Appsのコンテキストウィンドウはサブスクリプションに応じて大きくなります。AI planなしでは32K、AI Plusでは128K、AI ProとAI Ultraでは1 millionです。AI Pro / Ultraでは、より高い利用制限、追加機能、一部の早期機能も提供されます。&lt;/p&gt;
&lt;p&gt;仕事環境がすでにGoogleエコシステム内にあるなら、Geminiの価値は大きくなります。そうでなければ、Geminiを単に「もう一つのチャットボット」として契約する価値は、ChatGPTより安定して高いとは限りません。&lt;/p&gt;
&lt;h2 id=&#34;一般ユーザーの選び方&#34;&gt;一般ユーザーの選び方
&lt;/h2&gt;&lt;p&gt;一般ユーザーが陥りやすい失敗は、新モデル発表のたびに複数プラットフォームを同時契約することです。&lt;/p&gt;
&lt;p&gt;より合理的な選び方は、主な利用場面から考えることです。&lt;/p&gt;
&lt;p&gt;主に次のことをするなら：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;記事を書く。&lt;/li&gt;
&lt;li&gt;資料を調べる。&lt;/li&gt;
&lt;li&gt;要約する。&lt;/li&gt;
&lt;li&gt;PDFを読む。&lt;/li&gt;
&lt;li&gt;メールを書く。&lt;/li&gt;
&lt;li&gt;履歴書を直す。&lt;/li&gt;
&lt;li&gt;言語を学ぶ。&lt;/li&gt;
&lt;li&gt;日常的に質問する。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ChatGPT Plusを優先してください。汎用性が高く、タスクの境界が明確で、特定のエコシステムに深く縛られる必要がありません。&lt;/p&gt;
&lt;p&gt;主に次のことをするなら：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gmail / Docs / Drive / YouTube / Androidを高頻度で使う。&lt;/li&gt;
&lt;li&gt;AIをGoogleエコシステムに直接入れたい。&lt;/li&gt;
&lt;li&gt;Gemini App、Daily Brief、Google Search AI、YouTubeコンテンツQ&amp;amp;Aを試したい。&lt;/li&gt;
&lt;li&gt;Googleドキュメントを長文コンテキストで読みたい。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google AI Proを優先してください。&lt;/p&gt;
&lt;p&gt;軽い利用だけなら、まず両方の無料枠を使い、明確な制限に当たってから有料化すれば十分です。「使うかもしれない」だけで上位プランを契約する必要はありません。&lt;/p&gt;
&lt;h2 id=&#34;開発者の選び方&#34;&gt;開発者の選び方
&lt;/h2&gt;&lt;p&gt;開発者は大きく二種類に分けられます。&lt;/p&gt;
&lt;p&gt;第一のタイプは、コード質問、bug修正、スクリプト作成、リポジトリ読解が中心の人です。ChatGPT Plus / Pro + Codexを優先してください。&lt;/p&gt;
&lt;p&gt;理由は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CodexとChatGPTアカウントがつながっている。&lt;/li&gt;
&lt;li&gt;ChatGPTはコード説明、リファクタリング、テスト、エラー分析が安定している。&lt;/li&gt;
&lt;li&gt;Plusで多くの日常開発タスクをカバーできる。&lt;/li&gt;
&lt;li&gt;Proは高頻度、長時間、複雑なリポジトリ作業に向いている。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第二のタイプは、Googleエコシステム、Agentプラットフォーム、Android、Workspace、Gemini APIを中心に開発する人です。Google AI Pro / Ultraを優先してください。&lt;/p&gt;
&lt;p&gt;理由は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gemini 3.5 FlashはGoogle I/O後のAgentワークフローの重点モデル。&lt;/li&gt;
&lt;li&gt;Antigravity 2.0はGoogleのAgent-first開発プラットフォーム。&lt;/li&gt;
&lt;li&gt;Managed AgentsはAPI経由で、ツール付きかつ隔離Linux環境を持つAgentを作れる。&lt;/li&gt;
&lt;li&gt;AI StudioはAndroid、Workspace、Antigravityと自然につながる。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;フルスタック開発者にとって現実的な組み合わせは、多くの場合次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT Plusを日常のコードとドキュメントの主力にする。&lt;/li&gt;
&lt;li&gt;Gemini無料枠またはAI ProをGoogleエコシステム、長文コンテキスト、動画/Agent新機能に使う。&lt;/li&gt;
&lt;li&gt;APIは従量課金で使い、個人サブスクリプションを本番API予算と誤解しない。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;コンテンツクリエイターの選び方&#34;&gt;コンテンツクリエイターの選び方
&lt;/h2&gt;&lt;p&gt;コンテンツクリエイターの選択は、何を作るかで決まります。&lt;/p&gt;
&lt;p&gt;主に次のことをするなら：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コピー。&lt;/li&gt;
&lt;li&gt;見出し。&lt;/li&gt;
&lt;li&gt;台本。&lt;/li&gt;
&lt;li&gt;記事。&lt;/li&gt;
&lt;li&gt;画像付きコンテンツ。&lt;/li&gt;
&lt;li&gt;資料整理。&lt;/li&gt;
&lt;li&gt;多言語リライト。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ChatGPT Plusは今も安定しています。&lt;/p&gt;
&lt;p&gt;主に次のことをするなら：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;動画生成。&lt;/li&gt;
&lt;li&gt;ショート動画のアイデア。&lt;/li&gt;
&lt;li&gt;AI映像。&lt;/li&gt;
&lt;li&gt;YouTube Shorts。&lt;/li&gt;
&lt;li&gt;Google Flowワークフロー。&lt;/li&gt;
&lt;li&gt;多モーダル素材の統合。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gemini / Google AI ProまたはUltraに注目する価値があります。I/O後、Gemini OmniとGoogle FlowはGoogleのクリエイティブ領域での中心的なカードです。&lt;/p&gt;
&lt;p&gt;予算が限られるなら、まずテキスト主力を一つ契約し、もう一方の無料枠や短期契約で動画機能を試すのがよいでしょう。動画モデルの利用枠、待ち時間、長さ、解像度、地域制限は変化が速いため、最初から長期の制作基盤として計画しない方が無難です。&lt;/p&gt;
&lt;h2 id=&#34;企業とチームの選び方&#34;&gt;企業とチームの選び方
&lt;/h2&gt;&lt;p&gt;企業は個人ユーザーの発想で選ぶべきではありません。&lt;/p&gt;
&lt;p&gt;本当に見るべきなのは「今週どのモデルが強いか」ではなく、次の点です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;データが学習に使われるか。&lt;/li&gt;
&lt;li&gt;SSO、MFA、RBACがあるか。&lt;/li&gt;
&lt;li&gt;監査ログがあるか。&lt;/li&gt;
&lt;li&gt;社内ナレッジ接続に対応するか。&lt;/li&gt;
&lt;li&gt;プラグイン、コネクタ、Agent権限を制御できるか。&lt;/li&gt;
&lt;li&gt;組織のコンプライアンス要件を満たすか。&lt;/li&gt;
&lt;li&gt;既存のオフィススイートと連携できるか。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;企業がすでにGoogle Workspaceを深く使っているなら、Geminiの企業向けプランは自然に評価対象になります。チームがすでにChatGPT、Codex、OpenAI API、社内ツールチェーンを中心にプロセスを作っているなら、OpenAI Business / Enterpriseの方が自然です。&lt;/p&gt;
&lt;p&gt;エンジニアリングチームは、Codex、Antigravity、Gemini API Managed Agents、MCP、CI/CD、コード権限、リポジトリアクセス、監査も別途評価する必要があります。&lt;/p&gt;
&lt;h2 id=&#34;pro--ultraが必要になるタイミング&#34;&gt;Pro / Ultraが必要になるタイミング
&lt;/h2&gt;&lt;p&gt;多くの人は実際には上位プランを必要としていません。&lt;/p&gt;
&lt;p&gt;ChatGPT Proが必要な典型的なサイン：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;毎日長時間ChatGPTを使う。&lt;/li&gt;
&lt;li&gt;Plusの利用枠がよく足りなくなる。&lt;/li&gt;
&lt;li&gt;Codexを高頻度で使う。&lt;/li&gt;
&lt;li&gt;deep research、agent mode、複雑な推論をよく使う。&lt;/li&gt;
&lt;li&gt;GPT-5.5 Proのような上位モデルが必要。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google AI Ultraが必要な典型的なサイン：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gemini、Flow、Antigravityを高頻度で使う。&lt;/li&gt;
&lt;li&gt;Gemini / Antigravityのより高い利用枠が必要。&lt;/li&gt;
&lt;li&gt;動画制作、AI映像、長文コンテキスト研究を行う。&lt;/li&gt;
&lt;li&gt;Googleエコシステムと新機能の早期利用に深く依存している。&lt;/li&gt;
&lt;li&gt;Gemini Spark、Project Genie、または上位サブスクリプション特典が必要。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;毎日数回質問する、たまに記事を書く、少しコードを直す程度なら、Plus / ProやAI Pro / Ultraは必須ではありません。&lt;/p&gt;
&lt;h2 id=&#34;最も安く使う戦略&#34;&gt;最も安く使う戦略
&lt;/h2&gt;&lt;p&gt;おすすめは次の組み合わせです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;まず主力の有料サブスクリプションを一つ選ぶ。&lt;/li&gt;
&lt;li&gt;もう一方のプラットフォームは無料枠で使う。&lt;/li&gt;
&lt;li&gt;APIが本当に必要になったら従量課金で使う。&lt;/li&gt;
&lt;li&gt;動画、Agent、deep researchのような高消費機能は月単位でオン/オフし、年間で盲目的に契約しない。&lt;/li&gt;
&lt;li&gt;毎月振り返る：本当に利用枠を使い切ったか。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;よくある組み合わせ：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一般的なオフィス作業：ChatGPT Plus + Gemini無料枠。&lt;/li&gt;
&lt;li&gt;Googleエコシステムユーザー：Google AI Pro + ChatGPT無料枠。&lt;/li&gt;
&lt;li&gt;開発者：ChatGPT Plus/Pro + Gemini API/AI Studioを必要に応じて利用。&lt;/li&gt;
&lt;li&gt;動画クリエイター：Google AI Pro/Ultra + ChatGPT無料枠またはPlus。&lt;/li&gt;
&lt;li&gt;企業チーム：個人プランを寄せ集めず、Business / Enterprise / Workspaceプランを直接評価。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;契約前チェックリスト&#34;&gt;契約前チェックリスト
&lt;/h2&gt;&lt;p&gt;支払う前に、次の点を確認してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自分の地域で対象プランが使えるか。&lt;/li&gt;
&lt;li&gt;必要なモデルがそのプランに含まれているか。&lt;/li&gt;
&lt;li&gt;Codex、Antigravity、Flow、Omniが本当に使えるか。&lt;/li&gt;
&lt;li&gt;動画機能に地域、年齢、待ち行列、解像度の制限があるか。&lt;/li&gt;
&lt;li&gt;API呼び出しはサブスクリプションに含まれるのか、別課金なのか。&lt;/li&gt;
&lt;li&gt;ファイルアップロード、コンテキストウィンドウ、agent mode、deep researchに制限があるか。&lt;/li&gt;
&lt;li&gt;データプライバシー設定がプロジェクト要件に合うか。&lt;/li&gt;
&lt;li&gt;Google One、Workspace、ChatGPT Business、学校/会社アカウントの特典をすでに持っていないか。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;特に注意すべき点は、個人サブスクリプションはAPI無料、商用無制限、企業コンプライアンスを意味しないということです。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ
&lt;/h2&gt;&lt;p&gt;Google I/O後、Geminiの競争力は明らかに強まりました。特に動画、多モーダル、Googleエコシステム、Android、AI Studio、Antigravityの領域です。一方で、ChatGPTは日常の文章作成、複雑な質問応答、ファイル分析、コード支援、Codexワークフローにおいて、今もより安定した汎用主力です。&lt;/p&gt;
&lt;p&gt;最も簡単な判断は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;迷うなら：まずChatGPT Plus。&lt;/li&gt;
&lt;li&gt;Googleを深く使うなら：Google AI Pro。&lt;/li&gt;
&lt;li&gt;高頻度の開発者なら：CodexとAntigravityのどちらが自分のワークフローに合うかを見る。&lt;/li&gt;
&lt;li&gt;動画クリエイターなら：Gemini Omni、Flow、Google AI Pro / Ultraを優先して確認。&lt;/li&gt;
&lt;li&gt;企業ユーザーなら：モデルの話題性ではなく、コンプライアンス、権限、監査、既存オフィスエコシステムで選ぶ。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AIサブスクリプションは多ければよいわけではありません。本当にコスト効率がよいのは、主力ワークフローを一つ決め、他のプラットフォームを補助として使うことです。発表会のたびに長期サブスクリプションを増やす必要はありません。&lt;/p&gt;
&lt;p&gt;参考情報：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://chatgpt.com/pricing/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI：ChatGPT Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11369540-using-codex-with-your-chatgpt-plan&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Help：Using Codex with your ChatGPT plan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.google/products-and-platforms/products/google-one/google-ai-subscriptions/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Blog：Everything new in Google AI subscriptions from I/O 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.google/innovation-and-ai/technology/developers-tools/google-io-2026-developer-highlights/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Blog：I/O 2026 developer highlights&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://support.google.com/gemini/answer/16275805&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Help：Gemini Apps limits and upgrades for Google AI subscribers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>AI Agentはどう進化したのか？2022-2026年の5世代を整理する</title>
        <link>https://knightli.com/ja/2026/05/16/ai-agent-evolution-2022-2026/</link>
        <pubDate>Sat, 16 May 2026 19:19:52 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/05/16/ai-agent-evolution-2022-2026/</guid>
        <description>&lt;p&gt;AI Agentは一夜で生まれたものではありません。&lt;/p&gt;
&lt;p&gt;2022年末、ChatGPTはまだ会話できるウィンドウに近い存在でした。2026年になると、Agentはツール呼び出し、ファイル操作、コンピューター制御、長期記憶、リモート協業、常駐実行に近い能力を持ち始めています。4年間で、質問に答えるモデルから、タスクを前に進めるデジタルワーカーへ近づきました。&lt;/p&gt;
&lt;p&gt;時系列で見ると、AI Agentは大きく5世代に分けられます。各世代は前の世代の欠点を解決しながら、新しいバブルと安全上の課題も生みました。&lt;/p&gt;
&lt;h2 id=&#34;概観5世代のagentタイムライン&#34;&gt;概観：5世代のAgentタイムライン
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;段階&lt;/th&gt;
          &lt;th&gt;時期&lt;/th&gt;
          &lt;th&gt;キーワード&lt;/th&gt;
          &lt;th&gt;能力の変化&lt;/th&gt;
          &lt;th&gt;主な問題&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;第0世代&lt;/td&gt;
          &lt;td&gt;2022年末 - 2023年初&lt;/td&gt;
          &lt;td&gt;チャット画面&lt;/td&gt;
          &lt;td&gt;テキスト生成はできるが行動できない&lt;/td&gt;
          &lt;td&gt;モデルと現実世界が切断されている&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;第1世代&lt;/td&gt;
          &lt;td&gt;2023年中頃 - 2023年末&lt;/td&gt;
          &lt;td&gt;ツール呼び出し&lt;/td&gt;
          &lt;td&gt;構造化呼び出し、APIとRAG接続&lt;/td&gt;
          &lt;td&gt;開ループ実行とタスク迷走&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;第2世代&lt;/td&gt;
          &lt;td&gt;2023年末 - 2024年&lt;/td&gt;
          &lt;td&gt;工程化ワークフロー&lt;/td&gt;
          &lt;td&gt;計画、状態、反省、複数Agent協業&lt;/td&gt;
          &lt;td&gt;ワークフローがコピーされやすい&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;第3世代&lt;/td&gt;
          &lt;td&gt;2024年 - 2025年&lt;/td&gt;
          &lt;td&gt;Computer Use&lt;/td&gt;
          &lt;td&gt;画面を見てGUIを操作&lt;/td&gt;
          &lt;td&gt;権限、安全、誤操作リスク&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;第4世代&lt;/td&gt;
          &lt;td&gt;2025年 - 2026年&lt;/td&gt;
          &lt;td&gt;MCP / Skills / 常駐&lt;/td&gt;
          &lt;td&gt;ツールネットワーク、長期文脈、専門スキル&lt;/td&gt;
          &lt;td&gt;常駐実行でリスク半径が拡大&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;第5世代予測&lt;/td&gt;
          &lt;td&gt;2026年以降&lt;/td&gt;
          &lt;td&gt;閉ループと世界モデル&lt;/td&gt;
          &lt;td&gt;記憶、検証、物理行動の強化&lt;/td&gt;
          &lt;td&gt;ガバナンスがさらに難しくなる&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;2022年末第0世代chatgptチャット画面の時代&#34;&gt;2022年末：第0世代、ChatGPTチャット画面の時代
&lt;/h2&gt;&lt;p&gt;第0世代の起点は、2022年11月30日のChatGPT公開です。&lt;/p&gt;
&lt;p&gt;この世代はまだ本当のAgentとは言えません。自然言語生成は強力でしたが、主にチャット画面の中に閉じ込められていました。Pythonコードを書くことはできても、あなたのPCで実行できない。旅行計画は作れても、サイトを開いて予約できない。ファイルの直し方は説明できても、ファイルシステムに入って変更できない。&lt;/p&gt;
&lt;p&gt;能力の境界は明確でした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自然言語を理解できる&lt;/li&gt;
&lt;li&gt;記事、回答、コード、計画を生成できる&lt;/li&gt;
&lt;li&gt;最新データに自分でアクセスできない&lt;/li&gt;
&lt;li&gt;企業内部資料を安定して読めない&lt;/li&gt;
&lt;li&gt;外部アクションを実行できない&lt;/li&gt;
&lt;li&gt;長期タスク状態を管理できない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第0世代の核心は、モデル能力と現実世界の断絶でした。考えて話すことはできるが、行動できない。&lt;/p&gt;
&lt;p&gt;この段階では、プロンプトエンジニア、プロンプトテンプレート市場、講座、認定といった最初のバブルも生まれました。初期モデルがpromptに敏感だったのは事実ですが、市場は一時的な補助を長期的な堀と誤解しました。&lt;/p&gt;
&lt;p&gt;その後、GPT-4級モデル、system prompt、function calling、製品側の標準導線が成熟し、多くのプロンプトテンプレートは希少性を失いました。このパターンは繰り返されます。新能力が出ると中間層が爆発し、次世代システムがその能力を内蔵すると中間層は蒸発します。&lt;/p&gt;
&lt;h2 id=&#34;2023年中頃第1世代ツール呼び出しの覚醒&#34;&gt;2023年中頃：第1世代、ツール呼び出しの覚醒
&lt;/h2&gt;&lt;p&gt;第1世代のキーワードはツール呼び出しです。&lt;/p&gt;
&lt;p&gt;2023年6月、OpenAIは&lt;code&gt;function calling&lt;/code&gt;を公開しました。開発者は関数名、用途、引数型、&lt;code&gt;JSON Schema&lt;/code&gt;をモデルに説明できます。モデルはユーザーの要求を理解したうえで、通常の自然言語ではなく構造化JSONを出力し、外部システムがそれを実行します。&lt;/p&gt;
&lt;p&gt;これは大きな構造変化でした。モデルは「話すだけの脳」から、外部ツールを動かす脳へ変わり始めました。&lt;/p&gt;
&lt;p&gt;第1世代の能力は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザー意図に応じてツールを選ぶ&lt;/li&gt;
&lt;li&gt;構造化引数を出す&lt;/li&gt;
&lt;li&gt;外部APIを呼び出す&lt;/li&gt;
&lt;li&gt;API結果をモデルに戻して推論を続ける&lt;/li&gt;
&lt;li&gt;RAGで外部知識に接続する&lt;/li&gt;
&lt;li&gt;プラグインや知識ベースで初期personaを作る&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;同時期に&lt;code&gt;RAG&lt;/code&gt;とベクトルデータベースも流行しました。モデルが最新情報、企業固有資料、内部知識を知らない問題を補うため、関連文書を検索し、文脈に注入して回答させる方式です。&lt;/p&gt;
&lt;p&gt;この頃、Agentの基本構造が見えてきました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;あなたは誰か：system promptとpersona&lt;/li&gt;
&lt;li&gt;何を知っているか：知識ベース、RAG、私有文書&lt;/li&gt;
&lt;li&gt;何ができるか：function calling、プラグイン、外部API&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;代表的なバブルはAutoGPTです。ユーザーが大きな目標を与えると、AIがタスク分解、検索、ファイル作成、評価、ループを行い、自分で完了判断するという魅力的な構想でした。&lt;/p&gt;
&lt;p&gt;しかしAutoGPTはすぐに問題を露呈しました。状態制約、終了条件、信頼できるフィードバックが不足し、間違った方向に進み続けたり、誤ったAPI引数を繰り返したり、大量のAPIコールでコストを燃やしたりしました。第1世代の教訓は明確です。ツールと無限ループだけでは、本番品質のAgentにはなりません。&lt;/p&gt;
&lt;h2 id=&#34;2023年末から2024年第2世代工程化ワークフロー&#34;&gt;2023年末から2024年：第2世代、工程化ワークフロー
&lt;/h2&gt;&lt;p&gt;AutoGPTの失敗は、モデルの自由行動だけに頼れないことを業界に示しました。複雑なタスクには構造化されたプロセスが必要です。&lt;/p&gt;
&lt;p&gt;第2世代のキーワードは工程化ワークフローです。Agentは単発のモデル呼び出しではなく、状態、制御フロー、評価を持つソフトウェアシステムになりました。&lt;/p&gt;
&lt;p&gt;主な能力は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;タスク計画：大きな目標をステップに分解&lt;/li&gt;
&lt;li&gt;状態管理：作業がどこまで進んだかを記録&lt;/li&gt;
&lt;li&gt;反省と修正：生成後に評価し、修正する&lt;/li&gt;
&lt;li&gt;ツール編成：複数ツールを切り替える&lt;/li&gt;
&lt;li&gt;人間の確認：重要な節目で人に確認する&lt;/li&gt;
&lt;li&gt;複数Agent協業：異なる役割に分担させる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;典型例は&lt;code&gt;ReAct&lt;/code&gt;、つまり&lt;code&gt;Reasoning + Acting&lt;/code&gt;です。モデルが推論し、ツールを呼び出し、観察結果を受け取り、次の推論に進みます。Agentは盲目的に動かず、各ステップに監査可能な論理とフィードバックを持ちます。&lt;/p&gt;
&lt;p&gt;第2世代の価値は、モデル能力を制御可能なプロセスに入れたことです。よく設計されたworkflowは、単発の大規模モデル呼び出しよりも安定した成果を出すことがあります。&lt;/p&gt;
&lt;p&gt;一方で、低コードAgentプラットフォームのバブルも生まれました。ドラッグ&amp;amp;ドロップでprompt、RAG、プラグイン、フローを組み合わせるツールは構築の敷居を下げました。しかし、ワークフローが低コストでコピーできるなら、プラットフォーム自体の堀は弱いです。&lt;/p&gt;
&lt;p&gt;早期需要を取れることと、長期的な壁を持つことは別です。&lt;/p&gt;
&lt;h2 id=&#34;2024年から2025年第3世代computer-useが実画面に入る&#34;&gt;2024年から2025年：第3世代、Computer Useが実画面に入る
&lt;/h2&gt;&lt;p&gt;第3世代のキーワードは&lt;code&gt;Computer Use&lt;/code&gt;です。&lt;/p&gt;
&lt;p&gt;以前のツール呼び出しは主にAPIに依存していました。何ができるかは開発者が何を接続したかに依存します。しかし現実のソフトウェアには、きれいなAPIがない、公開されていない、不完全である、といったものが多くあります。&lt;/p&gt;
&lt;p&gt;Computer Useは、モデルが画面を見て、クリックし、GUIを操作できるようにします。汎用的なコンピューター画面そのものがツールになります。&lt;/p&gt;
&lt;p&gt;主な能力は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;画面内容の認識&lt;/li&gt;
&lt;li&gt;ボタンのクリック、文字入力、ウィンドウ切り替え&lt;/li&gt;
&lt;li&gt;Webとデスクトップアプリの操作&lt;/li&gt;
&lt;li&gt;リポジトリの読解、ファイル編集、テスト実行&lt;/li&gt;
&lt;li&gt;端末出力とエラーの確認&lt;/li&gt;
&lt;li&gt;実際のエンジニアリング助手に近づく&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これにより、Agentは「接続済みツールの呼び出し」から「人のようにソフトウェア画面を操作する」方向に進みました。coding agentも、プロジェクトを読み、コードを直し、テストを走らせ、エラーから修正する流れに近づきます。&lt;/p&gt;
&lt;p&gt;しかし信頼境界も広がります。AIがPCを操作するなら、誤クリック、誤削除、誤送信があり得ます。Webページ、文書、UI文言による誘導もあります。prompt injectionは会話上の問題だけでなく、ファイル操作、権限、システム安全の問題になります。&lt;/p&gt;
&lt;p&gt;第3世代の教訓は、実操作に近づくほど、サンドボックス、承認、ロールバック、最小権限が必要になることです。&lt;/p&gt;
&lt;h2 id=&#34;2025年から2026年第4世代mcpskills常駐デジタルワーカー&#34;&gt;2025年から2026年：第4世代、MCP、Skills、常駐デジタルワーカー
&lt;/h2&gt;&lt;p&gt;第4世代のキーワードは、常駐、接続、記憶、専門化です。&lt;/p&gt;
&lt;p&gt;この世代の焦点は、単発タスクの強化だけではありません。Agentは長期文脈、ツールネットワーク、専門スキル、時間感覚を持ち始めます。一回のチャット内の助手ではなく、継続して働けるデジタルワーカーに近づきます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;MCP&lt;/code&gt;はツール接続の問題を解きます。ファイルシステム、データベース、ブラウザ、設計ツール、プロジェクト管理ツール、企業システムを標準化された方法で接続できます。プロトコルが安定すると、単なるツール接続中間層は圧縮されます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Skills&lt;/code&gt;は専門的方法の問題を解きます。ツールはAgentに何ができるかを伝え、Skillsはどう進めるべきかを伝えます。良いskillはpromptではなく、領域の手順、制約、チェック方法、落とし穴、ツール呼び出し順をまとめたものです。&lt;/p&gt;
&lt;p&gt;第4世代の能力は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;長期記憶：ユーザー嗜好、プロジェクト規則、履歴を保存&lt;/li&gt;
&lt;li&gt;プロジェクト文脈：リポジトリ、文書、作業規約を理解&lt;/li&gt;
&lt;li&gt;ツールネットワーク：MCP、API、ブラウザ、ファイルシステムで外界に接続&lt;/li&gt;
&lt;li&gt;専門スキル：Skillsでタスク手法をパッケージ化&lt;/li&gt;
&lt;li&gt;常駐実行：待機、起床、通知、追跡&lt;/li&gt;
&lt;li&gt;リモート協業：別デバイスから承認や方向修正が可能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この世代のAgentは「従業員らしさ」を持ち始めます。役割と責任境界、長期文脈、専門的な作業方法、時間感覚、ツール権限、無人時の継続実行です。&lt;/p&gt;
&lt;p&gt;しかし能力が従業員に近づくほど、リスク半径も従業員に近づきます。常駐、ローカルデータ読み取り、秘密情報、ツール呼び出し、タスク処理により、安全問題は中心課題になります。&lt;/p&gt;
&lt;p&gt;特に重要なのは、テキストも攻撃面であることです。AgentがMarkdown、説明文書、skill pack、Webページを読んで従うなら、悪意あるテキストが行動を変える可能性があります。prompt injectionは、サプライチェーン、権限、実行安全の問題になります。&lt;/p&gt;
&lt;p&gt;第4世代の教訓は、常駐Agentには能力だけでなくガバナンスが必要だということです。&lt;/p&gt;
&lt;h2 id=&#34;2026年以降第5世代予測閉ループ内在記憶世界モデル&#34;&gt;2026年以降：第5世代予測、閉ループ、内在記憶、世界モデル
&lt;/h2&gt;&lt;p&gt;第5世代はまだ確定した歴史ではありません。前の4年の流れからの予測です。&lt;/p&gt;
&lt;p&gt;成熟したAgentには少なくとも3つの閉ループが必要です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;実行ループ：各操作後に結果を検証し、必要ならロールバック、修正、再試行する&lt;/li&gt;
&lt;li&gt;時間ループ：複数の起床周期をまたいで長期目標を追跡する&lt;/li&gt;
&lt;li&gt;認知ループ：確実な情報、推測、古い情報を区別する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;次の方向は内在記憶です。これまでの記憶は、RAG、ベクトルDB、会話履歴、ローカルファイル、&lt;code&gt;memory.md&lt;/code&gt;のようにモデル外部にありました。将来のモデルが会話をまたいだ持続状態を持つなら、Agentの記憶システムは再設計されます。&lt;/p&gt;
&lt;p&gt;第三の方向は世界モデルです。現在の多くのAgentは、観察、反応、再観察という反応型です。高リスクな作業では、行動の結果を事前にシミュレートする力が必要です。&lt;/p&gt;
&lt;p&gt;第四の方向は具身化です。これまでの世代は主にデジタル空間で進化しました。API、画面、ファイル、ブラウザ、企業ツールです。次は、ロボット、デバイス制御、産業システム、物理インターフェースへ広がる可能性があります。&lt;/p&gt;
&lt;p&gt;第5世代が解くべき問題は、Agentがタスクを実行するだけでなく、行動結果を理解し、長期状態を管理し、大きなリスク半径の中で信頼性を保つことです。&lt;/p&gt;
&lt;h2 id=&#34;このタイムラインの背後にある6つの法則&#34;&gt;このタイムラインの背後にある6つの法則
&lt;/h2&gt;&lt;p&gt;第一に、基盤モデル能力は依然として天井です。Agentは大規模モデルの外にある魔法ではなく、モデル能力を工程システムで解放する方法です。&lt;/p&gt;
&lt;p&gt;第二に、工程化された構造はモデル能力を増幅します。計画、検証、反省、修正、評価、権限管理は、単発生成よりも納品可能な結果に近いです。&lt;/p&gt;
&lt;p&gt;第三に、オープンプロトコルは価値分配を変えます。MCP、Skills、プロジェクト文脈の標準が安定すると、競争はツール接続から領域能力の蓄積へ移ります。&lt;/p&gt;
&lt;p&gt;第四に、Agent進化の隠れた主線は人間と機械の信頼境界の拡大です。テキスト、API、ワークフロー、PC操作、常駐実行へと、各世代でリスク半径が広がります。&lt;/p&gt;
&lt;p&gt;第五に、各世代の事故は次世代の規則になります。AutoGPTの無限ループは構造化編成を促し、vibe codingの失敗は評価駆動開発を促し、本番削除事故は最小権限とサンドボックスを促します。&lt;/p&gt;
&lt;p&gt;第六に、Agentエコシステムは爆発と絶滅を繰り返します。能力更新は一時的な中間層を作り、モデルやプラットフォームの内蔵化がそれを消します。時間窓を堀と誤解するのは危険です。&lt;/p&gt;
&lt;h2 id=&#34;本当の堀&#34;&gt;本当の堀
&lt;/h2&gt;&lt;p&gt;AI Agent領域の本当の堀は、新しい能力を最初に包装することではありません。&lt;/p&gt;
&lt;p&gt;より信頼できる堀は3つです。&lt;/p&gt;
&lt;p&gt;第一に、垂直領域の深さ。業界の流れ、リスク、例外、責任境界を本当に理解しているか。&lt;/p&gt;
&lt;p&gt;第二に、データフライホイール。実利用から高品質なフィードバックを集め、プロセス、評価、微調整、製品判断を改善できるか。&lt;/p&gt;
&lt;p&gt;第三に、ユーザー信頼。ユーザーが高価値で長期的、リスクのある仕事を任せるか、一回限りのツールとして扱うか。&lt;/p&gt;
&lt;p&gt;プラットフォームや基盤モデルに能力が吸収された後も、プロセス、フィードバック、責任境界、信頼が残る製品だけが生き残りやすいです。&lt;/p&gt;
&lt;h2 id=&#34;最後に&#34;&gt;最後に
&lt;/h2&gt;&lt;p&gt;2022年から2026年までのAI Agent進化は、「モデルが会話上手になった」話ではありません。「人間がAIに任せる仕事が増えた」話です。&lt;/p&gt;
&lt;p&gt;成熟したAgentとは、最も大胆に自動実行するシステムではありません。いつ実行し、いつ検証し、いつ止まり、いつ人に確認するかを知るシステムです。&lt;/p&gt;
&lt;p&gt;あるAgent製品に長期価値があるかを判断するなら、こう問うべきです。次のモデルやプラットフォームがその能力を内蔵した後、何が残るのか。&lt;/p&gt;
&lt;p&gt;答えが領域プロセス、実データ、検証可能な結果、ユーザー信頼なら、長期価値があるかもしれません。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Codexのモバイルリモートアクセス：ChatGPT AppでMac上の開発タスクを追跡する</title>
        <link>https://knightli.com/ja/2026/05/16/codex-mobile-remote-access-chatgpt-app/</link>
        <pubDate>Sat, 16 May 2026 17:42:40 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/05/16/codex-mobile-remote-access-chatgpt-app/</guid>
        <description>&lt;p&gt;OpenAIは2026年5月中旬、&lt;code&gt;Codex remote access&lt;/code&gt;をChatGPTモバイルアプリに追加しました。これはスマートフォンでコードを書く機能ではなく、Mac上で動くCodexをスマートフォンから追跡・操作するための機能です。&lt;/p&gt;
&lt;p&gt;Codexは引き続きMac上でプロジェクトを読み、コマンドを実行し、ファイルを編集し、テスト結果を確認します。スマートフォン側は進捗確認、質問への回答、追加指示、操作承認を担当します。&lt;/p&gt;
&lt;h2 id=&#34;できること&#34;&gt;できること
&lt;/h2&gt;&lt;p&gt;OpenAIのCodex remote connectionsドキュメントによると、モバイルアクセスでは次のことができます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ホスト上のプロジェクトで新しいthreadを開始、または既存threadを継続&lt;/li&gt;
&lt;li&gt;追加指示の送信、質問への回答、作業方向の調整&lt;/li&gt;
&lt;li&gt;コマンドやその他の操作の承認&lt;/li&gt;
&lt;li&gt;出力、diff、テスト結果、端末出力、スクリーンショットの確認&lt;/li&gt;
&lt;li&gt;Codexの完了や注意が必要なタイミングで通知を受信&lt;/li&gt;
&lt;li&gt;接続済みホストとthreadの切り替え&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;単なる小さなチャット画面ではなく、Codexの作業コンテキストに接続するモバイル操作面です。&lt;/p&gt;
&lt;h2 id=&#34;必要条件&#34;&gt;必要条件
&lt;/h2&gt;&lt;p&gt;同じChatGPTアカウントとworkspaceでCodexを使える必要があります。スマートフォンには最新版のChatGPT Appが必要で、iOSとAndroidに対応します。&lt;/p&gt;
&lt;p&gt;ホストは現時点ではMacです。Macは起動中、オンライン、Codex App実行中で、同じアカウントとworkspaceにログインしている必要があります。モバイル設定とデバイス制御には現在&lt;code&gt;Codex App for macOS&lt;/code&gt;が必要で、Codex CLIやIDE Extensionからは設定できません。&lt;/p&gt;
&lt;p&gt;MFA、SSO、passkeyが必要なアカウントでは、セットアップ中にその認証を完了する必要があります。ChatGPT workspaceでは、管理者がRemote Control accessを有効にする必要がある場合もあります。&lt;/p&gt;
&lt;h2 id=&#34;制限&#34;&gt;制限
&lt;/h2&gt;&lt;p&gt;第一に、現在は&lt;code&gt;macOS host&lt;/code&gt;が必要です。スマートフォンが接続するのはMac上のCodex Appであり、Codex CLI、IDE Extension、Linux / Windows開発機に直接接続するわけではありません。&lt;/p&gt;
&lt;p&gt;第二に、ホストはオンラインでなければなりません。Macがスリープしたり、ネットワークを失ったり、Codex Appを閉じたりすると、リモートセッションは切断される可能性があります。&lt;/p&gt;
&lt;p&gt;第三に、接続はQRコードのセットアップに依存します。Mac側で&lt;code&gt;Set up Codex mobile&lt;/code&gt;を開き、スマートフォンでQRコードを読み取り、ChatGPTで連携を完了します。&lt;/p&gt;
&lt;p&gt;第四に、遠隔操作にも承認フローがあります。端末コマンド、ファイル変更、テスト実行、外部アクセスに関わる操作は、内容を確認してから承認すべきです。&lt;/p&gt;
&lt;h2 id=&#34;接続方法&#34;&gt;接続方法
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;MacでCodexを開きます。&lt;/li&gt;
&lt;li&gt;サイドバーで&lt;code&gt;Set up Codex mobile&lt;/code&gt;を選びます。&lt;/li&gt;
&lt;li&gt;Codexがこのホストのリモートアクセスを有効化し、QRコードを表示します。&lt;/li&gt;
&lt;li&gt;スマートフォンでQRコードを読み取り、ChatGPTのセットアップ画面に進みます。&lt;/li&gt;
&lt;li&gt;同じChatGPTアカウントとworkspaceであることを確認します。&lt;/li&gt;
&lt;li&gt;必要なMFA、SSO、passkeyを完了します。&lt;/li&gt;
&lt;li&gt;成功すると、スマートフォンのCodexにMacが表示されます。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;接続後はMac側の&lt;code&gt;Settings &amp;gt; Connections&lt;/code&gt;で接続済みデバイスを管理できます。コンピューターをスリープさせない設定、Computer Use、Chrome extensionもここで確認できます。&lt;/p&gt;
&lt;h2 id=&#34;スマートフォンでやるべきこと&#34;&gt;スマートフォンでやるべきこと
&lt;/h2&gt;&lt;p&gt;スマートフォンに向いているのは、承認、方向修正、結果確認です。Codexがコマンド実行を求めたときに承認し、誤解やテスト失敗があれば短い指示で修正し、diffやテスト出力を確認できます。&lt;/p&gt;
&lt;p&gt;価値があるのは「スマートフォンで開発する」ことではなく、ホスト上で動く開発タスクの携帯用コントローラーになることです。&lt;/p&gt;
&lt;h2 id=&#34;よくある問題&#34;&gt;よくある問題
&lt;/h2&gt;&lt;p&gt;ホストが表示されない場合は、MacでCodex Appが動いていること、&lt;code&gt;Allow other devices to connect&lt;/code&gt;が有効であること、同じChatGPTアカウントとworkspaceを使っていることを確認します。&lt;/p&gt;
&lt;p&gt;承認リクエストが表示されない場合は、ChatGPTモバイルアプリでCodexを開き、再度QRコードを読み取るか、ホスト側からセットアップをやり直します。workspaceでは管理者設定も確認します。&lt;/p&gt;
&lt;p&gt;リモートセッションが切れる場合は、Macがスリープしていないか、ネットワークが切れていないか、Codex Appを閉じていないかを確認します。&lt;/p&gt;
&lt;h2 id=&#34;向いている場面&#34;&gt;向いている場面
&lt;/h2&gt;&lt;p&gt;長いCodexタスクをよく走らせる、席を離れても承認したい、複数のプロジェクトやthreadを扱う、Macを主開発機として使っている人に向いています。&lt;/p&gt;
&lt;p&gt;WindowsやLinux中心、Codex CLIやIDE Extensionだけを使う、スマートフォンだけで完全な開発環境を期待する場合には向きません。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ
&lt;/h2&gt;&lt;p&gt;Codexのモバイルリモートアクセスは、開発をスマートフォンに移す機能ではありません。Codexが止まりがちな承認、質問、テスト失敗、方向確認を、ChatGPT Appから処理できるようにする機能です。&lt;/p&gt;
&lt;p&gt;Mac上でCodexをよく使う人には有用です。たまにコードの質問をするだけなら、効果はそれほど大きくありません。&lt;/p&gt;
&lt;h2 id=&#34;参考資料&#34;&gt;参考資料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Help Center：ChatGPT Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://developers.openai.com/codex/remote-connections&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Developers：Codex Remote Connections&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>ChatGPT File Libraryとは：ファイル保存、容量制限、プライバシー境界</title>
        <link>https://knightli.com/ja/2026/05/16/chatgpt-file-library-storage-limits-privacy/</link>
        <pubDate>Sat, 16 May 2026 17:40:14 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/05/16/chatgpt-file-library-storage-limits-privacy/</guid>
        <description>&lt;p&gt;&lt;code&gt;ChatGPT File Library&lt;/code&gt;は、ChatGPT内のファイルライブラリです。&lt;/p&gt;
&lt;p&gt;以前は、会話にアップロードしたファイルはそのチャットで使う一時的な資料に近いものでした。File Libraryでは、アップロードしたファイルやChatGPTが作成したファイルをアカウントに保存し、後から探す、ダウンロードする、削除する、新しい会話で再利用するといったことができます。&lt;/p&gt;
&lt;p&gt;これにより、ChatGPTは一時的なチャット画面ではなく、継続的な資料ワークスペースに近づきます。&lt;/p&gt;
&lt;h2 id=&#34;最新の提供範囲&#34;&gt;最新の提供範囲
&lt;/h2&gt;&lt;p&gt;OpenAIの2026年5月14日のChatGPT Release Notesによると、File LibraryはFreeとGoユーザーにも拡大され、欧州経済領域のユーザーも対象に含まれます。同時に、プラン横断のストレージ管理も追加されました。&lt;/p&gt;
&lt;p&gt;一方、専用のFile storage and Libraryヘルプページには、確認時点で古い提供範囲が残っていました。このため本文では、より新しい2026年5月14日のRelease Notesを基準にします。ただし、実際に表示されるかどうかはロールアウト、地域、アプリのバージョンに依存します。&lt;/p&gt;
&lt;h2 id=&#34;保存されるファイル&#34;&gt;保存されるファイル
&lt;/h2&gt;&lt;p&gt;ChatGPTは、アップロードまたは作成した次のようなファイルを保存できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文書&lt;/li&gt;
&lt;li&gt;スプレッドシート&lt;/li&gt;
&lt;li&gt;プレゼンテーション&lt;/li&gt;
&lt;li&gt;PDF&lt;/li&gt;
&lt;li&gt;画像&lt;/li&gt;
&lt;li&gt;ChatGPTが生成したファイル&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;生成画像は引き続きImagesタブにも表示されます。File Libraryは、アップロードファイルと生成ファイルをまとめて管理する場所です。&lt;/p&gt;
&lt;p&gt;PDF分析、表計算、文書作成、プレゼン資料の編集をよく行うなら、同じファイルを何度もアップロードする手間を減らせます。&lt;/p&gt;
&lt;h2 id=&#34;新しい会話で使う方法&#34;&gt;新しい会話で使う方法
&lt;/h2&gt;&lt;p&gt;対応クライアントでは、入力欄付近の添付または追加メニューから&lt;code&gt;Add from library&lt;/code&gt;を選び、再利用したいファイルを選択します。&lt;/p&gt;
&lt;p&gt;Release Notesでは、LibraryとRecent filesがWeb、iOS、Androidで利用できることも説明されています。&lt;/p&gt;
&lt;h2 id=&#34;検索と管理&#34;&gt;検索と管理
&lt;/h2&gt;&lt;p&gt;Web版では左サイドバーからLibraryに入り、アップロード済みファイルと生成済みファイルを管理できます。&lt;/p&gt;
&lt;p&gt;ファイルは種類や由来で絞り込めます。ヘルプページでは、アップロードファイル、生成ファイル、画像、文書、スプレッドシート、プレゼンテーション、PDFなどのフィルターが挙げられています。&lt;/p&gt;
&lt;p&gt;ストレージ使用量は&lt;code&gt;Settings &amp;gt; Storage&lt;/code&gt;から確認できます。ファイルはLibraryから直接削除できます。&lt;/p&gt;
&lt;h2 id=&#34;プラン別容量&#34;&gt;プラン別容量
&lt;/h2&gt;&lt;p&gt;2026年5月14日のRelease Notesでは、容量は次のように示されています。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;プラン&lt;/th&gt;
          &lt;th&gt;File Library容量&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Free&lt;/td&gt;
          &lt;td&gt;500 MB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Go&lt;/td&gt;
          &lt;td&gt;4 GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Plus&lt;/td&gt;
          &lt;td&gt;20 GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Business&lt;/td&gt;
          &lt;td&gt;20 GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Pro&lt;/td&gt;
          &lt;td&gt;100 GB&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この容量には、アップロードしたファイルとChatGPTが作成した文書、表、プレゼン、画像が含まれます。&lt;/p&gt;
&lt;h2 id=&#34;単一ファイルの制限&#34;&gt;単一ファイルの制限
&lt;/h2&gt;&lt;p&gt;OpenAIのヘルプページでは、次の制限が示されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GPTまたはChatGPT会話にアップロードするファイルは最大512 MB&lt;/li&gt;
&lt;li&gt;テキスト・文書ファイルは最大200万token&lt;/li&gt;
&lt;li&gt;CSVやスプレッドシートは通常約50 MB、行の大きさに依存&lt;/li&gt;
&lt;li&gt;画像は1枚最大20 MB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これはアカウント全体の容量とは別の制限です。&lt;/p&gt;
&lt;h2 id=&#34;削除とダウンロード&#34;&gt;削除とダウンロード
&lt;/h2&gt;&lt;p&gt;ファイルは手動で削除するまでアカウントに保存されます。&lt;/p&gt;
&lt;p&gt;Libraryでファイルを選択し、削除またはゴミ箱アイコンを使います。OpenAIの説明では、削除後はアカウントからすぐに取り除かれ、通常30日以内にOpenAIのシステムから完全削除される予定です。ただし、匿名化済みでアカウントと切り離されている場合や、安全・法的義務で保持が必要な場合は例外があります。&lt;/p&gt;
&lt;p&gt;ファイルはLibraryからダウンロードすることもできます。&lt;/p&gt;
&lt;h2 id=&#34;temporary-chatでは保存されない&#34;&gt;Temporary Chatでは保存されない
&lt;/h2&gt;&lt;p&gt;Temporary Chatでアップロードしたファイルは、アカウントやLibraryに保存されません。&lt;/p&gt;
&lt;p&gt;File Libraryは長期再利用のための機能で、Temporary Chatは一時的・機密性の高い・長期文脈を残したくない作業に向いています。&lt;/p&gt;
&lt;h2 id=&#34;データとトレーニング設定&#34;&gt;データとトレーニング設定
&lt;/h2&gt;&lt;p&gt;OpenAIのヘルプページでは、ファイルとチャットはユーザーの設定とData Controlsに従うと説明されています。&lt;/p&gt;
&lt;p&gt;Memoryが有効な場合、ファイルやチャットが会話間で役立つ情報の記憶に使われる可能性があります。個人向けサービスで&lt;code&gt;Improve the model for everyone&lt;/code&gt;が有効な場合、アップロードファイルを含むChatGPTへの送信内容がモデル改善に使われる可能性があります。この設定は&lt;code&gt;Settings &amp;gt; Data Controls&lt;/code&gt;でオフにできます。&lt;/p&gt;
&lt;p&gt;File Libraryはローカルフォルダーではなく、クラウドアカウント機能です。アップロードしてよい資料かどうかを先に考える必要があります。&lt;/p&gt;
&lt;h2 id=&#34;向いている使い方&#34;&gt;向いている使い方
&lt;/h2&gt;&lt;p&gt;同じPDFやレポートの継続分析、授業資料や会議資料の再利用、ChatGPTが生成した文書や表の再編集、複数会話での素材共有に向いています。&lt;/p&gt;
&lt;p&gt;一方で、身分証明、契約書、医療記録、財務明細などの機密資料、正式なクラウドバックアップ、社内文書の無確認アップロードには向きません。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ
&lt;/h2&gt;&lt;p&gt;ChatGPT File Libraryの価値は、単にファイル一覧が増えたことではありません。ChatGPTを一回限りの会話ツールから、資料が蓄積するワークスペースへ変える点にあります。&lt;/p&gt;
&lt;p&gt;その分、古いファイルの整理、容量確認、通常チャットとTemporary Chatの使い分け、Data Controlsの確認が重要になります。&lt;/p&gt;
&lt;h2 id=&#34;参考資料&#34;&gt;参考資料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/20001052-file-storage-and-library-in-chatgpt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Help Center：File storage and Library in ChatGPT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Help Center：ChatGPT Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>OpenAI の新世代 Realtime 音声モデル：GPT-Realtime-2、リアルタイム翻訳、ストリーミング文字起こし</title>
        <link>https://knightli.com/ja/2026/05/09/openai-realtime-voice-models-gpt-realtime-2-translate-whisper/</link>
        <pubDate>Sat, 09 May 2026 10:58:47 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/05/09/openai-realtime-voice-models-gpt-realtime-2-translate-whisper/</guid>
        <description>&lt;p&gt;OpenAI は 2026 年 5 月 7 日、新世代の Realtime API 向け音声モデルを発表しました。焦点は「より人間らしく話す」ことだけではなく、音声エージェントがリアルタイムの会話中に理解し、推論し、ツールを呼び出し、翻訳し、文字起こしできるようにすることです。&lt;/p&gt;
&lt;p&gt;今回の更新には 3 つのモデルが含まれます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GPT-Realtime-2&lt;/code&gt;：リアルタイム音声 Agent 向けの主力モデル。より強い推論、ツール呼び出し、長いコンテキストに対応します。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPT-Realtime-Translate&lt;/code&gt;：70 以上の入力言語から 13 の出力言語へのリアルタイム音声翻訳モデル。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPT-Realtime-Whisper&lt;/code&gt;：字幕、会議メモ、リアルタイムワークフロー向けの低遅延ストリーミング音声認識モデル。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;初期の音声アシスタントが「一問一答」に近かったとすれば、今回の更新は「聞きながら作業する」音声インターフェースに近づいています。&lt;/p&gt;
&lt;h2 id=&#34;gpt-realtime-2音声-agent-の主力モデル&#34;&gt;GPT-Realtime-2：音声 Agent の主力モデル
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-Realtime-2&lt;/code&gt; はリアルタイム音声対話向けに作られています。質問に答えるだけでなく、ユーザーが話し、言い直し、割り込み、条件を追加する間も文脈を保ち、必要に応じてツールを呼び出してタスクを完了します。&lt;/p&gt;
&lt;p&gt;公式に強調されている機能は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「確認します」のような短い前置きを返し、処理中であることをユーザーに伝えられる。&lt;/li&gt;
&lt;li&gt;カレンダー、検索、注文、サポートシステムなどの複数ツールを並行して呼び出せる。&lt;/li&gt;
&lt;li&gt;失敗時の復帰がより自然で、会話が突然止まったり沈黙したりしにくい。&lt;/li&gt;
&lt;li&gt;コンテキストウィンドウが 32K から 128K に拡大され、長い会話や複雑なタスクフローに対応しやすい。&lt;/li&gt;
&lt;li&gt;専門用語、固有名詞、医療用語などの保持が改善されている。&lt;/li&gt;
&lt;li&gt;冷静、共感的、確認的、明るいなど、場面に応じた話し方を制御しやすい。&lt;/li&gt;
&lt;li&gt;reasoning effort は &lt;code&gt;minimal&lt;/code&gt;、&lt;code&gt;low&lt;/code&gt;、&lt;code&gt;medium&lt;/code&gt;、&lt;code&gt;high&lt;/code&gt;、&lt;code&gt;xhigh&lt;/code&gt; から選択でき、デフォルトは &lt;code&gt;low&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これにより、開発者は単純な Q&amp;amp;A だけでなく、より複雑な業務に音声 Agent を組み込めます。たとえば、サポート Agent がユーザーの説明を聞きながら注文を確認したり、旅行アプリがフライト変更に応じて次の行動を提案したり、不動産アプリが口頭条件から物件を絞り込んで内見を予約したりできます。&lt;/p&gt;
&lt;h2 id=&#34;リアルタイム翻訳多言語音声プロダクト向け&#34;&gt;リアルタイム翻訳：多言語音声プロダクト向け
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-Realtime-Translate&lt;/code&gt; はリアルタイム音声翻訳向けのモデルです。ユーザーは自分の言語で話し、相手は翻訳された音声を聞きながらリアルタイムの文字起こしも確認できます。&lt;/p&gt;
&lt;p&gt;適した用途は明確です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多言語カスタマーサポート。&lt;/li&gt;
&lt;li&gt;越境営業やプリセールス。&lt;/li&gt;
&lt;li&gt;オンライン教育やライブイベント。&lt;/li&gt;
&lt;li&gt;国際会議やイベント司会。&lt;/li&gt;
&lt;li&gt;動画プラットフォームやクリエイターコンテンツのローカライズ。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;リアルタイム翻訳の難しさは、正確さだけではありません。低遅延、自然な間、トーンの保持、アクセントへの対応、専門語彙の処理も必要です。OpenAI は、発話全体を待ってから翻訳するのではなく、より自然な異言語会話に近づけることを強調しています。&lt;/p&gt;
&lt;h2 id=&#34;ストリーミング文字起こし音声をすぐにワークフローへ&#34;&gt;ストリーミング文字起こし：音声をすぐにワークフローへ
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-Realtime-Whisper&lt;/code&gt; は新しいストリーミング音声認識モデルです。録音が終わるのを待つのではなく、話されている最中に音声を処理可能なテキストへ変換できる点に価値があります。&lt;/p&gt;
&lt;p&gt;主な用途は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;会議のリアルタイム字幕。&lt;/li&gt;
&lt;li&gt;授業や配信の字幕。&lt;/li&gt;
&lt;li&gt;リアルタイム議事録。&lt;/li&gt;
&lt;li&gt;音声 Agent への継続的な音声入力。&lt;/li&gt;
&lt;li&gt;サポート、医療、採用、営業など高頻度の音声業務における後続処理。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;プロダクト側では、ストリーミング文字起こしによって「話す」から「使えるテキスト」までの時間を短縮できます。字幕は早く表示され、会議メモは会話中に生成され、要約、タスク抽出、CRM 登録なども早く始められます。&lt;/p&gt;
&lt;h2 id=&#34;価格と提供状況&#34;&gt;価格と提供状況
&lt;/h2&gt;&lt;p&gt;3 つのモデルはいずれも Realtime API で利用できます。公式価格は次の通りです。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;モデル&lt;/th&gt;
          &lt;th&gt;価格&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GPT-Realtime-2&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;音声入力 $32 / 1M tokens、キャッシュ入力 $0.40 / 1M tokens、音声出力 $64 / 1M tokens&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GPT-Realtime-Translate&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;$0.034 / 分&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GPT-Realtime-Whisper&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;$0.017 / 分&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;OpenAI は Realtime API が EU Data Residency に対応し、エンタープライズ向けプライバシーコミットメントの対象であるとも述べています。欧州企業やデータ所在要件のある音声プロダクトでは、個別に評価すべき点です。&lt;/p&gt;
&lt;h2 id=&#34;開発者にとっての意味&#34;&gt;開発者にとっての意味
&lt;/h2&gt;&lt;p&gt;今回の発表で重要なのは、音声機能が単なる入出力層から、プロダクトの対話層へ移り始めていることです。&lt;/p&gt;
&lt;p&gt;従来の多くの音声機能は、音声をテキストに変換し、テキスト応答を音声に戻すものでした。本当に難しいのは中間層です。ユーザー意図の理解、割り込み処理、文脈補完、ツール呼び出し、処理状況の説明、失敗時の自然な復帰が必要になります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-Realtime-2&lt;/code&gt; はこの能力をリアルタイム音声モデル側に直接持たせようとしています。開発者が見るべきなのは単発の回答品質だけでなく、継続的な会話と多段階タスクを支えられるかどうかです。&lt;/p&gt;
&lt;p&gt;優先的に試す価値があるプロダクトは次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;カスタマーサポート音声 Agent。&lt;/li&gt;
&lt;li&gt;車載およびモバイル音声アシスタント。&lt;/li&gt;
&lt;li&gt;旅行、予約、不動産、金融など、会話しながら検索や照会が必要なサービス。&lt;/li&gt;
&lt;li&gt;多言語会議や越境コミュニケーションツール。&lt;/li&gt;
&lt;li&gt;リアルタイム字幕、議事録、通話品質管理システム。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;安全性と告知も重要&#34;&gt;安全性と告知も重要
&lt;/h2&gt;&lt;p&gt;OpenAI は発表ページで、Realtime API には複数の安全対策が含まれると説明しています。たとえばセッションに対するアクティブ分類や、ポリシー違反が検出された会話の停止です。開発者は Agents SDK を使って独自のガードレールを追加することもできます。&lt;/p&gt;
&lt;p&gt;見落としやすい要件として、エンドユーザーが AI と対話していることを明確に知らせる必要があります。ただし、文脈上それが明らかな場合は例外です。&lt;/p&gt;
&lt;p&gt;これはサポート、営業、教育、医療などで特に重要です。音声が自然になるほど、プロダクト設計上の境界も明確にする必要があります。ユーザーは自分が AI と話していること、どの操作が記録、文字起こし、ツール呼び出しにつながるのかを理解できるべきです。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ
&lt;/h2&gt;&lt;p&gt;OpenAI の今回の Realtime API 更新は、リアルタイム音声を「聞いて話せる」段階から「聞きながらタスクを処理できる」段階へ進めるものです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-Realtime-2&lt;/code&gt; は複雑な音声 Agent、&lt;code&gt;GPT-Realtime-Translate&lt;/code&gt; は異言語間のリアルタイム会話、&lt;code&gt;GPT-Realtime-Whisper&lt;/code&gt; は低遅延文字起こしを担当します。3 つを合わせると、音声プロダクトでよく必要になる会話、翻訳、文字起こしをカバーできます。&lt;/p&gt;
&lt;p&gt;サポート、車載、会議、教育、越境コミュニケーション、モバイル音声アシスタントを作っているなら、この更新は重点的に試す価値があります。検証すべきなのは、自然に聞こえるかだけではなく、長い会話、割り込み、ツール呼び出し、失敗復帰、コスト管理でどう振る舞うかです。&lt;/p&gt;
&lt;p&gt;参考リンク：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/advancing-voice-intelligence-with-new-models-in-the-api/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI：Advancing voice intelligence with new models in the API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>GPT-5.5、GPT-5.5 Instant、GPT-5.5 Thinking、GPT-5.5 Pro の違い</title>
        <link>https://knightli.com/ja/2026/05/07/gpt-5-5-instant-thinking-pro-differences/</link>
        <pubDate>Thu, 07 May 2026 21:59:33 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/05/07/gpt-5-5-instant-thinking-pro-differences/</guid>
        <description>&lt;p&gt;OpenAI は現在、GPT-5.5 を &lt;code&gt;Instant&lt;/code&gt;、&lt;code&gt;Thinking&lt;/code&gt;、&lt;code&gt;Pro&lt;/code&gt; という、より明確な利用階層に分けています。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-5.5&lt;/code&gt;、&lt;code&gt;GPT-5.5 Instant&lt;/code&gt;、&lt;code&gt;GPT-5.5 Thinking&lt;/code&gt;、&lt;code&gt;GPT-5.5 Pro&lt;/code&gt; は混同されがちです。簡単に言えば、&lt;code&gt;GPT-5.5&lt;/code&gt; はこの世代のモデル能力の総称です。&lt;code&gt;Instant&lt;/code&gt; は日常向けの高速モデル、&lt;code&gt;Thinking&lt;/code&gt; は深い推論モード、&lt;code&gt;Pro&lt;/code&gt; はより重い研究級モードです。&lt;/p&gt;
&lt;h2 id=&#34;早見表&#34;&gt;早見表
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;名称&lt;/th&gt;
          &lt;th&gt;本質&lt;/th&gt;
          &lt;th&gt;向いている用途&lt;/th&gt;
          &lt;th&gt;速度/コスト&lt;/th&gt;
          &lt;th&gt;利用可能性&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5&lt;/td&gt;
          &lt;td&gt;GPT-5.5 の主モデル/ファミリー名。ChatGPT では通常 GPT-5.5 Thinking の能力位置付けに近い&lt;/td&gt;
          &lt;td&gt;複雑な作業、コード、研究、分析、ツール利用&lt;/td&gt;
          &lt;td&gt;Instant より重いが、能力は高い&lt;/td&gt;
          &lt;td&gt;Plus、Pro、Business、Enterprise&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5 Instant&lt;/td&gt;
          &lt;td&gt;GPT-5.3 Instant を置き換える高速デフォルトモデル&lt;/td&gt;
          &lt;td&gt;日常 Q&amp;amp;A、文章作成、要約、軽いコード、素早い調査&lt;/td&gt;
          &lt;td&gt;最速で、最もクォータ効率が良い&lt;/td&gt;
          &lt;td&gt;すべての ChatGPT ユーザーへ段階的に展開&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5 Thinking&lt;/td&gt;
          &lt;td&gt;深い推論モード&lt;/td&gt;
          &lt;td&gt;難問、長文脈分析、複雑なコード、研究、文書密集タスク&lt;/td&gt;
          &lt;td&gt;遅めだが、推論が安定&lt;/td&gt;
          &lt;td&gt;有料ユーザーが手動選択可能&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5 Pro&lt;/td&gt;
          &lt;td&gt;より高強度な研究級モード&lt;/td&gt;
          &lt;td&gt;高リスク/高精度タスク：法律、ビジネス、教育、データサイエンス、科学研究分析&lt;/td&gt;
          &lt;td&gt;最も遅く重いが、品質重視&lt;/td&gt;
          &lt;td&gt;Pro、Business、Enterprise、Edu&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一つだけ覚えるなら次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;日常の高速タスク&lt;/strong&gt;：&lt;code&gt;GPT-5.5 Instant&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;複雑な推論とコード分析&lt;/strong&gt;：&lt;code&gt;GPT-5.5 Thinking&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特に難しく重要で、より網羅的かつ厳密さが必要な作業&lt;/strong&gt;：&lt;code&gt;GPT-5.5 Pro&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;gpt-55-とは何か&#34;&gt;GPT-5.5 とは何か
&lt;/h2&gt;&lt;p&gt;単独で &lt;code&gt;GPT-5.5&lt;/code&gt; と言う場合、通常は GPT-5.5 世代の主なモデル能力を指し、固定の一つのボタンを指すわけではありません。&lt;/p&gt;
&lt;p&gt;OpenAI は GPT-5.5 を「実際の仕事に向いた、より強いモデル」と位置付けています。重点は次のような能力です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;agentic coding。&lt;/li&gt;
&lt;li&gt;複雑なコードデバッグ。&lt;/li&gt;
&lt;li&gt;研究と資料の統合。&lt;/li&gt;
&lt;li&gt;文書、表計算、プレゼン資料の生成。&lt;/li&gt;
&lt;li&gt;コンピュータ利用とツール横断作業。&lt;/li&gt;
&lt;li&gt;長いタスクでの継続的推論と自己チェック。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ChatGPT では、ユーザーが見るのは曖昧な &lt;code&gt;GPT-5.5&lt;/code&gt; ボタンではなく、より具体的な &lt;code&gt;Instant&lt;/code&gt;、&lt;code&gt;Thinking&lt;/code&gt;、&lt;code&gt;Pro&lt;/code&gt; です。そのため「GPT-5.5 を使っている」と聞いたら、Instant なのか、Thinking なのか、Pro なのかを確認した方がよいです。&lt;/p&gt;
&lt;h2 id=&#34;gpt-55-instantデフォルト高速日常向け&#34;&gt;GPT-5.5 Instant：デフォルト、高速、日常向け
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-5.5 Instant&lt;/code&gt; は新しい高速デフォルトモデルです。OpenAI の公式説明では、&lt;code&gt;GPT-5.3 Instant&lt;/code&gt; を置き換え始め、ChatGPT のデフォルトモデルになり、API では &lt;code&gt;chat-latest&lt;/code&gt; として提供されます。&lt;/p&gt;
&lt;p&gt;向いているタスク：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日常会話。&lt;/li&gt;
&lt;li&gt;素早い Q&amp;amp;A。&lt;/li&gt;
&lt;li&gt;普通の文章作成。&lt;/li&gt;
&lt;li&gt;記事の要約。&lt;/li&gt;
&lt;li&gt;メールの書き換え。&lt;/li&gt;
&lt;li&gt;軽いコード説明。&lt;/li&gt;
&lt;li&gt;簡単な表やリスト。&lt;/li&gt;
&lt;li&gt;長時間の推論を必要としないタスク。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instant の主な利点は速度とデフォルト利用です。毎回手動で推論モードを選ぶ必要がなく、普通の質問に高い待ち時間を払う必要もありません。&lt;/p&gt;
&lt;p&gt;もう一つの変化として、OpenAI は GPT-5.5 Instant の回答がより明瞭で簡潔になり、パーソナライズ能力も強くなったとしています。普通のユーザーにとっては、一日中開いておくモデルとして使いやすいということです。&lt;/p&gt;
&lt;p&gt;注意点は、Instant が「最強モード」ではないことです。複雑な数学、長いコード、アーキテクチャ設計、複数ファイル分析、本格的な研究では、自動的に Thinking に切り替わることもあれば、手動で Thinking を選ぶ必要があることもあります。&lt;/p&gt;
&lt;h2 id=&#34;gpt-55-thinking複雑タスクの主力&#34;&gt;GPT-5.5 Thinking：複雑タスクの主力
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-5.5 Thinking&lt;/code&gt; は、複雑なタスクに向いた推論モードです。&lt;/p&gt;
&lt;p&gt;向いている場面：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コードデバッグ。&lt;/li&gt;
&lt;li&gt;アーキテクチャ設計。&lt;/li&gt;
&lt;li&gt;多段階推論。&lt;/li&gt;
&lt;li&gt;長文書分析。&lt;/li&gt;
&lt;li&gt;学術資料整理。&lt;/li&gt;
&lt;li&gt;ビジネス案の検討。&lt;/li&gt;
&lt;li&gt;データ分析の説明。&lt;/li&gt;
&lt;li&gt;比較、トレードオフ、検証が必要なタスク。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking はより多くの時間を使って推論します。OpenAI Help Center によると、GPT-5.5 Thinking または GPT-5.5 Pro が推論を開始すると、何をするつもりかを説明する短い preamble が表示されることがあります。モデルが thinking 中でも、ユーザーは追加指示を入れて方向を早めに調整できます。&lt;/p&gt;
&lt;p&gt;ChatGPT で Thinking を手動選択する場合、thinking time も調整できます。公式説明では、Plus と Business ユーザーは &lt;code&gt;Standard&lt;/code&gt; と &lt;code&gt;Extended&lt;/code&gt; を使えます。Pro ユーザーには &lt;code&gt;Light&lt;/code&gt; や &lt;code&gt;Heavy&lt;/code&gt; など、さらに多くの選択肢があります。&lt;/p&gt;
&lt;p&gt;私の理解では、Thinking は「本気で作業する」ための標準選択です。タスクが多段階、長文脈、高い正確性を必要とするなら、Instant より適しています。&lt;/p&gt;
&lt;h2 id=&#34;gpt-55-pro研究級でより重くより厳密&#34;&gt;GPT-5.5 Pro：研究級で、より重く、より厳密
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-5.5 Pro&lt;/code&gt; は、より難しい問題と高精度作業向けのモードです。&lt;/p&gt;
&lt;p&gt;向いている場面：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;法律資料分析。&lt;/li&gt;
&lt;li&gt;ビジネス調査。&lt;/li&gt;
&lt;li&gt;教育とカリキュラム設計。&lt;/li&gt;
&lt;li&gt;データサイエンス。&lt;/li&gt;
&lt;li&gt;科学研究資料の統合。&lt;/li&gt;
&lt;li&gt;高リスク判断前の深いレビュー。&lt;/li&gt;
&lt;li&gt;複数文書、複数制約、複数ラウンドの検証タスク。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenAI は GPT-5.5 の発表で、初期テスターが GPT-5.5 Pro について、GPT-5.4 Pro と比べて完全性、構造性、正確性、関連性、実用性が明らかに向上したと評価したと述べています。特にビジネス、法律、教育、データサイエンスで強いとされています。&lt;/p&gt;
&lt;p&gt;Pro の欠点も明確です。遅く、重く、小さな質問すべてに使うものではありません。日常チャットの入口というより、専門家レビューや研究パートナーに近いものです。&lt;/p&gt;
&lt;p&gt;また Pro にはツール対応の制限があります。OpenAI Help Center では、Apps、Memory、Canvas、画像生成は Pro では利用できないとされています。これらの ChatGPT 機能が必要な場合は、Instant または Thinking を使う方がよいかもしれません。&lt;/p&gt;
&lt;h2 id=&#34;ツール対応の違い&#34;&gt;ツール対応の違い
&lt;/h2&gt;&lt;p&gt;OpenAI Help Center によると、&lt;code&gt;GPT-5.5 Instant&lt;/code&gt; と &lt;code&gt;GPT-5.5 Thinking&lt;/code&gt; は ChatGPT の一般的なツールに対応しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web search。&lt;/li&gt;
&lt;li&gt;Data analysis。&lt;/li&gt;
&lt;li&gt;Image analysis。&lt;/li&gt;
&lt;li&gt;File analysis。&lt;/li&gt;
&lt;li&gt;Canvas。&lt;/li&gt;
&lt;li&gt;Image generation。&lt;/li&gt;
&lt;li&gt;Memory。&lt;/li&gt;
&lt;li&gt;Custom Instructions。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;GPT-5.5 Pro&lt;/code&gt; は研究級推論寄りですが、すべての ChatGPT ツールを使えるわけではありません。特に次に注意します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apps は利用不可。&lt;/li&gt;
&lt;li&gt;Memory は利用不可。&lt;/li&gt;
&lt;li&gt;Canvas は利用不可。&lt;/li&gt;
&lt;li&gt;画像生成は利用不可。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまりモデルを選ぶときは、「どれが賢いか」だけでなく、必要なツールも見る必要があります。&lt;/p&gt;
&lt;h2 id=&#34;コンテキストウィンドウの違い&#34;&gt;コンテキストウィンドウの違い
&lt;/h2&gt;&lt;p&gt;OpenAI Help Center が示す ChatGPT のコンテキストウィンドウは、おおよそ次の通りです。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;モード&lt;/th&gt;
          &lt;th&gt;コンテキストウィンドウ&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5 Instant&lt;/td&gt;
          &lt;td&gt;Free：16K；Plus/Business：32K；Pro/Enterprise：128K&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5 Thinking&lt;/td&gt;
          &lt;td&gt;有料プランで手動選択した場合は通常 256K；Pro では最大 400K&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;つまり次のように考えられます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;普通の会話と短い文書なら Instant で十分。&lt;/li&gt;
&lt;li&gt;複数ファイル、多ラウンド研究、長いコードベース分析なら Thinking が向く。&lt;/li&gt;
&lt;li&gt;特に長く複雑で高精度なタスクでは、Pro ユーザーはより大きな文脈と重い推論を使える。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;どう選ぶか&#34;&gt;どう選ぶか
&lt;/h2&gt;&lt;h3 id=&#34;日常-qa&#34;&gt;日常 Q&amp;amp;A
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;GPT-5.5 Instant&lt;/code&gt; を使います。&lt;/p&gt;
&lt;p&gt;速く、十分賢く、気軽な質問、素早い文章作成、素早い修正に向いています。&lt;/p&gt;
&lt;h3 id=&#34;記事作成要約メール修正&#34;&gt;記事作成、要約、メール修正
&lt;/h3&gt;&lt;p&gt;まず &lt;code&gt;GPT-5.5 Instant&lt;/code&gt; を使います。&lt;/p&gt;
&lt;p&gt;記事が長い、構造的な書き直しが必要、複数回の校正が必要な場合は、&lt;code&gt;GPT-5.5 Thinking&lt;/code&gt; に切り替えます。&lt;/p&gt;
&lt;h3 id=&#34;コード作成とデバッグ&#34;&gt;コード作成とデバッグ
&lt;/h3&gt;&lt;p&gt;簡単なコード説明は &lt;code&gt;Instant&lt;/code&gt; で十分です。&lt;/p&gt;
&lt;p&gt;複数ファイルのデバッグ、アーキテクチャ設計、複雑なエラー分析には &lt;code&gt;Thinking&lt;/code&gt; を使います。非常に難しい長期的なエンジニアリング問題なら &lt;code&gt;Pro&lt;/code&gt; も検討できます。&lt;/p&gt;
&lt;h3 id=&#34;研究と資料分析&#34;&gt;研究と資料分析
&lt;/h3&gt;&lt;p&gt;普通の資料整理には &lt;code&gt;Thinking&lt;/code&gt; を使います。&lt;/p&gt;
&lt;p&gt;法律、ビジネス、科学研究、データサイエンスのような高精度タスクでは &lt;code&gt;Pro&lt;/code&gt; がより適しています。&lt;/p&gt;
&lt;h3 id=&#34;画像生成canvasmemory-が必要な場合&#34;&gt;画像生成、Canvas、Memory が必要な場合
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Instant&lt;/code&gt; または &lt;code&gt;Thinking&lt;/code&gt; を優先します。&lt;/p&gt;
&lt;p&gt;Pro は一部の ChatGPT ツールに対応していないため、デフォルトで &lt;code&gt;Pro&lt;/code&gt; を選ばない方がよいです。&lt;/p&gt;
&lt;h2 id=&#34;短い結論&#34;&gt;短い結論
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-5.5 Instant&lt;/code&gt; は日常のデフォルトモデルです。速く、明瞭で、クォータ効率が良く、多くの普通のタスクに向きます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-5.5 Thinking&lt;/code&gt; は複雑タスクの主力です。コード、研究、長文書、分析、多段階推論に向きます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-5.5 Pro&lt;/code&gt; は高精度研究モードです。より難しく重要で、厳密さが必要なタスクに向きますが、速度とツール対応にはより制限があります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-5.5&lt;/code&gt; そのものは、この世代の総称に近いものです。実際に選ぶときは、ChatGPT で &lt;code&gt;Instant&lt;/code&gt;、&lt;code&gt;Thinking&lt;/code&gt;、&lt;code&gt;Pro&lt;/code&gt; のどれを選ぶかが重要です。&lt;/p&gt;
&lt;h2 id=&#34;関連リンク&#34;&gt;関連リンク
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;GPT-5.5 Instant 発表：&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/gpt-5-5-instant/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://openai.com/index/gpt-5-5-instant/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GPT-5.5 発表：&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introducing-gpt-5-5/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://openai.com/index/introducing-gpt-5-5/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GPT-5.5 in ChatGPT Help Center：&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11909943-gpt-53-and-gpt-55-in-chatgpt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/11909943-gpt-53-and-gpt-55-in-chatgpt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>ChatGPT、Claude Code、Gemini の記憶機構は何が違うのか</title>
        <link>https://knightli.com/ja/2026/05/07/chatgpt-claude-code-gemini-memory-comparison/</link>
        <pubDate>Thu, 07 May 2026 14:47:17 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/05/07/chatgpt-claude-code-gemini-memory-comparison/</guid>
        <description>&lt;p&gt;AI 製品における「記憶」はますます重要になっている。これは AI が「単発の会話ツール」から「長期的な協力相手」へ移行していることを示している。毎回背景を説明し直す必要がなくなり、好みを繰り返し伝える必要もなく、同じプロジェクトを何度も理解させる必要も減る。&lt;/p&gt;
&lt;p&gt;しかし、製品ごとの記憶は同じものではない。&lt;code&gt;ChatGPT&lt;/code&gt;、&lt;code&gt;Claude Code&lt;/code&gt;、&lt;code&gt;Gemini&lt;/code&gt; はいずれも「AI がより長く覚える」問題を扱っているが、設計目標、保存場所、透明性、適用シーンは大きく異なる。&lt;/p&gt;
&lt;p&gt;2026 年 5 月 7 日時点では、おおまかに3つに分けられる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT は「個人アシスタントの記憶」に近い。&lt;/li&gt;
&lt;li&gt;Claude Code は「エンジニアリングプロジェクトの記憶」に近い。&lt;/li&gt;
&lt;li&gt;Gemini は「Google エコシステムの文脈」に近い。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;chatgpt人を中心にした長期的な好み&#34;&gt;ChatGPT：人を中心にした長期的な好み
&lt;/h2&gt;&lt;p&gt;ChatGPT の記憶機構は主に個人協作向けだ。関心の中心は「あなたは誰か」「何を好むか」「長期的に何をしているか」にある。&lt;/p&gt;
&lt;p&gt;OpenAI は現在、ChatGPT の記憶を &lt;code&gt;saved memories&lt;/code&gt; と &lt;code&gt;chat history&lt;/code&gt; に分けている。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;saved memories&lt;/code&gt; は、ChatGPT が保存する重要情報だ。名前、好み、目標、よく使う技術スタック、文章の癖などが含まれる。ユーザーが明示的に覚えるよう頼むこともできるし、ChatGPT が会話の中から将来役立つと判断した情報を保存する場合もある。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;chat history&lt;/code&gt; は、回答時に過去の会話を参照する仕組みだ。すべての会話がそのまま記憶になるわけではなく、必要に応じて過去の会話から関連文脈を探す。&lt;/p&gt;
&lt;p&gt;つまり ChatGPT の中核ロジックは、同じユーザーを会話をまたいで理解することだ。&lt;/p&gt;
&lt;p&gt;典型例は次のようなものだ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「今後コード例はできるだけ簡潔にして。」&lt;/li&gt;
&lt;li&gt;「私は主に Python と TypeScript を使っている。」&lt;/li&gt;
&lt;li&gt;「AI ツールについての Hugo ブログを書いている。」&lt;/li&gt;
&lt;li&gt;「先に結論を見て、その後に詳細を読むのが好き。」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらの記憶は特定プロジェクトに紐づくものではなく、アカウントと個人の利用習慣についてくる。&lt;/p&gt;
&lt;h2 id=&#34;memory-sources個人化の出所を見えるようにする&#34;&gt;Memory Sources：個人化の出所を見えるようにする
&lt;/h2&gt;&lt;p&gt;OpenAI は 2026 年 5 月の更新で &lt;code&gt;Memory sources&lt;/code&gt; を強調した。&lt;/p&gt;
&lt;p&gt;これは新しい記憶タイプではなく、ChatGPT が回答を個人化するときに参照した情報源をユーザーに見せる仕組みだ。OpenAI のヘルプ文書によると、Memory Sources には次のようなものが表示される場合がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;過去のチャット。&lt;/li&gt;
&lt;li&gt;保存された記憶。&lt;/li&gt;
&lt;li&gt;カスタム指示。&lt;/li&gt;
&lt;li&gt;ファイルライブラリ内のファイル。&lt;/li&gt;
&lt;li&gt;接続済み Gmail のメール。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ファイルや Gmail の表示範囲は、プラン、地域、接続状態によって制限される。OpenAI はまた、Memory sources が回答に影響したすべての要因を表示するとは限らず、個人化の理解と管理を助けるものだと説明している。&lt;/p&gt;
&lt;p&gt;これは重要だ。AI が「あなたを覚える」ほど、ユーザーは何に基づいて回答したのかを知る必要がある。そうでなければ個人化はブラックボックスになりやすい。AI が自分を知っているように見えるが、なぜ知っているのか分からない状態になる。&lt;/p&gt;
&lt;p&gt;ChatGPT の強みは、会話やテーマをまたいで個人の好みを継続的に理解することだ。一方で、記憶が古くなったり、古い記憶がまだ回答に影響していることをユーザーが忘れたりするリスクもある。そのため saved memories と古いチャットは定期的に整理したほうがよい。&lt;/p&gt;
&lt;h2 id=&#34;claude-codeコードベースとエンジニアリングルールを中心に&#34;&gt;Claude Code：コードベースとエンジニアリングルールを中心に
&lt;/h2&gt;&lt;p&gt;Claude Code の記憶機構はエンジニアリング協作寄りだ。関心の中心は「ユーザーが普段何を好むか」ではなく、「このコードベースをどう変更すべきか」だ。&lt;/p&gt;
&lt;p&gt;Claude Code には混同されやすい2種類の記憶がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;明示的なプロジェクト記憶：&lt;code&gt;CLAUDE.md&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;自動プロジェクト記憶：Auto Memory。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; は最も基本的で安定したプロジェクト記憶ファイルだ。プロジェクトルートにも、サブディレクトリにも置ける。Claude Code はこれらのファイルを読み、プロジェクト説明と作業ルールとして扱う。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; に書くのに適した内容は次の通りだ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;よく使う build、test、lint コマンド。&lt;/li&gt;
&lt;li&gt;コードスタイルと命名規則。&lt;/li&gt;
&lt;li&gt;プロジェクトアーキテクチャ。&lt;/li&gt;
&lt;li&gt;モジュール境界と危険な領域。&lt;/li&gt;
&lt;li&gt;チームの約束事とコミットフロー。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; をリポジトリに置けば、Git にコミットしてチーム共有の agent 説明書にできる。これは ChatGPT のクラウド上の個人記憶とはまったく異なる。&lt;/p&gt;
&lt;h2 id=&#34;claude-code-auto-memoryプロジェクト経験を自動で蓄積する&#34;&gt;Claude Code Auto Memory：プロジェクト経験を自動で蓄積する
&lt;/h2&gt;&lt;p&gt;Claude Code には現在 &lt;code&gt;Auto Memory&lt;/code&gt; もある。目的は、ユーザーが毎回手で説明を書かなくても、Claude が複数セッションにまたがってプロジェクト経験を自動的に蓄積できるようにすることだ。&lt;/p&gt;
&lt;p&gt;Claude Code の文書によると、Auto Memory は作業中に Claude が自分用のメモを保存する仕組みだ。build コマンド、デバッグで分かったこと、アーキテクチャ説明、コードスタイルの好み、ワークフロー習慣などが対象になる。すべてのセッションで保存するわけではなく、将来役立ちそうな情報を判断する。&lt;/p&gt;
&lt;p&gt;誤解されやすい点がある。Auto Memory はデフォルトでプロジェクトルートの &lt;code&gt;.claude/memory.md&lt;/code&gt; に書くわけではない。公式文書では、各プロジェクトはユーザーディレクトリ配下に独自の memory ディレクトリを持つと説明されている。パスは次のような形だ。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;~/.claude/projects/&amp;lt;project&amp;gt;/memory/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;MEMORY.md&lt;/code&gt; は各会話開始時に最初の 200 行または 25KB が読み込まれ、詳細は別のトピックファイルへ分割される場合がある。Auto Memory ファイルはローカルの Markdown ファイルで、ユーザーは &lt;code&gt;/memory&lt;/code&gt; から表示、編集、削除できる。&lt;/p&gt;
&lt;p&gt;これにより Claude Code の記憶は「ローカル上のプロジェクト経験庫」に近くなる。ChatGPT の個人記憶よりコードベースに近く、単なる &lt;code&gt;CLAUDE.md&lt;/code&gt; より動的だ。&lt;/p&gt;
&lt;p&gt;ただし Auto Memory はローカルマシン上のものだ。リポジトリと一緒に他のマシンやクラウド環境へ自然に同期されるわけではない。チームで共有すべき安定したルールは、やはりプロジェクト内の &lt;code&gt;CLAUDE.md&lt;/code&gt; に書くべきだ。&lt;/p&gt;
&lt;h2 id=&#34;geminigoogle-エコシステムの文脈を中心に&#34;&gt;Gemini：Google エコシステムの文脈を中心に
&lt;/h2&gt;&lt;p&gt;Gemini の記憶ロジックはまた別だ。&lt;/p&gt;
&lt;p&gt;Gemini にも保存情報と過去チャット参照の能力がある。Google のヘルプ文書では、ユーザーは生活、仕事、好みに関する情報を保存でき、Gemini は回答前に過去のチャットを参照できると説明されている。これらの情報を使うと、回答下部のソース領域に &lt;code&gt;Your saved info&lt;/code&gt; や &lt;code&gt;Previous chats&lt;/code&gt; が表示される場合がある。&lt;/p&gt;
&lt;p&gt;しかし Gemini の差別化は「好みを数個保存する」ことだけではなく、Google エコシステム連携にある。&lt;/p&gt;
&lt;p&gt;ユーザーが許可し、機能が利用可能な場合、Gemini は Gmail、Google Drive、Docs、Sheets など接続された Google アプリから文脈を取得できる。強みは、ユーザーが一つずつ教え込むことではなく、すでに Google アカウント内にある資料を検索可能な作業文脈にできることだ。&lt;/p&gt;
&lt;p&gt;典型的な違いは次のようになる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT は「最近 LTO テープドライブを修理している」と覚える。&lt;/li&gt;
&lt;li&gt;Gemini は Gmail から購入確認メールを見つけたり、Drive から修理メモを読んだりできる場合がある。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;もちろん、Gemini が無条件で Google データすべてを読めるわけではない。アカウント種別、地域、権限、接続アプリ、Keep Activity 設定、具体的な製品提供状況に依存する。企業や学校アカウントでは、Google Workspace 管理者の制御も受ける。&lt;/p&gt;
&lt;p&gt;より正確に言えば、Gemini の記憶は単純な「メモ帳」ではなく、「保存情報 + 過去チャット + Google エコシステム接続」の組み合わせだ。&lt;/p&gt;
&lt;h2 id=&#34;3者の主な違い&#34;&gt;3者の主な違い
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;次元&lt;/th&gt;
          &lt;th&gt;ChatGPT&lt;/th&gt;
          &lt;th&gt;Claude Code&lt;/th&gt;
          &lt;th&gt;Gemini&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;中心対象&lt;/td&gt;
          &lt;td&gt;人と好み&lt;/td&gt;
          &lt;td&gt;プロジェクトとコードベース&lt;/td&gt;
          &lt;td&gt;Google アカウントとエコシステム資料&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;典型的な記憶&lt;/td&gt;
          &lt;td&gt;好み、背景、長期目標&lt;/td&gt;
          &lt;td&gt;アーキテクチャ、コマンド、規約、デバッグ経験&lt;/td&gt;
          &lt;td&gt;saved info、過去チャット、Gmail/Drive/Docs 文脈&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;保存形態&lt;/td&gt;
          &lt;td&gt;OpenAI アカウント内の記憶とチャット文脈&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;、&lt;code&gt;MEMORY.md&lt;/code&gt;、ローカル Markdown ファイル&lt;/td&gt;
          &lt;td&gt;Google アカウント活動、保存情報、接続アプリデータ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;透明性&lt;/td&gt;
          &lt;td&gt;Memory sources で一部の出所が見える&lt;/td&gt;
          &lt;td&gt;Markdown ファイルを直接表示・編集できる&lt;/td&gt;
          &lt;td&gt;ソース表示、Gemini Apps Activity、Google 設定で管理&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;プロジェクト横断&lt;/td&gt;
          &lt;td&gt;強い。ユーザーアカウントに追従&lt;/td&gt;
          &lt;td&gt;弱い。主にプロジェクトまたはローカル project memory に追従&lt;/td&gt;
          &lt;td&gt;強い。Google 資料と権限に依存&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;チーム共有&lt;/td&gt;
          &lt;td&gt;直接共有には不向き&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; を Git で共有可能&lt;/td&gt;
          &lt;td&gt;主に Workspace と権限体系に依存&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;得意領域&lt;/td&gt;
          &lt;td&gt;個人の好みと長期アシスタント&lt;/td&gt;
          &lt;td&gt;長期コードプロジェクトと agent 協作&lt;/td&gt;
          &lt;td&gt;Google Workspace 資料検索とクロスツール作業&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;どう選びどう使うか&#34;&gt;どう選び、どう使うか
&lt;/h2&gt;&lt;p&gt;AI に「自分は誰か、どんなスタイルが好きか、普段どう働くか」を覚えさせたいなら、ChatGPT の記憶が向いている。&lt;/p&gt;
&lt;p&gt;文章スタイル、よく使う技術スタック、回答形式、職業背景、長期プロジェクトの方向といった個人の好みを保存するのに適している。重点は自己紹介コストを下げ、新しい会話を素早く始めることだ。&lt;/p&gt;
&lt;p&gt;AI に「このコードベースをどう変えるか、どのコマンドが動くか、どの罠を避けるか」を覚えさせたいなら、Claude Code が向いている。&lt;/p&gt;
&lt;p&gt;安定したルールは &lt;code&gt;CLAUDE.md&lt;/code&gt; に書いてチーム共有する。動的な経験は Auto Memory に補助させる。重要な意思決定はローカル自動記憶にだけ残さず、文書や &lt;code&gt;CLAUDE.md&lt;/code&gt; に整理するのがよい。&lt;/p&gt;
&lt;p&gt;資料の多くが Gmail、Drive、Docs、Sheets にあるなら、Gemini のエコシステム文脈が有利だ。&lt;/p&gt;
&lt;p&gt;過去メールの検索、Google Drive 文書の整理、カレンダーやオフィス資料との連携に向いている。Gemini を使うポイントは、チャット内で何度も思い出させることではなく、関連アプリの接続、権限、アクティビティ設定を正しくしておくことだ。&lt;/p&gt;
&lt;h2 id=&#34;実用的な分担&#34;&gt;実用的な分担
&lt;/h2&gt;&lt;p&gt;3者は次のように分担できる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT は「自分の一般的な好み」を覚える。&lt;/li&gt;
&lt;li&gt;Claude Code は「このリポジトリのエンジニアリング知識」を覚える。&lt;/li&gt;
&lt;li&gt;Gemini は「Google エコシステム内の資料」を検索する。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、ChatGPT は個人秘書、Claude Code はプロジェクト内のシニアエンジニア、Gemini は Google アカウント内の資料インデクサーに近い。&lt;/p&gt;
&lt;p&gt;この3種類の記憶に絶対的な優劣はない。目的が違うだけだ。&lt;/p&gt;
&lt;p&gt;最も注意すべきなのは混同することだ。個人の好みは必ずしもプロジェクト記憶に書くべきではない。プロジェクトアーキテクチャは必ずしもクラウド上の個人記憶に保存すべきではない。Google エコシステム検索は、モデルがあなたを長期的に本当に理解したことと同じではない。&lt;/p&gt;
&lt;h2 id=&#34;短い判断&#34;&gt;短い判断
&lt;/h2&gt;&lt;p&gt;AI 記憶の次の段階は、単に「多く覚える」ことではない。記憶は階層化され、見えるようになり、制御可能である必要がある。&lt;/p&gt;
&lt;p&gt;ChatGPT の重点は会話をまたいだ個人化、Claude Code の重点はコードプロジェクトの継続性、Gemini の重点は Google エコシステム文脈だ。本当に使いやすい長期 AI 協作は、すべての情報を一つのブラックボックスに詰め込むのではなく、異なる種類の記憶を適切な場所に置く。&lt;/p&gt;
&lt;p&gt;個人の好みは個人記憶に、エンジニアリングルールはコードベースに、過去資料は元の文書やメールシステムに置く。AI がすべきことは、必要なときに正確にそれらの文脈を呼び出すことであり、すべてを一つに混ぜることではない。&lt;/p&gt;
&lt;h2 id=&#34;関連リンク&#34;&gt;関連リンク
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;OpenAI Memory FAQ：&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/8590148-memory-faq&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/8590148-memory-faq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ChatGPT Release Notes：&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Claude Code Memory：&lt;a class=&#34;link&#34; href=&#34;https://code.claude.com/docs/en/memory&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://code.claude.com/docs/en/memory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gemini Saved info：&lt;a class=&#34;link&#34; href=&#34;https://support.google.com/gemini/answer/15637730&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://support.google.com/gemini/answer/15637730&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gemini Apps Privacy Hub：&lt;a class=&#34;link&#34; href=&#34;https://support.google.com/gemini/answer/13594961&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://support.google.com/gemini/answer/13594961&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>ChatGPT Release Notes から見る OpenAI のプロダクトリズム</title>
        <link>https://knightli.com/ja/2026/05/07/chatgpt-release-notes-product-rhythm/</link>
        <pubDate>Thu, 07 May 2026 14:31:22 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/05/07/chatgpt-release-notes-product-rhythm/</guid>
        <description>&lt;p&gt;OpenAI の &lt;code&gt;ChatGPT Release Notes&lt;/code&gt; は、ChatGPT のプロダクトリズムを観察する直接的な入口だ。このページは、ChatGPT のモデル、機能、アカウントセキュリティ、アプリ連携、クライアント体験の変化を継続的に記録している。&lt;/p&gt;
&lt;p&gt;2026 年 5 月 7 日時点で見ると、ページ上部には最新更新が「yesterday」と表示され、最新項目は 2026 年 5 月 5 日に集中している。一見すると普通の更新に見えるが、まとめて見ると ChatGPT が向かう方向が分かる。デフォルトモデルはより信頼でき、記憶はより制御可能になり、オフィスシーンに深く入り、アカウント安全性も補強されている。&lt;/p&gt;
&lt;h2 id=&#34;最新重点1記憶ソースが見えるようになる&#34;&gt;最新重点1：記憶ソースが見えるようになる
&lt;/h2&gt;&lt;p&gt;5 月 5 日の最初の更新は、ChatGPT の記憶改善だ。&lt;/p&gt;
&lt;p&gt;OpenAI は、Plus と Pro ユーザーに対して、より個人化され継続的な回答を段階的に提供するとしている。ChatGPT は過去のチャット、保存記憶、利用可能なファイル、接続済み Gmail の文脈をよりうまく使い、ユーザーに合った提案、推薦、次の行動を出せる。&lt;/p&gt;
&lt;p&gt;この能力の価値は長期利用で明確になる。ユーザーがプロジェクトを進めていたり、連載記事を書いていたり、メール群を追っていたり、同種の作業を繰り返していたりすると、毎回背景を説明し直すことが負担になる。より強い記憶能力は、その繰り返しを減らすためのものだ。&lt;/p&gt;
&lt;p&gt;しかし記憶が強くなるほど、ユーザーはモデルがどの文脈を使ったのか知る必要がある。そのため OpenAI は &lt;code&gt;memory sources&lt;/code&gt; を導入した。ユーザーは回答下で、関連する保存記憶、過去のチャット、カスタム指示、特定条件で参照されたファイルや Gmail メールを確認できる。&lt;/p&gt;
&lt;p&gt;情報が古い、不正確、またはもう関連しない場合、ユーザーは修正、削除、または不関連としてマークできる。&lt;/p&gt;
&lt;h2 id=&#34;パーソナライズはより分かってくれるだけではない&#34;&gt;パーソナライズは「より分かってくれる」だけではない
&lt;/h2&gt;&lt;p&gt;AI のパーソナライズについて語るとき、多くの人は「モデルが自分をより理解するか」だけを見る。しかし長期的に使えるパーソナライズには、3つの問いに答える必要がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザーはモデルが何を参照したか見られるか。&lt;/li&gt;
&lt;li&gt;ユーザーはその情報を編集または削除できるか。&lt;/li&gt;
&lt;li&gt;ユーザーは記憶が不要なときにオフにできるか。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Release Notes では、memory sources はユーザー自身のアカウント体験内にのみ表示され、チャット共有時には他人に表示されないと明記されている。ユーザーはチャットを削除し、Temporary Chat を使い、記憶をオフにし、アプリ接続を解除し、コンテンツがモデル改善に使われるかを管理できる。&lt;/p&gt;
&lt;p&gt;これは、OpenAI がパーソナライズ能力を積むだけでなく、制御インターフェースも補っていることを示す。長期的なアシスタントにとって、この一歩は重要だ。&lt;/p&gt;
&lt;h2 id=&#34;最新重点2gpt-55-instant-がデフォルトモデルに&#34;&gt;最新重点2：GPT-5.5 Instant がデフォルトモデルに
&lt;/h2&gt;&lt;p&gt;同じ日に、OpenAI は &lt;code&gt;GPT-5.5 Instant&lt;/code&gt; を ChatGPT の新しいデフォルトモデルとして展開し、すべてのユーザーの &lt;code&gt;GPT-5.3 Instant&lt;/code&gt; を置き換え始めた。&lt;/p&gt;
&lt;p&gt;Release Notes はこのモデル更新を実務的に説明している。より正確で、より明確で、より簡潔になり、画像理解、STEM 質問、いつ web search を使うかの判断も改善している。&lt;/p&gt;
&lt;p&gt;この種のデフォルトモデル更新はユーザーへの影響が大きい。ほとんどのユーザーは毎日モデルを切り替えない。彼らが感じる ChatGPT の品質は、デフォルトモデルの品質だ。デフォルトモデルの幻覚が減り、無駄な文章が減り、意味のない追問が減れば、実際の体験は明確に改善する。&lt;/p&gt;
&lt;p&gt;OpenAI はまた、GPT-5.5 Instant が過度なフォーマットや不要な装飾的内容を減らすとも述べている。これは小さく見えるが、日常利用には近い。多くの場合、ユーザーが必要としているのは構造の整った小論文ではなく、正確で直接的で実行可能な答えだ。&lt;/p&gt;
&lt;p&gt;有料ユーザーは GPT-5.3 Instant を3か月間使い続けられ、その後このモデルは退役する。&lt;/p&gt;
&lt;h2 id=&#34;最新重点3chatgpt-が-excel-と-google-sheets-に入る&#34;&gt;最新重点3：ChatGPT が Excel と Google Sheets に入る
&lt;/h2&gt;&lt;p&gt;5 月 5 日の3つ目の更新は、ChatGPT for Excel と Google Sheets のグローバル提供だ。&lt;/p&gt;
&lt;p&gt;この機能は Microsoft Excel と Google Sheets のサイドバーに ChatGPT を入れ、ユーザーが表計算内で直接データを構築、更新、理解できるようにする。公式が挙げるシーンには、トラッカー、予算、数式、複数シートのファイル、シナリオ分析、スプレッドシート整理がある。&lt;/p&gt;
&lt;p&gt;これは ChatGPT が「チャット画面で質問に答える」だけに留まっていないことを示している。ユーザーがすでに働いている場所へ入っている。&lt;/p&gt;
&lt;p&gt;オフィスユーザーにとって、表計算は非常に高頻度の実作業現場だ。多くの会社、チーム、個人の業務データは、複雑なデータプラットフォームではなく、多数の Excel と Google Sheets ファイルにある。ChatGPT が表計算の横で直接データを理解し、数式を書き、複数シートを整理し、結果を説明できるなら、チャット画面へコピー＆ペーストするよりハードルはかなり低い。&lt;/p&gt;
&lt;p&gt;OpenAI は、数式や分析に依存する前に出力を確認するよう促している。これは現実的だ。AI は表計算作業を速くできるが、財務、運用、業務判断の責任をすべてユーザーの代わりに負うことはできない。&lt;/p&gt;
&lt;h2 id=&#34;4月末の下地安全性とモデル選択&#34;&gt;4月末の下地：安全性とモデル選択
&lt;/h2&gt;&lt;p&gt;少し前を見ると、4月30日の &lt;code&gt;Advanced Account Security&lt;/code&gt; も注目に値する。&lt;/p&gt;
&lt;p&gt;これは個人 ChatGPT アカウント向けの任意の安全設定だ。有効にすると、passkeys や互換セキュリティキーのようなより強いサインイン方式を使い、パスワードログイン、メールやSMSのログインコード、メールベースのアカウント復旧といった弱い経路を無効化する。さらにリカバリキー、短いアクティブセッション、ログイン通知、セッション管理コントロールも含まれる。&lt;/p&gt;
&lt;p&gt;この種の機能は、ChatGPT アカウントの重要性が上がっていることを示す。ファイル、記憶、アプリ接続、メール、表計算、作業プロジェクトが ChatGPT に入るにつれ、アカウント安全性は単なるログイン問題ではなく、ユーザーの長期的な仕事文脈に関わる問題になる。&lt;/p&gt;
&lt;p&gt;4月28日には、OpenAI はモデル選択入口を入力欄の近くに移し、Thinking と Pro モデルの &lt;code&gt;thinking effort&lt;/code&gt; 制御をモデルピッカーに入れた。これは典型的なプロダクト細部の変更だ。モデルが増えるほど、ユーザーは送信前に適切なツールを選びやすくする必要がある。&lt;/p&gt;
&lt;h2 id=&#34;4月下旬のもう一つの方向より速い通常回答&#34;&gt;4月下旬のもう一つの方向：より速い通常回答
&lt;/h2&gt;&lt;p&gt;4月22日、ChatGPT は &lt;code&gt;Fast answers&lt;/code&gt; を導入した。&lt;/p&gt;
&lt;p&gt;これは一般的な情報問い合わせ向けの機能だ。質問がパーソナライズを必要とせず、ChatGPT が高信頼の答えを持っている場合、より速く結果を返せる。Fast answers は過去のチャットや記憶を参照せず、ユーザーはパーソナライズ設定でオフにできる。&lt;/p&gt;
&lt;p&gt;これは記憶強化と逆に見えるが、実際には同じプロダクトロジックだ。異なる質問には異なる処理が必要になる。&lt;/p&gt;
&lt;p&gt;「先週のプロジェクト計画を続けて」のような質問には長期文脈が必要だ。一方、「世界七不思議は何か」のような質問には速さと明確さが必要だ。前者には記憶と文脈が必要で、後者には速度と明瞭さが必要になる。ChatGPT はこれらの経路を分け始めている。&lt;/p&gt;
&lt;h2 id=&#34;プロダクトリズムの変化&#34;&gt;プロダクトリズムの変化
&lt;/h2&gt;&lt;p&gt;これらの release notes から、ChatGPT の更新はもはやモデル発表だけではないことが分かる。&lt;/p&gt;
&lt;p&gt;現在の更新は同時に次をカバーしている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;デフォルトモデル品質。&lt;/li&gt;
&lt;li&gt;記憶とパーソナライズ。&lt;/li&gt;
&lt;li&gt;アプリ接続とオフィスアドイン。&lt;/li&gt;
&lt;li&gt;アカウント安全性。&lt;/li&gt;
&lt;li&gt;モデル選択とインタラクション入口。&lt;/li&gt;
&lt;li&gt;Fast answers とモバイル体験。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これは ChatGPT が単一の AI チャット製品から、より完全な作業プラットフォームへ移行していることを意味する。モデル能力は依然として重要だが、プロダクト体験、文脈管理、ツール入口、アカウント安全性、サードパーティ連携も同じくらい重要になっている。&lt;/p&gt;
&lt;h2 id=&#34;短い判断&#34;&gt;短い判断
&lt;/h2&gt;&lt;p&gt;この ChatGPT Release Notes で最も見るべきなのは、特定の1つの更新ではなく、それらが組み合わさって示す方向だ。&lt;/p&gt;
&lt;p&gt;OpenAI は ChatGPT を、より速く、より文脈を理解し、よりオフィスシーンに入り、同時により制御可能で安全なものにしている。GPT-5.5 Instant はデフォルト回答品質を高め、memory sources はパーソナライズの出所を説明し、Excel と Google Sheets は実際の作業ファイルへ入る。Advanced Account Security は、より重いアカウント利用に保護を足している。&lt;/p&gt;
&lt;p&gt;今後、ChatGPT の競争力はモデルパラメータだけで決まらない。これらの更新を、安定し、明確で、ユーザーが長期的な文脈を預けたいと思えるプロダクト体験へまとめられるかにも左右される。&lt;/p&gt;
&lt;h2 id=&#34;関連リンク&#34;&gt;関連リンク
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ChatGPT Release Notes：&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes%253F.ejs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/6825453-chatgpt-release-notes%253F.ejs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>ChatGPT Release Notes 更新：記憶ソース、GPT-5.5 Instant、表計算アドイン</title>
        <link>https://knightli.com/ja/2026/05/07/chatgpt-release-notes-memory-gpt-5-5-sheets/</link>
        <pubDate>Thu, 07 May 2026 14:30:15 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/05/07/chatgpt-release-notes-memory-gpt-5-5-sheets/</guid>
        <description>&lt;p&gt;OpenAI の &lt;code&gt;ChatGPT Release Notes&lt;/code&gt; ページは 2026 年 5 月初めに更新された。最新の主な内容は3つある。ChatGPT の記憶ソースとパーソナライズ能力の強化、&lt;code&gt;GPT-5.5 Instant&lt;/code&gt; の新デフォルトモデル化、そして ChatGPT for Excel と Google Sheets のグローバル提供だ。&lt;/p&gt;
&lt;p&gt;これらを合わせて見ると、方向は明確だ。ChatGPT は単なるチャット入口から、より継続的で、より個人化され、オフィス作業に近いワークアシスタントへ進んでいる。&lt;/p&gt;
&lt;h2 id=&#34;memory-sourcesパーソナライズをより透明に&#34;&gt;Memory sources：パーソナライズをより透明に
&lt;/h2&gt;&lt;p&gt;最新更新で最も注目すべきなのは &lt;code&gt;memory sources&lt;/code&gt; だ。&lt;/p&gt;
&lt;p&gt;OpenAI は、ChatGPT Plus と Pro ユーザーに対して記憶機能の改善を展開し始めるとしている。ChatGPT は過去のチャット、保存された記憶、利用可能なファイル、接続済み Gmail アプリから関連文脈をよりうまく取り出し、ユーザーに合ったアイデア、提案、次の行動を出せるようになる。&lt;/p&gt;
&lt;p&gt;これにより、ユーザーは新しい会話のたびにプロジェクト背景、好み、作業習慣、既存資料を繰り返し説明する必要が減る。長期的な執筆、プロジェクト計画、資料整理、学習、チーム作業では、継続性が強くなる。&lt;/p&gt;
&lt;p&gt;ただし、パーソナライズが強くなるほど透明性は重要になる。そのため OpenAI は memory sources を導入し、どの情報が回答のパーソナライズに使われたかをユーザーが確認できるようにする。回答下の Sources アイコンを押すと、関連する保存記憶、過去のチャット、カスタム指示を確認できる。Plus と Pro ユーザーは、ライブラリ内のファイルや、接続済み Gmail から参照されたメールも見る場合がある。&lt;/p&gt;
&lt;p&gt;情報が古い、不関連、または誤っている場合、ユーザーは修正、削除、または不関連としてマークできる。&lt;/p&gt;
&lt;h2 id=&#34;記憶の制御は依然として重要&#34;&gt;記憶の制御は依然として重要
&lt;/h2&gt;&lt;p&gt;OpenAI は、memory sources が回答に影響したすべての要因を表示するとは限らず、今後もこのビューを改善すると説明している。&lt;/p&gt;
&lt;p&gt;これは重要な注意点だ。memory sources は完全な「モデル思考ログ」ではない。個人化の文脈を理解するためのプロダクトインターフェースだ。可視性は高めるが、すべての影響要因を完全に展開するものではない。&lt;/p&gt;
&lt;p&gt;プライバシーと制御について、OpenAI は memory sources がユーザー自身のアカウント体験内にのみ表示されると述べている。チャットを共有しても、関連 sources は共有チャットに表示されない。ユーザーはチャットを削除したり、記憶を使わず更新もせず履歴にも残らない Temporary Chat を使ったり、記憶をオフにしたり、アプリ接続をいつでも解除したり、自分のコンテンツがモデル改善に使われるかを管理できる。&lt;/p&gt;
&lt;p&gt;これは、ChatGPT のパーソナライズがより明確な道筋を取っていることを示している。ユーザーをより理解する一方で、なぜそう答えたのかを知らせ、管理入口も残すという方向だ。&lt;/p&gt;
&lt;h2 id=&#34;gpt-55-instant-がデフォルトモデルに&#34;&gt;GPT-5.5 Instant がデフォルトモデルに
&lt;/h2&gt;&lt;p&gt;Release Notes は、&lt;code&gt;GPT-5.5 Instant&lt;/code&gt; が ChatGPT の新しいデフォルトモデルとして展開され、すべてのユーザー向けの &lt;code&gt;GPT-5.3 Instant&lt;/code&gt; を置き換えることも確認している。&lt;/p&gt;
&lt;p&gt;今回のデフォルトモデル更新では、主に次の点が改善される。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正確性。&lt;/li&gt;
&lt;li&gt;明確さと簡潔さ。&lt;/li&gt;
&lt;li&gt;画像理解。&lt;/li&gt;
&lt;li&gt;STEM 質問への回答。&lt;/li&gt;
&lt;li&gt;いつ web search が必要かの判断。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenAI は、GPT-5.5 Instant が特に正確性が重要なプロンプトでより事実に強いと強調している。また、より引き締まった直接的な回答を出し、不要な追問を減らし、過度なフォーマットや装飾的な内容による散らかりを減らす。&lt;/p&gt;
&lt;p&gt;ユーザーにとって、これは新しいボタンほど目立たないかもしれない。しかし毎日 ChatGPT を開くときの体感には効く。回答が遠回りせず、冗長さが減り、簡単な質問に過剰な形式を積み上げにくくなる。&lt;/p&gt;
&lt;h2 id=&#34;パーソナライズとデフォルトモデルがつながる&#34;&gt;パーソナライズとデフォルトモデルがつながる
&lt;/h2&gt;&lt;p&gt;Web 版の Plus と Pro ユーザーに対して、GPT-5.5 Instant は過去のチャット、ファイル、接続済み Gmail の文脈をより効果的に使える。&lt;/p&gt;
&lt;p&gt;これは memory sources と同じプロダクトラインにある。モデルは単に「賢い」だけではなく、適切な場面で、ユーザーが以前に何をしていたか、何を気にしているか、どんな資料をすでに提供したかを理解する必要がある。プロジェクトの継続、計画作成、メール情報の整理、過去の好みに基づく提案では、ChatGPT は重複した質問を減らせる。&lt;/p&gt;
&lt;p&gt;有料ユーザーは GPT-5.3 Instant をモデル設定から3か月間使い続けられ、その後このモデルは退役する。&lt;/p&gt;
&lt;h2 id=&#34;chatgpt-for-excel-と-google-sheets&#34;&gt;ChatGPT for Excel と Google Sheets
&lt;/h2&gt;&lt;p&gt;もう一つの重要な更新は、ChatGPT for Excel と Google Sheets のグローバル提供だ。&lt;/p&gt;
&lt;p&gt;これは Microsoft Excel と Google Sheets のサイドバーに ChatGPT を入れ、ユーザーが表計算内で直接データを作成、更新、理解できるようにする。OpenAI が挙げるシーンは次の通りだ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;トラッカー。&lt;/li&gt;
&lt;li&gt;予算。&lt;/li&gt;
&lt;li&gt;数式。&lt;/li&gt;
&lt;li&gt;複数シートのファイル。&lt;/li&gt;
&lt;li&gt;シナリオ作業。&lt;/li&gt;
&lt;li&gt;スプレッドシートの整理。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;利用可能な条件では、Skills と apps もサポートする。&lt;/p&gt;
&lt;p&gt;この機能の意味は分かりやすい。多くのオフィスデータは専用 BI システムではなく、Excel と Google Sheets にある。ChatGPT を表計算のサイドバーに置くことは、チャット画面へコピー＆ペーストさせるより自然で、実際のワークフローに入りやすい。&lt;/p&gt;
&lt;h2 id=&#34;利用制限とインストール方法&#34;&gt;利用制限とインストール方法
&lt;/h2&gt;&lt;p&gt;Release Notes によると、Free と Go には限定的な利用量が含まれる。Plus と Pro は Codex と同じ agentic usage limits を使う。プラン上限を超える場合、追加 credits を購入できる。&lt;/p&gt;
&lt;p&gt;インストール方法も直接的だ。Excel 版は Microsoft Marketplace から、Google Sheets 版は Google Workspace Marketplace からインストールし、対象となる ChatGPT アカウントでログインする。&lt;/p&gt;
&lt;p&gt;OpenAI は、数式や分析に依存する前に出力を確認するよう促している。これは重要だ。AI は表計算作業を速くできるが、数式、予算、財務、業務分析は依然として人間の確認が必要だ。&lt;/p&gt;
&lt;h2 id=&#34;最近の更新の流れ&#34;&gt;最近の更新の流れ
&lt;/h2&gt;&lt;p&gt;4月末から5月初めの release notes をまとめて見ると、ChatGPT の方向がよりはっきりする。&lt;/p&gt;
&lt;p&gt;4月30日、OpenAI は Advanced Account Security を公開し、個人の ChatGPT アカウント向けに、passkeys、セキュリティキー、リカバリキー、短いセッション、ログイン通知を含むより強いサインイン要件と保護を提供した。&lt;/p&gt;
&lt;p&gt;4月28日、モデル選択は入力欄の近くへ移動し、送信前にモデルを選びやすくなった。Thinking と Pro モデルの thinking effort 設定もモデルピッカーに入った。&lt;/p&gt;
&lt;p&gt;4月22日、ChatGPT は Fast answers を導入した。これはパーソナライズが不要で、モデルが高信頼の答えを持つ一般的な情報検索に使われる。Fast answers は過去のチャットや記憶を参照せず、ユーザーはパーソナライズ設定でオフにできる。&lt;/p&gt;
&lt;p&gt;これらの更新は同じ目標を持つ。ChatGPT を日常の高頻度利用により適したものにすることだ。速いべきときは速く、個人化すべきときは個人化し、安全保護と可視制御が必要なときは入口を用意する。&lt;/p&gt;
&lt;h2 id=&#34;短い判断&#34;&gt;短い判断
&lt;/h2&gt;&lt;p&gt;今回の ChatGPT Release Notes の焦点は、単一の機能ではなく、プロダクト形態がさらに整えられていることだ。&lt;/p&gt;
&lt;p&gt;GPT-5.5 Instant はデフォルト回答品質を高める。memory sources はパーソナライズを見えるようにする。Excel と Google Sheets のアドインは ChatGPT をオフィスの表計算に入れる。Advanced Account Security とモデル選択の変更は、アカウント保護と操作体験を補強する。&lt;/p&gt;
&lt;p&gt;ChatGPT はより長期的な作業レイヤーになりつつある。より多くの文脈を覚え、より多くのツールに入り、より多くの日常タスクを担う。次に見るべきなのは、パーソナライズの透明性が十分に分かりやすいか、オフィスアドインが実際の複雑な表計算で安定するか、そしてユーザーが便利さと制御のバランスを保てるかだ。&lt;/p&gt;
&lt;h2 id=&#34;関連リンク&#34;&gt;関連リンク
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ChatGPT Release Notes：&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>GPT-5.5 Instant 公開：ChatGPT のデフォルトモデルはより正確で短く、より個人に合うように</title>
        <link>https://knightli.com/ja/2026/05/07/gpt-5-5-instant-chatgpt-default-model/</link>
        <pubDate>Thu, 07 May 2026 14:28:40 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/05/07/gpt-5-5-instant-chatgpt-default-model/</guid>
        <description>&lt;p&gt;OpenAI は 2026 年 5 月 5 日、&lt;code&gt;GPT-5.5 Instant&lt;/code&gt; を公開し、すべての ChatGPT ユーザー向けのデフォルトモデルとして展開を開始した。&lt;/p&gt;
&lt;p&gt;今回の更新のキーワードは「より大きい」や「より派手」ではない。日常利用に近い改善だ。回答はより正確で簡潔になり、語調はより自然になり、ユーザーがすでに共有した文脈をよりうまく使う。ChatGPT にとって、デフォルトモデルの変化は特に重要だ。最も多くのユーザーが毎日実際に使う体験を変えるからだ。&lt;/p&gt;
&lt;h2 id=&#34;デフォルトモデルが重要な理由&#34;&gt;デフォルトモデルが重要な理由
&lt;/h2&gt;&lt;p&gt;Instant は ChatGPT の日常的な主力モデルだ。多くのユーザーは手動でモデルを切り替えず、モデル間の違いも詳しく調べない。彼らが感じる ChatGPT の品質は、デフォルトモデルの品質そのものだ。&lt;/p&gt;
&lt;p&gt;そのため GPT-5.5 Instant の意味は、新しいモデル名が増えたことだけではない。基礎体験を全体として一段押し上げることにある。OpenAI は、今回の更新により日常的なやり取りがより有用でスムーズになると説明している。さまざまなテーマで回答が引き締まり、会話のトーンが自然になり、必要なときには既存の文脈をよりよく使える。&lt;/p&gt;
&lt;p&gt;この改善は大規模なマルチモーダル発表ほど目立たないかもしれない。しかし数億規模のユーザーにとって、デフォルトモデルがミスを減らし、冗長さを減らし、不要な質問を減らすこと自体が大きなプロダクト変化だ。&lt;/p&gt;
&lt;h2 id=&#34;幻覚が少なくより信頼できる回答&#34;&gt;幻覚が少なく、より信頼できる回答
&lt;/h2&gt;&lt;p&gt;OpenAI は正確性を最初に置いている。&lt;/p&gt;
&lt;p&gt;公式によると、内部評価では、医学、法律、金融など高リスク領域のプロンプトに対して、GPT-5.5 Instant は GPT-5.3 Instant よりも幻覚的な主張を 52.5% 減らした。また、ユーザーが事実誤りとして報告した特に難しい会話では、不正確な主張が 37.3% 減った。&lt;/p&gt;
&lt;p&gt;この2つの数字は重要だ。OpenAI がモデルを「話がうまい」方向に進めるだけでなく、事実誤りの発生率を下げ続けていることを示している。特に医療、法律、金融のような領域では、モデルは流暢な答えを出すだけでは不十分で、より慎重で、作り話が少なくなければならない。&lt;/p&gt;
&lt;p&gt;もちろん、これで ChatGPT を専門家の助言の代わりにしてよいという意味ではない。より正確なモデルでも、高リスク領域では確認、出典、専門家の判断が必要だ。それでもプロダクト体験として、デフォルトモデルの事実信頼性が上がることは、日常利用の誤誘導を減らす。&lt;/p&gt;
&lt;h2 id=&#34;日常タスク能力の強化&#34;&gt;日常タスク能力の強化
&lt;/h2&gt;&lt;p&gt;GPT-5.5 Instant は事実性だけでなく、複数の日常タスクでも改善している。&lt;/p&gt;
&lt;p&gt;OpenAI は、写真や画像アップロードの分析、STEM 質問への回答、そしていつ web search を使うべきかの判断が改善したと述べている。ここで重要なのは「いつ検索するかを判断する」ことだ。多くのユーザーは、モデル内部でツールが呼ばれたかどうかではなく、答えが新しく、正確で、分かりやすいかを気にする。&lt;/p&gt;
&lt;p&gt;モデルが、どの質問は検索が必要で、どの質問は直接答えられるかをよりよく判断できれば、ユーザーは何度も「調べて」と言う必要がない。ChatGPT は、明示的な指示を待つチャット欄ではなく、より能動的で信頼できる助手に近づく。&lt;/p&gt;
&lt;p&gt;発表内の数学例もこの方向を示している。GPT-5.5 Instant は最初に誤った解法を認めた後、さらに確認して代数ミスを見つけ、正しい方程式に戻って解く。本当に重要なのは、まったく間違えないことではなく、推論の途中で問題に気づき修正できる可能性が高まることだ。&lt;/p&gt;
&lt;h2 id=&#34;回答は短くなるが薄くなるわけではない&#34;&gt;回答は短くなるが、薄くなるわけではない
&lt;/h2&gt;&lt;p&gt;OpenAI は、GPT-5.5 Instant の回答がより引き締まり、直接的になる一方で、必要な内容と ChatGPT の親しみやすいトーンを保つとも強調している。&lt;/p&gt;
&lt;p&gt;これはデフォルトモデルにとって重要だ。AI の回答に疲れる理由は、情報不足ではなく、構造が重すぎること、前置きが多すぎること、フォーマットが過剰なことにある場合が多い。単純な質問が5つの見出しと十数個の注意点に分解されると、不自然に感じられる。&lt;/p&gt;
&lt;p&gt;GPT-5.5 Instant の目標は、不要な長さと過度なフォーマットを減らし、不要な追問を減らし、回答を散らかす装飾的な要素を避けることだ。日常の業務、文章相談、生活相談、素早い説明では、こうした改善が単一のベンチマーク点よりも体感に効く。&lt;/p&gt;
&lt;p&gt;短いことは浅いことではない。良いデフォルトモデルは、ユーザーが必要としているのが一言の実行可能な助言なのか、説明なのか、完全な計画なのかを判断するべきだ。GPT-5.5 Instant は、このバランス感覚をより安定させる方向にある。&lt;/p&gt;
&lt;h2 id=&#34;パーソナライズ能力も強化&#34;&gt;パーソナライズ能力も強化
&lt;/h2&gt;&lt;p&gt;今回のもう一つの主軸はパーソナライズだ。&lt;/p&gt;
&lt;p&gt;OpenAI は、Instant が過去のチャット、ファイル、接続された Gmail の文脈をよりうまく使い、回答をより関連性の高いものにできると述べている。追加のパーソナライズが回答を改善できる場面を判断し、過去の会話から関連文脈をより速く探すため、ユーザーは同じ背景を繰り返す必要が減る。&lt;/p&gt;
&lt;p&gt;これは ChatGPT を長く使っている人にとって価値が大きい。計画、執筆、ツール選び、プロジェクト整理、ワークフローの継続では、ユーザーはすでに過去の会話で好み、制約、文脈を伝えていることが多い。モデルが自然に引き継げれば、説明の重複が減る。&lt;/p&gt;
&lt;p&gt;ただし、パーソナライズには透明性と制御が必要だ。そうでなければ、なぜモデルが突然ある好みに触れたのか、どの記憶が回答に影響したのかが分からない。&lt;/p&gt;
&lt;h2 id=&#34;memory-sources-でパーソナライズを見えるようにする&#34;&gt;Memory sources でパーソナライズを見えるようにする
&lt;/h2&gt;&lt;p&gt;OpenAI は同時に、すべての ChatGPT モデルに &lt;code&gt;memory sources&lt;/code&gt; を導入する。&lt;/p&gt;
&lt;p&gt;これは、保存された記憶や過去のチャットなど、どの文脈が回答のパーソナライズに使われたかをユーザーが確認できる機能だ。古い、不正確、またはもう使わせたくない内容があれば、削除や修正ができる。&lt;/p&gt;
&lt;p&gt;OpenAI はまた、ユーザーがチャットを共有しても memory sources は他の人には表示されないと説明している。引用されたくないチャットを削除したり、設定で保存記憶を変更したり、記憶を使わず更新もしない Temporary Chat を使ったりできる。&lt;/p&gt;
&lt;p&gt;これは重要な一歩だ。AI アシスタントが個人化されるほど、「何に基づいて答えたのか」を説明する必要が増える。Memory sources はすべての要因を示すわけではないが、パーソナライズの一部をブラックボックスの外へ出す。&lt;/p&gt;
&lt;h2 id=&#34;利用可能性&#34;&gt;利用可能性
&lt;/h2&gt;&lt;p&gt;GPT-5.5 Instant は発表当日から全 ChatGPT ユーザーへ展開され、GPT-5.3 Instant に代わってデフォルトモデルになる。API では &lt;code&gt;chat-latest&lt;/code&gt; に対応する。&lt;/p&gt;
&lt;p&gt;有料ユーザーは、モデル設定から GPT-5.3 Instant を3か月間使い続けられる。その後、このモデルは退役する。&lt;/p&gt;
&lt;p&gt;過去のチャット、ファイル、接続 Gmail を使った強化パーソナライズは、まず Web 版の Plus と Pro ユーザーに展開され、モバイルにも後日提供される。今後数週間で Free、Go、Business、Enterprise に広げる計画だ。Memory sources は Web 版の ChatGPT 消費者プランに展開され、モバイルにも後で提供される。利用できるパーソナライズ元は地域によって異なる場合がある。&lt;/p&gt;
&lt;h2 id=&#34;短い判断&#34;&gt;短い判断
&lt;/h2&gt;&lt;p&gt;GPT-5.5 Instant は、デフォルト体験に向けたアップグレードだ。&lt;/p&gt;
&lt;p&gt;モデル能力が強くなるだけではない。回答の正確性、密度、トーン、文脈利用、パーソナライズの透明性を同時に調整している。一般ユーザーにとって最も直接的な変化は、無駄な文章が減り、事実誤りが減り、自分の背景によりつながりやすくなることだろう。&lt;/p&gt;
&lt;p&gt;OpenAI にとっては、デフォルトアシスタントの形を進化させる一歩でもある。ChatGPT は「毎回ゼロから質問に答える」ツールから、好みを覚え、文脈を理解し、いつ検索すべきかを判断し、ユーザーが記憶の出所を管理できる長期的なアシスタントへ進んでいる。&lt;/p&gt;
&lt;h2 id=&#34;関連リンク&#34;&gt;関連リンク
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;OpenAI 発表：&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/gpt-5-5-instant/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://openai.com/index/gpt-5-5-instant/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>ChatGPT に「このチャットはサイバーセキュリティ上のリスクがある可能性があります」と表示される理由と対処法</title>
        <link>https://knightli.com/ja/2026/05/06/chatgpt-cybersecurity-risk-flag/</link>
        <pubDate>Wed, 06 May 2026 00:17:00 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/05/06/chatgpt-cybersecurity-risk-flag/</guid>
        <description>&lt;p&gt;ChatGPT や類似の大規模言語モデルを使っていると、まれに「このチャットはサイバーセキュリティ上のリスクがある可能性があります」（This chat was flagged for possible cybersecurity risk）という通知が表示されることがあります。これは、プラットフォームの自動安全システムが、会話内容が利用ポリシーに違反する可能性を検出したという意味です。&lt;/p&gt;
&lt;p&gt;以下では、この通知が表示される原因、実際の影響、対処方法を整理します。&lt;/p&gt;
&lt;h2 id=&#34;なぜフラグ付けされるのか&#34;&gt;なぜフラグ付けされるのか
&lt;/h2&gt;&lt;h3 id=&#34;入力内容がセンシティブ&#34;&gt;入力内容がセンシティブ
&lt;/h3&gt;&lt;p&gt;会話に、有害と解釈される可能性のある内容が含まれている場合があります。たとえば次のようなものです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;悪意のあるコードやスクリプトの生成を求める。&lt;/li&gt;
&lt;li&gt;ネットワーク脆弱性の分析や悪用について扱う。&lt;/li&gt;
&lt;li&gt;違法行為に関連する内容を質問する。&lt;/li&gt;
&lt;li&gt;セキュリティ制限を回避する手順を求める。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;誤検知false-positive&#34;&gt;誤検知（False Positive）
&lt;/h3&gt;&lt;p&gt;意図が合法的なコード分析や技術調査であっても、システムがサイバーセキュリティ関連の用語を潜在的な攻撃意図として誤判定することがあります。AI の審査モデルはキーワードに敏感であり、技術的な議論と攻撃行為の境界が必ずしも正確に判定されるとは限りません。&lt;/p&gt;
&lt;h3 id=&#34;プラットフォームの審査メカニズム&#34;&gt;プラットフォームの審査メカニズム
&lt;/h3&gt;&lt;p&gt;システムは会話内容を自動的にスキャンし、リスク評価を行います。新しいバージョン、たとえば 2026 年 4 月の更新以降では、この種の通知が表示されるケースが増えており、プラットフォームがより厳格な外部審査プロセスを導入した可能性があります。&lt;/p&gt;
&lt;h2 id=&#34;通知が表示された後の影響&#34;&gt;通知が表示された後の影響
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;現在のチャットが終了する&lt;/strong&gt;：プラットフォームが現在の会話での生成を制限または停止する場合があります。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;リスク記録&lt;/strong&gt;：リスク管理のトリガーが繰り返されると記録され、一定以上蓄積するとアカウント状態に影響する可能性があります。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高感度化の傾向&lt;/strong&gt;：審査メカニズムは継続的に厳しくなっており、技術的な議論でも境界に触れやすくなっています。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;対処方法&#34;&gt;対処方法
&lt;/h2&gt;&lt;h3 id=&#34;新しいチャットを作成する&#34;&gt;新しいチャットを作成する
&lt;/h3&gt;&lt;p&gt;最も直接的な方法は、現在の会話をあきらめて「New Chat」をクリックし、新しい会話を始めることです。以前の文脈は引き継がれないため、通常は同じ審査トリガーが再発しにくくなります。&lt;/p&gt;
&lt;h3 id=&#34;プロンプトを調整する&#34;&gt;プロンプトを調整する
&lt;/h3&gt;&lt;p&gt;以前に入力した内容を確認し、センシティブと判断されそうな語句を取り除き、より中立的な表現に置き換えます。たとえば「ある制限をどう回避するか」を「その制限の原理は何か」に、「攻撃スクリプトをどう書くか」を「この種のスクリプトは通常どのような仕組みを利用するのか」に変えます。&lt;/p&gt;
&lt;h3 id=&#34;回避を試みない&#34;&gt;回避を試みない
&lt;/h3&gt;&lt;p&gt;プロンプトインジェクションなどの方法で、AI に拒否された質問へ無理に回答させようとするのは避けてください。このような行為はアカウント停止のリスクを高め、たいてい逆効果です。&lt;/p&gt;
&lt;h3 id=&#34;自分の操作内容を確認する&#34;&gt;自分の操作内容を確認する
&lt;/h3&gt;&lt;p&gt;フィッシングリンクの分析やウイルス作成のような高リスク操作をしていない場合、多くは AI が技術概念を誤読したものです。この場合はプラットフォームへフィードバックすることも考えられますが、短期的な効果は限定的です。&lt;/p&gt;
&lt;h3 id=&#34;プライバシーに注意する&#34;&gt;プライバシーに注意する
&lt;/h3&gt;&lt;p&gt;個人情報や営業秘密を含む内容を AI 分析に使わないでください。リスク管理に引っかからなくても、データ漏えいのリスクは残ります。&lt;/p&gt;
&lt;h2 id=&#34;予防策&#34;&gt;予防策
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;技術的な議論では、できるだけ中立的な用語で問題を説明する。&lt;/li&gt;
&lt;li&gt;1 つの会話内で大量のセンシティブな話題を集中して扱わない。&lt;/li&gt;
&lt;li&gt;不要な過去の会話を定期的に整理する。&lt;/li&gt;
&lt;li&gt;重要なアカウントでは、審査の境界に頻繁に触れる使い方を避ける。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ
&lt;/h2&gt;&lt;p&gt;「このチャットはサイバーセキュリティ上のリスクがある可能性があります」という通知は、通常は自動審査によって発生するもので、必ずしもアカウント違反を意味するわけではありません。対処の優先順位は明確です。新しいチャットを作成する &amp;gt; 表現を調整する &amp;gt; 無理に突破しようとしない。日常的な利用では、表現の境界に注意することで、ほとんどの発生を避けられます。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>ChatGPT と Codex がログイン時に電話番号認証を求める理由</title>
        <link>https://knightli.com/ja/2026/05/06/chatgpt-codex-phone-verification-plus/</link>
        <pubDate>Wed, 06 May 2026 00:09:41 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/05/06/chatgpt-codex-phone-verification-plus/</guid>
        <description>&lt;p&gt;最近、ChatGPT アカウントは登録済みなのに、ChatGPT や Codex にログインしようとすると再度電話番号の認証を求められるケースが報告されている。特に Codex ではこの表示に戸惑うユーザーが多い。アカウント登録はできたのに、なぜツールにログインする際に電話番号が必要になるのか。&lt;/p&gt;
&lt;p&gt;この問題は通常、アカウントのリスク制御、無料枠の悪用、ネットワーク環境、アカウントセキュリティポリシーに関係している。以下に主な原因と対処の考え方を整理する。&lt;/p&gt;
&lt;h2 id=&#34;電話番号認証が要求される理由&#34;&gt;電話番号認証が要求される理由
&lt;/h2&gt;&lt;p&gt;最も直接的な原因はリスク制御の強化である。&lt;/p&gt;
&lt;p&gt;Codex が一般ユーザーに開放されると、無料枠は多くの正規ユーザーを惹きつける一方で、大量登録や無料枠の搾取も呼び込む。登録ボットでアカウントを大量生成し、無料枠を消費する行為が増えれば、プラットフォームは認証ポリシーを引き締めざるを得なくなる。&lt;/p&gt;
&lt;p&gt;ユーザー側から見える結果は、以前はメールまたはサードパーティログインだけで済んでいたアカウントが、ChatGPT や Codex へのアクセス時に突然電話番号の追加入力を求められる、というものだ。&lt;/p&gt;
&lt;p&gt;これは必ずしも個別のアカウントに問題があるとは限らず、よりリスクの高いログイン環境と判定された可能性もある。例えば：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多数のユーザーが共有するネットワーク出口を使用している。&lt;/li&gt;
&lt;li&gt;現在のIP帯域が登録や異常ログインに頻繁に使われている。&lt;/li&gt;
&lt;li&gt;登録直後のアカウントで、リソース消費の大きいツールにすぐアクセスした。&lt;/li&gt;
&lt;li&gt;デバイス、地域、ネットワークが頻繁に変わる。&lt;/li&gt;
&lt;li&gt;無料アカウントの利用パターンが大量アカウントのそれと似ている。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最近アカウントの異常、ログイン制限、誤BANを経験した場合、ネットワーク環境が巻き添えでフラグ付けされた可能性もある。特に多人数共有のノードはリスクが顕著に高い。&lt;/p&gt;
&lt;h2 id=&#34;codex-でより発生しやすい理由&#34;&gt;Codex でより発生しやすい理由
&lt;/h2&gt;&lt;p&gt;Codex は通常のチャットと異なり、開発ツールに近く、より多くのリソースを消費する可能性がある。また、無料枠を狙う大量アカウントにとっても格好の標的になりやすい。&lt;/p&gt;
&lt;p&gt;したがって、同じアカウントが通常の ChatGPT ページでは問題なく見えても、Codex のログインフローで電話番号認証がトリガーされるのは不思議ではない。製品の入り口ごとに異なるリスク判断が適用されると考えればよい。&lt;/p&gt;
&lt;p&gt;通常のユーザーに対しては、この種の認証は個人を困らせるためではなく、大量登録と無料枠の悪用を抑制するためのものだ。ただし、ネットワーク環境がクリーンでない場合は巻き添えを食らうこともある。&lt;/p&gt;
&lt;h2 id=&#34;対処法1plus-へのアップグレード&#34;&gt;対処法1：Plus へのアップグレード
&lt;/h2&gt;&lt;p&gt;ChatGPT や Codex を長期利用するなら、最もシンプルな対処法は ChatGPT Plus へのアップグレードである。&lt;/p&gt;
&lt;p&gt;実際の使用感から言えば、有料アカウントは無料アカウントよりも無料枠悪用関連のリスク制御に引っかかりにくい。Plus アカウントは Codex、ChatGPT の上位モデル、その他高頻度機能の安定利用にも適している。&lt;/p&gt;
&lt;p&gt;ただし、Plus にアップグレードすれば認証が永久に発生しなくなるわけではない。アップグレード後も電話番号を求められる場合、原因はやはりネットワーク環境であることが多い。&lt;/p&gt;
&lt;p&gt;その場合は以下を優先的に確認するとよい：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多数のユーザーが共有するネットワークを使っていないか。&lt;/li&gt;
&lt;li&gt;出口IPが頻繁に切り替わっていないか。&lt;/li&gt;
&lt;li&gt;低品質なプロキシや公共ノードを長期間使っていないか。&lt;/li&gt;
&lt;li&gt;同一ネットワーク下で多数の OpenAI アカウントがログインしていないか。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可能であれば、より安定したクリーンなネットワーク環境に切り替えてからログインする方が、何度もリトライするより効果的だ。&lt;/p&gt;
&lt;h2 id=&#34;対処法2ネットワーク環境の確認&#34;&gt;対処法2：ネットワーク環境の確認
&lt;/h2&gt;&lt;p&gt;ログイン認証の問題の多くは、一見アカウントの問題に見えて、本質的にはネットワークの問題である。&lt;/p&gt;
&lt;p&gt;特定の出口IPが多数のユーザーに共有されていたり、大量登録、異常ログイン、自動化リクエストに使われた履歴がある場合、フラグ付けされやすい。その場合、正規のユーザーであっても ChatGPT や Codex へのログイン時に追加認証を要求されることがある。&lt;/p&gt;
&lt;p&gt;以下の観点から確認できる：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;より安定したネットワーク環境に切り替える。&lt;/li&gt;
&lt;li&gt;公開された安価な多人数共有ノードの使用を避ける。&lt;/li&gt;
&lt;li&gt;短期間での頻繁な地域切り替えを最小限に抑える。&lt;/li&gt;
&lt;li&gt;同じブラウザで複数アカウントを頻繁に切り替えない。&lt;/li&gt;
&lt;li&gt;プロキシを使う場合は、品質が安定し悪用の少ない回線を優先する。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;サードパーティのネットワーク品質検出ツールで現在のIPのリスク状況を確認することもできるが、検出結果はあくまで参考であり、OpenAI 内部の判断を完全に代表するものではない。&lt;/p&gt;
&lt;h2 id=&#34;対処法3指示に従って電話番号認証を完了する&#34;&gt;対処法3：指示に従って電話番号認証を完了する
&lt;/h2&gt;&lt;p&gt;システムが明示的に電話番号認証を要求する場合、最も確実な方法は指示に従って認証を完了することである。&lt;/p&gt;
&lt;p&gt;長期的に認証コードを受信できる自分自身の番号を使うことを推奨する。そうすれば、後日アカウントのセキュリティ確認、復旧、異常通知が必要になった際にも対応できる。&lt;/p&gt;
&lt;p&gt;重要なアカウントを出所不明、多人共有、または長期間使えない番号に紐付けることは推奨しない。短期的には認証を通過できても、長期的にはアカウント復旧、セキュリティ監査、二次認証のリスクを招く。&lt;/p&gt;
&lt;p&gt;仕事用アカウント、チームアカウント、または長期利用の開発用アカウントを使っている場合は、管理不能な一時的な番号の使用を特に避けるべきだ。アカウントの安全は一時的な手間より重要である。&lt;/p&gt;
&lt;h2 id=&#34;plus-アップグレード時の注意点&#34;&gt;Plus アップグレード時の注意点
&lt;/h2&gt;&lt;p&gt;Plus へのアップグレードを予定している場合、事前にいくつか確認しておくとよい：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;アカウント自体が正常にログインできること。&lt;/li&gt;
&lt;li&gt;現在のネットワーク環境が安定しており、頻繁に地域が切り替わらないこと。&lt;/li&gt;
&lt;li&gt;支払い方法が信頼できるものであること。出所不明の代理決済は使わない。&lt;/li&gt;
&lt;li&gt;アップグレード後は決済記録とアカウントのメールを保管すること。&lt;/li&gt;
&lt;li&gt;アカウントを複数人で共有しないこと。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;アカウントの問題の多くは Plus 自体にあるのではなく、アップグレード前後のネットワーク、支払い、共有の習慣にある。アカウントを長期間複数人で共有し、頻繁に別の場所からログインし、頻繁に環境を切り替えると、有料であってもセキュリティ認証がトリガーされる可能性がある。&lt;/p&gt;
&lt;p&gt;たまに試すだけであれば、無料アカウントでも問題ない。しかし Codex を日常の開発ツールとして使っているなら、Plus の方が長期利用に適している。&lt;/p&gt;
&lt;h2 id=&#34;無料枠の搾取は推奨しない&#34;&gt;無料枠の搾取は推奨しない
&lt;/h2&gt;&lt;p&gt;Codex のようなツールの無料枠は、もともと正規ユーザーが体験・試用するためのものだ。大量のアカウントが無料枠を継続的に消費すれば、プラットフォームは最終的にリスク制御の強度を上げ続けるしかなくなる。&lt;/p&gt;
&lt;p&gt;その結果、正規ユーザーも影響を受ける。ログインは面倒になり、認証は増え、誤BANは増え、アカウントの利用コストは上昇する。&lt;/p&gt;
&lt;p&gt;実際に Codex をコーディング、プロジェクト改修、エンジニアリングタスクに使っている人にとっては、リスク制御を回避することに時間を費やすよりも、アカウントとネットワーク環境をクリーンに整える方が価値がある。長期的に見れば、新しいアカウントを繰り返し登録し、ノードを切り替え、認証問題に対処するよりもずっと楽だ。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ
&lt;/h2&gt;&lt;p&gt;ChatGPT や Codex がログイン時に電話番号認証を要求するのは、通常アカウントのリスク制御、無料枠の悪用、ネットワーク環境のリスクに関係している。必ずしもアカウント自体が違反しているとは限らないが、現在のログイン環境またはアカウント状態がより高いレベルの認証をトリガーしたことを示している。&lt;/p&gt;
&lt;p&gt;対処の順序はシンプルだ：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;まずネットワーク環境を確認し、多人共有や高リスクの出口を避ける。&lt;/li&gt;
&lt;li&gt;長期利用の場合は Plus へのアップグレードを検討する。&lt;/li&gt;
&lt;li&gt;システムが電話番号認証を要求する場合は、自分が長期間管理できる番号で完了させる。&lt;/li&gt;
&lt;li&gt;大量登録、アカウント共有、頻繁なログイン環境の切り替えを避ける。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;AI ツールを安定して使うための本質は、認証を回避し続けることではなく、アカウント、ネットワーク、利用方法をできる限り正常に保つことだ。そうすることでログインの手間を減らし、後日の巻き添えリスクも下げられる。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>OpenAI が Advanced Account Security を発表：ChatGPT と Codex アカウントに強力な保護層を追加</title>
        <link>https://knightli.com/ja/2026/05/01/openai-advanced-account-security/</link>
        <pubDate>Fri, 01 May 2026 06:15:29 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/05/01/openai-advanced-account-security/</guid>
        <description>&lt;p&gt;OpenAI は 2026 年 4 月 30 日、ChatGPT アカウント向けの任意の高度なセキュリティ設定として &lt;code&gt;Advanced Account Security&lt;/code&gt; を発表した。&lt;/p&gt;
&lt;p&gt;主な対象は二つのユーザー層だ。一つは、ジャーナリスト、選挙で選ばれた公職者、政治的反体制派、研究者など、標的型攻撃を受けやすい人たち。もう一つは、ChatGPT と Codex のアカウントにより強い保護を加えたい、セキュリティ意識の高いユーザーである。&lt;/p&gt;
&lt;p&gt;この機能を有効にすると、ChatGPT だけでなく、同じログインアカウントでアクセスする Codex も保護される。&lt;/p&gt;
&lt;h2 id=&#34;なぜ-chatgpt-アカウントにより高い安全性が必要なのか&#34;&gt;なぜ ChatGPT アカウントにより高い安全性が必要なのか
&lt;/h2&gt;&lt;p&gt;現在、多くの人が ChatGPT をますます私的で、リスクの高い仕事に使うようになっている。&lt;/p&gt;
&lt;p&gt;一つの ChatGPT アカウントには、次のようなものが含まれる可能性がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;個人的な相談や長期的な会話&lt;/li&gt;
&lt;li&gt;業務文書とプロジェクトの文脈&lt;/li&gt;
&lt;li&gt;接続済みのツールとワークフロー&lt;/li&gt;
&lt;li&gt;Codex 内のコードや開発タスク&lt;/li&gt;
&lt;li&gt;企業、研究、セキュリティ関連の資料&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;アカウントが乗っ取られた場合、被害はチャット履歴の漏洩だけでは済まない。攻撃者は接続済みツールへアクセスしたり、機密性の高い文脈を見たり、進行中の作業に干渉したりする可能性がある。&lt;/p&gt;
&lt;p&gt;そのため、今回 OpenAI が導入したのは単なるログインオプションではなく、より厳格なアカウント保護のセットである。&lt;/p&gt;
&lt;h2 id=&#34;advanced-account-security-に含まれる保護&#34;&gt;Advanced Account Security に含まれる保護
&lt;/h2&gt;&lt;p&gt;OpenAI はこの機能を、ChatGPT ウェブ版アカウントの Security 設定に配置している。ユーザーは任意で有効にできる。&lt;/p&gt;
&lt;p&gt;有効にすると、いくつかの面でアカウントの安全性が高まる。&lt;/p&gt;
&lt;p&gt;第一に、ログイン方法が強化される。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Advanced Account Security&lt;/code&gt; は &lt;code&gt;passkeys&lt;/code&gt; または物理セキュリティキーを要求し、パスワードベースのログインを無効にする。目的は、フィッシングに強いログイン方法を、それを必要とする人たちの標準にすることだ。&lt;/p&gt;
&lt;p&gt;第二に、アカウント復旧がより厳格になる。&lt;/p&gt;
&lt;p&gt;従来のアカウント復旧は、多くの場合メールやSMSに依存している。攻撃者がユーザーのメールアカウントや電話番号を支配した場合、それを使ってアカウントをリセットできる可能性がある。このリスクを下げるため、Advanced Account Security はメールと SMS による復旧を無効化し、バックアップ passkeys、セキュリティキー、復旧キーなど、より強力な復旧方法を使う。&lt;/p&gt;
&lt;p&gt;ここには重要な代償がある。有効にした後は、アカウント復旧がユーザー自身による復旧手段の管理に大きく依存する。OpenAI は、この機能を有効にしたユーザーが復旧手段を失った場合、OpenAI Support はアカウント復旧を支援できないと明示している。&lt;/p&gt;
&lt;p&gt;第三に、セッションが短くなり、管理がより明確になる。&lt;/p&gt;
&lt;p&gt;OpenAI はログインセッションを短くし、端末やアクティブなセッションが侵害された場合の露出時間を減らす。ユーザーはログイン通知も受け取り、複数デバイスでのアクティブセッションを確認・管理できる。&lt;/p&gt;
&lt;p&gt;第四に、学習除外が自動になる。&lt;/p&gt;
&lt;p&gt;機密情報を扱う人にとって、会話をモデル学習に使わせないことは重要なプライバシー設定である。Advanced Account Security を有効にすると、この設定が自動的に適用される。つまり、これらのアカウントの会話は OpenAI モデルの学習に使われない。&lt;/p&gt;
&lt;h2 id=&#34;yubico-と連携して物理セキュリティキーを広げる&#34;&gt;Yubico と連携して物理セキュリティキーを広げる
&lt;/h2&gt;&lt;p&gt;OpenAI は、Yubico と提携してカスタムのセキュリティキーセットを提供することも発表した。&lt;/p&gt;
&lt;p&gt;含まれるのは次の二つだ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;YubiKey C Nano&lt;/code&gt;：ノートPCに挿したまま使うことを想定し、日常のログイン負担を減らす&lt;/li&gt;
&lt;li&gt;&lt;code&gt;YubiKey C NFC&lt;/code&gt;：バックアップとして、またノートPCとモバイルデバイスの両方で使いやすい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenAI は、ユーザーが他の FIDO 準拠の物理セキュリティキーや、ソフトウェア passkeys を使うこともできるとしている。&lt;/p&gt;
&lt;p&gt;これは、Advanced Account Security が特定のハードウェアに縛られているわけではなく、フィッシングに強い認証方式を中心に設計されていることを示している。&lt;/p&gt;
&lt;h2 id=&#34;trusted-access-for-cyber-ユーザーには有効化が求められる&#34;&gt;Trusted Access for Cyber ユーザーには有効化が求められる
&lt;/h2&gt;&lt;p&gt;OpenAI はさらに、&lt;code&gt;Trusted Access for Cyber&lt;/code&gt; の個人メンバーが、より高性能で許容範囲の広いサイバーセキュリティ向けモデルにアクセスする場合、2026 年 6 月 1 日から Advanced Account Security の有効化が必要になると述べている。&lt;/p&gt;
&lt;p&gt;組織ユーザーは別の方法でも要件を満たせる。自社のシングルサインオンのワークフローが、すでにフィッシング耐性のある認証を採用していると証明する方法だ。&lt;/p&gt;
&lt;p&gt;この方針は妥当だ。モデル能力が強くなるほど、アカウント保護も強くする必要がある。特にサイバーセキュリティ研究、脆弱性分析、レッドチームといった場面では、アカウント自体が高価値の標的になる。&lt;/p&gt;
&lt;h2 id=&#34;誰が有効にすべきか&#34;&gt;誰が有効にすべきか
&lt;/h2&gt;&lt;p&gt;この機能は、必ずしもすべての人に向いているわけではない。&lt;/p&gt;
&lt;p&gt;普通の会話に使うだけで、より厳格なアカウント復旧の複雑さを負いたくない場合は、しばらく様子を見るのもよい。&lt;/p&gt;
&lt;p&gt;ただし、次のようなユーザーは真剣に検討する価値がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT で機密性の高い業務資料をよく扱う人&lt;/li&gt;
&lt;li&gt;Codex でプライベートコードリポジトリを扱う人&lt;/li&gt;
&lt;li&gt;ジャーナリスト、公共政策関係者、研究者、企業幹部などの高リスクユーザー&lt;/li&gt;
&lt;li&gt;サイバーセキュリティ従事者&lt;/li&gt;
&lt;li&gt;すでに passkeys や物理セキュリティキーに慣れている人&lt;/li&gt;
&lt;li&gt;フィッシング、SMS乗っ取り、メールアカウント乗っ取りを特に警戒している人&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有効にする前に、バックアップ passkey、セキュリティキー、復旧キーを用意し、それらが適切に保管されていることを確認したほうがよい。そうしないと、安全性は高まる一方で、アカウント復旧の難度も明らかに上がる。&lt;/p&gt;
&lt;h2 id=&#34;ai-プロダクトにとって何を意味するのか&#34;&gt;AI プロダクトにとって何を意味するのか
&lt;/h2&gt;&lt;p&gt;Advanced Account Security はモデル能力の更新ではない。しかし、AI プロダクトがより高リスクな利用段階に入っていることを反映している。&lt;/p&gt;
&lt;p&gt;ChatGPT と Codex がワークフロー、コード、文書、企業向けコネクター、長期的な文脈を担い始めると、アカウントはもはや「チャットツールにログインする入口」ではなく、AI 作業環境の鍵になる。&lt;/p&gt;
&lt;p&gt;こうしたプロダクトが個人の作業台に近づくほど、アカウントセキュリティ、復旧メカニズム、セッション管理、学習データ制御は重要になる。&lt;/p&gt;
&lt;p&gt;OpenAI が passkeys、物理セキュリティキー、復旧制限、セッション管理、学習除外を一つの設定にまとめた方向性は妥当だ。高リスクユーザーが明確な入口から、機密性の高い作業に適したレベルまでアカウント保護を引き上げられる。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Advanced Account Security&lt;/code&gt; は、ChatGPT と Codex の高セキュリティモードと理解できる。&lt;/p&gt;
&lt;p&gt;より強いログイン、より厳格な復旧、短いセッション、ログイン通知、自動的な学習除外によって、アカウント乗っ取り後のリスクを下げる。その代わり、ユーザーは自分の復旧手段をより慎重に管理する必要がある。有効化後は従来のメールや SMS による復旧が使えず、OpenAI Support も代わりに救済できないからだ。&lt;/p&gt;
&lt;p&gt;すでに ChatGPT や Codex を重要な仕事に使っているなら、特にプライベートコード、機密文書、高リスクな立場に関わる場合、この機能は注目に値する。&lt;/p&gt;
&lt;p&gt;参考リンク：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/advanced-account-security/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Introducing Advanced Account Security - OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>ChatGPT・Claude・Gemini の役割分担はどうするべきか：日常会話、コーディング、特殊機能の選び方</title>
        <link>https://knightli.com/ja/2026/04/25/chatgpt-claude-gemini-task-selection/</link>
        <pubDate>Sat, 25 Apr 2026 10:51:19 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/04/25/chatgpt-claude-gemini-task-selection/</guid>
        <description>&lt;p&gt;今では、多くの人が1つのモデルだけを使うのではなく、&lt;code&gt;ChatGPT&lt;/code&gt;、&lt;code&gt;Claude&lt;/code&gt;、&lt;code&gt;Gemini&lt;/code&gt; を行き来しながら使っています。そうなると問題はかなり実務的になります。&lt;strong&gt;どんなタスクを、どのモデルに任せるべきなのか。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;この点が悩ましくなるのは、3社とも弱いからではありません。むしろ十分に強くなった結果、それぞれの得意分野が分かれてきたからです。いまだに「どれがいちばん賢いか」のような曖昧な基準で選ぶと、かえって外しやすくなります。&lt;/p&gt;
&lt;p&gt;まずは簡略版の結論から言うと、おおむね次のように考えられます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日常会話や汎用タスクなら、まず &lt;code&gt;ChatGPT&lt;/code&gt; を思い浮かべる人が多い&lt;/li&gt;
&lt;li&gt;コマンドラインでのコーディング、長いコンテキストでの協業、継続的に進めるタイプの作業なら、&lt;code&gt;Claude&lt;/code&gt; のほうが扱いやすいことが多い&lt;/li&gt;
&lt;li&gt;Google エコシステム、検索、マルチモーダルの入口、あるいは一部の製品レベルの特殊機能が必要なら、&lt;code&gt;Gemini&lt;/code&gt; の存在感が強い&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下、3つに分けて見ていきます。&lt;/p&gt;
&lt;h2 id=&#34;1-日常会話なぜ多くの人がまず-chatgpt-を開くのか&#34;&gt;1. 日常会話：なぜ多くの人がまず &lt;code&gt;ChatGPT&lt;/code&gt; を開くのか
&lt;/h2&gt;&lt;p&gt;多くの一般的な利用シーンでは、&lt;code&gt;ChatGPT&lt;/code&gt; は今でも「標準の入口」のような存在です。&lt;/p&gt;
&lt;p&gt;ここで言いたいのは、特定の benchmark の話ではなく、全体的な使い心地です。&lt;br&gt;
ちょっとした質問をしたいとき、考えを整理したいとき、短い文章を書きたいとき、たたき台を作りたいとき、資料を要約したいときに、&lt;code&gt;ChatGPT&lt;/code&gt; は全体としてバランスがよく感じられます。&lt;/p&gt;
&lt;p&gt;強みは主に次の点にあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;回答スタイルが比較的安定している&lt;/li&gt;
&lt;li&gt;一般ユーザーにとって使い始めるハードルが低い&lt;/li&gt;
&lt;li&gt;多くの総合タスクで過度な追加調整がいらない&lt;/li&gt;
&lt;li&gt;製品としての完成度が高く、日常的に高頻度で使いやすい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;たとえば次のような作業なら、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;あるテーマを整理してほしい&lt;/li&gt;
&lt;li&gt;アイデアを構造化された内容にまとめたい&lt;/li&gt;
&lt;li&gt;長文を要約したい&lt;/li&gt;
&lt;li&gt;いくつかの案をブレインストーミングしたい&lt;/li&gt;
&lt;li&gt;表現をより分かりやすく整えたい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;ChatGPT&lt;/code&gt; はかなり自然な出発点になります。&lt;/p&gt;
&lt;p&gt;これは、あらゆる専門タスクで必ず最強だという意味ではありません。むしろ「広く汎用的に使える」という点で、標準の作業台に近いということです。&lt;/p&gt;
&lt;h2 id=&#34;2-コマンドラインでのコーディングと長いタスクなぜ-claude-を好む人が多いのか&#34;&gt;2. コマンドラインでのコーディングと長いタスク：なぜ &lt;code&gt;Claude&lt;/code&gt; を好む人が多いのか
&lt;/h2&gt;&lt;p&gt;タスクが「少し会話する」段階から、「最後まで継続して進める」段階に移ると、多くの人の好みは &lt;code&gt;Claude&lt;/code&gt; に傾き始めます。&lt;/p&gt;
&lt;p&gt;特に次のような場面です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コマンドラインでのプログラミング&lt;/li&gt;
&lt;li&gt;大規模プロジェクトのコンテキスト理解&lt;/li&gt;
&lt;li&gt;複数ファイルをまたぐ修正&lt;/li&gt;
&lt;li&gt;長い流れのデバッグ&lt;/li&gt;
&lt;li&gt;コードを読みながらタスクを前進させる作業&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こうしたタスクで重要なのは、1回の返答がどれだけ派手かではなく、長い作業の流れの中で安定していられるかどうかです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Claude&lt;/code&gt; が好まれる理由は、「ひとことが他よりうまいから」ではなく、主に次の点にあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;長いコンテキストのタスクでも粘り強い&lt;/li&gt;
&lt;li&gt;ファイル、ログ、ルールを連続して読むときの安定感が高い&lt;/li&gt;
&lt;li&gt;複雑なコーディング作業を段階的に進めやすい&lt;/li&gt;
&lt;li&gt;コマンドラインや agent ワークフローでは主力モデルとして扱われやすい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;vibe coding&lt;/code&gt;、コマンドラインでのバグ修正、プロジェクト構造の理解、複数ファイルにまたがる機能改修をしているなら、&lt;code&gt;Claude&lt;/code&gt; の強みはより見えやすくなります。&lt;/p&gt;
&lt;p&gt;要するに、&lt;code&gt;Claude&lt;/code&gt; は一問一答のためだけでなく、一緒に「作業を進める」相手として向いているモデルだと言えます。&lt;/p&gt;
&lt;h2 id=&#34;3-gemini-の強みは何でも正面から勝つことではない&#34;&gt;3. &lt;code&gt;Gemini&lt;/code&gt; の強みは「何でも正面から勝つこと」ではない
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Gemini&lt;/code&gt; を語るとき、多くの人は「結局3つの中で最強なのか」と聞きがちです。&lt;/p&gt;
&lt;p&gt;しかし実際の利用感覚からすると、もっと有用な問いはそこではありません。&lt;strong&gt;どんな場面で、あえて単独で使う価値が高いのか。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Gemini&lt;/code&gt; の価値は、主に次の方向で表れやすいです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google エコシステムとの連携&lt;/li&gt;
&lt;li&gt;検索や情報収集&lt;/li&gt;
&lt;li&gt;マルチモーダルの入口&lt;/li&gt;
&lt;li&gt;一部の製品機能との連動&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;もし普段のワークフローがもともと Google のツールチェーンに近いなら、たとえば&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;検索&lt;/li&gt;
&lt;li&gt;ドキュメント&lt;/li&gt;
&lt;li&gt;メール&lt;/li&gt;
&lt;li&gt;ブラウザ上での利用&lt;/li&gt;
&lt;li&gt;モバイル側の入口&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Gemini&lt;/code&gt; の実用上の便利さは、単純なモデル性能の比較よりも重要になるかもしれません。&lt;/p&gt;
&lt;p&gt;つまり &lt;code&gt;Gemini&lt;/code&gt; の使いやすさは、「どこで自分のワークフローに自然につながるか」から来ることが多く、「単発の回答で誰に勝つか」だけでは測れません。&lt;/p&gt;
&lt;h2 id=&#34;4-本当に役立つ選び方は最強を問うことではなくタスクの種類を問うこと&#34;&gt;4. 本当に役立つ選び方は、最強を問うことではなく、タスクの種類を問うこと
&lt;/h2&gt;&lt;p&gt;3つのモデルを並べて比較するとき、いちばん陥りやすい罠は「唯一の最強」を探そうとすることです。&lt;/p&gt;
&lt;p&gt;ですが、現実のタスクはあまりにも違います。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;単発のQ&amp;amp;Aもある&lt;/li&gt;
&lt;li&gt;長い対話で伴走してもらうものもある&lt;/li&gt;
&lt;li&gt;コードベースを扱う作業もある&lt;/li&gt;
&lt;li&gt;情報検索もある&lt;/li&gt;
&lt;li&gt;マルチモーダル処理もある&lt;/li&gt;
&lt;li&gt;ツールチェーンとの協業もある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;だからこそ、より有効なのはタスクの種類で分けることです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;総合型で、日常的に高頻度に使えて、開けばすぐ使える助手がほしいなら、まず &lt;code&gt;ChatGPT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;長いコンテキスト、コマンドライン、コーディング協業、複雑な作業の継続的な前進が必要なら、まず &lt;code&gt;Claude&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Google エコシステム、検索、マルチモーダルの入口、あるいは一部の製品連携を活かしたいなら、&lt;code&gt;Gemini&lt;/code&gt; を重視する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このような役割分担のほうが、無理に総合優勝を決めるより、実際の使い方に近いです。&lt;/p&gt;
&lt;h2 id=&#34;5-なぜヘビーユーザーは3つとも契約するのか&#34;&gt;5. なぜヘビーユーザーは3つとも契約するのか
&lt;/h2&gt;&lt;p&gt;ライトユーザーの視点では、3つ全部に課金するのは重複して見えがちです。&lt;br&gt;
けれどもヘビーユーザーの視点では、それは異なる仕事に異なる道具を割り当てているだけです。&lt;/p&gt;
&lt;p&gt;理由は単純です。&lt;br&gt;
3つのモデルの強みがすでにはっきり分かれ始めているなら、同時に使うことは重複課金ではなく、タスク切り替えのコストや試行錯誤のコストを下げる方法だからです。&lt;/p&gt;
&lt;p&gt;たとえば、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日常的な整理や総合Q&amp;amp;Aには &lt;code&gt;ChatGPT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;コーディングの主作業には &lt;code&gt;Claude&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;検索、マルチモーダル、Google 関連の導線には &lt;code&gt;Gemini&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この組み合わせの考え方は、デザイナーが複数のソフトを入れることや、開発者が複数の IDE を使うことと本質的には変わりません。&lt;/p&gt;
&lt;h2 id=&#34;6-何度もモデルを切り替えすぎないほうがいい場面&#34;&gt;6. 何度もモデルを切り替えすぎないほうがいい場面
&lt;/h2&gt;&lt;p&gt;もちろん、モデルが多ければ常に良いわけではありません。&lt;/p&gt;
&lt;p&gt;まだ安定したワークフローを作っている途中なら、3つのモデルを早い段階で頻繁に行き来すると、かえって混乱しやすくなります。よくある問題は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;同じタスクを何度も説明し直す&lt;/li&gt;
&lt;li&gt;モデルごとに違う提案が出て、判断が難しくなる&lt;/li&gt;
&lt;li&gt;コンテキストが途切れ、協業コストが上がる&lt;/li&gt;
&lt;li&gt;自分なりの使い分けができる前に、道具選びそのものに引っ張られる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なので、より安定したやり方は次の通りです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;まず各モデルに1つずつ主な担当領域を与える&lt;/li&gt;
&lt;li&gt;その担当領域でしばらく続けて使う&lt;/li&gt;
&lt;li&gt;そのうえで自分なりの使い分けを徐々に作っていく&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;こうすることで、「今日はこれを試してみよう」という段階に留まり続けるのではなく、再利用しやすい実践知を得やすくなります。&lt;/p&gt;
&lt;h2 id=&#34;7-まずはこう覚えておけばいい&#34;&gt;7. まずはこう覚えておけばいい
&lt;/h2&gt;&lt;p&gt;とりあえず使える覚え方だけ欲しいなら、次のような口語的な分担表で十分です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ChatGPT&lt;/code&gt;：汎用型の標準アシスタント&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Claude&lt;/code&gt;：長いタスクとコーディング協業の主力&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Gemini&lt;/code&gt;：検索、マルチモーダル、Google エコシステムで強みを発揮しやすいツール&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これは絶対的なルールではありませんし、3者が互いに代替できないという意味でもありません。あくまで実際の利用感覚に近い出発点です。&lt;/p&gt;
&lt;p&gt;本当に重要なのは、「宇宙最強のモデル」を選ぶことではなく、できるだけ早く次を見極めることです。&lt;br&gt;
&lt;strong&gt;今、目の前のこの種類のタスクに対して、どのモデルがもっとも時間を節約し、気力を消耗させず、結果につながりやすいか。&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>OpenAI が GPT-5.5 を発表：より強力なエージェント型コーディング、知識作業、研究支援</title>
        <link>https://knightli.com/ja/2026/04/24/openai-gpt-5-5-release/</link>
        <pubDate>Fri, 24 Apr 2026 08:39:56 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/04/24/openai-gpt-5-5-release/</guid>
        <description>&lt;p&gt;OpenAI は 2026 年 4 月 23 日に &lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introducing-gpt-5-5/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Introducing GPT-5.5&lt;/a&gt; を公開しました。公式ページを見る限り、今回の更新は単に「モデルが賢くなった」という話ではなく、複雑なタスクをどこまで継続して進められるかに重点があります。&lt;/p&gt;
&lt;p&gt;OpenAI は GPT-5.5 を、実際の仕事により適したモデルとして位置づけています。質問に答えるだけでなく、コードを書き、デバッグし、情報を調べ、データを分析し、文書やスプレッドシートを作成し、ソフトウェアを操作し、複数のツールを行き来しながらタスクを完了することが期待されています。&lt;/p&gt;
&lt;h2 id=&#34;1-gpt-55-はどこが強いのか&#34;&gt;1. GPT-5.5 はどこが強いのか
&lt;/h2&gt;&lt;p&gt;今回の発表ページで繰り返し強調されている方向性は、大きく次の 4 つです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エージェント型コーディング&lt;/li&gt;
&lt;li&gt;コンピューター操作とツール利用&lt;/li&gt;
&lt;li&gt;知識作業&lt;/li&gt;
&lt;li&gt;初期段階の科学研究支援&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;つまり、GPT-5.5 の重点は短い質疑応答ではなく、より長い流れを持つタスクです。たとえばエンジニアリング上の問題は、「このコードをどう直すか」だけではありません。プロジェクト構造を理解し、失敗原因を特定し、関連ファイルを修正し、テストを追加し、結果を検証し、ユーザーが何度も指示しなくても前に進める必要があります。&lt;/p&gt;
&lt;p&gt;OpenAI は、GPT-5.5 が Codex のタスクでより少ない token を使うことも強調しています。これは実務上かなり重要です。コーディングエージェントは、ファイルを読み、コマンドを実行し、bug を直し始めると、token 消費がすぐに増えます。同じタスクを少ない手順で完了できれば、実際のコストと待ち時間の両方が下がります。&lt;/p&gt;
&lt;h2 id=&#34;2-コーディング能力が今回の中心的な見せ場&#34;&gt;2. コーディング能力が今回の中心的な見せ場
&lt;/h2&gt;&lt;p&gt;OpenAI は GPT-5.5 を、現時点で最も強力な agentic coding モデルだと説明しています。&lt;/p&gt;
&lt;p&gt;公開されている指標の中で、とくに注目したいものは次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Terminal-Bench 2.0&lt;/code&gt;：GPT-5.5 は &lt;code&gt;82.7%&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SWE-Bench Pro&lt;/code&gt;：GPT-5.5 は &lt;code&gt;58.6%&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;OpenAI 内部の &lt;code&gt;Expert-SWE&lt;/code&gt;：GPT-5.5 は GPT-5.4 を上回る&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらの評価に共通しているのは、単一のアルゴリズム問題よりも、実際の開発フローに近いことです。特に Terminal-Bench のようなタスクでは、コマンドライン操作、計画、試行錯誤、ツール連携、複数ステップの検証が必要になります。&lt;/p&gt;
&lt;p&gt;日常的に開発する人にとって、ここでの意味は明確です。モデルがより大きなタスクを受け止められるかどうかは、長時間コンテキストを保てるか、自分の仮説を検証できるか、いつテストを走らせるべきかを判断できるか、変更がどこに影響するかを理解できるかにかかっています。&lt;/p&gt;
&lt;p&gt;Codex における GPT-5.5 の価値も、主にこうした振る舞いに表れます。コード断片を補完するだけのツールというより、エンジニアリング作業の一部を任せられる協力者に近づいています。&lt;/p&gt;
&lt;h2 id=&#34;3-知識作業が重要な利用シーンになっている&#34;&gt;3. 知識作業が重要な利用シーンになっている
&lt;/h2&gt;&lt;p&gt;コードを書くことに加えて、OpenAI は今回 GPT-5.5 をより広いオフィス作業の文脈にも置いています。&lt;/p&gt;
&lt;p&gt;公式発表では、GPT-5.5 は Codex で文書、スプレッドシート、スライド資料をよりうまく生成でき、業務調査、表計算モデル、ビジネス資料の整理にも向いているとされています。コンピューター操作能力と組み合わせると、その目標は単に助言することではなく、「情報を探す、内容を理解する、ツールを使う、出力を確認する、結果として整理する」という一連の流れに直接参加することです。&lt;/p&gt;
&lt;p&gt;発表ページでは、OpenAI 社内ですでにソフトウェアエンジニアリング、財務、コミュニケーション、マーケティング、データサイエンス、プロダクト管理など、多くの部門で Codex が使われていることにも触れています。ここで注目すべきなのは個別の事例ではなく、OpenAI が Codex を開発者向けツールから汎用的な仕事用ツールへ広げようとしている点です。&lt;/p&gt;
&lt;p&gt;ChatGPT では、GPT-5.5 Thinking が Plus、Pro、Business、Enterprise ユーザー向けに提供されます。GPT-5.5 Pro は、より難しい問題や高い正確性が必要な作業向けで、Pro、Business、Enterprise ユーザーが利用できます。&lt;/p&gt;
&lt;h2 id=&#34;4-研究能力は答えがうまいだけではない&#34;&gt;4. 研究能力は「答えがうまい」だけではない
&lt;/h2&gt;&lt;p&gt;GPT-5.5 は研究支援の面でも大きく紹介されています。&lt;/p&gt;
&lt;p&gt;OpenAI は、遺伝学、定量生物学、バイオインフォマティクス、数学証明などの領域で改善があると述べています。ここで重要なのは、モデルが知識を暗記しているかどうかではなく、より現実の研究に近い問題を扱えるかどうかです。データを読み、異常を見つけ、分析方法を提案し、結果を解釈し、中間結果に基づいてさらに進める必要があります。&lt;/p&gt;
&lt;p&gt;発表ページに登場する &lt;code&gt;GeneBench&lt;/code&gt; と &lt;code&gt;BixBench&lt;/code&gt; は、どちらも多段階の科学分析タスク寄りの評価です。OpenAI はさらに、カスタムハーネスを使った GPT-5.5 の内部版が Ramsey numbers に関する新しい証明の発見を助け、その証明が Lean で検証されたとも述べています。&lt;/p&gt;
&lt;p&gt;こうした事例を「AI がすでに独立して研究できる」と単純に捉えるべきではありません。ただし、モデルが質問応答ツールから研究協力者へ近づいていることは示しています。特に、コード、データ、論文、実験アイデアが混ざる場面では、GPT-5.5 の長い推論とツール利用能力がより重要になります。&lt;/p&gt;
&lt;h2 id=&#34;5-推論効率強くなっても大きく遅くならない&#34;&gt;5. 推論効率：強くなっても大きく遅くならない
&lt;/h2&gt;&lt;p&gt;見落としやすい点として、OpenAI は GPT-5.5 の実運用における per-token latency が GPT-5.4 と同等だと説明しています。&lt;/p&gt;
&lt;p&gt;通常、より大きく強力なモデルは高い遅延を伴います。今回 OpenAI は、推論システムの最適化によって、GPT-5.5 の能力を高めながら速度を維持したと強調しています。発表ページでは、Codex が本番トラフィックのパターンを分析し、負荷分散に関するヒューリスティックアルゴリズムを書いたことで、token 生成速度が &lt;code&gt;20%&lt;/code&gt; 以上向上したとも述べられています。&lt;/p&gt;
&lt;p&gt;この点は興味深いところです。モデルはインフラに提供されるだけでなく、自分自身を提供するインフラの改善にも役立っているからです。&lt;/p&gt;
&lt;h2 id=&#34;6-安全対策はより厳しくなるとくにサイバーセキュリティ領域&#34;&gt;6. 安全対策はより厳しくなる、とくにサイバーセキュリティ領域
&lt;/h2&gt;&lt;p&gt;GPT-5.5 はサイバーセキュリティ能力も強くなっているため、OpenAI は安全制限も同時に強化しています。&lt;/p&gt;
&lt;p&gt;公式説明では、GPT-5.5 はサイバーセキュリティ能力で GPT-5.4 より向上しているため、より厳格な分類器を導入するとされています。特に、高リスク活動、機微なサイバーセキュリティ関連リクエスト、繰り返しの悪用に対して厳しくなります。&lt;/p&gt;
&lt;p&gt;そのため、一部のユーザーはサイバーセキュリティ関連の作業で、より多くの拒否や制限に遭遇する可能性があります。OpenAI は Trusted Access for Cyber も用意しており、検証済みの防御目的のユーザーが不要な制限を受けにくくする仕組みを提供しています。&lt;/p&gt;
&lt;p&gt;一般的な開発者にとっては、合法的なセキュリティ強化、脆弱性修正、コード監査は引き続き支援される一方、高リスクな攻撃フローはより厳しく制御される、と理解すればよさそうです。&lt;/p&gt;
&lt;h2 id=&#34;7-利用可能範囲と-api-価格&#34;&gt;7. 利用可能範囲と API 価格
&lt;/h2&gt;&lt;p&gt;OpenAI の発表ページによると、GPT-5.5 の利用可能範囲は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT：GPT-5.5 Thinking は Plus、Pro、Business、Enterprise ユーザー向け&lt;/li&gt;
&lt;li&gt;ChatGPT：GPT-5.5 Pro は Pro、Business、Enterprise ユーザー向け&lt;/li&gt;
&lt;li&gt;Codex：GPT-5.5 は Plus、Pro、Business、Enterprise、Edu、Go プラン向け&lt;/li&gt;
&lt;li&gt;Codex：コンテキストウィンドウは &lt;code&gt;400K&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Codex Fast mode：生成速度は約 &lt;code&gt;1.5x&lt;/code&gt;、コストは &lt;code&gt;2.5x&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;API については、OpenAI は &lt;code&gt;gpt-5.5&lt;/code&gt; と &lt;code&gt;gpt-5.5-pro&lt;/code&gt; を近く提供するとしています。&lt;/p&gt;
&lt;p&gt;公式に示された API 価格は次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gpt-5.5&lt;/code&gt;：入力 &lt;code&gt;5 米ドル / 1M tokens&lt;/code&gt;、出力 &lt;code&gt;30 米ドル / 1M tokens&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gpt-5.5-pro&lt;/code&gt;：入力 &lt;code&gt;30 米ドル / 1M tokens&lt;/code&gt;、出力 &lt;code&gt;180 米ドル / 1M tokens&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gpt-5.5&lt;/code&gt; API のコンテキストウィンドウは &lt;code&gt;1M&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Batch と Flex は標準 API 価格の半額&lt;/li&gt;
&lt;li&gt;Priority processing は標準価格の &lt;code&gt;2.5x&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この価格は多くの日常用途向けモデルより明らかに高いため、普通の雑談よりも、複雑な工程変更、長文書分析、オフィス自動化、研究支援、重要な業務フローのような高価値タスクに向いています。&lt;/p&gt;
&lt;h2 id=&#34;8-今回の発表をどう見るか&#34;&gt;8. 今回の発表をどう見るか
&lt;/h2&gt;&lt;p&gt;一言で言えば、GPT-5.5 の重点は、OpenAI がモデルを「質問に答えるもの」から「仕事を完了するもの」へさらに進めていることです。&lt;/p&gt;
&lt;p&gt;注目すべきなのは benchmark の点数だけではありません。いくつかの能力が合流し始めています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;より強い長時間タスク維持能力&lt;/li&gt;
&lt;li&gt;より安定したツール利用&lt;/li&gt;
&lt;li&gt;より良いエンジニアリング文脈理解&lt;/li&gt;
&lt;li&gt;文書、スプレッドシート、研究、業務フローへの適性&lt;/li&gt;
&lt;li&gt;より長いコンテキストと高い token 効率&lt;/li&gt;
&lt;li&gt;高リスク能力に対するより厳格な制御&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;開発者にとって最も試す価値があるのは、Codex での複雑なエンジニアリングタスクです。企業ユーザーにとっては、ツール、文書、業務プロセスをまたぐ一部の作業を、実際に納品できる成果物へ変えられるかが重要になります。&lt;/p&gt;
&lt;p&gt;GPT-5.5 は、チャット体験だけを対象にした小さな更新ではありません。OpenAI が「仕事の実行層としての AI」をさらに進める一歩に見えます。&lt;/p&gt;
&lt;h2 id=&#34;関連リンク&#34;&gt;関連リンク
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introducing-gpt-5-5/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Introducing GPT-5.5 - OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>OpenAIがChatGPT Images 2.0を発表、画像生成は「そのまま使える成果物」へ</title>
        <link>https://knightli.com/ja/2026/04/22/openai-chatgpt-images-2-0-deliverable-image-generation/</link>
        <pubDate>Wed, 22 Apr 2026 14:21:45 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/04/22/openai-chatgpt-images-2-0-deliverable-image-generation/</guid>
        <description>&lt;p&gt;OpenAI は 2026 年 4 月 21 日に &lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introducing-chatgpt-images-2-0/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Introducing ChatGPT Images 2.0&lt;/a&gt; を公開しました。発表ページを見る限り、今回のアップデートが伝えたいのは単に「画像がよりきれいになった」ということではありません。より制御しやすく、レイアウトに強く、そのまま使える方向へ画像生成が進んでいる、という点です。&lt;/p&gt;
&lt;p&gt;この発表ページは、従来の技術的な発表というより、高密度な能力デモに近い構成です。モデル構造や学習の詳細、ベンチマークについてはほとんど語られていません。その代わり、多数のサンプルを通じて、ChatGPT の画像生成がこれまで人手で何度も修正していた文字、レイアウト、仕上げの工程までどこまで前倒しできるのかを示しています。&lt;/p&gt;
&lt;h2 id=&#34;01-今回の更新で最もわかりやすいシグナル&#34;&gt;01 今回の更新で最もわかりやすいシグナル
&lt;/h2&gt;&lt;p&gt;発表ページで特に目立つキーワードは、すでに今回の方向性をかなりはっきり示しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Greater precision and control&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Stronger across languages&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Stylistic sophistication and realism&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この 3 つをまとめて見ると、意図はかなり明確です。&lt;/p&gt;
&lt;p&gt;1つ目は、想像力だけでなく制御性を前面に出していることです。ページにはポスター、雑誌レイアウト、販促ページ、インフォグラフィック、キャラクター設定シート、コミックページ、印刷用しおりデザインなどが数多く並んでいます。これらに共通するのは、単に見栄えがよいだけではなく、文字処理、情報の階層、余白、構図、スタイルの統一、出力比率まで同時に扱う必要がある点です。つまり OpenAI は「1枚の画像を作る」から「実際に使えるビジュアル成果物を作る」へと製品の位置づけを進めようとしているように見えます。&lt;/p&gt;
&lt;p&gt;2つ目は、多言語テキストを大きく打ち出していることです。ページには多言語ポスター、書籍カバー、韓国語の宿泊施設プロモーション、日本語マンガ、そして typography を強調した例まであります。これは重要です。画像モデルは、長いテキスト、複雑なレイアウト、英語以外の文字になると急に不安定になることが多かったからです。そこを発表の中心に置いたこと自体が、文字レンダリングや多言語レイアウトが、いまや積極的に見せられる能力になってきたというシグナルです。&lt;/p&gt;
&lt;p&gt;3つ目は、スタイルの幅がかなり広いことです。フォトリアルな写真、レトロコラージュ、Bauhaus風ポスター、ファッションエディトリアル、モノクロのドキュメンタリー調、児童書風イラスト、マンガ、教育用インフォグラフィック、商品グリッド、キャラクター設定シートまで幅広く並んでいます。ここで伝えたいのは「多くの画風を真似できる」という話だけではありません。より多様な実務的ビジュアルタスクに適応しようとしている、ということです。&lt;/p&gt;
&lt;h2 id=&#34;02-なぜそのまま使える成果物へ向かっていると言えるのか&#34;&gt;02 なぜ「そのまま使える成果物」へ向かっていると言えるのか
&lt;/h2&gt;&lt;p&gt;この発表内容を見ると、ChatGPT Images 2.0 は単純に強化された画像生成モデルというより、ビジュアル制作ワークベンチの進化に近い印象です。&lt;/p&gt;
&lt;p&gt;これまでのモデルも見栄えのよい画像は生成できましたが、タスクが次のようなものになると体験が急に崩れやすくなっていました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;見出し、副題、説明文まで入ったポスターを作る&lt;/li&gt;
&lt;li&gt;情報量の多い雑誌ページや販促ページを作る&lt;/li&gt;
&lt;li&gt;キャラクターや物語の連続性が必要なコミックページを作る&lt;/li&gt;
&lt;li&gt;比率、レイアウト、ブランド感が決まった販促素材を作る&lt;/li&gt;
&lt;li&gt;多言語の文字を含む完成度の高いビジュアルを作る&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回の発表は、こうした従来の弱点に正面から応えようとしているように見えます。&lt;/p&gt;
&lt;p&gt;実際にページには、教育用インフォグラフィック、デザイントレンドのポスター、印刷仕様入りのしおり、カフェのオープン告知ポスター、観光プロモーション、グッズのモックアップ、論文ポスターの再構成例などが並んでいます。これらは「ちょっと良い画像」というより、実際の制作フローにおける半完成品、あるいは完成品に近いものです。&lt;/p&gt;
&lt;p&gt;そう考えると、今回の重要点は単に1枚絵の品質が上がったことではなく、コンテンツ制作、ブランド素材、教育用途、軽量なデザイン制作に使える生成システムへ近づいていることだと言えます。&lt;/p&gt;
&lt;h2 id=&#34;03-これは-chatgpt-の製品定位に何を意味するのか&#34;&gt;03 これは ChatGPT の製品定位に何を意味するのか
&lt;/h2&gt;&lt;p&gt;発表ページの見せ方からは、製品としての方向性の変化も読み取れます。&lt;/p&gt;
&lt;p&gt;OpenAI は ChatGPT Images 2.0 を、クリエイター向けの狭い画像モデルとして見せていません。むしろ、調査、推論、資料変換、レイアウト整理、知識伝達、マーケティング出力といった文脈で繰り返し提示しています。数学の証明、デザイントレンド、歴史ノート、学術論文の可視化まで例に含まれているのも象徴的です。&lt;/p&gt;
&lt;p&gt;つまり ChatGPT における画像生成は、単なる「会話に添える画像」や「1枚のイラスト生成」ではなく、より汎用的な表現レイヤーに近づいています。ユーザーが ChatGPT 上で調べ、考え、整理し、文章化したあと、その最終的なビジュアル出力まで一気通貫で扱うことを目指しているように見えます。&lt;/p&gt;
&lt;p&gt;この方向が続くなら、画像生成の競争軸は、単純な審美性や写実性だけではなく、次のような点にますます依存するはずです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複雑な文字をどこまで安定して扱えるか&lt;/li&gt;
&lt;li&gt;ページやコマをまたいだ一貫性を維持できるか&lt;/li&gt;
&lt;li&gt;実務で使う素材に近いレイアウトを作れるか&lt;/li&gt;
&lt;li&gt;調査、執筆、マーケティング、教育といった流れに自然につながるか&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;04-この発表ページで語られていないこと&#34;&gt;04 この発表ページで語られていないこと
&lt;/h2&gt;&lt;p&gt;もちろん、このページの書き方には限界もあります。&lt;/p&gt;
&lt;p&gt;2026 年 4 月 21 日時点の公式ページは、方法よりも結果を見せることに重心があります。具体的には、次のような点は詳しく書かれていません。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前世代比での定量的な改善幅&lt;/li&gt;
&lt;li&gt;文字精度や多言語レンダリングの明確な指標&lt;/li&gt;
&lt;li&gt;複雑なレイアウト生成における失敗境界&lt;/li&gt;
&lt;li&gt;API、価格、利用方法、エンタープライズ向け統合の詳細&lt;/li&gt;
&lt;li&gt;安全ポリシーや生成制限の具体的な更新内容&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そのため、このページは完全な技術仕様というより、製品シグナルとして読むほうが適切です。&lt;/p&gt;
&lt;h2 id=&#34;05-まとめ&#34;&gt;05 まとめ
&lt;/h2&gt;&lt;p&gt;ChatGPT Images 2.0 を一言でまとめるなら、今回の進化は「より上手に描けるようになった」ことより、「より完成品に近いものを作れるようになった」ことにあります。&lt;/p&gt;
&lt;p&gt;OpenAI は画像生成を、発想支援のツールから、実行可能で、レイアウトに強く、伝達力があり、納品に近い制作ツールへ押し進めようとしているように見えます。文字制御、多言語、レイアウト、スタイルの広さ、長いページの構成といった、これまで弱点が出やすかった部分が、今回はむしろ強みとして提示されています。&lt;/p&gt;
&lt;p&gt;もちろん、これでデザイン作業のすべての問題が解決したわけではありません。それでも今回の発表からは、競争の重心が変わりつつあることが見て取れます。これからの差は、最も派手な1枚を出せるかどうかではなく、実際に使えるビジュアルをどれだけ安定して出せるかで決まるのかもしれません。&lt;/p&gt;
&lt;h2 id=&#34;関連リンク&#34;&gt;関連リンク
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introducing-chatgpt-images-2-0/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Introducing ChatGPT Images 2.0 - OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>codex-quota 実践ガイド：コマンドをそのまま使う Local・Web・Docker 運用</title>
        <link>https://knightli.com/ja/2026/04/16/codex-quota-cli-web-docker-guide/</link>
        <pubDate>Thu, 16 Apr 2026 18:13:04 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/04/16/codex-quota-cli-web-docker-guide/</guid>
        <description>&lt;h2 id=&#34;このプロジェクトは何をするか&#34;&gt;このプロジェクトは何をするか
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;codex-quota&lt;/code&gt; は ChatGPT Codex のクォータ使用状況を確認できる軽量ツールで、データ取得元は &lt;code&gt;https://chatgpt.com/backend-api/wham/usage&lt;/code&gt; です。&lt;/p&gt;
&lt;p&gt;主な機能：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;単一アカウント・複数アカウント（&lt;code&gt;account/*.auth.json&lt;/code&gt;）の両方に対応。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;five_hour%&lt;/code&gt;、&lt;code&gt;weekly%&lt;/code&gt;、&lt;code&gt;weekly_reset&lt;/code&gt; を出力し、取得元（&lt;code&gt;network&lt;/code&gt; / &lt;code&gt;cache&lt;/code&gt;）も表示。&lt;/li&gt;
&lt;li&gt;一時的な失敗（&lt;code&gt;408&lt;/code&gt;、&lt;code&gt;429&lt;/code&gt;、&lt;code&gt;5xx&lt;/code&gt;）に対して指数バックオフで再試行。&lt;/li&gt;
&lt;li&gt;ローカルキャッシュを内蔵し、クォータ枯渇時の重複リクエストを削減。&lt;/li&gt;
&lt;li&gt;Web Dashboard、JSON API、auth ファイル管理画面を提供。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;メリット：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;軽量：単体スクリプトで実行でき、依存が少ない。&lt;/li&gt;
&lt;li&gt;実用的：CLI と Web の両方の入口を使える。&lt;/li&gt;
&lt;li&gt;配備しやすい：Docker / Docker Compose をサポート。&lt;/li&gt;
&lt;li&gt;運用しやすい：再試行、キャッシュ、定期更新に対応。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;先にアカウント認証情報を準備する&#34;&gt;先にアカウント認証情報を準備する
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;account/&amp;lt;name&amp;gt;.auth.json&lt;/code&gt; に認証情報ファイルを作成します。例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;tokens&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;access_token&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;eyJ...&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;account_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;user-xxxxxxxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;説明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;access_token&lt;/code&gt; と &lt;code&gt;account_id&lt;/code&gt; は API クエリに必要な項目です。&lt;/li&gt;
&lt;li&gt;ファイル名の &lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt; は出力時のアカウント名として使われます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;local-cli-の使い方元コマンドを維持&#34;&gt;Local CLI の使い方（元コマンドを維持）
&lt;/h2&gt;&lt;p&gt;依存をインストール：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install -r requirements.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;説明：プロジェクトの実行依存をインストールします。&lt;/p&gt;
&lt;p&gt;全アカウントを照会：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python codex_quota.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;説明：&lt;code&gt;account/*.auth.json&lt;/code&gt; を読み込み、全アカウントのクォータを集計表示します。&lt;/p&gt;
&lt;p&gt;単一アカウントを照会：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python codex_quota.py your_account_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;説明：&lt;code&gt;account/your_account_name.auth.json&lt;/code&gt; のみを照会します。&lt;/p&gt;
&lt;p&gt;強制更新（キャッシュ無視）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python codex_quota.py --refresh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;説明：ローカルキャッシュを無視して最新データを直接取得します。&lt;/p&gt;
&lt;h2 id=&#34;cli-オプション説明readme-準拠&#34;&gt;CLI オプション説明（README 準拠）
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;account_name&lt;/code&gt;：任意のアカウント名（&lt;code&gt;.auth.json&lt;/code&gt; なし）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--account-dir&lt;/code&gt;：認証ファイルディレクトリ。デフォルトは &lt;code&gt;account&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--chatgpt-url&lt;/code&gt;：クォータ API エンドポイント。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--raw-json&lt;/code&gt;：JSON レスポンス本文をそのまま表示。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--raw-headers&lt;/code&gt;：レスポンスヘッダーを表示。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--refresh&lt;/code&gt;：キャッシュを無視。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--retries&lt;/code&gt;：再試行回数。デフォルト &lt;code&gt;3&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--retry-delay&lt;/code&gt;：再試行の基本待機秒数。デフォルト &lt;code&gt;2.0&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;web-dashboard-の使い方元コマンドを維持&#34;&gt;Web Dashboard の使い方（元コマンドを維持）
&lt;/h2&gt;&lt;p&gt;サービス起動：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python codex_quota_service.py --host 0.0.0.0 --port &lt;span class=&#34;m&#34;&gt;8081&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;説明：&lt;code&gt;8081&lt;/code&gt; ポートで HTTP サービスを起動します。&lt;/p&gt;
&lt;p&gt;アクセス URL：&lt;code&gt;http://localhost:8081&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Service オプション：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--host&lt;/code&gt;：バインドアドレス。デフォルト &lt;code&gt;0.0.0.0&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--port&lt;/code&gt;：ポート。デフォルト &lt;code&gt;8081&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--interval-seconds&lt;/code&gt;：定期更新間隔。デフォルト &lt;code&gt;3600&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--account-dir&lt;/code&gt;：認証ファイルディレクトリ。デフォルト &lt;code&gt;account&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--state-file&lt;/code&gt;：状態ファイルパス。デフォルト &lt;code&gt;&amp;lt;account-dir&amp;gt;/codex_quota_web_results.json&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--account-name&lt;/code&gt;：任意。単一アカウントモード。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--chatgpt-url&lt;/code&gt;：クォータ API エンドポイント。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--retries&lt;/code&gt;：再試行回数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--retry-delay&lt;/code&gt;：再試行の基本待機。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--refresh&lt;/code&gt;：定期実行時に CLI キャッシュを無視。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;http-エンドポイント自動化向け&#34;&gt;HTTP エンドポイント（自動化向け）
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /&lt;/code&gt;：Dashboard 画面。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/results&lt;/code&gt;：最新結果の JSON。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /refresh&lt;/code&gt;：即時更新して &lt;code&gt;/&lt;/code&gt; にリダイレクト。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /auth&lt;/code&gt;：auth ファイル一覧。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /auth/new&lt;/code&gt;：auth ファイル新規作成フォーム。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /auth/edit?name=&amp;lt;account&amp;gt;&lt;/code&gt;：auth ファイル編集フォーム。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /auth/save&lt;/code&gt;：auth ファイル作成/更新。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /auth/delete&lt;/code&gt;：auth ファイル削除。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;docker-の使い方元コマンドを維持&#34;&gt;Docker の使い方（元コマンドを維持）
&lt;/h2&gt;&lt;p&gt;イメージをビルド：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker build -t codex-quota .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;説明：現在のプロジェクトを &lt;code&gt;codex-quota&lt;/code&gt; イメージとしてビルドします。&lt;/p&gt;
&lt;p&gt;コンテナ起動（8081 をマッピング）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run --rm -p 8081:8081 -v ./account:/app/account codex-quota
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;説明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--rm&lt;/code&gt;：終了後にコンテナを自動削除。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p 8081:8081&lt;/code&gt;：ホストポートをコンテナポートへマッピング。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-v ./account:/app/account&lt;/code&gt;：ローカル認証ディレクトリをコンテナにマウント。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;アクセス URL：&lt;code&gt;http://localhost:8081&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;docker-compose-の使い方元コマンドを維持&#34;&gt;Docker Compose の使い方（元コマンドを維持）
&lt;/h2&gt;&lt;p&gt;起動：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up --build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;説明：&lt;code&gt;docker-compose.yml&lt;/code&gt; に従ってビルド・起動します。&lt;/p&gt;
&lt;p&gt;アクセス URL：&lt;code&gt;http://localhost:8081&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;運用のヒント&#34;&gt;運用のヒント
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;複数アカウント運用では、まず Dashboard で一元管理するのがおすすめです。&lt;/li&gt;
&lt;li&gt;通知や自動連携には &lt;code&gt;GET /api/results&lt;/code&gt; を優先すると扱いやすいです。&lt;/li&gt;
&lt;li&gt;公開リポジトリに実際の &lt;code&gt;access_token&lt;/code&gt; をコミットしないでください。&lt;/li&gt;
&lt;li&gt;一時エラーが多い場合は &lt;code&gt;--retries&lt;/code&gt; と &lt;code&gt;--retry-delay&lt;/code&gt; を増やしてください。&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        <item>
        <title>Codex の利用枠の考え方：5時間制限、週次制限、Credit 消費</title>
        <link>https://knightli.com/ja/2026/04/15/codex-usage-limits-five-hour-weekly-credits/</link>
        <pubDate>Wed, 15 Apr 2026 22:50:00 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/04/15/codex-usage-limits-five-hour-weekly-credits/</guid>
        <description>&lt;p&gt;Codex の利用枠を見ると、最初は &lt;code&gt;5時間制限&lt;/code&gt; が短期の残高で、それを使い切ってから &lt;code&gt;週次制限&lt;/code&gt; が減り始めるように見えます。&lt;/p&gt;
&lt;p&gt;しかし実際は違います。Codex は複数の制限ウィンドウを同時に確認している、と考える方が自然です。短いウィンドウは短時間の大量利用を防ぎ、週次ウィンドウは一週間の総量を制御します。1 回の Codex 利用は通常、その両方に反映されます。&lt;/p&gt;
&lt;p&gt;そのため、次のような状態は一般的には正常です。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;5時間枠はまだ多く残っている
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;しかし weekly 枠はすでに減っている
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;01-まず結論&#34;&gt;01 まず結論
&lt;/h2&gt;&lt;p&gt;Codex の利用枠は、まず次の 3 点で理解できます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;5時間制限&lt;/code&gt; と &lt;code&gt;週次制限&lt;/code&gt; は同時に有効であり、順番に消費されるものではありません。&lt;/li&gt;
&lt;li&gt;週次制限を使い切ると、5時間枠が残っていても同じサブスクリプション枠では通常続けて使えません。&lt;/li&gt;
&lt;li&gt;Codex は単純なメッセージ数ではなく、モデル、tokens、タスクの複雑さ、コンテキスト、実行場所に影響されます。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;疑似コードで書くとこうです。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;can_use_codex =
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    five_hour_remaining &amp;gt; 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;amp;&amp;amp; weekly_remaining &amp;gt; 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;amp;&amp;amp; 他の製品ポリシー制限に触れていない
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;5時間ウィンドウがリセットされても、戻るのは 5時間枠だけです。weekly 枠は戻りません。weekly は自分の reset を待つか、対応プランで追加 credits を購入する必要があります。&lt;/p&gt;
&lt;h2 id=&#34;02-なぜ両方のウィンドウが減るのか&#34;&gt;02 なぜ両方のウィンドウが減るのか
&lt;/h2&gt;&lt;p&gt;Codex の利用枠は 2 つのゲートとして考えるとわかりやすいです。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;ウィンドウ&lt;/th&gt;
          &lt;th&gt;役割&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;5時間ウィンドウ&lt;/td&gt;
          &lt;td&gt;短時間の高頻度利用を防ぐ&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;週次ウィンドウ&lt;/td&gt;
          &lt;td&gt;一週間の総使用量を制御する&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Codex タスクごとに実際の消費が発生し、その消費が関連する rate limit ウィンドウに反映されます。&lt;/p&gt;
&lt;p&gt;つまり、こうではありません。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;先に 5時間枠を使う
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;5時間枠を使い切ったら
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;週次枠を使う
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;より近いのはこうです。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1 回の Codex リクエスト
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=&amp;gt; 5時間ウィンドウに計上
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=&amp;gt; 同時に週次ウィンドウにも計上
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;これが「5時間枠が残っているのに weekly も減る」理由です。&lt;/p&gt;
&lt;h2 id=&#34;03-今は-token-based-credits-を見る&#34;&gt;03 今は token-based credits を見る
&lt;/h2&gt;&lt;p&gt;OpenAI は、ユーザーが完全に再計算できる Codex の課金式を公開していません。公開されているのは rate card、影響要因、モデル別の credit 単価です。&lt;/p&gt;
&lt;p&gt;2026-04-15 時点では、Codex rate card の主な考え方は &lt;code&gt;token-based credits&lt;/code&gt; です。入力 tokens、キャッシュ入力 tokens、出力 tokens から credits に換算されます。&lt;/p&gt;
&lt;p&gt;公式の価格例は次の通りです。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;モデル&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;入力 / 1M tokens&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;キャッシュ入力 / 1M tokens&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;出力 / 1M tokens&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.4&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;62.50 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;6.250 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;375 credits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.4-Mini&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;18.75 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;1.875 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;113 credits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.3-Codex&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;43.75 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;4.375 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;350 credits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.2-Codex&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;43.75 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;4.375 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;350 credits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.1-Codex-Max&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;31.25 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;3.125 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;250 credits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.1-Codex-mini&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;6.25 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;0.625 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;50 credits&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ざっくりした見積もりは次のようになります。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;今回の消費
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;≈ 入力 tokens / 1,000,000 × モデルの入力単価
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+ キャッシュ入力 tokens / 1,000,000 × モデルのキャッシュ入力単価
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+ 出力 tokens / 1,000,000 × モデルの出力単価
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;これは正確な請求式ではありませんが、傾向の説明には十分です。出力は高く、長いコンテキストも高く、高性能モデルほど高くなります。公式 rate card では、&lt;code&gt;Fast mode&lt;/code&gt; は 2 倍の credits を消費し、&lt;code&gt;Code review&lt;/code&gt; は GPT-5.3-Codex の価格を使うとも説明されています。&lt;/p&gt;
&lt;h2 id=&#34;04-メッセージ数だけで見ない&#34;&gt;04 メッセージ数だけで見ない
&lt;/h2&gt;&lt;p&gt;同じ 10 回の Codex メッセージでも、消費量は大きく変わります。&lt;/p&gt;
&lt;p&gt;軽いタスクは通常少なめです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;小さな関数を修正する&lt;/li&gt;
&lt;li&gt;短いコードを説明する&lt;/li&gt;
&lt;li&gt;短い文章を書く&lt;/li&gt;
&lt;li&gt;明確なファイル内で局所的に変更する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;重いタスクは高くなります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大きなコードベースをスキャンする&lt;/li&gt;
&lt;li&gt;長時間 agent を動かす&lt;/li&gt;
&lt;li&gt;読み取り、編集、テスト、修正を何度も繰り返す&lt;/li&gt;
&lt;li&gt;大量のコードや長いレポートを生成する&lt;/li&gt;
&lt;li&gt;cloud task を使う&lt;/li&gt;
&lt;li&gt;fast mode を有効にする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そのため、&lt;code&gt;メッセージ数&lt;/code&gt; はかなり粗い目安にすぎません。実際の消費量を判断するには不十分です。&lt;/p&gt;
&lt;h2 id=&#34;05-local-task-と-cloud-task-の違い&#34;&gt;05 local task と cloud task の違い
&lt;/h2&gt;&lt;p&gt;消費量の差が出やすいのは実行場所です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;local task&lt;/code&gt; は、ローカルのワークスペースでファイルを読み、コードを編集し、コマンドを実行するものです。&lt;code&gt;cloud task&lt;/code&gt; は、タスクをクラウド環境に任せて実行するもので、長く自動化された処理に向いています。&lt;/p&gt;
&lt;p&gt;cloud task は多くの場合、より高くなります。理由は単純です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;クラウド実行環境が必要&lt;/li&gt;
&lt;li&gt;タスクが長くなりやすい&lt;/li&gt;
&lt;li&gt;ツール呼び出しが多い&lt;/li&gt;
&lt;li&gt;コンテキストが大きい&lt;/li&gt;
&lt;li&gt;自動化の流れがより完全&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通常のコード編集、記事整理、小さな修正なら local task の方が節約しやすいです。cloud task は本当にクラウド実行が必要なときに使うのがよいです。&lt;/p&gt;
&lt;h2 id=&#34;06-weekly-が早く減る理由&#34;&gt;06 weekly が早く減る理由
&lt;/h2&gt;&lt;p&gt;5時間枠はあまり減っていないのに weekly が大きく減る場合、よくある理由は次の通りです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;cloud task を使った。&lt;/li&gt;
&lt;li&gt;高いモデルを使った。&lt;/li&gt;
&lt;li&gt;fast mode を有効にした。&lt;/li&gt;
&lt;li&gt;コンテキストが大きく、多くのファイルや長い会話を扱った。&lt;/li&gt;
&lt;li&gt;出力が長かった。大量のコード、長いレポート、ログ分析など。&lt;/li&gt;
&lt;li&gt;タスクチェーンが長かった。検索、編集、テスト、修正、再テストなど。&lt;/li&gt;
&lt;li&gt;自作の利用枠スクリプトがウィンドウ名を誤って解釈した。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;/backend-api/wham/usage&lt;/code&gt; のようなフィールドをスクリプトで読んでいる場合、加工後の &lt;code&gt;five_hour%&lt;/code&gt; や &lt;code&gt;weekly%&lt;/code&gt; だけを信用しない方が安全です。raw JSON で次の値を確認します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;limit_window_seconds&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;percent_left&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reset_at&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;bucket / feature 名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;典型的なウィンドウは次のように判断できます。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;limit_window_seconds = 18000
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=&amp;gt; 約 5 時間
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;limit_window_seconds = 604800
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=&amp;gt; 約 7 日
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;スクリプトが 2 つのウィンドウを逆にラベル付けしていると、利用枠表示は誤解を招きます。&lt;/p&gt;
&lt;h2 id=&#34;07-利用枠を節約する使い方&#34;&gt;07 利用枠を節約する使い方
&lt;/h2&gt;&lt;p&gt;weekly を長持ちさせるには、次のように使います。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;大きなタスクを小さく分ける。&lt;/li&gt;
&lt;li&gt;可能なら local task を優先する。&lt;/li&gt;
&lt;li&gt;関連パスを明確に伝え、不要なスキャンを減らす。&lt;/li&gt;
&lt;li&gt;巨大なログ、長いファイル、無関係なコンテキストを一度に入れない。&lt;/li&gt;
&lt;li&gt;軽い作業には安い mini モデルを使う。&lt;/li&gt;
&lt;li&gt;長い作業の前に、まず計画を出してもらう。&lt;/li&gt;
&lt;li&gt;長いレポートが不要なら、簡潔に答えるよう指定する。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;覚えやすいモデルはこれです。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;続けて使えるか
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;= 短いウィンドウに残量がある
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;amp;&amp;amp; 週次ウィンドウに残量がある
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;消費の速さ
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;= モデル価格
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× tokens
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× 出力の長さ
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× タスクの複雑さ
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× 実行場所
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;これは正確な請求計算ではありませんが、ほとんどの Codex 利用枠の挙動を説明できます。&lt;/p&gt;
&lt;h2 id=&#34;関連リンク&#34;&gt;関連リンク
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11369540-using-codex-with-your-chatgpt-plan&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Using Codex with your ChatGPT plan - OpenAI Help Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11481834&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ChatGPT Rate Card - OpenAI Help Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/zh-hans-cn/articles/20001106-codex-rate-card&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Codex rate card - OpenAI Help Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/12642688-using-credits-for-flexible-usage-in-chatgpt-pluspro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Using Credits for Flexible Usage in ChatGPT - OpenAI Help Center&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Codex クォータ使用統計</title>
        <link>https://knightli.com/ja/2026/04/12/codex-usage-quota-check/</link>
        <pubDate>Sun, 12 Apr 2026 00:01:33 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/04/12/codex-usage-quota-check/</guid>
        <description>&lt;p&gt;現在の Codex アカウントの残高を確認したい場合は、ChatGPT の &lt;code&gt;/backend-api/wham/usage&lt;/code&gt; インターフェイスを要求する小さなスクリプトを直接作成できます。&lt;/p&gt;
&lt;p&gt;このタイプのスクリプトの考え方は非常にシンプルです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;auth.json&lt;/code&gt; から &lt;code&gt;tokens.access_token&lt;/code&gt; および &lt;code&gt;tokens.account_id&lt;/code&gt; を読み取ります&lt;/li&gt;
&lt;li&gt;リクエスト &lt;code&gt;https://chatgpt.com/backend-api/wham/usage&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;リクエストヘッダーに &lt;code&gt;Authorization: Bearer ...&lt;/code&gt; と &lt;code&gt;ChatGPT-Account-Id&lt;/code&gt; を含めます&lt;/li&gt;
&lt;li&gt;返された結果の 5 時間のウィンドウと週ごとのウィンドウ クォータを解析します。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;やるべきことに適した&#34;&gt;やるべきことに適した
&lt;/h2&gt;&lt;p&gt;この方法は、ローカルですばやく確認するのに適しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5 時間の割り当てはどれくらい残っていますか?&lt;/li&gt;
&lt;li&gt;週の割り当てはどれくらい残っていますか?&lt;/li&gt;
&lt;li&gt;クォータはいつリセットされますか?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;複数のアカウントをお持ちの場合は、スクリプトで &lt;code&gt;account/*.auth.json&lt;/code&gt; を一括で読み込み、一律に集計表を出力することもできます。
auth.json ファイルは、現在ログインしている chatgpt アカウントに対応する ~/.codex/ ディレクトリにあります。&lt;/p&gt;
&lt;h2 id=&#34;最も重要なインプット&#34;&gt;最も重要なインプット
&lt;/h2&gt;&lt;p&gt;通常、スクリプトは次の 2 つの資格情報のみに依存します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;access_token&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;account_id&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらは通常、ローカルの &lt;code&gt;auth.json&lt;/code&gt; から入手できます。これら 2 つの値が有効である限り、リクエスト ヘッダーは次のように構成できます。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;Authorization&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Bearer &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;Accept&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;ChatGPT-Account-Id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;Origin&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://chatgpt.com&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;Referer&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://chatgpt.com/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Mozilla/5.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;返された結果の見方&#34;&gt;返された結果の見方
&lt;/h2&gt;&lt;p&gt;インターフェイスが戻った後は、次の 2 種類のウィンドウに焦点が当てられます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;five_hour&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;weekly&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;スクリプトはそれらを次の項目に整理できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;残高の割合&lt;/li&gt;
&lt;li&gt;リセット時間&lt;/li&gt;
&lt;li&gt;対応する時間ウィンドウの長さ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;インターフェイス フィールド名が異なる場合、バリアント &lt;code&gt;primary_window&lt;/code&gt;、&lt;code&gt;secondary_window&lt;/code&gt;、&lt;code&gt;five_hour_limit&lt;/code&gt;、および &lt;code&gt;weekly_limit&lt;/code&gt; とも互換性がある可能性があります。&lt;/p&gt;
&lt;h2 id=&#34;よくある質問&#34;&gt;よくある質問
&lt;/h2&gt;&lt;p&gt;スクリプトが 401 を返した場合、通常、&lt;code&gt;access_token&lt;/code&gt; の有効期限が切れているか、無効であることを意味します。&lt;/p&gt;
&lt;p&gt;403 が返された場合は、通常、現在のアカウントにこのインターフェイスにアクセスする権限がないか、アカウントのステータスが異常であることを意味します。&lt;/p&gt;
&lt;p&gt;同じ応答内でフィールドの名前が一貫していない場合でも驚かないでください。実際の処理では、異なる命名方法を統一的にマッピングしてから出力するのがベストです。&lt;/p&gt;
&lt;h2 id=&#34;参考リンク&#34;&gt;参考リンク
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;codex-auth-manager&lt;/code&gt;：&lt;a class=&#34;link&#34; href=&#34;https://github.com/RioArisk/codex-auth-manager&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/RioArisk/codex-auth-manager&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;コード&#34;&gt;コード
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;  1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 45
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 46
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 47
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 48
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 49
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 50
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 51
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 52
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 53
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 54
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 55
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 56
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 57
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 58
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 59
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 60
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 61
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 62
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 63
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 64
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 65
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 66
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 67
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 68
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 69
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 70
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 71
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 72
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 73
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 74
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 75
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 76
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 77
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 78
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 79
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 80
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 81
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 82
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 83
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 84
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 85
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 86
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 87
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 88
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 89
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 90
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 91
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 92
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 93
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 94
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 95
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 96
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 97
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 98
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 99
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;100
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;101
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;102
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;103
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;104
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;105
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;106
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;107
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;108
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;109
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;110
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;111
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;112
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;113
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;114
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;115
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;116
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;117
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;118
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;119
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;120
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;121
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;122
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;123
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;124
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;125
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;126
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;127
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;128
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;129
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;130
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;131
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;132
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;133
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;134
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;135
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;136
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;137
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;138
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;139
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;140
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;141
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;142
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;143
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;144
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;145
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;146
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;147
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;148
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;149
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;150
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;151
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;152
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;153
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;154
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;155
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;156
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;157
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;158
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;159
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;160
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;161
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;162
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;163
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;164
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;165
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;166
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;167
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;168
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;169
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;170
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;171
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;172
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;173
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;174
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;175
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;176
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;177
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;178
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;179
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;180
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;181
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;182
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;183
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;184
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;185
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;186
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;187
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;188
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;189
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;190
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;191
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;192
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;193
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;194
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;195
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;196
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;197
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;198
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;199
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;200
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;201
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;202
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;203
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;204
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;205
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;206
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;207
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;208
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;209
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;210
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;211
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;212
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;213
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;214
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;215
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;216
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;217
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;218
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;219
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;220
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;221
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;222
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;223
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;224
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;225
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;226
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;227
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;228
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;229
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;230
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;231
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;232
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;233
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;234
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;235
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;236
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;237
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;238
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;239
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;240
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;241
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;242
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;243
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;244
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;245
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;246
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;247
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;248
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;249
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;250
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;251
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;252
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;253
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;254
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;255
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;256
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;257
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;258
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;259
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;260
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;261
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;262
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;263
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;264
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;265
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;266
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;267
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;268
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;269
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;270
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;271
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;272
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;273
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;274
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;275
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;276
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;277
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;278
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;279
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;280
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;281
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;282
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;283
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;284
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;285
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;286
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;287
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;288
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;289
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;290
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;291
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;292
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;293
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;294
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;295
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;296
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;297
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;298
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;299
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;300
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;301
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;302
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;303
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;304
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;305
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;306
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;307
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;308
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;309
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;310
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;311
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;312
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;313
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;314
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;315
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;316
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;317
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;318
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;319
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;320
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;321
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;322
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;323
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;324
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;325
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;326
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;327
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;328
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;329
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;330
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;331
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;332
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;333
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;334
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;335
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;336
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;337
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;338
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;339
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;340
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;341
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;342
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;343
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;344
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;345
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;346
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;347
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;348
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;349
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;350
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;351
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;352
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;353
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;354
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;355
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;356
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;357
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;358
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;359
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;360
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;361
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;362
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;363
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;364
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;365
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;366
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;367
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;368
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;369
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;370
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;371
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;372
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;373
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;374
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;375
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;376
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;377
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;378
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;379
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;380
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;381
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;382
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;383
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;384
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;385
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;386
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;387
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;388
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;389
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;390
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;391
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;392
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;393
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;394
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;395
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;396
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;397
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;398
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;399
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;400
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;401
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;402
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;403
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;404
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;405
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;406
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;407
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;408
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;409
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;410
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;411
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;412
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;413
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;414
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;415
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;416
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;417
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;418
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;419
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;420
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;421
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;422
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;423
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;424
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;425
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;426
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;427
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;428
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;429
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;430
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;431
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;432
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;433
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;434
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;435
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;436
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;437
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;438
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;439
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;440
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;441
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;442
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;443
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;444
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;445
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;446
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;447
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;448
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;449
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;450
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;451
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;452
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;453
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;454
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;455
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;456
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;457
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;458
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;459
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;460
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;argparse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;base64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timedelta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timezone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pathlib&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;typing&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;UTC&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timezone&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;utc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;CST&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timezone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;timedelta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hours&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;CST&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Query ChatGPT Codex usage from /backend-api/wham/usage.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;account_name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;nargs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Account name used to load account/&amp;lt;account_name&amp;gt;.auth.json. If omitted, load all *.auth.json files in account/.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;--account-dir&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Directory containing &amp;lt;account_name&amp;gt;.auth.json files.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;--chatgpt-url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;https://chatgpt.com/backend-api/wham/usage&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ChatGPT usage endpoint.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;--raw-json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;store_true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Print the full JSON response body.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;--raw-headers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;store_true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Print response headers.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dumps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;indent&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ensure_ascii&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;load_auth_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path_str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path_str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path_str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;expanduser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;OSError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDecodeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get_nested_string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;format_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dt&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;astimezone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CST&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strftime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;%Y-%m-&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%d&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; %H:%M:%S %Z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;format_cst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;format_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;epoch_ms_to_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;raw&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;TypeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ValueError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Newer responses sometimes use epoch seconds, older ones use epoch milliseconds.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;timestamp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;11&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fromtimestamp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;timestamp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tz&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UTC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;first_dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;decode_jwt_exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parts&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;=&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;base64&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;urlsafe_b64decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;encode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ascii&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;exp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;exp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exp&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fromtimestamp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tz&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UTC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;ValueError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;TypeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDecodeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get_percent_left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;percent_left&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;remaining_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;used_percent&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;used_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;used_percent&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;used_percent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;TypeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ValueError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;resolve_limit_window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_at&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_time_ms&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;primary_window&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;primary_window&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;parse_limit_entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resolve_limit_window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_percent_left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;reset_time_ms&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_time_ms&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;reset_time_ms&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;reset_time_ms&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;limit_window_seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;percent_left&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_time_ms&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;reset_time_ms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;epoch_ms_to_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reset_time_ms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;limit_window_seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;infer_limit_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3600&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3600&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;relabel_rate_limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;tuple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;inferred_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;infer_limit_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;limit_window_seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inferred_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inferred_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;parse_rate_limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;tuple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary_key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour_limit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour_rate_limit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;primary&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary_key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_limit_entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;primary_key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary_key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_limit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_rate_limit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;secondary&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary_key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_limit_entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;secondary_key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_limit_entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;primary_window&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_limit_entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;secondary_window&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;relabel_rate_limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;format_percent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;percent_sort_value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;descending&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;bool&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;tuple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;numeric_value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numeric_value&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;descending&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;numeric_value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get_auth_paths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;base_dir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;base_dir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.auth.json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;sorted&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;base_dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;glob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*.auth.json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get_account_name_from_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;suffix&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;.auth.json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;suffix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;endswith&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;suffix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;build_summary_row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;five_hour&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;five_hour&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;percent_left&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;five_hour&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;percent_left&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;print_summary_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;sorted_rows&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;sorted&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;percent_sort_value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;descending&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;percent_sort_value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;descending&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;format_cst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;display_rows&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sorted_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;display_rows&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;format_percent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;format_percent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;format_cst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour%&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly%&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]),&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;display_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;account&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;account&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;five_hour&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;five_hour&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly_reset&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly_reset&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;display_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;account&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;account&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;five_hour&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;five_hour&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly_reset&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly_reset&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;validate_token_inputs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;startswith&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sess-&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;status: invalid_token_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;s2&#34;&gt;&amp;#34;message: --chatgpt-token looks like a session token (sess-...). Use the JWT access_token instead.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;hint: Found tokens.access_token in auth.json; omit --chatgpt-token or pass that value instead.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;token_exp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;decode_jwt_exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token_exp&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token_exp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UTC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;status: expired&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;message: access_token expired at &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;token_exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;auth_token_exp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;decode_jwt_exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;hint&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;format_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_token_exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_token_exp&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;unknown time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;hint: auth.json contains a different access_token expiring at &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hint&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;account_id&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;warning: supplied --account-id does not match auth.json tokens.account_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;handle_error_response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;bool&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;401&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;status: expired&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;message: Token 已过期或无效&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;403&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;status: forbidden&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;message: 账号已被封禁或无权访问&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;400&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;HTTP &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;fetch_chatgpt_usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;tuple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;load_auth_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_account_name_from_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_nested_string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;tokens&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;access_token&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_nested_string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;tokens&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;account_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: auth file not found or invalid&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: missing access_token&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: missing account_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;validation_error&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;validate_token_inputs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;validation_error&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;validation_error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;Authorization&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Bearer &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;Accept&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;ChatGPT-Account-Id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;Origin&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://chatgpt.com&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;Referer&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://chatgpt.com/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Mozilla/5.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;chatgpt_url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timeout&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;60&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RequestException&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Request failed: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exc&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raw_headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;=== Headers ===&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ValueError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;HTTP &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;error_response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;handle_error_response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error_response&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error_response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;=== Raw JSON ===&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;rate_limits&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;first_dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;rate_limit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;rate_limits&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rate_limits&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;build_summary_row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;five_hour&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_rate_limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rate_limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;build_summary_row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;five_hour&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_paths&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_auth_paths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_paths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;No auth files found.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;exit_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;summary_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_path&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_paths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;current_exit_code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;summary_row&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fetch_chatgpt_usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;exit_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit_code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current_exit_code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;summary_row&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;summary_rows&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;summary_row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;summary_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;print_summary_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;summary_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit_code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;vm&#34;&gt;__name__&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
        </item>
        
    </channel>
</rss>
