<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Akira</title>
    <description>The latest articles on DEV Community by Akira (@aakira).</description>
    <link>https://dev.to/aakira</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3816151%2Fbb126af7-07b9-4483-91c4-7f4ccabb61f5.png</url>
      <title>DEV Community: Akira</title>
      <link>https://dev.to/aakira</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aakira"/>
    <language>en</language>
    <item>
      <title>ジョブサーチ自動化：オープンソースAI活用術【転職成功ガイド】</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Tue, 07 Apr 2026 09:59:00 +0000</pubDate>
      <link>https://dev.to/aakira/ziyobusatizi-dong-hua-opunsosuaihuo-yong-shu-zhuan-zhi-cheng-gong-gaido-4cl3</link>
      <guid>https://dev.to/aakira/ziyobusatizi-dong-hua-opunsosuaihuo-yong-shu-zhuan-zhi-cheng-gong-gaido-4cl3</guid>
      <description>&lt;h2&gt;
  
  
  要約
&lt;/h2&gt;

&lt;p&gt;Career-Opsは、Claude Codeを本格的な就職活動コマンドセンターに変える、無料でオープンソースのボイラープレートです。A-Fスコアリングで求人を評価し、各求人情報に合わせてATSに最適化された履歴書を生成し、45以上の企業ポータルを自動的にスキャンし、すべての情報をターミナルダッシュボードで追跡します。作成者はこれを使用して740以上の求人を評価し、Head of Applied AIの役職を獲得しました。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidogを今すぐ試してみましょう&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  はじめに
&lt;/h2&gt;

&lt;p&gt;多くの開発者は求人応募をスプレッドシートで管理しています。新しいタブを開き、求人情報を貼り付け、キーワードを確認し、「応募済み、結果待ち」で行を更新…。これを50回以上繰り返すと、まるで別の仕事のように感じます。&lt;/p&gt;

&lt;p&gt;Career-Opsはこのモデルを逆転します。評価や書式設定、進捗管理の作業をあなたの代わりにClaude Codeが担当します。あなたはURLや求人情報を貼り付けるだけ。システムが履歴書を読み込み、適合性を判断し、10の側面で求人を採点、カスタマイズされたPDFを生成し、結果を記録します。応募の決定だけが、あなたの役割です。&lt;/p&gt;

&lt;p&gt;このシステムは手当たり次第に応募するボットではありません。フィルター哲学に基づき、数百の求人から価値のある案件だけを抽出し、4.0/5未満はすべて除外します。作者自身もCareer-Opsで740以上の求人を評価し、100超のカスタム履歴書を生成し、Head of Applied AIに就任しました。このプロジェクトは1週間でGitHub 11.9kスターを獲得しています。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;パイプラインテストやAPIの信頼性確保が必要な場合は、&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidogのテストシナリオ&lt;/a&gt;を活用してください。Career-Opsが求人APIに送るHTTPリクエストを本番前にすべて検証できます。詳しくは[internal: api-testing-tutorial]をご参照ください。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Career-Opsが実際にすること
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/santifer/career-ops" rel="noopener noreferrer"&gt;Career-Ops&lt;/a&gt;はスタンドアロンアプリではなく、Claude Code用のボイラープレートです。リポジトリをクローンし、履歴書をマークダウンファイルで追加し、プロファイルYAMLを編集、そのディレクトリでClaude Codeを起動します。以降はスラッシュコマンド一つでパイプライン全体を実行可能です。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwuln89ymw48c4v042moe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwuln89ymw48c4v042moe.png" alt="Career-Opsのコアワークフロー図"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  コアワークフロー
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;求人URLまたは説明を貼り付け
        |
        v
アーキタイプ検出
(LLMOps / Agentic / PM / SA / FDE / Transformation)
        |
        v
A-F評価エンジン
(cv.mdを読み込み、10の側面を採点)
        |
   +----+----+
   v    v    v
レポート  PDF  トラッカー
 .md   .pdf  .tsv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;すべてがAIランタイムとしてClaude Codeを介して実行されます。システムは実際に使っているファイルを直接読み込むので、Claude側からモードや重み、スクリプトをカスタマイズできます。&lt;/p&gt;

&lt;h2&gt;
  
  
  14のスラッシュコマンド
&lt;/h2&gt;

&lt;p&gt;Career-Opsは、単一のエントリーポイント &lt;code&gt;/career-ops&lt;/code&gt; から14のモードを持っています。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;/career-ops                 → すべてのコマンドを表示
/career-ops {求人情報JDを貼り付け}    → 完全パイプライン：評価 + PDF + トラッカー
/career-ops scan            → 45以上の企業ポータルをスキャンし新しい求人を探索
/career-ops pdf             → 求人リストに合わせたATS最適化履歴書生成
/career-ops batch           → 複数（10件以上）の求人を並列評価
/career-ops tracker         → 応募パイプラインの進捗表示
/career-ops apply           → AIで応募フォームを入力
/career-ops pipeline        → 待機中URLキューの一括処理
/career-ops contacto        → LinkedIn連絡メッセージ自動作成
/career-ops deep            → ターゲット企業の詳細調査
/career-ops training        → コースや認定資格を評価
/career-ops project         → ポートフォリオプロジェクトを評価
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;特に自動パイプラインがよく使われます。任意の求人URLまたは説明テキストを貼り付けるだけで、モード指定不要で完全評価が実施されます。&lt;/p&gt;

&lt;h2&gt;
  
  
  A-Fスコアリングエンジンの仕組み
&lt;/h2&gt;

&lt;p&gt;Career-Opsの中核はA-Fスコアリングエンジンです。全求人を6つの構造化ブロックで評価します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A: 職務概要&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
タイトル、チーム、経験レベル、必須スキル抽出。アーキタイプ分類で適切な評価基準を適用。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;B: 履歴書の一致度&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
キーワード数でなく、あなたの履歴・経験と求人情報を直接比較。スキルギャップや強みを特定し、不適格要因もフラグ。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;C: 職務レベル・報酬戦略&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
報酬ベンチマークを調査し、交渉の論拠を構築。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;D: パーソナライズ&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
企業が何を作っているか、あなたの経験がどこにマッチするかで、具体的なカバーレターやアプローチ角度を生成。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;E: 評価スコア (A-F)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
上記を統合し最終スコアを出力。4.0/5未満は応募非推奨。時間の無駄な応募を減らします。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;F: 面接準備 (STAR+R)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
STARフレームワークで履歴書からストーリーを自動生成し、Reflection列で経験レベルを示します。ストーリーは&lt;code&gt;story-bank.md&lt;/code&gt;に蓄積され再利用可能です。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;さらに給与交渉スクリプトも自動生成（給与アンカー、地理的要素への反論、競合オファー活用等）。&lt;/p&gt;

&lt;h2&gt;
  
  
  ATSに最適化されたPDF生成
&lt;/h2&gt;

&lt;p&gt;Career-OpsのPDFジェネレーターは、各求人ごとにATS最適化された履歴書を生成します。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;求人内容からATSがスキャンする主要要件とキーワードを抽出&lt;/li&gt;
&lt;li&gt;経験箇条書きをそれらキーワード中心にリライト（虚偽記載なし）&lt;/li&gt;
&lt;li&gt;Space Grotesk/DM SansフォントHTMLテンプレートを用い、Playwright/PuppeteerでPDF化&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ATSも人間も読みやすい履歴書が作成できます。MITライセンスでテンプレートは自由にカスタマイズ可能です。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 求人リストに合わせた履歴書をPDF出力&lt;/span&gt;
/career-ops pdf

&lt;span class="c"&gt;# または完全パイプラインで&lt;/span&gt;
/career-ops &lt;span class="o"&gt;{&lt;/span&gt;求人URLまたは説明を貼り付け&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;出力は&lt;code&gt;output/&lt;/code&gt;ディレクトリに保存。デフォルトでgit管理外なので個人データはローカルに保持されます。&lt;/p&gt;

&lt;h2&gt;
  
  
  大規模なポータルスキャン
&lt;/h2&gt;

&lt;p&gt;Career-Opsには45以上の企業がスキャン対象としてプリセットされています。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AIラボ:&lt;/strong&gt; Anthropic, OpenAI, Mistral, Cohere, LangChain, Pinecone&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;音声AI:&lt;/strong&gt; ElevenLabs, PolyAI, Parloa, Hume AI, Deepgram, Vapi, Bland AI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AIプラットフォーム:&lt;/strong&gt; Retool, Airtable, Vercel, Temporal, Glean, Arize AI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLMOps:&lt;/strong&gt; Langfuse, Weights &amp;amp; Biases, Lindy, Cognigy, Speechmatics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;エンタープライズ:&lt;/strong&gt; Salesforce, Twilio, Gong, Dialpad&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;自動化:&lt;/strong&gt; n8n, Zapier, Make.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ヨーロッパ (DACH):&lt;/strong&gt; Factorial, Attio, Tinybird, Clarity AI, Travelperk + 31のDACH企業（コミュニティ追加）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Playwrightで採用ページをクロールし、Greenhouse/Ashby/Lever/Wellfound APIも直接クエリ。&lt;code&gt;portals.yml&lt;/code&gt;でターゲット企業セットし、&lt;code&gt;/career-ops scan&lt;/code&gt;で自動追加。&lt;/p&gt;

&lt;h2&gt;
  
  
  並列サブエージェントによるバッチ処理
&lt;/h2&gt;

&lt;p&gt;大量の求人URLもバッチモードで並列評価できます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# jds/ディレクトリにURLを配置後&lt;/span&gt;
/career-ops batch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;内部的には&lt;code&gt;claude -p&lt;/code&gt;ワーカーが並列実行され、各求人を独立評価。重複除去やトラッカーマージも自動化。失敗時には&lt;code&gt;batch/batch-runner.sh&lt;/code&gt;でリトライ処理も可能。&lt;/p&gt;

&lt;p&gt;20件以上の求人評価も、手動なら丸一日かかる作業が1時間以内に完了します。&lt;/p&gt;

&lt;h2&gt;
  
  
  Go TUIダッシュボード
&lt;/h2&gt;

&lt;p&gt;応募パイプラインは&lt;code&gt;data/applications.md&lt;/code&gt;にマークダウンテーブルで保存。ターミナルダッシュボード（Go/Bubble Tea/Catppuccin Mochaテーマ）が視覚的進捗管理を提供します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;dashboard
go build &lt;span class="nt"&gt;-o&lt;/span&gt; career-dashboard &lt;span class="nb"&gt;.&lt;/span&gt;
./career-dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;6つのフィルタータブ（ステータス・アーキタイプ・スコア等）&lt;/li&gt;
&lt;li&gt;4つのソートモード&lt;/li&gt;
&lt;li&gt;グループ/フラットビュー&lt;/li&gt;
&lt;li&gt;レポートプレビュー遅延ロード&lt;/li&gt;
&lt;li&gt;インラインで応募ステータス編集
マークダウン直編集不要でTUIから直接操作できます。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  15分でセットアップ
&lt;/h2&gt;

&lt;p&gt;セットアップ手順は以下の通りです。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. クローンと依存インストール&lt;/span&gt;
git clone https://github.com/santifer/career-ops.git
&lt;span class="nb"&gt;cd &lt;/span&gt;career-ops &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install
&lt;/span&gt;npx playwright &lt;span class="nb"&gt;install &lt;/span&gt;chromium

&lt;span class="c"&gt;# 2. プロファイル設定&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;config/profile.example.yml config/profile.yml
&lt;span class="c"&gt;# profile.ymlを編集（氏名・場所・職種・給与・希望など）&lt;/span&gt;

&lt;span class="c"&gt;# 3. ターゲット企業設定&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;templates/portals.example.yml portals.yml
&lt;span class="c"&gt;# 企業リストを編集&lt;/span&gt;

&lt;span class="c"&gt;# 4. 履歴書追加&lt;/span&gt;
&lt;span class="c"&gt;# プロジェクト直下にcv.mdを作成&lt;/span&gt;
&lt;span class="c"&gt;# 履歴書をマークダウンで記載&lt;/span&gt;

&lt;span class="c"&gt;# 5. Claude Code起動&lt;/span&gt;
claude
&lt;span class="c"&gt;# Claudeに以下のように指示可能&lt;/span&gt;
&lt;span class="c"&gt;# 「アーキタイプをバックエンドエンジニアリング職に変更」&lt;/span&gt;
&lt;span class="c"&gt;# 「5社をportals.ymlに追加」&lt;/span&gt;
&lt;span class="c"&gt;# 「この履歴書でプロファイルを更新」&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude側からモードやスコア重み、交渉スクリプトのカスタマイズも可能です。&lt;/p&gt;

&lt;h2&gt;
  
  
  自動更新システム
&lt;/h2&gt;

&lt;p&gt;v1.1.0からは、システムファイル（自動更新されるスコアリングルール等）とユーザーファイル（プロファイル・履歴書等）を分離。ユーザーデータを保護しながらシステム層のみ更新可能です。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 更新確認（セッション開始時に自動実行）&lt;/span&gt;
node update-system.mjs check

&lt;span class="c"&gt;# 更新適用&lt;/span&gt;
node update-system.mjs apply

&lt;span class="c"&gt;# 問題発生時のロールバック&lt;/span&gt;
node update-system.mjs rollback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;更新前にはバックアップブランチが生成され、ユーザーファイルの非変更も検証されます。&lt;/p&gt;

&lt;h2&gt;
  
  
  Career-Opsが他の求職ツールと異なる点
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;意思決定システム&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
単なる応募ボットや履歴書自動書き換えツールではなく、A-Fスコアリングにより「応募しない」判断も重視します（4.0/5未満は応募しない設計）。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;キーワードマッチングでなく適合性重視&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
キーワード数でなく、履歴書と求人の意味的な一致に基づき評価。例えば「Python経験5年」と求人にあっても、あなたが3年でも実績次第で高評価となることも。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;コンテキストが多いほど精度向上&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Claudeは初期状態ではあなたを知らないため、プロフィールやキャリアストーリーを追加するほど判定精度が向上します。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;すべてローカル保存&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
履歴書・応募情報・PDF類はデフォルトでgit管理外&amp;amp;ローカル保存。ClaudeがAPI評価・検索以外で外部送信することはありません。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  知っておくべき制限事項
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Claude Code必須&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Career-OpsはClaude Code専用ボイラープレート。他モデルやUIでは動作不可。Anthropicアカウントが必要です。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Playwrightの一部不安定性&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
企業の採用ページHTML変化で、Playwrightスキャナーが一部ポータルで動作しなくなる場合あり。標準API採用企業では安定。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;初期評価の精度は要調整&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
最初は大まかな評価となります。プロファイルや実績を十分入力した上でスコアを活用してください。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;バッチモードはAPIクレジット消費大&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;claude -p&lt;/code&gt;並列ワーカーはバッチで大量API消費するため、最初の大規模バッチ前に使用状況を確認しましょう。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AIエージェントのキャリブレーションについては[internal: how-ai-agent-memory-works]を参照してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  対象者
&lt;/h2&gt;

&lt;p&gt;Career-Opsは以下に該当する開発者・技術専門職向けです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;積極的に転職活動中で、手動管理に疲れた人&lt;/li&gt;
&lt;li&gt;AI企業での職務を志望する人（ポータルリストもAI寄り）&lt;/li&gt;
&lt;li&gt;大量応募ボットでなく、評価・意思決定支援にAIを使いたい人&lt;/li&gt;
&lt;li&gt;CLIツール・YAML編集に抵抗のない人&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GUI希望の非技術ユーザーや、自動応募提出を望む方には不向きです。応募の最終判断・提出は必ず手動となります。&lt;/p&gt;

&lt;h2&gt;
  
  
  始め方
&lt;/h2&gt;

&lt;p&gt;リポジトリをクローンし、履歴書を追加し、Claudeでプロファイルを構成。1時間程度で本当に興味ある職務に対し最初の評価を実施できます。調整作業はすぐに成果をもたらします。&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/santifer/career-ops" rel="noopener noreferrer"&gt;https://github.com/santifer/career-ops&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;本プロジェクトはMITライセンスです。コミュニティからの貢献も歓迎。PR前には必ずIssueを作成してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  結論
&lt;/h2&gt;

&lt;p&gt;Career-Opsは現時点で最も包括的なオープンソース求職パイプラインです。A-Fスコアリング、ATS最適化PDF、並列バッチ処理、Go TUIダッシュボードの各機能は単体でも有用。プロファイルを厳密に調整することで、意味ある求人だけに絞って応募するワークフローが構築できます。&lt;/p&gt;

&lt;p&gt;求職活動は「量」ではなく「情報」の問題。Career-Opsはその本質を実装するツールです。&lt;/p&gt;

&lt;h2&gt;
  
  
  よくある質問
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: Career-Opsは有料ですか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ツールは無料(MITライセンス)です。Claude APIの利用料金のみ必要。完全な評価（評価＋PDF＋トラッカー）は10,000～30,000トークン程度（Claude 3.5 Haikuの場合1回0.05ドル未満）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Claude以外のモデルは使えますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
直接は不可。Claude Code用に設計されているため。他モデルに移植するにはスキル定義等を書き換える必要あり。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: ATS最適化はどのように機能していますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
求人情報から必須スキル・キーワード抽出し、経験箇条書きを自然にリライトしPDF化。HTMLテンプレートはSpace Grotesk・DM SansフォントでATS対応済み。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: サポートしている求人掲示板は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Greenhouse、Ashby、Lever、Wellfound、Workable、RemoteFrontを直接サポート。その他はPlaywrightでカスタムページをクロール。DACH/ヨーロッパ企業も31件追加済み。APIサーフェスの扱い詳細は[internal: local-vs-api-ai-models]参照。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: 履歴書データの安全性は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
全ファイルはローカルかつgit管理外。ClaudeのAPI呼び出し（Anthropic標準）以外は外部送信なし。データ処理詳細は[internal: claude-code]参照。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: 独自の企業をポータルスキャナーに追加できますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
可能です。&lt;code&gt;templates/portals.example.yml&lt;/code&gt;を&lt;code&gt;portals.yml&lt;/code&gt;にコピーし、任意の企業を追加。Greenhouse/Ashby/Lever採用企業は自動認識、カスタムページはPlaywrightセレクターで設定可能。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: 完全な評価にかかる時間は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
PDF生成含む単一評価は通常2〜4分（Claude 3.5 Sonnet）。バッチモード並列化で10件でもほぼ同時間。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: STAR+Rフレームワークとは？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
STAR（Situation, Task, Action, Result）にReflection（反省）を加えたもの。経験を単に説明するだけでなく、そこからの学びや変化も示せるため、経験豊富な候補者像を強調できます。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>2026年 おすすめ オープンソース コーディングアシスタント：無料のCursor代替案</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Tue, 07 Apr 2026 09:53:50 +0000</pubDate>
      <link>https://dev.to/aakira/2026nian-osusume-opunsosu-kodeinguasisutantowu-liao-nocursordai-ti-an-34gj</link>
      <guid>https://dev.to/aakira/2026nian-osusume-opunsosu-kodeinguasisutantowu-liao-nocursordai-ti-an-34gj</guid>
      <description>&lt;h2&gt;
  
  
  要点
&lt;/h2&gt;

&lt;p&gt;Cursorは月額20ドル、Windsurfは月額15ドルですが、現在はエージェント型コーディングや複数ファイル編集、モデルの自由な選択などの約80％の機能を無料で提供するオープンソース代替ツールが5つ登場しています。本ガイドでは、それぞれの最適なツールの実用面、得意領域、そして選び方を解説します。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;今すぐApidogを試してみよう&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  はじめに
&lt;/h2&gt;

&lt;p&gt;1年前までは「オープンソースのコーディングアシスタント」といえば、コード補完のみのプラグインが主流でした。しかし今では、コードベースの解析、テスト生成、ターミナルコマンドの自動実行、反復処理も可能なエージェント型コーディング環境にまで進化しています。&lt;/p&gt;

&lt;p&gt;有料ツールと無料オープンソースの間の機能差もほとんどなくなりました。Cursorはエージェント型コーディングの代表格ですが、1人月額20ドルはチーム運用にはコスト高です。Windsurf（月額15ドル）やGitHub Copilot（月額10ドル）もありますが、いずれもプロプライエタリで監査やセルフホスト不可、モデル選択も制限されます。&lt;/p&gt;

&lt;p&gt;本記事で紹介するオープンソースツールは、モデルを自由に選べ、完全に監査・セルフホストでき、無料で利用可能です。セットアップやUXの面で多少の手間はありますが、導入の価値は十分です。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;注意:&lt;/strong&gt; これらのツールはAI生成コードが呼び出すAPIのテストまではカバーしません。API統合テストには&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;が最適です。RESTクライアントやOpenAPI仕様のエンドポイント生成後、Apidogのテストシナリオで本番前に検証できます。詳しいAPIテストワークフローは[internal: api-testing-tutorial]を参照してください。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2026年にオープンソースコーディングアシスタントが現実的になった理由
&lt;/h2&gt;

&lt;p&gt;ポイントは3つあります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;モデルへのアクセス:&lt;/strong&gt; OpenAI・Anthropic・GoogleなどのAPI経由で最新モデルが使えるようになり、Continue.devやClineなどのOSSツールでもClaude 3.5 SonnetやGPT-4o、Gemini 1.5 Proを直接利用可能です。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ローカルモデル:&lt;/strong&gt; Ollamaの登場でQwen2.5-CoderやDeepSeek-Coder-V2、Code Llamaといった大規模モデルもローカルで手軽に動かせるようになりました。機密コードも外部流出せずAIの恩恵を受けられます。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;エージェントアーキテクチャ:&lt;/strong&gt; ClaudeのツールAPIやGPT-4oの関数呼び出しにより、ファイル操作・ターミナル実行のループをOSSでも再現できるようになりました。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  最高のオープンソースコーディングアシスタント5選
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Continue.dev
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;概要:&lt;/strong&gt; VS CodeおよびJetBrains向け拡張機能で、チャットサイドバー・インライン編集・コードQ&amp;amp;Aなどが使えます。最も成熟した&lt;a href="https://github.com/continuedev/continue" rel="noopener noreferrer"&gt;オープンソースプロジェクト&lt;/a&gt;です。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnub0gbftgsmggqyy4qzm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnub0gbftgsmggqyy4qzm.png" alt="Continue.dev VS Code拡張機能のスクリーンショット" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;最適なユーザー:&lt;/strong&gt; VS Codeから離れずにCursor的な機能を無料で使いたい開発者と、モデル選択を自分でコントロールしたいチーム。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;セットアップ手順:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;VS CodeマーケットプレイスからContinue.devをインストール&lt;/li&gt;
&lt;li&gt;OpenAI, Anthropic, Gemini, またはOllamaなど任意モデルのAPIキーを追加&lt;/li&gt;
&lt;li&gt;アカウント作成不要ですぐ利用可能&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;主な機能:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;コードベース全体のインデックス＋コンテキスト認識型チャット&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ctrl+I&lt;/code&gt;によるインライン編集&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@codebase&lt;/code&gt;でリポジトリ横断検索&lt;/li&gt;
&lt;li&gt;カスタムスラッシュコマンド／コンテキストプロバイダ&lt;/li&gt;
&lt;li&gt;20以上のLLMプロバイダ対応&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;制限:&lt;/strong&gt; ターミナル実行や自律エージェントループは非対応。全変更は手動承認が必要。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;費用:&lt;/strong&gt; 無料（APIキーは自前で用意）&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Cursor&lt;/th&gt;
&lt;th&gt;Continue.dev&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;価格&lt;/td&gt;
&lt;td&gt;月20ドル&lt;/td&gt;
&lt;td&gt;無料&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VS Code対応&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JetBrains対応&lt;/td&gt;
&lt;td&gt;×&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;td&gt;完全&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;/tr&gt;
&lt;tr&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;/div&gt;




&lt;h3&gt;
  
  
  2. Aider
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;概要:&lt;/strong&gt; ターミナルでGitを直接操作する自律型コーディングエージェント。&lt;a href="http://apidog.com/blog/aider-ai/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Aiderの解説&lt;/a&gt;をどうぞ。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kbw9saep1ohti5vp3ld.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kbw9saep1ohti5vp3ld.png" alt="Aiderのスクリーンショット" width="800" height="651"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;最適なユーザー:&lt;/strong&gt; ターミナル派・バックエンドエンジニア向け。CIやリモートサーバー自動化にも最適。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;セットアップ手順:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;pip install aider-chat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;プロジェクトルートで &lt;code&gt;aider --model claude-3-5-sonnet-20241022&lt;/code&gt; を実行&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;主な機能:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gitコミットベースの複数ファイル自動編集&lt;/li&gt;
&lt;li&gt;Claude/GPT-4o/Gemini/ローカルモデル対応&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--yes&lt;/code&gt;で全変更自動承認&lt;/li&gt;
&lt;li&gt;リポジトリマップ読込によるコード構造理解&lt;/li&gt;
&lt;li&gt;音声入力対応&lt;/li&gt;
&lt;li&gt;組み込みベンチマーク機能（aider-bench）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;制限:&lt;/strong&gt; ターミナル専用。IDE連携・視覚的な差分確認なし。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;費用:&lt;/strong&gt; 無料（モデルAPIは従量課金）&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;実践例:&lt;/strong&gt;&lt;br&gt;
GitHub Actionsで失敗したテストを自動修正する:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Aider to fix tests&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;aider --model gpt-4o \&lt;/span&gt;
          &lt;span class="s"&gt;--message "Fix the failing tests in test_api.py" \&lt;/span&gt;
          &lt;span class="s"&gt;--yes \&lt;/span&gt;
          &lt;span class="s"&gt;--no-git&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Cline
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;概要:&lt;/strong&gt; VS Code拡張で、ファイル読書き・ターミナルコマンド・ウェブ閲覧・ブラウザ操作まで自律的に実行するエージェント。&lt;a href="http://apidog.com/blog/what-is-cline/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Clineの詳細&lt;/a&gt;で解説しています。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmnd03117g9cnqchczkq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmnd03117g9cnqchczkq.png" alt="Cline VS Code拡張機能のスクリーンショット" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;最適なユーザー:&lt;/strong&gt; VS Code内で複数手順の自律コーディングを完結させたい方。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;セットアップ手順:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;VS Code Marketplaceからインストール&lt;/li&gt;
&lt;li&gt;任意モデルのAPIキーを追加&lt;/li&gt;
&lt;li&gt;新規タスク開始で即利用&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;主な機能:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;読み込み／書き込み／実行／閲覧まで一貫のエージェントループ&lt;/li&gt;
&lt;li&gt;各アクションの承認（自動or手動）切替&lt;/li&gt;
&lt;li&gt;Claude、GPT-4o、Gemini、Bedrock、Vertex、Ollamaなど多様なモデル&lt;/li&gt;
&lt;li&gt;タスクごとのコスト追跡&lt;/li&gt;
&lt;li&gt;カスタムプロンプト注入&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;制限:&lt;/strong&gt; 長時間タスク＋高価なモデル利用時はコスト増に注意。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;費用:&lt;/strong&gt; 無料（モデルAPIは直払い）&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Modo
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;概要:&lt;/strong&gt; 2026年4月登場の新規OSSプロジェクト。VS CodeベースのAIファーストIDE。Cursor・Kiro・Windsurfの代替狙い。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;最適なユーザー:&lt;/strong&gt; サブスク不要のAI専用IDEが欲しい方。VS Code Marketplace未掲載のため手動導入が必要。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;セットアップ手順:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;GitHubからクローン（github.com/mohshomis/modo）&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm install &amp;amp;&amp;amp; npm run build&lt;/code&gt;でビルド&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;主な機能:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VS Code拡張との互換性&lt;/li&gt;
&lt;li&gt;AIチャット・インライン補完標準搭載&lt;/li&gt;
&lt;li&gt;モデルフリー&lt;/li&gt;
&lt;li&gt;OSSで監査・セルフホスト可&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;制限:&lt;/strong&gt; 新規プロジェクトのため動作が粗削り。Marketplace未掲載。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;費用:&lt;/strong&gt; 無料&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Void editor
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;概要:&lt;/strong&gt; 拡張不要でAI機能を統合、VS Codeフォーク型のOSSエディタ。「&lt;a href="https://github.com/voideditor/void" rel="noopener noreferrer"&gt;オープンソースCursor&lt;/a&gt;」を目指す。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpdpkvyrfe5l015d6t29e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpdpkvyrfe5l015d6t29e.png" alt="Void editorのスクリーンショット" width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;最適なユーザー:&lt;/strong&gt; 拡張ではなくフルフォークでCursor的UXを求める開発者。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;セットアップ手順:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;voideditor.comからダウンロード&lt;/li&gt;
&lt;li&gt;プロジェクトを開き、モデル設定&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;主な機能:&lt;/strong&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;Ollama経由ローカルモデル&lt;/li&gt;
&lt;li&gt;VS Code拡張機能の互換&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;制限:&lt;/strong&gt; VS Code本家のアップデートに遅れやすい。拡張の一部が非対応の場合あり。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;費用:&lt;/strong&gt; 無料&lt;/p&gt;




&lt;h2&gt;
  
  
  比較表
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ツール&lt;/th&gt;
&lt;th&gt;IDEサポート&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;Continue.dev&lt;/td&gt;
&lt;td&gt;VS Code, JetBrains&lt;/td&gt;
&lt;td&gt;完全（20以上対応）&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;Aider&lt;/td&gt;
&lt;td&gt;ターミナル&lt;/td&gt;
&lt;td&gt;完全&lt;/td&gt;
&lt;td&gt;完全（ターミナル）&lt;/td&gt;
&lt;td&gt;バックエンド・CI/CD自動化&lt;/td&gt;
&lt;td&gt;無料&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cline&lt;/td&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;完全（Claude等）&lt;/td&gt;
&lt;td&gt;完全&lt;/td&gt;
&lt;td&gt;VS Codeでの自律的多段階タスク&lt;/td&gt;
&lt;td&gt;無料&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modo&lt;/td&gt;
&lt;td&gt;VS CodeベースのIDE&lt;/td&gt;
&lt;td&gt;完全&lt;/td&gt;
&lt;td&gt;開発中&lt;/td&gt;
&lt;td&gt;サブスク不要AIファーストIDE&lt;/td&gt;
&lt;td&gt;無料&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Void editor&lt;/td&gt;
&lt;td&gt;VS Codeフォーク&lt;/td&gt;
&lt;td&gt;完全&lt;/td&gt;
&lt;td&gt;部分的&lt;/td&gt;
&lt;td&gt;Cursor的UX・OSS&lt;/td&gt;
&lt;td&gt;無料&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  適切なものの選び方
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VS Code＋無料でCursorチャット体験:&lt;/strong&gt; Continue.dev一択。成熟度とコミュニティ最大。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ターミナル派・バックエンド:&lt;/strong&gt; Aider。Git統合＆CI自動化に最適。AIバックエンド構築には[internal: how-to-build-tiny-llm-from-scratch]も参考に。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;完全自律エージェント型が必要:&lt;/strong&gt; Cline。Cursorのエージェントモードに最も近いOSS。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;拡張不要のAI IDE:&lt;/strong&gt; Void editor。Modoも今後に期待。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;完全なコードプライバシー:&lt;/strong&gt; Ollama＋Qwen2.5-Coder-32B等。24GB VRAM以上のPCで本番品質のコード生成可。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;チーム評価:&lt;/strong&gt; Continue.dev・Clineは設定の共有・管理が容易。APIテストの一元化は[internal: rest-api-best-practices]参照。&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ApidogがAIコーディングワークフローにどう適合するか
&lt;/h2&gt;

&lt;p&gt;AIコーディングアシスタントはコード生成が得意ですが、APIの実動作検証までは行いません。RESTクライアントやOpenAPI仕様エンドポイントを生成した場合、&lt;strong&gt;Apidogのテストシナリオ&lt;/strong&gt;で本番デプロイ前に統合テストを自動化できます。&lt;/p&gt;

&lt;h3&gt;
  
  
  テストワークフロー
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;生成エンドポイントをApidogにインポート（URL＋メソッド貼付け、またはOpenAPI仕様から）&lt;/li&gt;
&lt;li&gt;ハッピーパス用テストシナリオ作成（認証→主要リクエスト→レスポンス検証）&lt;/li&gt;
&lt;li&gt;ネガティブケース追加（期限切れトークン、不正ボディ、レートリミット等）&lt;/li&gt;
&lt;li&gt;ステージングがなければSmart MockでサードパーティAPIをシミュレート&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  例：GitHub APIクライアント検証
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scenario"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GitHub API client verification"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"steps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Create issue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.github.com/repos/{owner}/{repo}/issues"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer {{token}}"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Test issue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Created by test scenario"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"assertions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"equals"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"response.number"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exists"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"List issues (verify created issue appears)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.github.com/repos/{owner}/{repo}/issues"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"assertions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"response[0].number"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"equals"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{steps[0].response.number}}"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5分で設定が終わり、AI生成コードで発生しがちなHTTPメソッド間違い・必須フィールド漏れ・ページネーション未対応などを検出できます。ステートフルAPIのテストについては[internal: how-ai-agent-memory-works]も参考に。&lt;/p&gt;




&lt;h2&gt;
  
  
  まとめ
&lt;/h2&gt;

&lt;p&gt;2026年の今、オープンソースのコーディングアシスタントは十分実用的です。エージェント型コーディングや全体チャット、複数ファイル編集もCursor不要で実現可能です。Continue.dev・Aider・Clineで主要なワークフローを網羅でき、Modo/Voidも注目です。&lt;/p&gt;

&lt;p&gt;残る課題は&lt;strong&gt;テスト&lt;/strong&gt;です。AI生成コードは速いがバグも生みやすいので、ApidogなどでAPI統合を検証しましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  よくある質問
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: Continue.devはCursorに匹敵する？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: チャット・インライン編集はほぼ同等。完全自律エージェント（承認なしエンドツーエンド開発）はCursorが一歩上ですが、Claude 3.5 SonnetやGPT-4oを組み合わせれば遜色ありません。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: ローカルモデルのみでOSSコーディングアシスタントは使える？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 可能です。全ツールがOllama対応で、Qwen2.5-CoderやDeepSeek-Coder-V2などをローカルで動かせます。高度なタスクはフロンティアモデル優位ですが、ボイラープレートやリファクタで十分活躍します。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: モデル選択のコツは？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Claude 3.5 Sonnetは複雑な自動タスク、GPT-4oはコード生成と関数呼び出しに強み。DeepSeek-Coder-V2はOSS界最強モデルでローカル実行向き。コスト優先ならClaude/GPT-4o、プライバシー重視や大量処理ならDeepSeek推奨。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Aiderを&lt;code&gt;--yes&lt;/code&gt;モードで使っても大丈夫？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 注意必須。全変更を自動承認するため、必ずブランチ運用＆マージ前に差分レビュー推奨。CI自動化には便利ですが、対話型開発では手動レビューが安心です。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Kiroとは？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: AWS製AI IDE（2025年発表）。VS CodeをベースにAWS統合を強化。OSSではありません。ModoのREADMEにも代替対象として記載あり。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: チームで設定共有できる？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 可能。Continue.devは&lt;code&gt;.continue/config.json&lt;/code&gt;、Clineは&lt;code&gt;settings.json&lt;/code&gt;、Aiderは&lt;code&gt;.aider.conf.yml&lt;/code&gt;をVCS管理できます。チーム標準化も容易。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: オフライン動作は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Ollama経由のローカルモデル使用なら完全オフライン可。APIベース（Claude/GPT-4o）はネット必須。Void editorやModoもローカルモデル運用が可能です。&lt;/p&gt;

</description>
      <category>ai</category>
      <category>coding</category>
      <category>opensource</category>
      <category>tooling</category>
    </item>
    <item>
      <title>AIエージェントのメモリの仕組み (APIでテストする方法)</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Tue, 07 Apr 2026 08:04:16 +0000</pubDate>
      <link>https://dev.to/aakira/aiezientonomemorinoshi-zu-mi-apidetesutosurufang-fa--4bha</link>
      <guid>https://dev.to/aakira/aiezientonomemorinoshi-zu-mi-apidetesutosurufang-fa--4bha</guid>
      <description>&lt;h2&gt;
  
  
  要するに
&lt;/h2&gt;

&lt;p&gt;AIエージェントの失敗は知能不足ではなく、「忘れる」ことに原因があります。4つのメモリタイプがどのように保存され、API挙動にどのように影響するかを理解することで、より信頼性の高いエージェントを構築し、本番投入前にバグを特定できます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;今すぐApidogを試してみる&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  はじめに
&lt;/h2&gt;

&lt;p&gt;多くのAIエージェントが失敗する主な理由は、モデル自体の問題ではなく、メモリ層の設計や実装にあります。過去の会話を思い出せない、セッション間でコンテキストが消える、自己矛盾するエージェントの多くはメモリ設計やテスト不足が原因です。&lt;/p&gt;

&lt;p&gt;最近登場したオープンソースのエージェントメモリシステム &lt;a href="https://github.com/kitfunso/hippo-memory" rel="noopener noreferrer"&gt;Hippo&lt;/a&gt; は、生物学的にインスパイアされた設計で人間の記憶のように短期・長期・エピソードメモリを分離管理します。このような仕組みは、エージェントメモリを後回しにしがちな開発現場でのギャップを浮き彫りにしています。&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Apidogのテストシナリオ&lt;/strong&gt;を使えば、ステートフルな複数ターンのエージェント会話を本番前にテストできます。APIコール間のセッション状態検証、コンテキストのアサート、Smart Mockによるメモリ障害シミュレーションも可能です。本記事後半で具体的なテスト方法を解説します。より幅広いAPIテスト方法については [internal: api-testing-tutorial] を参照してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  AIエージェントメモリとは何か？
&lt;/h2&gt;

&lt;p&gt;エージェントメモリとは、AIシステムが現在の入力を超えて情報へアクセス・保持できる仕組みです。これがなければAPIコールはすべてステートレスとなり、モデルはプロンプトと応答以外何も覚えません。&lt;/p&gt;

&lt;p&gt;主に4つのメモリタイプが存在し、それぞれ異なる役割を果たします。&lt;/p&gt;

&lt;h2&gt;
  
  
  エージェントメモリの4つのタイプ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ワーキングメモリ
&lt;/h3&gt;

&lt;p&gt;ワーキングメモリはエージェントの「現在のコンテキスト」、つまりプロンプト内に含まれる全データです。多くのLLMベースのエージェントでは、これがコンテキストウィンドウに該当します（例：GPT-4oは128Kトークン、Claude 3.5 Sonnetは200K、Gemini 1.5 Proは1M）。&lt;/p&gt;

&lt;ul&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;/ul&gt;

&lt;h3&gt;
  
  
  エピソード記憶
&lt;/h3&gt;

&lt;p&gt;エピソード記憶は、過去のインタラクションや決定のログです。エージェントの日記のようなもの。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;実装例:&lt;/strong&gt; ベクトルDB（Chroma, Pinecone, Qdrant）やイベントログ。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;取得方法:&lt;/strong&gt; セマンティック検索で関連エピソードのみプロンプトに注入。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hippoの特徴:&lt;/strong&gt; タイムスタンプと減衰重み付きのシーケンスで、直近の出来事ほど取得しやすくなっています。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  セマンティック記憶
&lt;/h3&gt;

&lt;p&gt;セマンティック記憶は、事実やドメイン知識、ユーザーの好みなど「知っていること」を保存します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;実装例:&lt;/strong&gt; システムプロンプトへの事前ロード、過去会話からの知識抽出（ナレッジグラフ）、RAGによる外部知識取得など。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  手続き記憶
&lt;/h3&gt;

&lt;p&gt;手続き記憶は「やり方」や「スキル」を保持します。行動シーケンスやツール利用パターンなど。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;実装例:&lt;/strong&gt; システムプロンプト内のfew-shot例、行動計画のテンプレートライブラリ。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;注意:&lt;/strong&gt; 実装が難しく、本番システムでは省略されがち。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  実際のシステムでのメモリの保存方法
&lt;/h2&gt;

&lt;p&gt;理想的には4タイプそれぞれに専用ストアを割り当てますが、現実のシステムは以下のような構成が一般的です。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;コンテキストウィンドウ（ワーキングメモリ）:&lt;/strong&gt; エージェントフレームワークが管理し、会話終了時に期限切れ。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;外部ベクトルストア（エピソード+セマンティック記憶）:&lt;/strong&gt; Chroma/Pinecone/Qdrantでインタラクションや知識チャンクの埋め込み管理。各ターンで検索・注入。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;構造化DB（セマンティック+手続き記憶）:&lt;/strong&gt; PostgreSQLやSQLiteでユーザー設定や学習済みアクションを管理。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;インメモリキャッシュ（ワーキングメモリのオーバーフロー）:&lt;/strong&gt; Redisや辞書型ストアで直近コンテキストを高速取得。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hippoは3層メモリシステムを明示的なハンドオフロジックで実装しており、最近使われなかったワーキングメモリはエピソード記憶に統合、さらに要約されてセマンティック記憶に移行します。これは人間の記憶統合プロセスに近い設計です。&lt;/p&gt;

&lt;h2&gt;
  
  
  エージェントメモリがAPIの挙動に与える影響
&lt;/h2&gt;

&lt;p&gt;APIを実装・利用する際、メモリ設計はAPI挙動と直結します。主な観点は以下です。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;セッションID:&lt;/strong&gt; 多くのエージェントAPIはセッションIDやスレッドIDで呼び出し間のメモリを紐付けます（例：OpenAI Assistants APIの&lt;code&gt;thread_id&lt;/code&gt;）。ID管理ミスによるセッション混入バグに注意。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;リクエストペイロードサイズ:&lt;/strong&gt; メモリ注入型エージェントでは会話の継続でペイロードが肥大化。クライアント側のサイズ制限に注意。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;取得レイテンシ:&lt;/strong&gt; ベクトルストアクエリは1ターン50～200ms加算。応答速度への影響を計測・アサートしましょう。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;失敗時の状態不整合:&lt;/strong&gt; タスク途中でツール呼び出しが失敗した場合、部分的なログが残り次ターンでバグ化しやすい。状態チェックポイントを設ける設計が有効。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ApidogでAPI経由でエージェントメモリをテストする方法
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apidog.com/api-testing/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ステートフルな&lt;/a&gt;エージェントAPIの本番品質テストには、複数ターン・セッション・障害ケースの検証が不可欠です。Apidogでは、これをテストシナリオで簡単に実現できます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fby2zl8cisv8zsow7dh97.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fby2zl8cisv8zsow7dh97.png" alt="Apidog Test Scenario" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  テスト1：コンテキストの引き継ぎ
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;事実を伝えるメッセージ（例：「私のプロジェクトはPostgreSQL 16を使用しています」）を &lt;code&gt;/agent/chat&lt;/code&gt; にPOST&lt;/li&gt;
&lt;li&gt;その事実を問うメッセージ（例：「どのデータベースを最適化すべきですか？」）を同じエンドポイントにPOST&lt;/li&gt;
&lt;li&gt;ステップ2の応答に「PostgreSQL」が含まれることをアサート&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;例（擬似コード）:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ステップ&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/agent/chat&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"session_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"私のプロジェクトはPostgreSQL 16を使用しています"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ステップ&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/agent/chat&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"session_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"どのデータベースを最適化すべきですか？"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;アサーション&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;expect(response.message.content).toContain(&lt;/span&gt;&lt;span class="s2"&gt;"PostgreSQL"&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  テスト2：セッション分離
&lt;/h3&gt;

&lt;p&gt;異なる&lt;code&gt;session_id&lt;/code&gt;で上記シナリオを2回実行し、2つ目のセッションの応答に1つ目のセッションの情報が混入していないことをアサートします。これでメモリのネームスペース分離バグを検知できます。&lt;/p&gt;

&lt;h3&gt;
  
  
  テスト3：メモリ障害時の劣化
&lt;/h3&gt;

&lt;p&gt;Smart Mockでベクトルストアのエンドポイントを503にモックし、メモリ障害状態を再現します。&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;h3&gt;
  
  
  テスト4：コンテキストウィンドウのオーバーフロー
&lt;/h3&gt;

&lt;p&gt;30回以上連続でメッセージを送信し、ワーキングメモリの制限を超える状況を作ります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;context_length_exceeded&lt;/code&gt;エラーが発生しないこと&lt;/li&gt;
&lt;li&gt;30ターン目でもエピソード記憶から情報取得できること&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;response.usage&lt;/code&gt; のトークン数が想定範囲内であること&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;これらを1つのテストシナリオで連鎖させ、共有変数でセッションID等を管理できます。LLM側のコンテキストウィンドウ実装詳細については [internal: how-to-build-tiny-llm-from-scratch] も参照してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  よくあるメモリ障害モード
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;サイレントなコンテキスト切り捨て:&lt;/strong&gt; コンテキスト上限で古い履歴が消える。&lt;code&gt;response.usage.prompt_tokens&lt;/code&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;li&gt;
&lt;strong&gt;埋め込みのドリフト:&lt;/strong&gt; 埋め込みモデル変更時の取得異常。取得コンテキストのセマンティック一致度をアサートする。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;メモリインジェクション:&lt;/strong&gt; 悪意あるユーザー入力による保存・取得操作。敵対的入力をテストスイートに含め、システムプロンプトの上書きが無視されることを確認。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;APIセキュリティテスト全般は [internal: rest-api-best-practices] 参照。&lt;/p&gt;

&lt;h2&gt;
  
  
  結論
&lt;/h2&gt;

&lt;p&gt;エージェントメモリ（ワーキング・エピソード・セマンティック・手続き）は、知的なアシスタントと単なる「忘れっぽい」アシスタントの分水嶺です。各メモリタイプの保存・取得方法を理解し、テストで明確にアサートすることで、バグの温床を可視化できます。&lt;/p&gt;

&lt;p&gt;Hippoのようなツールはメモリアーキテクチャの進化を示しています。どんなメモリシステムでも、&lt;strong&gt;Apidogのテストシナリオ&lt;/strong&gt;で大規模環境特有の障害ケースまで検証しましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  よくある質問
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: エージェントにメモリを追加する最も簡単な方法は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 会話履歴のスライディングウィンドウ（プロンプトに直近Nターンを保持）が手軽です。短期タスク向け。長期運用にはベクトルストア＋セマンティック検索も組み合わせましょう。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: OpenAI Assistants APIはどのようにメモリを処理しますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: サーバーサイドでスレッドオブジェクトとして会話履歴を管理。ファイル検索・コードインタープリターの添付で外部知識も利用可能。メモリ管理は抽象化されており、便利ですがデバッグは少し難しくなります。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: エージェントメモリに最適なベクトルデータベースは？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: ローカル開発はChroma、本番はQdrant（セルフホスト）またはPinecone（マネージド）が推奨です。Hippoはプラグイン式ストレージをサポート。Claude Codeの独自メモリ層については [internal: claude-code] 参照。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: エージェントが過去インタラクションを幻覚するのを防ぐには？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: インタラクションログをタイムスタンプや信頼度とともに構造化保存し、プロンプト注入時に明示的な引用を付与します（例：「[日付]の会話によると…」）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: 実行中のエージェントなしでエージェントメモリをテストできますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 可能です。ApidogのSmart MockでセッションIDやリクエスト内容ごとに異なる応答を返すよう設定し、メモリ挙動をフロント・統合レイヤーで検証できます。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: 本番環境でのベクトルストレージのコストは？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Pinecone無料ティアは10万ベクトル/1インデックス。本番はp1.x1ポッド（100万ベクトル/768次元）で$0.096/時間程度。Qdrantセルフホストは無料。多くの場合、ストレージより埋め込み生成コストが支配的です。MCPサーバー統合との関係は [internal: what-is-mcp-server] 参照。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: RAGとエージェントメモリの違いは？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: RAGは静的ナレッジベースからドキュメントを取得しますが、エージェントメモリはインタラクションを通じて動的に成長・変化します。RAGは「ドキュメントには何と書かれている？」、エージェントメモリは「このユーザーについて私は何を知っていて何をしてきたか？」に答えます。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>LLMをゼロから構築する方法：得られる学び</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Tue, 07 Apr 2026 04:31:53 +0000</pubDate>
      <link>https://dev.to/aakira/llmwozerokaragou-zhu-surufang-fa-de-rareruxue-bi-2pj8</link>
      <guid>https://dev.to/aakira/llmwozerokaragou-zhu-surufang-fa-de-rareruxue-bi-2pj8</guid>
      <description>&lt;h2&gt;
  
  
  要約
&lt;/h2&gt;

&lt;p&gt;ゼロから最小限の言語モデル（LLM）を構築するためには、Pythonコードで300行も必要ありません。この構築プロセスを通じて、トークン化、アテンション、推論の仕組みを正確に理解でき、本番LLMをアプリケーションへ統合する際に、より優れたAPIコンシューマーになることができます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidogを今すぐ試す&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  はじめに
&lt;/h2&gt;

&lt;p&gt;多くの開発者は言語モデルをブラックボックスとして扱っています。テキストを入力するとトークンが出てきて、その裏側では何らかの「魔法」が起きていると思われがちです。しかしAPI統合のデバッグ、サンプリングパラメータの調整、構造化データの生成エラー解析などの場面では内部構造の理解が不可欠になります。&lt;/p&gt;

&lt;p&gt;HackerNewsで話題となった『GuppyLM』は、Pythonでゼロから実装された870万パラメータのトランスフォーマーであり、一般的なGPUで1時間以内にトレーニング可能です。コードは1ファイルに収まり、目的はGPT-4と競うことではなく、LLMの内部動作の理解にあります。&lt;/p&gt;

&lt;p&gt;この記事では、小規模LLMの構築方法・主要コンポーネントの役割・API活用時に内部構造を知っておくことの意義を、実装例と共に解説します。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Apidogのテストシナリオを活用すると、ストリーミング応答の検証やトークン構造のアサーション、エッジケース補完のシミュレーションなどが本番クレジットを消費せずに行えます。詳細は後述。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  言語モデルが「小さい」とは？
&lt;/h2&gt;

&lt;p&gt;GPT-4などの本番LLMは数千億パラメータですが、「小さい」LLMは100万〜2500万パラメータが目安です。GuppyLM（870万）、nanoGPT（1億2400万）、MicroLM（100〜200万）などが該当します。&lt;/p&gt;

&lt;p&gt;小規模LLMの特徴:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ノートPCやColabでトレーニング可能&lt;/li&gt;
&lt;li&gt;CPUメモリで動作&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;/ul&gt;

&lt;p&gt;価値は出力品質よりも、構築・運用を通じて得られる理解にあります。&lt;/p&gt;

&lt;h2&gt;
  
  
  主要コンポーネント：LLMの実際の仕組み
&lt;/h2&gt;

&lt;p&gt;LLMを構成する4つの主な要素について解説します。&lt;/p&gt;

&lt;h3&gt;
  
  
  トークナイザー
&lt;/h3&gt;

&lt;p&gt;トークナイザーは生テキストを整数IDに変換します。例: &lt;code&gt;Hello, world!&lt;/code&gt; → &lt;code&gt;[15496, 11, 995, 0]&lt;/code&gt;&lt;br&gt;&lt;br&gt;
各IDは語彙内のサブワード・文字単位に対応します。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API実装へのヒント&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
トークン数はレイテンシやコストに直結します。トークナイザーの分割方法を把握しておくことで、プロンプトがコンテキストウィンドウに収まり、不要な切り捨てを防げます。&lt;/p&gt;

&lt;p&gt;GuppyLMは文字レベル、GPT-4などはBPE（5万〜10万語彙）を使用しています。&lt;/p&gt;
&lt;h3&gt;
  
  
  埋め込み層
&lt;/h3&gt;

&lt;p&gt;埋め込み層はトークンIDを密なベクトル（例：384次元）へ変換します。意味的に近いトークンはベクトル空間でも近くなります。&lt;br&gt;&lt;br&gt;
さらに「位置埋め込み」を加えることで、トークン配列の順序も認識できます。&lt;/p&gt;
&lt;h3&gt;
  
  
  トランスフォーマーブロック
&lt;/h3&gt;

&lt;p&gt;主な計算部です。各ブロックは以下2つから構成されます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;自己アテンション&lt;/strong&gt;：各トークンが他すべてを参照し、次トークン生成の重要度を判定します。GuppyLMは6ヘッド×6層。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;フィードフォワードネットワーク&lt;/strong&gt;：アテンション後にMLP（2層）を適用。GuppyLMはReLU活性、GPT-4などはSwiGLUなども使われます。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  出力ヘッド
&lt;/h3&gt;

&lt;p&gt;最終ブロックの出力を語彙サイズのベクトルへ線形変換し、softmaxで確率を算出。最も高い確率のトークンを選ぶ/サンプリングして繰り返します。&lt;/p&gt;
&lt;h2&gt;
  
  
  Pythonで最小限のLLMを構築する
&lt;/h2&gt;

&lt;p&gt;GuppyLMを参考にしたPyTorch実装例です。実行に必要な最小構成を示します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch.nn&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch.nn.functional&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;

&lt;span class="c1"&gt;# ハイパーパラメータ
&lt;/span&gt;&lt;span class="n"&gt;VOCAB_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;     &lt;span class="c1"&gt;# 文字レベル：ASCII文字ごとに1スロット
&lt;/span&gt;&lt;span class="n"&gt;D_MODEL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;        &lt;span class="c1"&gt;# 埋め込み次元
&lt;/span&gt;&lt;span class="n"&gt;N_HEADS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;          &lt;span class="c1"&gt;# アテンションヘッド数
&lt;/span&gt;&lt;span class="n"&gt;N_LAYERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;         &lt;span class="c1"&gt;# トランスフォーマーブロック数
&lt;/span&gt;&lt;span class="n"&gt;SEQ_LEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;         &lt;span class="c1"&gt;# コンテキストウィンドウ
&lt;/span&gt;&lt;span class="n"&gt;DROPOUT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SelfAttention&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_heads&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;n_heads&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n_heads&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head_dim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;n_heads&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;qkv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;proj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dropout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Dropout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DROPOUT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;
        &lt;span class="n"&gt;qkv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;qkv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;n_heads&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head_dim&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qkv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unbind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# 因果マスク: 各トークンは前のトークンのみ参照
&lt;/span&gt;        &lt;span class="n"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head_dim&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;
        &lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;
        &lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;triu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;diagonal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;attn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;masked_fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-inf&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;softmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dropout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;transpose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;proj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TransformerBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_heads&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SelfAttention&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_heads&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Sequential&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ReLU&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Dropout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DROPOUT&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ln1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LayerNorm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ln2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LayerNorm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ln1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ln2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TinyLLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;VOCAB_SIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;D_MODEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pos_embed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SEQ_LEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;D_MODEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ModuleList&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="nc"&gt;TransformerBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;D_MODEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;N_HEADS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N_LAYERS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ln_f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LayerNorm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;D_MODEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;D_MODEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;VOCAB_SIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;
        &lt;span class="n"&gt;tok_emb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pos_emb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pos_embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tok_emb&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;pos_emb&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;block&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ln_f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;logits&lt;/span&gt;

&lt;span class="c1"&gt;# モデル初期化とパラメータ数カウント
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TinyLLM&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;total_params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;numel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Model size: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total_params&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; parameters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 約1.2M
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  トレーニングループ
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch.optim&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;optim&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;train&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;epochs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3e-4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;optimizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;optim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AdamW&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;lr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;train&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;epoch&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;epochs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# data: トークンIDのテンソル, 形状 [バッチ, seq_len+1]
&lt;/span&gt;        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="c1"&gt;# 入力: 最後のトークンを除く
&lt;/span&gt;        &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;    &lt;span class="c1"&gt;# ターゲット: 1つシフト
&lt;/span&gt;        &lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;loss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cross_entropy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;VOCAB_SIZE&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zero_grad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;backward&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;epoch&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Epoch &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;epoch&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, loss: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;item&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  推論（テキスト生成）
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@torch.no_grad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_new_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;prompt_ids&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_new_tokens&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;idx_cond&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;SEQ_LEN&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;  &lt;span class="c1"&gt;# コンテキストウィンドウに合わせて切り詰め
&lt;/span&gt;        &lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idx_cond&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;temperature&lt;/span&gt;  &lt;span class="c1"&gt;# 最後のトークンのみ
&lt;/span&gt;        &lt;span class="c1"&gt;# top-kサンプリング
&lt;/span&gt;        &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;topk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
        &lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-inf&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;probs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;softmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;next_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;multinomial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;probs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_samples&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;next_id&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;dim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  これがAI APIの挙動について教えてくれること
&lt;/h2&gt;

&lt;p&gt;この構築経験から得られる、API統合時の実践的な知見を紹介します。&lt;/p&gt;

&lt;h3&gt;
  
  
  Temperatureとサンプリングは単なるパラメータ
&lt;/h3&gt;

&lt;p&gt;Temperatureはsoftmax前のロジットをスケールします。高くすると出力がランダムに、低くすると決定論的になります。APIで&lt;code&gt;temperature=0.0&lt;/code&gt;指定でも、一貫性が出ない場合は仕様です（多くのAPIは完全なargmaxを避けています）。&lt;/p&gt;

&lt;h3&gt;
  
  
  コンテキストウィンドウは厳密で、緩やかなものではない
&lt;/h3&gt;

&lt;p&gt;推論ループの&lt;code&gt;idx_cond = ids[:, -SEQ_LEN:]&lt;/code&gt;のように、モデルはウィンドウ外のトークンを完全に破棄します。API統合時、会話履歴を全て覚えている前提は成り立ちません。&lt;/p&gt;

&lt;h3&gt;
  
  
  ストリーミングトークン = 推論ループの可視化
&lt;/h3&gt;

&lt;p&gt;ストリーミングAPIも内部的には逐次生成と同じです。トークンごとに応答をフラッシュしているだけ。途中でストリームが切れると再開はできません（最初からやり直し）。&lt;/p&gt;

&lt;h3&gt;
  
  
  ロジット分布は構造化出力の難しさを示す
&lt;/h3&gt;

&lt;p&gt;各ステップで語彙全体に確率が割り当てられ、例えば有効なJSON生成には全トークンが正しい必要があります。OutlinesやGuidance等はロジットを制約して文法を強制しています。APIで「構造化出力」モードがある場合、内部的にこの処理をしています。&lt;/p&gt;

&lt;h2&gt;
  
  
  ApidogでAI APIの統合をテストする方法
&lt;/h2&gt;

&lt;p&gt;LLMの推論理解を応用して、Apidogによる堅牢なAPIテストを構築しましょう。Apidogのテストシナリオでは、複数のAPI呼び出しを連鎖させ、AI応答の構造を自動アサートできます。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ストリーミングチャットAPIのテスト例:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;/v1/chat/completions&lt;/code&gt;エンドポイントを含むテストシナリオを作成&lt;/li&gt;
&lt;li&gt;レスポンスアサーション例:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;response.choices[0].finish_reason == "stop"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;response.usage.total_tokens &amp;lt; 4096&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;応答を次のターンの入力として再利用し、複数ターン会話をシミュレーション&lt;/li&gt;
&lt;li&gt;ApidogのスマートモックでAIエンドポイントをスタブ化し、&lt;code&gt;finish_reason: "length"&lt;/code&gt;, &lt;code&gt;finish_reason: "content_filter"&lt;/code&gt;, ストリーム途中のタイムアウト等の異常系もテスト&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;これにより、CI実行時にAPIクレジットを消費せずAI統合テストが可能です。より広範なアプローチは[internal: api-testing-tutorial]を参照してください。&lt;/p&gt;

&lt;h3&gt;
  
  
  トークン数アサーションのテスト
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"assertions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"response.usage.completion_tokens"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"less_than"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"response.choices[0].finish_reason"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"equals"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stop"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"field"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"response.choices[0].message.content"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"operator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_empty"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;このテストは、1つのシナリオ内で複数モデル（GPT-4o, Claude 3.5 Sonnet, Gemini 1.5 Pro）に対して実行し、APIスキーマの違いによる不具合を本番前に発見できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  応用編：量子化と推論の最適化
&lt;/h2&gt;

&lt;p&gt;小さなLLMを動かした後は、本番モデル運用と直結する以下のテクニックも押さえておきましょう。&lt;/p&gt;

&lt;h3&gt;
  
  
  量子化
&lt;/h3&gt;

&lt;p&gt;モデル重みは通常32ビットfloatですが、8ビット（INT8）や4ビット（INT4）整数に量子化可能です。これによりメモリ消費が4〜8倍削減され、精度低下も小さいです。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 例: PyTorchでの動的INT8量子化
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch.quantization&lt;/span&gt;
&lt;span class="n"&gt;quantized_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quantization&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quantize_dynamic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Linear&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;qint8&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;本番APIでも量子化モデルが使われます。同じモデル名でも品質が微妙に異なる場合、量子化の影響であることがあります。&lt;/p&gt;

&lt;h3&gt;
  
  
  KVキャッシュ
&lt;/h3&gt;

&lt;p&gt;推論ループでは毎回全トークン分のアテンションを再計算しますが、本番環境では「キー・バリューキャッシュ」を使い、1トークンごとに必要部分だけ計算します。これによりストリーミング応答の2トークン目以降のレイテンシが大幅に下がります。&lt;/p&gt;

&lt;h2&gt;
  
  
  小さなLLMと本番API：それぞれの使い分け
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ユースケース&lt;/th&gt;
&lt;th&gt;小さなLLM&lt;/th&gt;
&lt;th&gt;本番API&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;/tr&gt;
&lt;tr&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;プライベート/機密データ&lt;/td&gt;
&lt;td&gt;良い選択肢&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;td&gt;不可能&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;/tr&gt;
&lt;tr&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;/div&gt;

&lt;p&gt;ほとんどの開発者には「本番APIを活用しつつ、内部理解のために小さなモデルを動かす」というハイブリッド運用が最適です。両者は競合ではありません。&lt;br&gt;&lt;br&gt;
[internal: open-source-coding-assistants-2026]では境界を曖昧にするツールについても紹介しています。&lt;/p&gt;

&lt;h2&gt;
  
  
  結論
&lt;/h2&gt;

&lt;p&gt;小さなLLMは週末の時間で構築できます。得られるものは本番品質のシステムではなく、GuppyLMからGPT-4oまでのLLMの動作を理解するための実践的メンタルモデルです。この知識は、ストリーミング統合のデバッグやサンプリングパラメータの調整、AI APIテスト設計などに直結します。&lt;/p&gt;

&lt;p&gt;GuppyLMプロジェクトは良い出発点です。クローンし、任意のテキストデータでトレーニングし、推論ループの挙動を観察してみましょう。本番API統合の見方が大きく変わるはずです。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apidogのテストシナリオをぜひ活用し、他のバックエンド同様に厳密なAI APIテストを実施してください。&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  よくある質問
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;「小さな」LLMが一貫性あるテキストを生成するには何パラメータ必要？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
おおよそ1,000万〜5,000万パラメータで良質なデータセットなら短い一貫文の生成が可能です。100万未満だと意味不明になりがち。GuppyLM（870万）は60トピックの短文会話で機能します。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GPUなしで小さなLLMは使える？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
1億パラメータ未満ならCPUでも動作します（推論は遅い）。上記モデル(120万パラメータ)はノートPCのCPUでミリ秒単位の生成が可能です。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;どんなデータセットで学習すべき？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
プロジェクト・グーテンベルクやWikipediaサブセット等のプレーンテキストがおすすめ。GuppyLMはHuggingFaceの会話データセット（&lt;code&gt;arman-bd/guppylm-60k-generic&lt;/code&gt;）を利用。コード生成にはThe StackやCodeParrotを。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Temperatureとtop-kサンプリングの違いは？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Temperatureは分布全体のランダム性調整、top-kは上位k候補に絞ってからTemperatureを適用。組み合わせて使うのが一般的。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LLMが自己反復する理由は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
直前のトークンに高確率を割り当てる失敗モード。APIでは&lt;code&gt;repetition_penalty=1.1&lt;/code&gt;等で対策できます。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;小さなLLMのトレーニング時間は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
上記モデルなら単一GPU（RTX 3060等）で2時間以内、Colabでも同等。1億以上はマルチGPUと数日が必要。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;小さなLLMからAPIエンドポイントへ移行する最速手順は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
llama.cppでGGUF変換→llama-serverでOpenAI互換API提供→Apidogでテスト可能。[internal: rest-api-best-practices]参照。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;本番LLMはトレーニングウィンドウ以上のコンテキストをどう扱う？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
RoPEの拡張、スライディングウィンドウアテンション、RAG等でコンテキスト拡張可能。中核アーキテクチャは不変、位置エンコードやアテンション適用方法だけが変わります。&lt;/p&gt;

</description>
      <category>llm</category>
      <category>machinelearning</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Seedance 2.0 API 2026年版 使い方ガイド</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Sat, 04 Apr 2026 12:57:57 +0000</pubDate>
      <link>https://dev.to/aakira/seedance-20-api-2026nian-ban-shi-ifang-gaido-489n</link>
      <guid>https://dev.to/aakira/seedance-20-api-2026nian-ban-shi-ifang-gaido-489n</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR (要約)
&lt;/h2&gt;

&lt;p&gt;Seedance 2.0 APIは2026年4月2日にVolcengine Arkを通じてリリースされました。動画生成タスクをPOSTリクエストで送信し、ステータスが「succeeded」になるまでGETエンドポイントをポーリングします。このAPIは、テキストから動画、画像から動画、最初と最後のフレーム制御、マルチモーダル参照、ネイティブ音声生成をサポートしています。5秒の1080p動画の費用は約0.93ドルです。動画は24時間以内にダウンロードしてください。その後、URLは期限切れになります。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://hypereal.cloud" rel="noopener noreferrer"&gt;Hypereal AI&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://hypereal.cloud/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9no1b7kwev33vq2bcepw.png" alt="Hypereal AIを試す"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hypereal.cloud/" rel="noopener noreferrer"&gt;Hypereal AIを試す&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;今すぐApidogを試そう&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  はじめに
&lt;/h2&gt;

&lt;p&gt;2026年4月2日、ByteDanceのVolcengine Arkプラットフォームは公式のSeedance 2.0 APIをリリースしました。それ以前は、Seedance 2.0の動画を生成する唯一の方法はウェブコンソールからでした。UIのウォークスルーを示すチュートリアルを見たことがある場合、それらはコンソール向けに書かれたものです。このガイドでは、開発者がプログラムで呼び出せる実際のAPIについて、実装方法にフォーカスして解説します。&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;非同期タスクパターンのポイント&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
このAPIは非同期タスクパターンです。タスクを作成するためにPOSTし、タスクIDを受け取り、ジョブが完了するまでGETエンドポイントをポーリングします。Apidogのテストシナリオを使えば、POST送信→タスクID抽出→GETポーリング→動画URLの検証までシナリオ化できます。Apidogのセクションで具体的なテスト手順を紹介します。&lt;/p&gt;

&lt;p&gt;この記事では、すべての入力タイプ、料金算出方法、エラー対応など、実装に必要な知識をまとめています。&lt;/p&gt;
&lt;h2&gt;
  
  
  Seedance 2.0とは？
&lt;/h2&gt;

&lt;p&gt;Seedance 2.0はByteDanceが提供する動画生成モデルです。Volcengine Ark上で、  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;標準モデル: &lt;code&gt;doubao-seedance-2-0-260128&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;高速/低品質モデル: &lt;code&gt;doubao-seedance-2-0-fast-260128&lt;/code&gt;
として利用できます。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;v1.5よりも多くの入力に対応し、以下の特徴があります。&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;8カ国語以上のリップシンク&lt;/li&gt;
&lt;li&gt;カメラモーション（ドリー/トラッキング等）制御&lt;/li&gt;
&lt;li&gt;最大2K/15秒の動画出力&lt;/li&gt;
&lt;li&gt;1:1～21:9のアスペクト比、24fps&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  変更点：ガイドと公式APIの比較
&lt;/h2&gt;

&lt;p&gt;2026年2月以前の記事は、VolcengineのWebコンソール手順のみを扱っていました。&lt;br&gt;&lt;br&gt;
2026年4月からはAPIが登場し、プログラムから任意の言語で動画生成パイプラインを自動化できるようになりました。本記事はAPI実装に絞って解説します。&lt;/p&gt;
&lt;h2&gt;
  
  
  前提条件
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.volcengine.com/" rel="noopener noreferrer"&gt;volcengine.com&lt;/a&gt;でVolcengineアカウントを作成&lt;/li&gt;
&lt;li&gt;ArkコンソールでAPIキーを生成
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  https://console.volcengine.com/ark/region:ark+cn-beijing/apikey
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;APIキーを環境変数に設定
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ARK_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-api-key-here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Bearerトークンとしてリクエストヘッダーにセット
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;  Authorization: Bearer YOUR_ARK_API_KEY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;新規アカウントには無料トライアルクレジット付与（1080pで約8本の15秒動画生成分）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  テキストから動画：最初のリクエスト
&lt;/h2&gt;

&lt;p&gt;ベースURL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://ark.cn-beijing.volces.com/api/v3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  cURL例
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$ARK_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "doubao-seedance-2-0-260128",
    "content": [
      {
        "type": "text",
        "text": "A golden retriever running through a sunlit wheat field, wide tracking shot, cinematic"
      }
    ],
    "resolution": "1080p",
    "ratio": "16:9",
    "duration": 5,
    "watermark": false
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;レスポンス（タスクID）例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cgt-2025xxxxxxxx-xxxx"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python例（公式SDK）
&lt;/h3&gt;

&lt;p&gt;まずSDKをインストール：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;volcenginesdkarkruntime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;タスク送信例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;volcenginesdkarkruntime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Ark&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Ark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ARK_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A golden retriever running through a sunlit wheat field, wide tracking shot, cinematic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;タスクIDを保存し、後述のポーリングで使用します。&lt;/p&gt;

&lt;h2&gt;
  
  
  非同期タスクパターン：送信、ポーリング、ダウンロード
&lt;/h2&gt;

&lt;p&gt;生成には時間がかかります（例：5秒の1080pで60〜120秒）。&lt;br&gt;&lt;br&gt;
タスクの状態遷移は以下の通りです。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;queued -&amp;gt; running -&amp;gt; succeeded
                  -&amp;gt; failed
                  -&amp;gt; expired
                  -&amp;gt; cancelled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;queued&lt;/code&gt;/&lt;code&gt;running&lt;/code&gt;の間は、GETで状態確認をポーリングします。&lt;/p&gt;

&lt;h3&gt;
  
  
  完全なPythonポーリングループ
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;volcenginesdkarkruntime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Ark&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Ark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ARK_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Step 1: submit
&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Aerial shot of a mountain lake at sunrise, slow dolly forward&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;task_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task submitted: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Step 2: poll with exponential backoff
&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;succeeded&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;expired&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cancelled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task ended with status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;

    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Step 3: download immediately
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;succeeded&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iter_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8192&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Downloaded: output.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;指数バックオフ（最大60秒）はAPI負荷抑制に有効です。&lt;/p&gt;

&lt;h2&gt;
  
  
  画像から動画（I2V）：静止画のアニメーション化
&lt;/h2&gt;

&lt;p&gt;画像をアニメーション化するには、&lt;code&gt;content&lt;/code&gt;配列に&lt;code&gt;image_url&lt;/code&gt;を追加します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The woman slowly turns her head and smiles at the camera&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/portrait.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adaptive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ratio: "adaptive"&lt;/code&gt; で入力画像のアスペクト比を自動採用&lt;/li&gt;
&lt;li&gt;画像サイズは30MB未満、1リクエスト最大9枚&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  最初と最後のフレーム：開始点と終了点の制御
&lt;/h2&gt;

&lt;p&gt;最初・最後のフレーム制御例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The flower blooms from bud to full open, macro lens, soft light&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/flower-bud.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/flower-open.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adaptive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;両端画像＋テキストで、中間アニメーションを生成します。&lt;br&gt;&lt;br&gt;
&lt;code&gt;return_last_frame: true&lt;/code&gt;を指定すると、最終フレーム画像も取得でき、次回リクエストの初期フレームとして活用可能です。&lt;/p&gt;
&lt;h2&gt;
  
  
  マルチモーダル参照：画像、動画、音声の組み合わせ
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;content&lt;/code&gt;配列で以下の型を混在可能：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;テキスト: &lt;code&gt;{"type": "text", ...}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;画像: &lt;code&gt;{"type": "image_url", ...}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;動画: &lt;code&gt;{"type": "video_url", ...}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;音声: &lt;code&gt;{"type": "audio_url", ...}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;制限：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;画像: 最大9枚（各30MB）&lt;/li&gt;
&lt;li&gt;動画: 最大3本（各2〜15秒/50MB）&lt;/li&gt;
&lt;li&gt;音声: 最大3本（MP3/各15MB）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Match the visual style of the reference clip and add the provided background audio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/style-reference.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/motion-reference.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;audio_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;audio_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/background-music.mp3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;動画参照を入れると料金ティアが下がります（V2V: 約3.90ドル/100万トークン）。&lt;/p&gt;

&lt;h2&gt;
  
  
  ネイティブ音声生成
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;generate_audio: true&lt;/code&gt;を指定すると、音声付き映像を生成します。&lt;br&gt;&lt;br&gt;
リップシンクや環境音も自動生成。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_generation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;doubao-seedance-2-0-260128&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A street musician plays guitar outside a cafe in Paris, crowds passing by, city sounds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1080p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;generate_audio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;watermark&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;トークン消費は若干増加します。&lt;/p&gt;

&lt;h2&gt;
  
  
  解像度、アスペクト比、期間の制御
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;resolution&lt;/strong&gt;: &lt;code&gt;"480p"&lt;/code&gt;, &lt;code&gt;"720p"&lt;/code&gt;, &lt;code&gt;"1080p"&lt;/code&gt;, &lt;code&gt;"2K"&lt;/code&gt;（デフォルト &lt;code&gt;"1080p"&lt;/code&gt;、高いほど高コスト）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ratio&lt;/strong&gt;: &lt;code&gt;"16:9"&lt;/code&gt;, &lt;code&gt;"9:16"&lt;/code&gt;, &lt;code&gt;"4:3"&lt;/code&gt;, &lt;code&gt;"3:4"&lt;/code&gt;, &lt;code&gt;"21:9"&lt;/code&gt;, &lt;code&gt;"1:1"&lt;/code&gt;, &lt;code&gt;"adaptive"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;duration&lt;/strong&gt;: 4～15（秒、デフォルト5）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;高速モデルはプロンプト試行に、本番は標準モデル推奨。&lt;/p&gt;

&lt;h2&gt;
  
  
  応答からの費用の読み取り
&lt;/h2&gt;

&lt;p&gt;成功時のレスポンス例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"completion_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;246840&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_tokens"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;246840&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;15秒/1080p: 約308,880トークン&lt;/li&gt;
&lt;li&gt;5秒/1080p: 約102,960トークン&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&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;費用 (T2V/I2V)&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;~103,000&lt;/td&gt;
&lt;td&gt;~0.47元 / ~$0.93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10秒&lt;/td&gt;
&lt;td&gt;~206,000&lt;/td&gt;
&lt;td&gt;~9.48元 / ~$1.32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15秒&lt;/td&gt;
&lt;td&gt;~309,000&lt;/td&gt;
&lt;td&gt;~14.21元 / ~$1.97&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;V2V: ~3.90ドル/100万トークン。&lt;br&gt;&lt;br&gt;
&lt;code&gt;completion_tokens&lt;/code&gt;でコスト追跡可能です。&lt;/p&gt;

&lt;h2&gt;
  
  
  重要：動画は24時間以内にダウンロード
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;video_url&lt;/code&gt;は24時間で失効。&lt;br&gt;&lt;br&gt;
完了したら即ダウンロードしてください。&lt;br&gt;&lt;br&gt;
&lt;code&gt;execution_expires_after&lt;/code&gt;はタスク自体の有効期間（例：48時間）ですが、動画URLは24時間のみ。&lt;/p&gt;

&lt;h2&gt;
  
  
  ApidogでSeedance APIをテストする方法
&lt;/h2&gt;

&lt;p&gt;非同期タスクパターンは、POSTとGETの連携が必要です。Apidogの「テストシナリオ」機能で自動化できます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7qpzpmtge0bkzzppks6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr7qpzpmtge0bkzzppks6.png" alt="Apidog テストシナリオ"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;具体的な流れ：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ステップ1：テストシナリオ作成&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;「テスト」→新規シナリオ（例: Seedance 2.0動画生成）&lt;/li&gt;
&lt;li&gt;環境変数&lt;code&gt;ARK_API_KEY&lt;/code&gt;を設定（&lt;code&gt;{{ARK_API_KEY}}&lt;/code&gt;で参照）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ステップ2：送信リクエスト追加&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;POST &lt;code&gt;/contents/generations/tasks&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Authorization: &lt;code&gt;Bearer {{ARK_API_KEY}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;JSONボディでモデル/コンテンツ指定&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ステップ3：タスクID抽出&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;応答の&lt;code&gt;$.id&lt;/code&gt;を&lt;code&gt;TASK_ID&lt;/code&gt;環境変数に抽出&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ステップ4：待機&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;30秒の遅延を追加（モデル初期処理用）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ステップ5：Forループでポーリング&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;最大20回

&lt;ol&gt;
&lt;li&gt;GET &lt;code&gt;/contents/generations/tasks/{{TASK_ID}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;10秒遅延&lt;/li&gt;
&lt;li&gt;Break条件: &lt;code&gt;$.status == "succeeded"&lt;/code&gt;または&lt;code&gt;"failed"&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ステップ6：アサーション追加&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$.status == "succeeded"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$.content.video_url&lt;/code&gt;が空でない&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apidogは各ステップ・抽出・テスト結果をレポート化します。&lt;br&gt;&lt;br&gt;
cURLコマンドからのインポートもサポート。&lt;/p&gt;

&lt;h2&gt;
  
  
  料金の内訳：10秒の動画の費用
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;タスクタイプ&lt;/th&gt;
&lt;th&gt;料金（100万トークンあたり）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1080pでのT2V / I2V&lt;/td&gt;
&lt;td&gt;46元（約6.40ドル）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V2V（動画参照入力）&lt;/td&gt;
&lt;td&gt;28元（約3.90ドル）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&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;費用 (T2V/I2V)&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;~103,000&lt;/td&gt;
&lt;td&gt;~0.47元 / ~$0.93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10秒&lt;/td&gt;
&lt;td&gt;~206,000&lt;/td&gt;
&lt;td&gt;~9.48元 / ~$1.32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15秒&lt;/td&gt;
&lt;td&gt;~309,000&lt;/td&gt;
&lt;td&gt;~14.21元 / ~$1.97&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;新規アカウントには約8本の15秒動画生成分の無料トライアルあり。&lt;br&gt;&lt;br&gt;
開発時は解像度を720pや480pに落とすことでコスト削減可能です。&lt;/p&gt;

&lt;h2&gt;
  
  
  よくあるエラーとその解決策
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;429 Too Many Requests&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
→ 同時実行制限。指数バックオフ（10秒→20秒→…最大60秒）でリトライ。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;status: "failed"&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
→ プロンプト違反/画像破損/パラメータ不正等。入力内容を見直して再実行を。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;status: "expired"&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
→ キュー待ち時間超過。混雑時発生。再送信のみ。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;video_urlの403エラー&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
→ 24時間超過でURL失効。再生成が必要。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;シードの再現性&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
→ 応答の&lt;code&gt;seed&lt;/code&gt;値を保存して同条件で再リクエストすると再現性アップ。&lt;/p&gt;

&lt;h2&gt;
  
  
  結論
&lt;/h2&gt;

&lt;p&gt;Seedance 2.0 APIは高性能な動画生成をプログラムから自動化できます。  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;非同期タスクパターンのPOST→ポーリング→即ダウンロード&lt;/li&gt;
&lt;li&gt;マルチモーダル入力やネイティブ音声など、Web UIではできないワークフローを構築可能&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;本番前にApidogでE2Eテストシナリオを構築し、ポーリングや抽出、URL有効期限の問題を事前検証しましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: &lt;code&gt;doubao-seedance-2-0-260128&lt;/code&gt;と&lt;code&gt;doubao-seedance-2-0-fast-260128&lt;/code&gt;の違いは？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 標準モデルは高品質、本番用。高速モデルは速いが低品質。プロンプト検証は高速モデルで、最終出力は標準モデル推奨。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Seedance 2.0は中国国外で使える？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: エンドポイントは北京リージョン。国外開発者も利用可能だが遅延あり。地理制限はVolcengine利用規約参照。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: 複数クリップで長い動画を作りたい&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 各生成で&lt;code&gt;return_last_frame: true&lt;/code&gt;を指定。最終フレーム画像を次の最初のフレームに使い、動画編集で連結。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: ネイティブ音声生成は高コスト？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: トークン消費はやや増加。&lt;code&gt;generate_audio: true&lt;/code&gt;オフの同一リクエストと比較し、&lt;code&gt;completion_tokens&lt;/code&gt;で確認可能。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: ポーリングではなくWebhook利用は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 送信時に&lt;code&gt;callback_url&lt;/code&gt;指定で、完了時に自動通知。パイプライン大量処理時に有効。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: 画像9枚制限を超過すると？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 400エラー。9枚以内に制限。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: シード値で完全再現できる？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: シード値で再現性は高まるが、パラメータやモデルバージョンが変わると完全一致は保証されません。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: 複数タスクの費用管理は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: &lt;code&gt;completion_tokens&lt;/code&gt;×レートでコスト算出。APIに支出ダッシュボードはないので、アプリ側で集計・記録を。&lt;/p&gt;




&lt;p&gt;ApidogでのAPI連携テストには&lt;br&gt;&lt;br&gt;
&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog公式サイト&lt;/a&gt;&lt;br&gt;&lt;br&gt;
を活用してください。  &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Grokテキストから動画APIの使い方【完全ガイド】</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Fri, 03 Apr 2026 08:40:51 +0000</pubDate>
      <link>https://dev.to/aakira/groktekisutokaradong-hua-apinoshi-ifang-wan-quan-gaido-45hb</link>
      <guid>https://dev.to/aakira/groktekisutokaradong-hua-apinoshi-ifang-wan-quan-gaido-45hb</guid>
      <description>&lt;h2&gt;
  
  
  要するに
&lt;/h2&gt;

&lt;p&gt;Grokのテキスト-to-ビデオAPIは、テキストプロンプトからビデオを生成します。&lt;code&gt;POST /v1/videos/generations&lt;/code&gt;を呼び出すとすぐに&lt;code&gt;request_id&lt;/code&gt;が返され、ステータスが&lt;code&gt;"done"&lt;/code&gt;になるまで&lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt;でポーリングします。モデル名は&lt;code&gt;grok-imagine-video&lt;/code&gt;で、料金は480pで1秒あたり0.05ドルから。xAI Python SDKを使えばポーリング処理も自動化できます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;今すぐApidogを試す&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  はじめに
&lt;/h2&gt;

&lt;p&gt;xAIは2026年1月だけで12億本のビデオを生成しました。これは、2026年1月28日にGrokのテキスト-to-ビデオAPIをリリースしてから最初の1ヶ月の成果です。このモデルは同月、Artificial Analysisのテキスト-to-ビデオリーダーボードで1位を獲得しました。大規模かつ実績あるインフラを前提に使えます。&lt;/p&gt;

&lt;p&gt;このガイドでは、リクエストの作成、結果のポーリング、パラメータ調整、プロンプト設計、参照画像の使い方、ビデオの延長・編集手順、適切なAPI選択まで具体的に解説します。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;APIは非同期です。&lt;/strong&gt; フロントエンドはビデオの生成完了まで何も表示できません。UIを開発・テストするには、APIのポーリングフローを模倣できる環境が必須です。&lt;strong&gt;ApidogのSmart Mock&lt;/strong&gt;なら生成・ポーリング両エンドポイントを簡単にモック可能。バックエンド開発中でもUIやポーリングロジックを実装できます。詳細は後述のテストセクション参照。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Grokテキスト-to-ビデオAPIとは？
&lt;/h2&gt;

&lt;p&gt;Grokテキスト-to-ビデオAPIは、&lt;code&gt;https://api.x.ai&lt;/code&gt;で提供されるxAIのメディア生成APIの一つです。テキストプロンプトのみで&lt;code&gt;grok-imagine-video&lt;/code&gt;モデルが短い動画を生成します（ソース画像不要）。&lt;/p&gt;

&lt;p&gt;同期型の画像生成エンドポイント（&lt;code&gt;POST /v1/images/generations&lt;/code&gt;、モデル&lt;code&gt;grok-imagine-image&lt;/code&gt;、1画像0.02ドル）も併設されています。さらに、既存ビデオの延長や編集用エンドポイントも利用可能です。&lt;/p&gt;

&lt;p&gt;テキスト-to-ビデオは「言葉だけで」構図・動き・スタイルをゼロから生成します。画像-to-ビデオのようにソース画像を渡したい場合は、&lt;a href="http://apidog.com/blog/grok-image-to-video-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Grok画像-to-ビデオAPIガイド&lt;/a&gt;を参照してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  テキスト-to-ビデオ生成の仕組み（非同期パターン解説）
&lt;/h2&gt;

&lt;p&gt;ビデオ生成APIは&lt;strong&gt;非同期パターン&lt;/strong&gt;です。フローは以下の通り：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;プロンプトを含めてPOSTリクエスト送信&lt;/li&gt;
&lt;li&gt;即座に&lt;code&gt;request_id&lt;/code&gt;が返却&lt;/li&gt;
&lt;li&gt;サーバー側でビデオ生成開始&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;request_id&lt;/code&gt;を使いGETエンドポイントをポーリング&lt;/li&gt;
&lt;li&gt;ステータスが&lt;code&gt;"done"&lt;/code&gt;になればビデオURLを取得&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;この設計により、HTTP接続を短時間で済ませ、進捗確認やUIの切り替えが柔軟に行えます。ローディングインジケーターや中間状態の実装が必要です。&lt;/p&gt;

&lt;h2&gt;
  
  
  前提条件
&lt;/h2&gt;

&lt;p&gt;実装前に以下を準備します。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;xAIアカウント&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt;で作成。API利用には課金情報登録が必要です。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;APIキー&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
コンソールでAPIキーを生成し、安全な場所に保管。全リクエストでBearer認証として使います。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvi4f1gdevs2pth1c3l0f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvi4f1gdevs2pth1c3l0f.png" alt="xAIコンソールのAPIキーページを示すスクリーンショット"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;APIキーは環境変数に設定しましょう。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_api_key_here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;オプションでxAI Python SDKをインストール可能です。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;xai-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  初めてのテキスト-to-ビデオ リクエスト
&lt;/h2&gt;

&lt;h3&gt;
  
  
  curlでリクエスト
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/generations &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "prompt": "A golden retriever running through autumn leaves in slow motion, cinematic lighting"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;即座に次のようなレスポンスが返却されます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python (requests) での実装例
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A golden retriever running through autumn leaves in slow motion, cinematic lighting&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Generation started. Request ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ビデオ結果のポーリング
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;request_id&lt;/code&gt;を受け取ったら、&lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt;を一定間隔で呼び出してステータスが&lt;code&gt;"done"&lt;/code&gt;になるまで待ちます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;"processing"&lt;/code&gt; … 生成中&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"done"&lt;/code&gt; … 完了、ビデオURLあり&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"failed"&lt;/code&gt; … 失敗&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ポーリングループの実装（Python例）
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;ビデオ生成が完了するまでポーリング&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;progress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;progress&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Attempt &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: status=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, progress=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;progress&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video generation failed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TimeoutError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video not ready after &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;max_attempts&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; attempts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ワークフロー例
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Request ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video ready: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;video_url&lt;/span&gt;

&lt;span class="n"&gt;video_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A timelapse of a city skyline at sunset transitioning to night, aerial view&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ポーリング完了時のレスポンス例
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vidgen.x.ai/....mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"respect_moderation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500000000&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  xAI Python SDKの活用
&lt;/h2&gt;

&lt;p&gt;手動ポーリングを省略したい場合はxAI SDKが便利です。&lt;code&gt;client.video.generate()&lt;/code&gt;が完了までブロックします。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;xai_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;A golden retriever running through autumn leaves in slow motion&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;720p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;aspect_ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Duration: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;カスタムポーリングや進捗制御が必要な場合はrequests版を利用してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  ビデオ生成のための効果的なプロンプト設計
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;シーン記述&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
被写体と設定を明確に記述。「雨に濡れた窓の横の木製テーブルに置かれた白いセラミックのコーヒーマグ」など。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;動きの指示&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
「湯気が立ち上るマグカップの周りをカメラがゆっくり旋回する」など、動きの明示が重要。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;カメラスタイル&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
「クローズアップ」「ドローンビュー」など映画的な表現を加える。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ライティング・ムード&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
「ゴールデンアワー」「ネオンライト」「憂鬱な雰囲気」などで見た目・雰囲気を指定。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;スタイル参照&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
「シネマティック」「アニメ」「ハイパーラプス」など、スタイル名も積極的に活用。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  効果的なプロンプト例
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A lone astronaut floats past the International Space Station,
tether drifting behind them. The camera tracks slowly
alongside, showing Earth below. Cinematic, IMAX quality,
warm sunrise light reflecting off the visor.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  解像度・持続時間・アスペクト比の制御
&lt;/h2&gt;

&lt;p&gt;リクエスト時に以下のパラメータで出力仕様を調整できます。&lt;/p&gt;

&lt;h3&gt;
  
  
  持続時間
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;範囲：1〜15秒（デフォルト6秒）。長いほどコスト増。&lt;/p&gt;

&lt;h3&gt;
  
  
  解像度
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"720p"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;"480p"&lt;/code&gt;（デフォ、開発・テスト向け）&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"720p"&lt;/code&gt;（本番/高品質用）&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  アスペクト比
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"aspect_ratio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"9:16"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&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;16:9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;デスクトップ、YouTube、プレゼン資料（デフォ）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;9:16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TikTok、Instagramリール、モバイル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1:1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Instagramフィード、ソーシャルカード&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;4:3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;クラシック映像、プレゼン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3:4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ポートレート系モバイル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;3:2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一般的な写真比率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;2:3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ポートレート写真&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  フルパラメータ例
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/generations &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "prompt": "A coastal town at dawn, waves breaking gently on a rocky shore",
    "duration": 10,
    "resolution": "720p",
    "aspect_ratio": "16:9"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  参照画像でビデオスタイルを指定する
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;reference_images&lt;/code&gt;パラメータで最大7枚の画像URLを指定可能。これらは主題ではなく、スタイルや色味のガイドとして機能します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"grok-imagine-video"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A coastal town at dawn, waves breaking gently on a rocky shore"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reference_images"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/my-style-reference.jpg"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/color-palette-reference.jpg"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;一貫したスタイルの画像セットが最も効果的。プロンプトが主で、画像は色・構図・テクスチャに影響。&lt;/p&gt;

&lt;h2&gt;
  
  
  生成ビデオの延長と編集
&lt;/h2&gt;

&lt;p&gt;xAIには生成済みビデオの操作用エンドポイントが2種類あります。&lt;/p&gt;

&lt;h3&gt;
  
  
  ビデオの延長
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;POST /v1/videos/extensions&lt;/code&gt;&lt;br&gt;&lt;br&gt;
既存ビデオの&lt;code&gt;request_id&lt;/code&gt;と新しいプロンプトをセットで送信し、映像を追加できます。複数回呼び出すことで15秒以上の動画も実現可能。&lt;/p&gt;
&lt;h3&gt;
  
  
  ビデオの編集
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;POST /v1/videos/edits&lt;/code&gt;&lt;br&gt;&lt;br&gt;
既存ビデオをプロンプトで編集できます（スタイル変更・シーン修正など）。&lt;/p&gt;

&lt;p&gt;いずれも&lt;code&gt;request_id&lt;/code&gt;が返る非同期パターンです。&lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt;で結果を取得。&lt;/p&gt;
&lt;h2&gt;
  
  
  APIレスポンスからコスト取得
&lt;/h2&gt;

&lt;p&gt;完了時レスポンスの&lt;code&gt;usage.cost_in_usd_ticks&lt;/code&gt;を10,000,000で割るとUSD換算できます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;cost_in_usd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cost_in_usd_ticks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10_000_000&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cost: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cost_in_usd&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 出力例: Cost: $0.0500
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  料金表
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;解像度&lt;/th&gt;
&lt;th&gt;1秒あたり&lt;/th&gt;
&lt;th&gt;10秒クリップ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;480p&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;720p&lt;/td&gt;
&lt;td&gt;$0.07&lt;/td&gt;
&lt;td&gt;$0.70&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;500000000&lt;/code&gt;ティック＝$0.50、480pの10秒クリップに相当します。全リクエストのコストを自前で集計し、ダッシュボードへ反映可能です。&lt;/p&gt;

&lt;h2&gt;
  
  
  ApidogでGrokビデオAPIをテストする方法
&lt;/h2&gt;

&lt;p&gt;非同期ポーリングはテストが難しいですが、&lt;strong&gt;ApidogのSmart Mock&lt;/strong&gt;で効率化できます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmit5bu2s8zqtmpzxfpbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmit5bu2s8zqtmpzxfpbs.png" alt="ApidogのSmart Mock機能がビデオ生成のモックレスポンスを表示しているスクリーンショット"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ユースケース1：フロントエンド開発用Smart Mock
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ApidogのSmart Mock&lt;/a&gt;でエンドポイントのスキーマを定義すれば、即座にリアルなモックレスポンスが得られます。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;生成エンドポイントのモック例：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;POST /v1/videos/generations&lt;/code&gt;
レスポンススキーマに&lt;code&gt;request_id&lt;/code&gt;（文字列）を設定。自動でUUID風の値が返る。
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ポーリングエンドポイントのモック例：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt;
&lt;code&gt;status&lt;/code&gt;、&lt;code&gt;video.url&lt;/code&gt;、&lt;code&gt;video.duration&lt;/code&gt;、&lt;code&gt;progress&lt;/code&gt;、&lt;code&gt;usage.cost_in_usd_ticks&lt;/code&gt;などを含むスキーマ・カスタムレスポンス例。
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vidgen.x.ai/mock-video-12345.mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"respect_moderation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cost_in_usd_ticks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;400000000&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;開発のポイント：&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;"status": "processing"&lt;/code&gt;/&lt;code&gt;"done"&lt;/code&gt;/&lt;code&gt;"failed"&lt;/code&gt;のバリエーションでUI状態をテスト&lt;/li&gt;
&lt;li&gt;開発中はAPIクレジット消費ゼロ&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ユースケース2：ポーリングループのテストシナリオ
&lt;/h3&gt;

&lt;p&gt;統合テストもApidog内で自動化できます。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;生成リクエスト追加&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;POST /v1/videos/generations&lt;/code&gt;→JSONPathで&lt;code&gt;request_id&lt;/code&gt;を抽出し変数保存&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ポーリング追加&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;GET /v1/videos/{{videoRequestId}}&lt;/code&gt;をForループで繰り返し、&lt;code&gt;status == "done"&lt;/code&gt;でブレーク。各ループで5秒待機。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;アサーション&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
最後のレスポンスで&lt;code&gt;$.video.url&lt;/code&gt;が空でないか検証。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;このシナリオをCIに組み込めば、回帰テストも高速化できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  テキスト-to-ビデオ vs 画像-to-ビデオ：使い分け
&lt;/h2&gt;

&lt;p&gt;どちらも&lt;code&gt;grok-imagine-video&lt;/code&gt;モデル利用ですが、用途が異なります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;テキスト-to-ビデオが適するケース：&lt;/strong&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;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;画像-to-ビデオが適するケース：&lt;/strong&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;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;重要：&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
テキスト-to-ビデオはゼロから生成、画像-to-ビデオは既存画像に動きを付与。詳細は&lt;a href="https://apidog.com/api-mocking/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;こちらのガイド&lt;/a&gt;参照。&lt;/p&gt;

&lt;p&gt;両対応UIの場合、入力内容に応じてAPIルーティングを自動化しましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  よくあるエラーと対処法
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;401 Unauthorized&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
APIキーの指定ミス・期限切れ。&lt;code&gt;Bearer YOUR_XAI_API_KEY&lt;/code&gt;形式・有効性を再確認。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;429 Too Many Requests&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
レートリミット超過。1分60リクエスト・1秒1リクエスト。ポーリング間隔（5秒以上）を調整。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;status: "failed"&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
モデレーション違反の可能性。&lt;code&gt;respect_moderation&lt;/code&gt;が&lt;code&gt;true&lt;/code&gt;の場合はプロンプトを修正。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ビデオURL 404&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
生成ビデオURLは短期間有効。取得後すぐに自ストレージへ保存。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;空白/静止ビデオ&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
曖昧なプロンプトや動きの記述がない場合。動きやシーンを明確に指定する。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;生成遅延&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
720pや長尺は時間がかかる。開発・テストでは短尺＆480p推奨。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  まとめ
&lt;/h2&gt;

&lt;p&gt;Grokテキスト-to-ビデオAPIは、テキストだけで動画生成を実現します。非同期パターンの理解が重要です。&lt;br&gt;&lt;br&gt;
&lt;code&gt;request_id&lt;/code&gt;でポーリングし、完了したらビデオURLを取得・保存。&lt;br&gt;&lt;br&gt;
持続時間・解像度・アスペクト比・参照画像などパラメータも柔軟に指定可能です。&lt;/p&gt;

&lt;p&gt;コスト追跡は&lt;code&gt;cost_in_usd_ticks&lt;/code&gt;から計算。&lt;br&gt;&lt;br&gt;
開発時はApidogでAPIモックサーバー・テストシナリオを構築し、実際のビデオ生成待ちやクレジット消費なしでフロントエンド開発・CIテストが可能です。&lt;/p&gt;

&lt;h2&gt;
  
  
  よくある質問
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: テキスト-to-ビデオ生成にはどのモデル名を使う？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: &lt;code&gt;grok-imagine-video&lt;/code&gt;を指定。&lt;code&gt;/v1/videos/generations&lt;/code&gt;で必須。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: ビデオ生成にかかる時間は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 持続時間・解像度による。480pの短尺は30秒未満、720p長尺は数分。5〜10秒おきのポーリング推奨。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: 15秒超のビデオ生成は可能？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 単一リクエスト不可。最大&lt;code&gt;duration&lt;/code&gt;は15秒。&lt;code&gt;/v1/videos/extensions&lt;/code&gt;で延長。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: 生成ビデオのダウンロード方法は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: ポーリング完了時の&lt;code&gt;result.video.url&lt;/code&gt;から即時ダウンロード。URLは一時的。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: プロンプトがモデレーション違反の場合？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: &lt;code&gt;status: "failed"&lt;/code&gt;で完了。&lt;code&gt;respect_moderation&lt;/code&gt;が&lt;code&gt;true&lt;/code&gt;ならプロンプト修正で再試行。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: ビデオAPIの無料枠は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: ビデオは1秒ごとに課金。無料枠はなし。新規クレジットは&lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt;で確認。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: &lt;code&gt;reference_images&lt;/code&gt;とソース画像の違いは？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 参照画像はスタイルガイド用。画像-to-ビデオは画像そのものが最初のフレーム。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: クレジット消費なしでポーリングテストするには？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: ApidogのSmart Mockで生成・ポーリング両エンドポイントをモック。&lt;code&gt;"processing"&lt;/code&gt;/&lt;code&gt;"done"&lt;/code&gt;状態のレスポンスを切り替えれば、実API不要でテスト可能です。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Grok画像から動画APIの使い方【ステップバイステップガイド】</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Fri, 03 Apr 2026 08:36:04 +0000</pubDate>
      <link>https://dev.to/aakira/grokhua-xiang-karadong-hua-apinoshi-ifang-sutetupubaisutetupugaido-3kh3</link>
      <guid>https://dev.to/aakira/grokhua-xiang-karadong-hua-apinoshi-ifang-sutetupubaisutetupugaido-3kh3</guid>
      <description>&lt;h2&gt;
  
  
  要約
&lt;/h2&gt;

&lt;p&gt;Grok画像-動画APIは、&lt;code&gt;grok-imagine-video&lt;/code&gt;モデルで静止画像を動画クリップにアニメーション化します。画像URL、プロンプト、オプション設定を&lt;code&gt;https://api.x.ai/v1/videos/generations&lt;/code&gt;にPOSTし、&lt;code&gt;request_id&lt;/code&gt;が即時返却されます。その後、&lt;code&gt;GET /v1/videos/{request_id}&lt;/code&gt;で&lt;code&gt;status&lt;/code&gt;が&lt;code&gt;"done"&lt;/code&gt;になるまでポーリングします。動画の長さは1～15秒、料金は480p出力で1秒あたり0.05ドルからです。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidogを今すぐ試す&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  はじめに
&lt;/h2&gt;

&lt;p&gt;2026年1月28日、xAIは&lt;code&gt;grok-imagine-video&lt;/code&gt;モデルを公開APIアクセス向けにリリースしました。公開から1ヶ月で12億本の動画生成を達成し、Artificial Analysisのテキスト-動画リーダーボードで1位を獲得しました。写真と説明プロンプトをAPIに送信するだけで、その写真を短い動画クリップとしてMP4ダウンロードできます。&lt;/p&gt;

&lt;p&gt;このAPIは非同期フロー（ジョブ送信→完了までポーリング）を採用しており、POSTの200レスポンスのみでは統合テストは不十分です。&lt;code&gt;"processing"&lt;/code&gt;, &lt;code&gt;"done"&lt;/code&gt;, &lt;code&gt;"failed"&lt;/code&gt;の各状態を現実的なネットワーク条件下で正しく処理することが重要です。&lt;/p&gt;

&lt;p&gt;Apidogのテストシナリオなら、&lt;code&gt;/v1/videos/generations&lt;/code&gt;のPOST→&lt;code&gt;request_id&lt;/code&gt;抽出→&lt;code&gt;status == "done"&lt;/code&gt;までのポーリングループ構築→動画URLのアサートまで一連の自動テストを簡単に実装可能です。本記事後半のハンズオンに沿って、Apidogでテストを始めましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  Grok画像-動画APIとは？
&lt;/h2&gt;

&lt;p&gt;Grok画像-動画APIは、xAIの動画生成製品の1機能です。&lt;code&gt;grok-imagine-video&lt;/code&gt;モデルを使用し、画像を動画の開始フレームとして受け付けます。画像とテキストプロンプトからシーンを自然にアニメーション化します。&lt;/p&gt;

&lt;p&gt;APIエンドポイント：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST https://api.x.ai/v1/videos/generations
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;認証はBearerトークンです。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer YOUR_XAI_API_KEY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;APIキーは&lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;公式xAIコンソール&lt;/a&gt;から取得します。&lt;/p&gt;

&lt;p&gt;同じエンドポイントでテキスト-動画（&lt;code&gt;image&lt;/code&gt;省略）、動画延長、編集も可能です。&lt;/p&gt;

&lt;h2&gt;
  
  
  画像から動画への処理フロー
&lt;/h2&gt;

&lt;p&gt;リクエストボディの&lt;code&gt;image&lt;/code&gt;パラメータは、出力動画の&lt;strong&gt;最初のフレーム&lt;/strong&gt;を指定します。モデルはこの画像を変更せずに開始し、プロンプトに基づいて動きを生成します。&lt;/p&gt;

&lt;p&gt;例：山湖の写真＋「朝霧が漂い、水面に穏やかな波紋」→最初のフレームは写真、その後のフレームで水や霧が動く。&lt;/p&gt;

&lt;ul&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;/ul&gt;

&lt;h2&gt;
  
  
  前提条件
&lt;/h2&gt;

&lt;p&gt;APIコール前に以下を準備してください。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://console.x.ai" rel="noopener noreferrer"&gt;console.x.ai&lt;/a&gt;の&lt;strong&gt;xAIアカウント&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APIキー&lt;/strong&gt;（環境変数で管理推奨）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python 3.8+&lt;/strong&gt;または&lt;strong&gt;Node.js 18+&lt;/strong&gt;（本記事例で使用）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;公開アクセス可能な画像URL&lt;/strong&gt;またはbase64データURI&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;画像例：&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozcnsdoclf1obpc6q6w3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozcnsdoclf1obpc6q6w3.png" alt="サンプル画像"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;APIキーを環境変数にセット：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_key_here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;xAI Python SDKを使う場合はインストール：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;xai-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;生HTTPの場合、&lt;code&gt;requests&lt;/code&gt;（Python）または&lt;code&gt;fetch&lt;/code&gt;（Node.js）以外は不要です。&lt;/p&gt;

&lt;h2&gt;
  
  
  最初の画像-動画リクエストを行う
&lt;/h2&gt;

&lt;h3&gt;
  
  
  curlでの実装例
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/generations &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "prompt": "Gentle waves move across the surface, morning mist rises slowly",
    "image": {
      "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/24701-nature-natural-beauty.jpg/1280px-24701-nature-natural-beauty.jpg"
    },
    "duration": 6,
    "resolution": "720p",
    "aspect_ratio": "16:9"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;レスポンス例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"d97415a1-5796-b7ec-379f-4e6819e08fdf"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python（生HTTPリクエスト）
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gentle waves move across the surface, morning mist rises slowly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/24701-nature-natural-beauty.jpg/1280px-24701-nature-natural-beauty.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;duration&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resolution&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;720p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aspect_ratio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai/v1/videos/generations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;request_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;request_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Job started: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  base64画像を使いたい場合
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my_image.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;encoded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data:image/jpeg;base64,&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;encoded&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  結果のポーリング
&lt;/h2&gt;

&lt;p&gt;動画生成は非同期です。&lt;code&gt;request_id&lt;/code&gt;で進捗をポーリングします。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://api.x.ai/v1/videos/{request_id}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&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;"processing"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;動画レンダリング中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"done"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;動画完成・URLが応答に含まれる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"failed"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;生成失敗&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;レスポンス例（完了時）：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"done"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://vidgen.x.ai/....mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  完全なPythonポーリングループ
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.x.ai/v1/videos/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | Progress: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;progress&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video generation failed for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 使用例
&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;poll_video&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Duration: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;duration&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：ポーリング間隔は5秒以上推奨。APIは1分60回・1秒1回までです。&lt;/p&gt;

&lt;h2&gt;
  
  
  xAI Python SDKの利用
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;xai-sdk&lt;/code&gt;ならポーリングやエラー処理も自動。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;xai_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XAI_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;grok-imagine-video&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gentle waves move across the surface, morning mist rises slowly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com/landscape.jpg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;720p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;aspect_ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;16:9&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Video URL: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Duration: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;細かいポーリングやリトライ設定をしたい場合は生HTTPを選択してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  解像度、期間、アスペクト比の制御
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;期間&lt;/strong&gt;: &lt;code&gt;duration&lt;/code&gt;（1～15秒、デフォルト6秒）&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;長いほどコスト増。10秒は1秒の10倍。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;解像度&lt;/strong&gt;: &lt;code&gt;"480p"&lt;/code&gt;（デフォルト）, &lt;code&gt;"720p"&lt;/code&gt;&lt;br&gt;
| 値      | 説明                      |&lt;br&gt;
|---------|---------------------------|&lt;br&gt;
| "480p"  | 低コスト、高速             |&lt;br&gt;
| "720p"  | 高品質、1秒0.07ドル        |&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"720p"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;アスペクト比&lt;/strong&gt;: &lt;code&gt;aspect_ratio&lt;/code&gt;&lt;br&gt;
| 値     | 用途                           |&lt;br&gt;
|--------|-------------------------------|&lt;br&gt;
| "16:9" | デフォルト、ワイド              |&lt;br&gt;
| "9:16" | 縦型、SNSストーリー             |&lt;br&gt;
| "1:1"  | インスタやサムネイル            |&lt;br&gt;
| "4:3"  | クラシック写真                  |&lt;br&gt;
| "3:4"  | ポートレート                    |&lt;br&gt;
| "3:2"  | 標準写真                        |&lt;br&gt;
| "2:3"  | 縦型標準                        |&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;image&lt;/code&gt;を指定するとデフォルトで画像比率に自動設定。変更したい場合は明示指定。&lt;/p&gt;




&lt;h2&gt;
  
  
  スタイルガイド用の参照画像
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;image&lt;/code&gt;&lt;/strong&gt;: 最初のフレームとなる画像&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;reference_images&lt;/code&gt;&lt;/strong&gt;: スタイルや雰囲気をガイドする画像配列（最大7枚）。フレームにはならない。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"grok-imagine-video"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A product rotating slowly on a clean white surface"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/product-shot.jpg"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reference_images"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/brand-style-reference-1.jpg"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/lighting-reference.jpg"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"720p"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;参照画像だけで、&lt;code&gt;image&lt;/code&gt;なしも可能です（その場合はテキスト-動画生成＋スタイルガイド）。&lt;/p&gt;

&lt;h2&gt;
  
  
  動画の延長と編集
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;動画の延長&lt;/strong&gt;: 既存動画に追加生成。15秒制限以上の動画を生成したい場合に有効。&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/extensions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "video_id": "your_original_request_id",
    "prompt": "The mist continues to lift as sunlight breaks through",
    "duration": 5
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;結果は同じ非同期パターンでポーリング。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;動画の編集&lt;/strong&gt;: 既存動画の一部をプロンプトで変更。&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.x.ai/v1/videos/edits &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$XAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "grok-imagine-video",
    "video_id": "your_original_request_id",
    "prompt": "Change the sky to a dramatic sunset with deep orange tones"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;こちらもポーリングで完了を確認。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  料金内訳：10秒の動画の場合
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&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;/td&gt;
&lt;td&gt;1枚あたり0.002ドル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;480p出力&lt;/td&gt;
&lt;td&gt;1秒あたり0.05ドル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;720p出力&lt;/td&gt;
&lt;td&gt;1秒あたり0.07ドル&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;10秒の720p動画例&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;入力画像：0.002ドル&lt;/li&gt;
&lt;li&gt;出力：10秒 × 0.07ドル = 0.70ドル&lt;/li&gt;
&lt;li&gt;合計：0.702ドル&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6秒の480p動画例&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;入力画像：0.002ドル&lt;/li&gt;
&lt;li&gt;出力：6秒 × 0.05ドル = 0.30ドル&lt;/li&gt;
&lt;li&gt;合計：0.302ドル&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;同じ画像URLでも毎回入力画像料金がかかります。テキスト-動画は画像入力料金（0.002ドル）は不要。&lt;/p&gt;

&lt;h2&gt;
  
  
  ApidogでGrok動画API統合をテストする方法
&lt;/h2&gt;

&lt;p&gt;非同期APIのテストには以下の自動化フローをApidogで構築します。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;生成POSTで&lt;code&gt;request_id&lt;/code&gt;を取得&lt;/li&gt;
&lt;li&gt;ポーリングGETで&lt;code&gt;"processing"&lt;/code&gt;状態をハンドリング&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"done"&lt;/code&gt;後に動画URLの存在をアサート&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;テストシナリオ構築手順&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ステップ1&lt;/strong&gt;: Apidogで新規テストシナリオ作成（例:「Grok画像-動画非同期フロー」）&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ステップ2&lt;/strong&gt;: 生成POSTリクエスト追加&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL: &lt;code&gt;https://api.x.ai/v1/videos/generations&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;メソッド: POST&lt;/li&gt;
&lt;li&gt;ヘッダー: &lt;code&gt;Authorization: Bearer {{xai_api_key}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ボディ(JSON)例:
&lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"grok-imagine-video"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Gentle mist rises from the water as light filters through the trees"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/your-test-image.jpg"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resolution"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"480p"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;ステップ3&lt;/strong&gt;: &lt;code&gt;request_id&lt;/code&gt;抽出（変数抽出プロセッサで&lt;code&gt;$.request_id&lt;/code&gt;→&lt;code&gt;video_request_id&lt;/code&gt;へ）&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;ステップ4&lt;/strong&gt;: ForループでポーリングGETリクエスト&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL: &lt;code&gt;https://api.x.ai/v1/videos/{{video_request_id}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ヘッダー: &lt;code&gt;Authorization: Bearer {{xai_api_key}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;変数抽出: &lt;code&gt;$.status&lt;/code&gt;→&lt;code&gt;video_status&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;待機プロセッサ5000ms追加&lt;/li&gt;
&lt;li&gt;ブレイク条件: &lt;code&gt;{{video_status}} == "done"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;ステップ5&lt;/strong&gt;: 完了後に動画URLをアサート&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;フィールド: &lt;code&gt;$.video.url&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;条件: 空でない&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;シナリオ実行例&lt;/strong&gt;&lt;br&gt;
テストシナリオ画面で「実行」。POST→&lt;code&gt;request_id&lt;/code&gt;抽出→ループ→動画URLアサートまで自動実行し、各ステップの進捗と結果がレポートされます。&lt;/p&gt;

&lt;p&gt;CLI経由でCI/CD統合も可能：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--scenario&lt;/span&gt; grok-video-async-flow &lt;span class="nt"&gt;--env&lt;/span&gt; production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  よくあるエラーとその修正
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;401 Unauthorized&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
APIキー未設定または無効。ヘッダー形式&lt;code&gt;Bearer YOUR_XAI_API_KEY&lt;/code&gt;とキーの有効性を確認。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;422 Unprocessable Entity&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
リクエストボディの必須フィールド漏れや画像URLアクセス不可。画像URLはブラウザで事前チェック。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;画像URLにアクセス不可&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
xAIサーバーから到達可能なURLまたはbase64データURIを使用。private/localhost/認証付きURLは不可。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;processing&lt;/code&gt;のまま進まない&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
高解像度・長時間動画は遅延。10分以上変化なければ再リクエスト推奨。タイムアウトは現状APIから返却されません。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;429 レート制限&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
1分60回・1秒1回。複数ジョブ同時ポーリング時はインターバル追加。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Base64アップロード失敗&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
データURIのMIMEタイプが正しいか確認（例: JPEGなら&lt;code&gt;data:image/jpeg;base64,&lt;/code&gt;）。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;アスペクト比不一致&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ソース画像と異なる比率を指定するとクロップ/レターボックスされることあり。最良結果には画像比率と同じ&lt;code&gt;aspect_ratio&lt;/code&gt;を設定。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  まとめ
&lt;/h2&gt;

&lt;p&gt;Grok画像-動画APIは、静止写真→短尺アニメクリップの自動化に最適です。シンプルなPOST→&lt;code&gt;request_id&lt;/code&gt;取得→完了までポーリング→MP4ダウンロードという流れで実装できます。&lt;code&gt;grok-imagine-video&lt;/code&gt;は2026年1月時点で業界リーダーの実績。大規模運用でも安定したパフォーマンスが期待できます。&lt;/p&gt;

&lt;p&gt;非同期処理を正しくテストするには、Apidogの変数抽出・ポーリングループ・アサーションを活用してください。これにより本番前のバグ検出・品質担保が容易になります。&lt;/p&gt;

&lt;p&gt;Apidogを無料でダウンロードして、今すぐ統合テストを始めましょう。クレジットカード不要です。&lt;/p&gt;

&lt;h2&gt;
  
  
  よくある質問
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q. Grok画像-動画APIのモデル名は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A. &lt;code&gt;grok-imagine-video&lt;/code&gt;です。POSTリクエストの&lt;code&gt;model&lt;/code&gt;フィールドに指定。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q. &lt;code&gt;image&lt;/code&gt;パラメータと&lt;code&gt;reference_images&lt;/code&gt;の違いは？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A. &lt;code&gt;image&lt;/code&gt;は開始フレーム、&lt;code&gt;reference_images&lt;/code&gt;はスタイルガイド。両方同時利用可能。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q. 動画生成はどれくらい時間がかかる？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A. 6秒480pで約1～3分、15秒720pで4～8分。ポーリングは5秒間隔推奨。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q. ローカルファイルも使える？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A. はい。base64データURI（例:&lt;code&gt;data:image/jpeg;base64,xxxx&lt;/code&gt;）にエンコードして&lt;code&gt;image.url&lt;/code&gt;に指定。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q. &lt;code&gt;aspect_ratio&lt;/code&gt;を省略すると？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A. &lt;code&gt;image&lt;/code&gt;指定時は画像の比率、テキスト-動画時は&lt;code&gt;16:9&lt;/code&gt;がデフォルト。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q. 10秒720p動画の料金は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A. 入力画像0.002ドル＋出力0.70ドル＝合計0.702ドル。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q. レート制限は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A. 1分60回・1秒1回。POST/GETすべてに適用。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q. 15秒を超える動画は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A. &lt;code&gt;POST /v1/videos/extensions&lt;/code&gt;で分割生成・連結が可能。各延長も非同期パターン。&lt;/p&gt;




&lt;p&gt;これで、Grok画像-動画APIの実装・テスト・運用のための実践的なガイドを完了します。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>2026年版 Bird SMS APIの料金は？</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Fri, 03 Apr 2026 07:08:23 +0000</pubDate>
      <link>https://dev.to/aakira/2026nian-ban-bird-sms-apinoliao-jin-ha-4kp8</link>
      <guid>https://dev.to/aakira/2026nian-ban-bird-sms-apinoliao-jin-ha-4kp8</guid>
      <description>&lt;h2&gt;
  
  
  要約
&lt;/h2&gt;

&lt;p&gt;Bird SMS APIは、&lt;strong&gt;米国宛送信メッセージあたり0.00331ドル&lt;/strong&gt;、&lt;strong&gt;米国発信受信メッセージあたり0.003ドル&lt;/strong&gt;という低価格で利用可能です。競合他社と比較してもエントリーレベルの料金が非常に安価で、1日5通までの無料SMSが使える無償プランも提供されています。Proプラン（月額49ドル）には1,000通分のSMSクレジットが含まれます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;今すぐApidogを試す&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  はじめに
&lt;/h2&gt;

&lt;p&gt;MessageBirdは2023年にBirdへブランド変更し、AIを活用したオムニチャネルコミュニケーション（SMS、WhatsApp、Eメール、音声通話）を単一プラットフォームで提供することに注力しています。従量課金制へと料金体系が刷新され、TwilioやVonageなど他社よりも低価格が実現されています。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;SMS統合を今すぐ構築するなら&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Apidogでは、Bird APIリクエスト設計・テスト・応答検証がコード不要で可能。最新の料金データも取得でき、Bird SMS統合のテストが数分で行えます。詳しくは &lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;apidog.com&lt;/a&gt; をご覧ください。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;この記事では、2025～2026年のBird SMSコスト構造・コスト増加要因・競合比較・実装手順を解説します。&lt;/p&gt;

&lt;h2&gt;
  
  
  Bird SMS料金概要
&lt;/h2&gt;

&lt;p&gt;BirdのSMS利用料金は2階層で構成されています。&lt;/p&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;/ol&gt;

&lt;div class="table-wrapper-paragraph"&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;含まれるSMS数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;無料&lt;/td&gt;
&lt;td&gt;0ドル&lt;/td&gt;
&lt;td&gt;1日5通のSMS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;49ドル&lt;/td&gt;
&lt;td&gt;1,000通/月&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&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;/div&gt;

&lt;p&gt;プランのSMS上限超過時は、下記の従量課金が発生します（米国番号の場合）:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;送信SMS&lt;/strong&gt;: 1通あたり0.00331ドル&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;受信SMS&lt;/strong&gt;: 1通あたり0.003ドル&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;詳細は &lt;a href="https://bird.com/en/pricing/sms" rel="noopener noreferrer"&gt;bird.com/en/pricing/sms&lt;/a&gt; を参照してください。&lt;/p&gt;

&lt;h2&gt;
  
  
  料金の内訳：SMS、MMS、WhatsApp、Eメール
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SMS
&lt;/h3&gt;

&lt;p&gt;米国宛送信SMS：0.00331ドル/通。150ヵ国以上へ直接接続可能。国別料金の一例：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&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;/td&gt;
&lt;td&gt;～0.00331ドル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;英国&lt;/td&gt;
&lt;td&gt;～0.036ユーロ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;オーストラリア&lt;/td&gt;
&lt;td&gt;～0.009ユーロ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ドイツ&lt;/td&gt;
&lt;td&gt;～0.056ユーロ&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;tr&gt;
&lt;td&gt;ブラジル&lt;/td&gt;
&lt;td&gt;～0.047ユーロ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;: 米国・カナダでは追加キャリア手数料（10DLC, Toll-Free等）が別途発生します。&lt;/p&gt;

&lt;h3&gt;
  
  
  MMS
&lt;/h3&gt;

&lt;p&gt;MMS（画像付きメッセージ）は米国・カナダでサポート。料金はSMSの約3～5倍で、国やプランによって異なります。最新情報は &lt;a href="https://bird.com/en/pricing/sms" rel="noopener noreferrer"&gt;bird.com/en/pricing/sms&lt;/a&gt; を参照。&lt;/p&gt;

&lt;h3&gt;
  
  
  WhatsApp
&lt;/h3&gt;

&lt;p&gt;BirdのWhatsApp料金は2要素で決まります。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Bird処理手数料&lt;/strong&gt;（1,000メッセージ単位）：&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ボリューム&lt;/th&gt;
&lt;th&gt;1,000メッセージあたり手数料&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1～1,000&lt;/td&gt;
&lt;td&gt;0.001ドル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1,001～100,000&lt;/td&gt;
&lt;td&gt;0.005ドル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100,001～500,000&lt;/td&gt;
&lt;td&gt;0.0045ドル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500,001以上&lt;/td&gt;
&lt;td&gt;0.004ドル&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Metaパススルー手数料&lt;/strong&gt;（会話単位、国・内容で異なる）
米国番号例：&lt;/li&gt;
&lt;li&gt;マーケティング会話：0.0250ドル&lt;/li&gt;
&lt;li&gt;ユーティリティ会話：0.0034ドル&lt;/li&gt;
&lt;li&gt;認証会話：0.0034ドル&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;BirdはMeta手数料を原価で転嫁します。&lt;/p&gt;

&lt;h3&gt;
  
  
  Eメール
&lt;/h3&gt;

&lt;p&gt;API経由のEメール送信は1通0.001ドル～（ボリューム次第で単価低減）。Proプランで月10,000通まで無料枠。コスト効率の良いチャネルです。&lt;/p&gt;

&lt;h3&gt;
  
  
  音声通話
&lt;/h3&gt;

&lt;p&gt;BirdのVoice APIは従量課金制。米国発信：1分あたり約0.013～0.015ドル。着信はより安価です。大量利用は営業窓口へ。&lt;/p&gt;

&lt;h2&gt;
  
  
  Birdの請求額に影響する要因
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 国・キャリアルーティング
&lt;/h3&gt;

&lt;p&gt;送信先によって料金は大きく異なります。例：ドイツ（～0.056ユーロ）、バングラデシュ（～0.208ユーロ）、ブルンジ（～0.269ユーロ）は米国の10～80倍。国際SMS前には最新料金表の確認を推奨。&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 電話番号の種類
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ロングコード（10DLC）&lt;/strong&gt;: 標準番号。ブランド・キャンペーン登録必須。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ショートコード&lt;/strong&gt;: 5～6桁、高スループット、月額500～1,000ドル。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;フリーダイヤル&lt;/strong&gt;: 中程度のコスト・スループット。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;番号の月額レンタル料は別途発生。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. メッセージ長・エンコーディング
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GSM-7: 160文字/セグメント&lt;/li&gt;
&lt;li&gt;Unicode: 70文字/セグメント&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;160文字超や絵文字使用時はセグメント数が増え、従量課金も加算。&lt;/p&gt;

&lt;h3&gt;
  
  
  4. チャネルミックス
&lt;/h3&gt;

&lt;p&gt;ワークフローでSMS送信失敗時にWhatsApp等へフォールバック設定する場合は、それぞれのチャネル利用料金が発生します。BirdのFlow Builderで自動化可能ですが、コストシミュレーションを事前に行いましょう。&lt;/p&gt;

&lt;h3&gt;
  
  
  5. ボリューム
&lt;/h3&gt;

&lt;p&gt;公式な段階的ボリューム割引は非公開ですが、大量送信時はEnterpriseプランで交渉可能。&lt;/p&gt;

&lt;h2&gt;
  
  
  隠れた費用と手数料
&lt;/h2&gt;

&lt;h3&gt;
  
  
  米国キャリア手数料（10DLC）
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ブランド登録&lt;/strong&gt;：1回約4～44ドル&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;キャンペーン登録&lt;/strong&gt;：月額約10ドル/キャンペーン&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;メッセージごとの追加料金&lt;/strong&gt;：数セント&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;これらは米国キャリア（AT&amp;amp;T, T-Mobile, Verizon）が設定し、Birdは原価で請求。&lt;/p&gt;

&lt;h3&gt;
  
  
  電話番号のレンタル
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ロングコード：月1～2ドル&lt;/li&gt;
&lt;li&gt;フリーダイヤル：月2～3ドル&lt;/li&gt;
&lt;li&gt;ショートコード：月500～1,000ドル&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  受信ウェブフック・処理
&lt;/h3&gt;

&lt;p&gt;受信SMSごとに0.003ドル（米国）。オプトアウトや自動応答の運用時も発生。&lt;/p&gt;

&lt;h3&gt;
  
  
  プラットフォームサブスクリプション
&lt;/h3&gt;

&lt;p&gt;Proプラン（月49ドル）は固定。送信量が少ない場合は従量課金がコストの中心となります。&lt;/p&gt;

&lt;h2&gt;
  
  
  Birdと競合他社の比較
&lt;/h2&gt;

&lt;p&gt;主要プロバイダーの米国宛SMS料金比較：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;プロバイダー&lt;/th&gt;
&lt;th&gt;米国宛送信SMS&lt;/th&gt;
&lt;th&gt;米国発信受信SMS&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;strong&gt;Bird&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.00331ドル&lt;/td&gt;
&lt;td&gt;0.003ドル&lt;/td&gt;
&lt;td&gt;最低水準の料金、オムニチャネル対応&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;0.0079ドル&lt;/td&gt;
&lt;td&gt;0.0079ドル&lt;/td&gt;
&lt;td&gt;基本料金高め、巨大なエコシステム&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telnyx&lt;/td&gt;
&lt;td&gt;～0.004ドル&lt;/td&gt;
&lt;td&gt;～0.001ドル&lt;/td&gt;
&lt;td&gt;競争力あり、キャリア直結&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plivo&lt;/td&gt;
&lt;td&gt;0.0055ドル&lt;/td&gt;
&lt;td&gt;0.0005ドル&lt;/td&gt;
&lt;td&gt;受信料金が安価、シンプルなプラットフォーム&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Birdは送信単価で優位。Twilioはボリュームディスカウントあり。シンプルなAPI利用だけならTelnyxやPlivoも検討対象。Flow Builderによる自動化や複数チャネル統合の要件がある場合、Birdのトータルコスト優位性が際立ちます。&lt;/p&gt;

&lt;h2&gt;
  
  
  Birdの利用開始方法
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;無料アカウント作成&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://bird.com" rel="noopener noreferrer"&gt;bird.com&lt;/a&gt;でアカウント登録。クレジットカード不要で1日5通のSMSテスト可。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ブランド・キャンペーン登録&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
米国10DLC対応にはブランド/キャンペーン登録が必須。Birdダッシュボードから申請（通常1～3営業日）。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;電話番号取得&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
BirdのNumbers APIまたはダッシュボードでロングコード番号をプロビジョニング。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;APIコール実行&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
REST API（JSON形式）でSMS送信。例：&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.bird.com/v1/messages &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: AccessKey {YOUR_API_KEY}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
       "originator": "{YOUR_NUMBER}",
       "recipients": ["{DESTINATION_NUMBER}"],
       "body": "テストメッセージ"
   }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;公式ドキュメント &lt;a href="https://docs.bird.com" rel="noopener noreferrer"&gt;docs.bird.com&lt;/a&gt; には各種SDK（Node.js, Python, PHP, Go, Java, Ruby）・認証・Webhook設定方法も詳細に記載されています。&lt;/p&gt;

&lt;h2&gt;
  
  
  結論
&lt;/h2&gt;

&lt;p&gt;Bird SMS APIは、米国宛送信0.00331ドルという業界最低水準の単価で利用でき、無料プランでAPIテストも容易です。Proプランでは月1,000通のSMS込みで、チームでの本格利用もすぐに開始できます。&lt;/p&gt;

&lt;p&gt;コスト計算時は10DLCキャリア手数料・番号レンタル・国際料金などの追加費用も必ず考慮してください。特に国際送信や大量配信時は見積精度が重要です。&lt;/p&gt;

&lt;p&gt;本番導入前は、Apidogを使ってBird SMS統合をエンドツーエンドで検証しましょう。Apidogはリクエスト設計・環境変数・テストチェーン・配信アサートをワンストップで提供します。&lt;/p&gt;

&lt;h2&gt;
  
  
  よくある質問
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;米国でのBird SMS APIのメッセージ単価は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
米国宛送信SMS：0.00331ドル、米国発信受信SMS：0.003ドルです（APIティアの基本料金）。追加で10DLCキャリア手数料が発生します。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BirdはMessageBirdと同じ？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
はい。MessageBirdは2023年にBirdへリブランド。APIエンドポイントや一部ドキュメントでは旧名称が残っています。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;受信SMSも課金対象？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
米国発信受信SMS：1通0.003ドル。オプトアウト返信やヘルプキーワード応答も課金対象です。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;無料プランの内容は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
1日5通のSMS、10通のEメール、15通のAIエージェントメッセージを無料提供。クレカ不要でAPIテスト可。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twilioとの価格差は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Birdの米国宛送信SMS（0.00331ドル）はTwilio（0.0079ドル）の半額以下。月10万通の場合、Birdは約331ドル、Twilioは約790ドル（ボリュームディスカウント除く）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;隠れた費用は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
10DLCブランド登録（4～44ドル）、キャンペーン登録（月10ドル/件）、番号レンタル（月1～2ドル）、国際メッセージは高額です。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;実際のメッセージ送信なしでAPIテストする方法は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ApidogのSmart Mock機能でBird API応答をシミュレート可能。BirdのサンドボックスやApidogのテストシナリオ連携で安全に検証できます。&lt;/p&gt;




&lt;p&gt;【参考リンク】&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bird.com/en/pricing/sms" rel="noopener noreferrer"&gt;Bird公式料金表&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.bird.com" rel="noopener noreferrer"&gt;Bird APIドキュメント&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog公式サイト&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Twilio SMS API 料金: 2026年版 料金体系を徹底解説</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Fri, 03 Apr 2026 03:53:33 +0000</pubDate>
      <link>https://dev.to/aakira/twilio-sms-api-liao-jin-2026nian-ban-liao-jin-ti-xi-woche-di-jie-shuo-47ed</link>
      <guid>https://dev.to/aakira/twilio-sms-api-liao-jin-2026nian-ban-liao-jin-ti-xi-woche-di-jie-shuo-47ed</guid>
      <description>&lt;h2&gt;
  
  
  要するに
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;米国ロングコードSMS（送信/受信）：1メッセージあたり &lt;strong&gt;$0.0083&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;MMS送信：&lt;strong&gt;$0.022&lt;/strong&gt; / MMS受信：&lt;strong&gt;$0.0165&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;トールフリーSMS：&lt;strong&gt;$0.0083&lt;/strong&gt;（+キャリア料金）&lt;/li&gt;
&lt;li&gt;ショートコードレンタル：ランダム &lt;strong&gt;月額$1,000&lt;/strong&gt; / バニティ &lt;strong&gt;月額$1,500&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;10DLCブランド登録：一回限り &lt;strong&gt;$4.50&lt;/strong&gt;（2025年8月更新）、キャンペーンは&lt;strong&gt;月額$1.50~$10&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;電話番号（ロングコード）：&lt;strong&gt;月額$1.15&lt;/strong&gt; / トールフリー：&lt;strong&gt;月額$2.15&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;キャリア料金はすべての基本料金に追加&lt;/li&gt;
&lt;li&gt;月間150,000メッセージ超で自動ボリュームディスカウント&lt;/li&gt;
&lt;li&gt;無料トライアルあり、開始にクレジットカード不要&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  はじめに
&lt;/h2&gt;

&lt;p&gt;Twilioは、多くの開発者にとって標準的なSMS APIです。ドキュメントが充実していてAPI設計も洗練されていますが、サイドプロジェクトから本番運用へ拡大すると、料金構造が複雑化しコストも急増します。メッセージごとの単価だけでなく、基本料金・キャリア追加料金・電話番号・10DLC登録費用などが加算されます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidogを今すぐ試す&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;SMS連携の構築前に十分なテストを！&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Apidogを使えば、Twilio WebhookのOpenAPI仕様に基づく自動テストシナリオを構築できます。ステータスコードやレスポンスボディのスキーマ検証、CI/CDでの契約テストの自動化も可能です。本番移行前にApidogでSMSワークフローを無料検証しましょう。&lt;/p&gt;

&lt;p&gt;この記事では、Twilioの料金体系の詳細、コストに影響する要素、競合サービスとの比較、開発者が押さえるべきポイントを解説します。&lt;/p&gt;

&lt;h2&gt;
  
  
  Twilio SMS料金の概要
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.twilio.com/en-us/pricing/messaging" rel="noopener noreferrer"&gt;Twilioは従量課金制&lt;/a&gt;を採用しています。メッセージセグメントごと、電話番号ごと、追加機能や登録ごとに料金が発生します。契約や最低利用料は不要（エンタープライズ契約を除く）です。&lt;/p&gt;

&lt;p&gt;米国ロングコードSMSの基本料金は送信/受信ともに&lt;strong&gt;1セグメントあたり$0.0083&lt;/strong&gt;。しかし実際にはキャリア料金や番号レンタル料、コンプライアンス登録料が毎月加算されます。&lt;/p&gt;

&lt;p&gt;月間150,000メッセージを超えると番号タイプごとに自動でボリュームディスカウントが適用されます。&lt;/p&gt;

&lt;h2&gt;
  
  
  料金の内訳：SMS、MMS、トールフリー、ショートコード
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ロングコードSMS（10桁の電話番号）
&lt;/h3&gt;

&lt;p&gt;ロングコードは米国A2Pメッセージングの標準です。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&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;SMS送信&lt;/td&gt;
&lt;td&gt;$0.0083&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS受信&lt;/td&gt;
&lt;td&gt;$0.0083&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMS送信&lt;/td&gt;
&lt;td&gt;$0.022&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMS受信&lt;/td&gt;
&lt;td&gt;$0.0165&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;ポイント&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Twilioは「1メッセージ」単位ではなく&lt;strong&gt;セグメント単位&lt;/strong&gt;で課金します。GSM-7では160文字、Unicode利用時は70文字が1セグメントです。たとえば、200文字の平文SMSは2セグメント分の料金になります。&lt;/p&gt;

&lt;h3&gt;
  
  
  トールフリー番号
&lt;/h3&gt;

&lt;p&gt;トールフリー番号もロングコードと同じSMS料金（$0.0083/セグメント）ですが、MMS受信料金は若干高くなります（$0.02）。初期費用や10DLC登録不要で、大量配信に向いていますが、最大スループットには番号検証が必要です。&lt;/p&gt;

&lt;h3&gt;
  
  
  ショートコード（5～6桁の番号）
&lt;/h3&gt;

&lt;p&gt;ショートコードは高スループットキャンペーン向き。SMS料金は$0.0083ですが、番号レンタル料が高いです。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&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;/td&gt;
&lt;td&gt;$1,000（四半期請求）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;バニティ&lt;/td&gt;
&lt;td&gt;$1,500（四半期請求）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;持ち込みバニティ&lt;/td&gt;
&lt;td&gt;$500（四半期請求）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;MMS対応時は&lt;strong&gt;一回限り$500&lt;/strong&gt;のセットアップ費用が別途かかります。&lt;/p&gt;

&lt;h3&gt;
  
  
  ボリュームディスカウント
&lt;/h3&gt;

&lt;p&gt;Twilioは番号タイプごとに自動的に階層型割引を適用します。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&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;1～150,000&lt;/td&gt;
&lt;td&gt;$0.0083&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;150,001～300,000&lt;/td&gt;
&lt;td&gt;$0.0081&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300,001～500,000&lt;/td&gt;
&lt;td&gt;$0.0079&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500,001～750,000&lt;/td&gt;
&lt;td&gt;$0.0077&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;750,001～1,000,000&lt;/td&gt;
&lt;td&gt;$0.0075&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1,000,001以上&lt;/td&gt;
&lt;td&gt;$0.0073&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;※ロングコード・トールフリーなどのメッセージ数は合算できません。&lt;/p&gt;

&lt;h2&gt;
  
  
  Twilioの請求額に影響する要因
&lt;/h2&gt;

&lt;h3&gt;
  
  
  電話番号の種類
&lt;/h3&gt;

&lt;p&gt;送信元番号のタイプで適用される料金が異なります。複数番号タイプを使い分けると割引基準に到達しにくくなります。&lt;/p&gt;

&lt;h3&gt;
  
  
  メッセージセグメント
&lt;/h3&gt;

&lt;p&gt;メッセージは1セグメント単位で課金。長文やUnicode利用時は、1通あたりのコストが倍増することも。&lt;/p&gt;

&lt;h3&gt;
  
  
  キャリア料金
&lt;/h3&gt;

&lt;p&gt;Twilio基本料金に加え、米国キャリアごとに追加料金が上乗せされます。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ロングコードSMS送信時のキャリア追加料金例：&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&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;AT&amp;amp;T&lt;/td&gt;
&lt;td&gt;$0.0035&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T-Mobile&lt;/td&gt;
&lt;td&gt;$0.0045&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verizon&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US Cellular&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;その他&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;MMSはさらに高額（AT&amp;amp;T: $0.009, T-Mobile: $0.01 など）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;例:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
AT&amp;amp;T宛SMSは Twilio料金 $0.0083 + キャリア料金 $0.0035 = &lt;strong&gt;$0.0118/セグメント&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  宛先国
&lt;/h3&gt;

&lt;p&gt;国際SMSは料金が大きく異なります。例：イギリス $0.04、インド $0.0029、ブラジル $0.075。&lt;/p&gt;

&lt;h3&gt;
  
  
  10DLC登録
&lt;/h3&gt;

&lt;p&gt;米国A2P 10DLCではブランド/キャンペーン登録が必須。未登録はキャリアでブロックされます。&lt;/p&gt;

&lt;h2&gt;
  
  
  隠れたコストと手数料
&lt;/h2&gt;

&lt;h3&gt;
  
  
  10DLC登録費用
&lt;/h3&gt;

&lt;p&gt;2025年8月以降、TCRによる新料金に更新。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ブランド登録：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;個人事業主/低ボリューム：&lt;strong&gt;$4.50（1回）&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;標準（二次審査含む）：&lt;strong&gt;$46（1回）&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;キャンペーン登録：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;審査費用（1回）：&lt;strong&gt;$15/キャンペーン&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;月額：タイプ別 $1.50～$10&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&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;/td&gt;
&lt;td&gt;$2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;低ボリューム混合&lt;/td&gt;
&lt;td&gt;$1.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;標準&lt;/td&gt;
&lt;td&gt;$10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;チャリティ/501(c)(3)&lt;/td&gt;
&lt;td&gt;$3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;緊急サービス&lt;/td&gt;
&lt;td&gt;$5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;審査異議申立てや再試行にも追加費用が発生します。&lt;/p&gt;

&lt;h3&gt;
  
  
  電話番号料金
&lt;/h3&gt;

&lt;p&gt;ロングコード：&lt;strong&gt;月額$1.15&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
トールフリー：&lt;strong&gt;月額$2.15&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
大量番号を利用する場合は合計額に注意。&lt;/p&gt;

&lt;h3&gt;
  
  
  メッセージ処理失敗時手数料
&lt;/h3&gt;

&lt;p&gt;「失敗」扱いのSMSごとに&lt;strong&gt;$0.001&lt;/strong&gt;課金。デバッグや配信エラー時に積み重なる場合あり。&lt;/p&gt;

&lt;h3&gt;
  
  
  オプション機能のアドオン
&lt;/h3&gt;

&lt;p&gt;エンゲージメント（リンク短縮・クリックトラッキング）やコンプライアンスツール使用時：&lt;br&gt;&lt;br&gt;
最初の1,000通無料、以降1通あたり&lt;strong&gt;$0.015&lt;/strong&gt;加算。&lt;/p&gt;

&lt;h3&gt;
  
  
  サポートプラン
&lt;/h3&gt;

&lt;p&gt;無料開発者サポートは制限あり。有料サポートは&lt;strong&gt;月額$250&lt;/strong&gt;から。&lt;/p&gt;

&lt;h2&gt;
  
  
  Twilioと競合サービスの比較
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;プロバイダ&lt;/th&gt;
&lt;th&gt;米国SMS送信&lt;/th&gt;
&lt;th&gt;米国SMS受信&lt;/th&gt;
&lt;th&gt;電話番号&lt;/th&gt;
&lt;th&gt;10DLC要件&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;$0.0083 + キャリア料金&lt;/td&gt;
&lt;td&gt;$0.0083 + キャリア料金&lt;/td&gt;
&lt;td&gt;$1.15/月&lt;/td&gt;
&lt;td&gt;はい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plivo&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;td&gt;$0.00035&lt;/td&gt;
&lt;td&gt;$0.80/月&lt;/td&gt;
&lt;td&gt;はい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telnyx&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;td&gt;$1.00/月&lt;/td&gt;
&lt;td&gt;はい&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bird（旧MessageBird）&lt;/td&gt;
&lt;td&gt;~$0.007&lt;/td&gt;
&lt;td&gt;~$0.007&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;/div&gt;

&lt;p&gt;Plivo、TelnyxはTwilioより低価格。特にPlivoの受信は大幅に安価。Telnyxはキャリア料金の扱いが異なるため、総額比較が必要です。&lt;/p&gt;

&lt;p&gt;Twilioは開発者体験・ドキュメント・グローバル展開・機能面で優位。シンプルな大量配信ならPlivo/Telnyxも選択肢。&lt;/p&gt;

&lt;h2&gt;
  
  
  Twilioを無料でテストする方法
&lt;/h2&gt;

&lt;p&gt;Twilioはクレカ不要の無料トライアルアカウントを提供。少額クレジットが付与され、SMS送受信やWebhookテストができます。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;トライアルのポイント：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;テスト番号のプロビジョニング&lt;/li&gt;
&lt;li&gt;API経由でSMS送受信&lt;/li&gt;
&lt;li&gt;Webhook配信のテスト&lt;/li&gt;
&lt;li&gt;コンソールや利用ログの確認&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;未検証番号宛SMSには"Sent from your Twilio trial account"のプレフィックスが付きます。削除には有料アップグレードが必要。&lt;br&gt;&lt;br&gt;
アップグレード後も従量課金で最低利用料なし。&lt;/p&gt;

&lt;h2&gt;
  
  
  ApidogでTwilio SMS連携をテストする方法
&lt;/h2&gt;

&lt;p&gt;Twilio認証情報とWebhookを設定後、&lt;strong&gt;Apidogのテストシナリオ&lt;/strong&gt;を使って連携テストを自動化できます。手動テストでは検出しにくいWebhook仕様の不一致もキャッチ可能です。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgcuec6nm1uksjpraul5p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgcuec6nm1uksjpraul5p.png" alt="apidog-twilio-test" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;テストシナリオ構築手順例：&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;TwilioのWebhookエンドポイント仕様をApidogテストシナリオにインポート&lt;/li&gt;
&lt;li&gt;SMS送信・配信コールバック受信・返信処理など各メッセージフローのステップを追加&lt;/li&gt;
&lt;li&gt;オーケストレートモードでステップを並べ、順番に実行&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{{$.stepId.response.body.field}}&lt;/code&gt; 形式でデータをステップ間連携（例：メッセージSIDを利用）&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;これにより、Twilio APIの実際の利用フロー（送信→SID返却→Webhook受信）を自動テストとして再現できます。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;契約テスト&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Apidogの契約テスト機能で、OpenAPI仕様とレスポンスの自動突合。  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTPステータスコード一致&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;strong&gt;はじめ方&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidogを無料でダウンロード&lt;/a&gt;し、Twilio API仕様をインポート。Webhookスキーマを定義し、SMS送受信フローを模倣するテストシナリオを組みましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  結論
&lt;/h2&gt;

&lt;p&gt;Twilio SMS APIの料金は米国ロングコードで&lt;strong&gt;$0.0083/セグメント&lt;/strong&gt;からですが、実際はキャリア料金・番号レンタル・10DLC登録料も加算されます。AT&amp;amp;T宛送信なら&lt;strong&gt;$0.0118/セグメント&lt;/strong&gt;、10DLCキャンペーンは&lt;strong&gt;月額$10&lt;/strong&gt;追加も。&lt;/p&gt;

&lt;p&gt;料金体系は透明で、ボリュームディスカウントも自動適用。ただし&lt;strong&gt;見かけの単価だけでなく総コストを見積もることが重要&lt;/strong&gt;です。&lt;/p&gt;

&lt;p&gt;コスト算出後は、連携を構築し、Apidogのテストシナリオ＆契約テストでWebhookフローやAPIレスポンスの自動検証を行いましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  よくある質問
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: Twilioでの米国SMS送信の基本料金はいくらですか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 米国ロングコードSMS送信は&lt;strong&gt;$0.0083/セグメント&lt;/strong&gt;。キャリア料金が上乗せされます。AT&amp;amp;T宛なら&lt;strong&gt;$0.0118&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Twilioは受信SMSにも課金しますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: はい。ロングコード・トールフリーで&lt;strong&gt;$0.0083/セグメント&lt;/strong&gt;。発信元キャリアによっては追加料金も。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: 10DLCとは？費用は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 10DLCは米国のA2P SMS登録制。ロングコード利用時はブランド登録&lt;strong&gt;$4.50（1回）&lt;/strong&gt;、キャンペーン種別で&lt;strong&gt;月額$1.50～$10&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Twilioのショートコード料金は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: ランダムショートコードは&lt;strong&gt;月額$1,000&lt;/strong&gt;（四半期請求）、バニティは&lt;strong&gt;月額$1,500&lt;/strong&gt;＋MMS有効時は&lt;strong&gt;$500&lt;/strong&gt;（1回）。SMS料金は&lt;strong&gt;$0.0083&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Twilioはボリュームディスカウントを提供している？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: はい。月間150,000通超で自動割引（最大で&lt;strong&gt;$0.0073/セグメント&lt;/strong&gt;）。エンタープライズは個別交渉でさらに割引。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Twilioの無料トライアルはある？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: あり。クレジットカード不要、クレジット付き。トライアル中はSMSにプレフィックス付き。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: SMSでTwilioの安価な代替は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: Plivo（送信&lt;strong&gt;$0.005&lt;/strong&gt;/受信&lt;strong&gt;$0.00035&lt;/strong&gt;）、Telnyx（&lt;strong&gt;$0.004&lt;/strong&gt;）等。いずれも10DLC登録は必須。Twilioはドキュメントと機能面で優位。&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Apidogを今すぐ試す:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Vonage SMS API 料金はいくらですか？ (2026年価格)</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Fri, 03 Apr 2026 03:48:08 +0000</pubDate>
      <link>https://dev.to/aakira/vonage-sms-api-liao-jin-haikuradesuka-2026nian-jia-ge--4cak</link>
      <guid>https://dev.to/aakira/vonage-sms-api-liao-jin-haikuradesuka-2026nian-jia-ge--4cak</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Vonage SMS APIの料金は、米国では&lt;strong&gt;送信メッセージあたり$0.00809&lt;/strong&gt;、&lt;strong&gt;受信メッセージあたり$0.00649&lt;/strong&gt;から。月額最低料金なし。国際料金は国によって異なり、一部市場で$1.00/通超も。Vonage SMS統合を構築・テストする際は、Apidogでテストリクエスト送信、応答検証、エラー捕捉が可能です。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;今すぐApidogを試す&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  はじめに
&lt;/h2&gt;

&lt;p&gt;Nexmoをご存知の方は、既にVonageにも馴染みがあるでしょう。2016年にVonageがNexmoを買収し、開発者用SMS・通信API基盤として&lt;code&gt;developer.vonage.com&lt;/code&gt;（旧nexmo.com/developers）が今も稼働中です。2022年にはエリクソンがVonageを買収し、API事業はグローバル通信大手の一員となりました。&lt;/p&gt;

&lt;p&gt;現在Vonageは10万社超・160万人超の開発者にAPIを提供。従量課金、契約縛りなし、190カ国以上対応の成熟したプラットフォームです。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 統合を進める前に、APIテストツールが必須です。&lt;strong&gt;Apidog&lt;/strong&gt;ならVonage SMSリクエストのテストシナリオを構築し、応答検証や複数API呼び出しのワークフロー自動化が可能。無料トライアル、クレカ不要。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Vonage SMS料金概要
&lt;/h2&gt;

&lt;p&gt;VonageのSMS APIは従量課金制。月額や初期費用は不要で、メッセージごとに支払い。料金は送信先国や番号種別で変動します。&lt;/p&gt;

&lt;p&gt;米国の料金例：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&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;送信SMS（米国LVN）&lt;/td&gt;
&lt;td&gt;$0.00809&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;受信SMS（米国LVN）&lt;/td&gt;
&lt;td&gt;$0.00649&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;送信SMS（米国フリーダイヤル）&lt;/td&gt;
&lt;td&gt;営業担当者にお問い合わせ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;受信SMS（米国フリーダイヤル）&lt;/td&gt;
&lt;td&gt;無料&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;LVNはLocal Virtual Number（標準10DLC長番号）。料金は国ごとに異なり、リアルタイムで請求額が計算されます。&lt;/p&gt;

&lt;p&gt;グローバル料金表は公式ダッシュボードからダウンロードでき、国際キャンペーンのコスト見積もりに活用できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  料金の内訳：送信、受信、MMS、WhatsApp
&lt;/h2&gt;

&lt;h3&gt;
  
  
  送信SMS
&lt;/h3&gt;

&lt;p&gt;アプリ→ユーザーへの送信は、米国LVNなら&lt;strong&gt;$0.00809/通&lt;/strong&gt;（2026年初頭時点）。公式ダッシュボードで最新料金を確認してください。&lt;/p&gt;

&lt;h3&gt;
  
  
  受信SMS
&lt;/h3&gt;

&lt;p&gt;Vonage番号で受信するSMSは、米国LVNなら&lt;strong&gt;$0.00649/通&lt;/strong&gt;。フリーダイヤル番号は無料のものもありますが、アカウントで要確認。&lt;/p&gt;

&lt;h3&gt;
  
  
  MMS料金
&lt;/h3&gt;

&lt;p&gt;MMSはMessages API経由で送信可能ですが、単価は非公開。営業チームに問い合わせが必要です。&lt;/p&gt;

&lt;h3&gt;
  
  
  Vonage経由のWhatsApp
&lt;/h3&gt;

&lt;p&gt;Messages API経由でWhatsApp送信が可能。料金体系は：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;WhatsApp側の課金（Meta）&lt;/strong&gt;：会話カテゴリごとに異なる。最新はMeta公式料金ページ参照。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vonageプラットフォーム料金&lt;/strong&gt;：$0.00015/通～。カテゴリ・ボリュームで変動。&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Facebook Messenger
&lt;/h3&gt;

&lt;p&gt;Vonage経由でFacebook Messengerは&lt;strong&gt;$0.0011/通&lt;/strong&gt;（Messages API経由）。&lt;/p&gt;

&lt;h3&gt;
  
  
  RCS（リッチコミュニケーションサービス）
&lt;/h3&gt;

&lt;p&gt;米国キャリアごとのRCS料金：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;キャリア&lt;/th&gt;
&lt;th&gt;RCSリッチ（テキスト）&lt;/th&gt;
&lt;th&gt;RCSリッチメディア&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T-モバイル&lt;/td&gt;
&lt;td&gt;$0.00620&lt;/td&gt;
&lt;td&gt;$0.01250&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ベライゾン&lt;/td&gt;
&lt;td&gt;$0.00400&lt;/td&gt;
&lt;td&gt;$0.00600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AT&amp;amp;T&lt;/td&gt;
&lt;td&gt;$0.00450&lt;/td&gt;
&lt;td&gt;$0.01000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USセルラー&lt;/td&gt;
&lt;td&gt;$0.00620&lt;/td&gt;
&lt;td&gt;$0.01350&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;RCSには国ごとに&lt;strong&gt;$600&lt;/strong&gt;の一回限り設定料も発生。&lt;/p&gt;

&lt;h2&gt;
  
  
  Vonageの請求額に影響するもの
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;送信先の国&lt;/strong&gt;: アメリカは安価。アフリカ・東南アジアなどは高額のことも（$0.50/通超）。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;番号の種類&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ロングコード(10DLC)&lt;/strong&gt;: 標準番号。最も安価。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;フリーダイヤル番号&lt;/strong&gt;: A2P向け。受信は無料なことが多い。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ショートコード&lt;/strong&gt;: 大量配信向け。レンタル料高。&lt;/li&gt;
&lt;/ul&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;: GSM-7は160文字/通、Unicode含むと70文字/通。長文や絵文字でコスト増に注意。&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;キャリア課徴金&lt;/strong&gt;: 10DLC A2Pはキャリア独自の追加料金あり。Vonage請求書に反映。&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  見落としがちな隠れたコスト
&lt;/h2&gt;

&lt;h3&gt;
  
  
  サポートティア
&lt;/h3&gt;

&lt;p&gt;無料はコミュニティ/ドキュメントのみ。有料ビジネスサポートは&lt;strong&gt;月$3,300&lt;/strong&gt;（24/7/365電話・専任担当）。&lt;/p&gt;

&lt;h3&gt;
  
  
  アドオンAPI
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&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;監査API&lt;/td&gt;
&lt;td&gt;$550/月&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自動編集（PII削除）&lt;/td&gt;
&lt;td&gt;$1,100/月&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;レポートAPI&lt;/td&gt;
&lt;td&gt;$495/月（または$0.00049/CDR従量）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;監査APIは厳格なコンプライアンス用途、自動編集はPII削除機能。&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify APIコスト
&lt;/h3&gt;

&lt;p&gt;二要素認証に使う場合、&lt;strong&gt;認証成功あたり$0.0572&lt;/strong&gt;。失敗してもメッセージ料金は発生。&lt;/p&gt;

&lt;h3&gt;
  
  
  番号登録（米国10DLC）
&lt;/h3&gt;

&lt;p&gt;A2P SMS送信にはTCR登録が必須。  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ブランド登録：一回限り&lt;/li&gt;
&lt;li&gt;キャンペーン登録：月額発生&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;未登録はメッセージがフィルタ対象。&lt;/p&gt;

&lt;h2&gt;
  
  
  Vonage vs 代替サービス
&lt;/h2&gt;

&lt;p&gt;米国送信SMSの主要サービス比較：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;プロバイダー&lt;/th&gt;
&lt;th&gt;米国送信SMS&lt;/th&gt;
&lt;th&gt;米国受信SMS&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;Vonage&lt;/td&gt;
&lt;td&gt;$0.00809&lt;/td&gt;
&lt;td&gt;$0.00649&lt;/td&gt;
&lt;td&gt;あり（認証済番号のみ）&lt;/td&gt;
&lt;td&gt;有料（月$3,300の24/7/365）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;$0.0079&lt;/td&gt;
&lt;td&gt;$0.0075&lt;/td&gt;
&lt;td&gt;あり（$15クレジット）&lt;/td&gt;
&lt;td&gt;月$250～有料サポート&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plivo&lt;/td&gt;
&lt;td&gt;$0.0055&lt;/td&gt;
&lt;td&gt;$0.0005&lt;/td&gt;
&lt;td&gt;あり&lt;/td&gt;
&lt;td&gt;基本無料/有料ティア&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telnyx&lt;/td&gt;
&lt;td&gt;$0.004&lt;/td&gt;
&lt;td&gt;$0.002&lt;/td&gt;
&lt;td&gt;あり（$5クレジット）&lt;/td&gt;
&lt;td&gt;メールは無料・電話は有料&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Telnyxは最安だがサポート規模小&lt;/li&gt;
&lt;li&gt;Plivoは受信が安く開発者評価も高い&lt;/li&gt;
&lt;li&gt;Twilioは最大規模・統合多数・ドキュメント充実&lt;/li&gt;
&lt;li&gt;Vonageは中間価格で、エリクソン傘下の信頼性・国際ネットワークが強み&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;価格だけでなく配信率、規制遵守、開発者ツール、サポートも考慮しましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  Vonageを無料で試す方法
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.vonage.com/communications-apis/pricing/" rel="noopener noreferrer"&gt;Vonageは無料のトライアルアカウント&lt;/a&gt;を提供しています。主な内容と制約：&lt;/p&gt;

&lt;h3&gt;
  
  
  得られるもの
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;テスト用Vonage仮想番号&lt;/li&gt;
&lt;li&gt;APIキー・シークレット&lt;/li&gt;
&lt;li&gt;開発者向けドキュメント・SDK&lt;/li&gt;
&lt;li&gt;テストクレジットで少量送信可&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  制限事項
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;認証済み電話番号のみに送信可能（不正防止）&lt;/li&gt;
&lt;li&gt;有料化しないと任意番号送信不可&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  開始手順
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://dashboard.nexmo.com" rel="noopener noreferrer"&gt;dashboard.nexmo.com&lt;/a&gt; または &lt;a href="https://www.vonage.com/communications-apis/" rel="noopener noreferrer"&gt;vonage.com/communications-apis&lt;/a&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;REST APIまたは公式SDKでAPIコール&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ueumbyjp6vt2xicifxk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ueumbyjp6vt2xicifxk.png" alt="ダッシュボードのVonage APIキーとシークレット" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vonage SDKはNode.js、Python、PHP、Ruby、Java、.NET、Go対応。任意HTTPクライアントでREST APIも可。&lt;/p&gt;

&lt;h2&gt;
  
  
  ApidogでVonage SMS統合をテストする方法
&lt;/h2&gt;

&lt;p&gt;APIキー・シークレット取得後は、本番前に統合テストが必須。&lt;strong&gt;Apidog&lt;/strong&gt;はこのために設計されています。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi04oh5iormtlr02zuvt3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi04oh5iormtlr02zuvt3.png" alt="Vonage SMS用のApidogテストシナリオ" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  テストシナリオのセットアップ
&lt;/h3&gt;

&lt;p&gt;Apidogのテストモジュールで新規シナリオを作成。以下の方法でステップ追加：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAPI形式のAPI仕様からインポート&lt;/li&gt;
&lt;li&gt;Vonage REST APIエンドポイントにカスタムリクエスト追加&lt;/li&gt;
&lt;li&gt;Vonage公式ドキュメントのcURLコマンドをインポート&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;例：SMS送信テストは&lt;code&gt;https://rest.nexmo.com/sms/json&lt;/code&gt;にPOSTリクエスト。APIキー、シークレット、送信元・送信先・本文をフォームパラメータで指定。&lt;/p&gt;

&lt;h3&gt;
  
  
  応答の検証
&lt;/h3&gt;

&lt;p&gt;Apidogは応答を自動スキーマ検証。Vonage SMS APIでは、&lt;code&gt;messages&lt;/code&gt;配列の&lt;code&gt;status&lt;/code&gt;が&lt;code&gt;0&lt;/code&gt;で成功。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;アサーション例：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ステータスコード200&lt;/li&gt;
&lt;li&gt;&lt;code&gt;messages[0].status == "0"&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;messages[0].message-id&lt;/code&gt;が非空&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;エラー時は応答本文を確認し、素早くデバッグ可能。&lt;/p&gt;

&lt;h3&gt;
  
  
  リクエスト間のデータ受け渡し
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;{{$.stepId.response.body.field}}&lt;/code&gt;構文で、1つ目の応答（例：&lt;code&gt;message-id&lt;/code&gt;）を2つ目のリクエストで利用できます。&lt;/p&gt;

&lt;h3&gt;
  
  
  CI/CDでのテスト自動化
&lt;/h3&gt;

&lt;p&gt;ApidogはGitHub Actions、GitLab CI、Jenkinsと連携可能。テストシナリオをエクスポートし、CLIで自動実行。PRごとにSMS統合の回帰テストを実施可能です。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog.comで無料トライアル&lt;/a&gt;。クレカ不要。&lt;/p&gt;

&lt;h2&gt;
  
  
  まとめ
&lt;/h2&gt;

&lt;p&gt;Vonage SMS APIは従量課金制。月額最低料金なし。米国送信SMSは$0.00809/通、受信は$0.00649/通。コストは送信先国・番号種別・エンコーディングで変動。監査APIや24時間サポートなどのプレミアム機能は月額コスト増。予算計画時に考慮必須。&lt;/p&gt;

&lt;p&gt;代替サービス比較では、Telnyx・Plivoは安価、Twilioはエコシステム規模でリード。Vonageはエリクソンのネットワークを活かした信頼性と国際カバレッジが強み。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;本番移行前にApidogでVonage統合のテストシナリオを構築し、全ワークフロー・応答を検証、エラーを開発段階で検出しましょう。&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  よくある質問
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;VonageはNexmoと同じ？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
はい。Vonageは2016年にNexmoを買収。&lt;code&gt;developer.vonage.com&lt;/code&gt;でAPI提供中。&lt;code&gt;rest.nexmo.com&lt;/code&gt;エンドポイントも旧統合で現役。両者は同一製品。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VonageはSMSで月額費用がかかる？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
SMS API自体は月額なし。送信/受信ごと+番号レンタル料のみ。監査API等のアドオンは別途月額。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vonage番号のレンタル料金は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
米国のLVNは月数ドル～。フリーダイヤル・ショートコードはさらに高額。最新料金はダッシュボードで要確認。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vonage SMSはどの国で使える？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
190カ国超でサポート。料金は大幅に異なる。特定国は$0.50/通超の例も。グローバル料金表はダッシュボードでダウンロード可能。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ボリュームディスカウントはある？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
あり。大量送信者は営業へ相談しカスタム料金の交渉が可能。なければデフォルトの従量課金制。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;受信SMSは無料？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
米国フリーダイヤル番号は多くの場合無料。ロングコードは$0.00649/通。国ごとに異なるので要確認。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VonageとTwilioの比較は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
米国送信SMS単価はVonageが$0.00809、Twilioが$0.0079。Twilioはエコシステム/統合/ドキュメントで優位。Vonageはエリクソンのネットワークによる信頼性・国際展開が強み。価格差は小さいため、最終判断は開発体験・サポート品質次第。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>API開発者にとってCursor 3は何を意味するのか？</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Fri, 03 Apr 2026 03:43:08 +0000</pubDate>
      <link>https://dev.to/aakira/apikai-fa-zhe-nitotutecursor-3hahe-woyi-wei-surunoka-1a51</link>
      <guid>https://dev.to/aakira/apikai-fa-zhe-nitotutecursor-3hahe-woyi-wei-surunoka-1a51</guid>
      <description>&lt;p&gt;&lt;strong&gt;要約:&lt;/strong&gt; Cursor 3は2026年4月2日にリリースされ、IDEファーストのインターフェースをエージェントファーストのワークスペースに置き換えました。API開発者にとって最大の変化は、並列エージェント実行、よりリッチなMCPツール出力、そしてワークフローを中断なく実行し続けるクラウドからローカルへのハンドオフです。Cursor 3をApidogのMCPサーバーと組み合わせると、AIエージェントがライブAPI仕様を読み取り、コピー＆ペーストなしで正確なスキーマ認識コードを生成できます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;今すぐApidogを試してみよう&lt;/a&gt;
&lt;/p&gt;

&lt;h2 id="%E3%81%8A%E3%81%9D%E3%82%89%E3%81%8F%E4%BA%88%E6%84%9F%E3%81%97%E3%81%A6%E3%81%84%E3%81%9F%E5%A4%89%E5%8C%96"&gt;おそらく予感していた変化&lt;/h2&gt;

&lt;p&gt;AIコードエディターは2年間で賢くなってきましたが、Cursor 3は単なるアップデートではなく、AI開発環境の構造そのものを再設計しています。&lt;/p&gt;

&lt;p&gt;Cursor 3以前は、ファイルを開き、エージェントに指示し、差分を確認して作業を進める従来のIDE的なワークフローが中心でした。エージェントはオンデマンドアシスタントとして機能していましたが、Cursor 3ではエージェントが作業単位の中心になります。複数のエージェントを同時に起動し、並列で出力を比較・選択できます。&lt;/p&gt;

&lt;p&gt;API開発では複雑な連携や同時進行タスクが多いですが、Cursor 3によりツール側でもそれに適応したワークフローが実現します。&lt;/p&gt;

&lt;p&gt;💡Cursor 3単独ではAPI仕様を認識できません。ここでApidog MCPサーバーが重要です。接続すれば、CursorエージェントがApidogからOpenAPIスキーマ、エンドポイント、テストシナリオを直接取得でき、仕様準拠のコード生成が可能になります。&lt;/p&gt;

&lt;p&gt;この記事では、Cursor 3の変更点、API開発への影響、Cursor 3とApidog MCPサーバーを組み合わせた具体的なワークフローを解説します。&lt;/p&gt;

&lt;h2 id="cursor-3%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD"&gt;Cursor 3の新機能&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cursor.com/blog/cursor-3" rel="noopener noreferrer"&gt;Cursor 3&lt;/a&gt;は2026年4月2日リリース。主な新機能とAPI開発者視点での活用ポイントを紹介します。&lt;/p&gt;

&lt;h3&gt;
  
  
  エージェントウィンドウ
&lt;/h3&gt;

&lt;p&gt;エディター中心のレイアウトからエージェント中心のレイアウトへ移行。複数リポジトリで同時にエージェントを実行可能。ローカル・クラウド・SSH環境でもOK。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Cmd+Shift+P → Agents Window&lt;/code&gt;でアクセス。IDEを併用しつつ、エージェントの並列実行や管理ができます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-59.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-59.png" alt="複数のエージェントセッションが並行して実行されているCursor 3のエージェントウィンドウ。" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;例えば一方のエージェントで新APIエンドポイントの実装、もう一方で共有ライブラリのバグ修正といった作業を同時進行し、成果物をレビュー・統合できます。&lt;/p&gt;

&lt;h3&gt;
  
  
  デザインモード
&lt;/h3&gt;

&lt;p&gt;デザインモードではブラウザUIに直接注釈を付与可能。要素選択や領域ハイライト→説明なしでエージェントの指示文脈に追加できます。API＋Webフロントの連携作業で「右上のボタン」などの曖昧な指示が不要に。&lt;/p&gt;

&lt;p&gt;ショートカット:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
&lt;code&gt;Cmd+Shift+D&lt;/code&gt;でデザインモード切替&lt;/li&gt;
  &lt;li&gt;
&lt;code&gt;Shift+ドラッグ&lt;/code&gt;で領域選択&lt;/li&gt;
  &lt;li&gt;
&lt;code&gt;Cmd+L&lt;/code&gt;で要素をチャットに追加&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-60.png" alt="ウェブページ上の要素をハイライト表示するCursor 3のデザインモード。" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  MCPアプリ: 構造化出力
&lt;/h3&gt;

&lt;p&gt;Cursor 3ではMCPツール出力がリッチかつ構造化データとして返せます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-61.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.apidog.com%2Fblog-next%2F2026%2F04%2Fimage-61.png" alt="明確に定義されたフィールドを持つMCPアプリからの構造化出力を示すCursor 3。" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ApidogのMCPサーバーと組み合わせれば、API仕様やテスト結果がエージェントにクリーンなデータとして伝わり、より高精度なコード生成や検証が可能です。&lt;/p&gt;

&lt;h3&gt;
  
  
  /worktree, /best-of-nコマンド
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;/worktree&lt;/code&gt;：分離ワークツリーで破壊的変更や別実装を安全に試せます。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/best-of-n&lt;/code&gt;：複数モデル（Claude, GPT-4o, Gemini等）で同じタスクを並列実行し成果物を比較可能。API設計・実装時の多様なアプローチ検討に有効。&lt;/p&gt;

&lt;h3&gt;
  
  
  クラウドからローカルへのハンドオフ
&lt;/h3&gt;

&lt;p&gt;エージェントセッションをクラウドとローカル間で自由に移動。重いタスクをクラウドで走らせ、ローカルで実サービス検証、もしくは逆のフローも可能。&lt;/p&gt;

&lt;h2&gt;
  
  
  API開発にとっての意味
&lt;/h2&gt;

&lt;p&gt;API開発は仕様、クライアント、エディター、ターミナル、ドキュメント間でのコンテキストスイッチが多い作業です。Cursor 3とMCPレイヤー連携で、この分断を埋める実践的なワークフローが作れます。&lt;/p&gt;

&lt;h3&gt;
  
  
  並列エンドポイント開発
&lt;/h3&gt;

&lt;p&gt;例えば10個のRESTエンドポイントを個別エージェントで同時に実装、成果物のレビュー・統合が可能です。スプリント圧縮やリリースサイクル短縮に直結します。&lt;/p&gt;

&lt;h3&gt;
  
  
  スキーマ認識型コード生成
&lt;/h3&gt;

&lt;p&gt;Apidog MCPサーバーと接続すれば、エージェントがOpenAPI仕様から直接スキーマ情報を取得。フィールド名・型・ネスト構造・必須/任意情報を正確に反映したコードが即座に生成できます。&lt;/p&gt;

&lt;h3&gt;
  
  
  エディター内コントラクトテスト
&lt;/h3&gt;

&lt;p&gt;Cursor 3エージェントはターミナルコマンド実行にも対応。Apidog CLIと統合すれば、エディター内で自動化コントラクト検証を実装できます。&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apidog run &lt;span class="nt"&gt;--scenario&lt;/span&gt; &amp;lt;test-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;エージェントがテスト失敗時に自動修正を繰り返すワークフローも構築可能です。&lt;/p&gt;

&lt;h3&gt;
  
  
  ドキュメントの最新状態維持
&lt;/h3&gt;

&lt;p&gt;APIコードと仕様ドキュメントのずれは、エージェントがMCP経由で両方を比較し、差分を指摘・修正提案できます。レビューサイクルに組み込むことで、ドキュメントの陳腐化を防げます。&lt;/p&gt;

&lt;h3&gt;
  
  
  変更されていない点
&lt;/h3&gt;

&lt;p&gt;Cursor 3はAPI自動テストや認証・レート制限の自動検出等は行いません。あくまでエージェントインターフェースであり、QAは別途専用ツールで担保する必要があります。また、MCPサーバーの構造化出力対応状況はサーバーごとに異なります（Apidog MCPサーバーは対応済み）。&lt;/p&gt;

&lt;h2&gt;
  
  
  Cursor 3 + Apidog MCPサーバー: 実践ワークフロー
&lt;/h2&gt;

&lt;h3&gt;
  
  
  セットアップ
&lt;/h3&gt;

&lt;p&gt;CursorのMCP設定にApidog MCPサーバーを追加。下記の設定例を参考にしてください。&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apidog"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@apidog/mcp-server@latest"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"APIDOG_ACCESS_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your_access_token"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;アクセストークンはApidog「アカウント設定」→「APIアクセストークン」で取得。接続後は&lt;code&gt;get_endpoint_detail&lt;/code&gt;や&lt;code&gt;get_schema&lt;/code&gt;などのツールを利用できます。&lt;/p&gt;

&lt;h3&gt;
  
  
  ワークフロー例: 仕様から新エンドポイントを足場固め
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Apidogで新エンドポイント&lt;code&gt;POST /invoices&lt;/code&gt;を定義し、スキーマ・テストシナリオをリンク&lt;/li&gt;
&lt;li&gt;エージェントウィンドウで新セッション開始、下記のように指示&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;「Apidogプロジェクト内のPOST /invoicesエンドポイントを検索し、スキーマに合致するNode.js/Expressハンドラーを生成、テストシナリオで検証せよ」&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;エージェントはMCP経由で仕様取得→コード生成→CLIでテスト実行→失敗時自動修正&lt;/li&gt;
&lt;li&gt;成果物をレビューし、必要ならマージ&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  /best-of-nで複雑な実装比較
&lt;/h3&gt;

&lt;p&gt;複雑なエンドポイント実装には&lt;code&gt;/best-of-n&lt;/code&gt;を利用。3モデルで同時生成し、Cursorワークツリーで比較。仕様はMCP経由で統一的に取得されるため、モデルごとの差異は実装方針やエラー処理に集約されます。&lt;/p&gt;

&lt;h3&gt;
  
  
  ドキュメント同期
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;新APIリリース後、エージェントに下記のように指示&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;「POST /invoicesのApidogドキュメントとinvoices.jsのコードを比較し、不一致箇所を指摘、必要なら仕様かコードを修正」&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;MCP経由で両者を比較→修正提案→承認/拒否&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;この一連の流れをパイプラインやCIと連携することで、APIドキュメントの陳腐化を防げます。&lt;/p&gt;

&lt;h2&gt;
  
  
  実践セットアップ手順
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ステップ1: Cursor 3へアップグレード
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://cursor.com/" rel="noopener noreferrer"&gt;cursor.com&lt;/a&gt;から最新版をダウンロード&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Cmd+Shift+P&lt;/code&gt; →「Agents Window」で新UIを起動&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ステップ2: Apidogアクセストークン生成
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Apidogログイン→「アカウント設定」→「APIアクセストークン」で新規作成・コピー&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ステップ3: MCPサーバー設定追加
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cursor「設定」→「MCP」で下記を追加
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apidog"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@apidog/mcp-server@latest"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"APIDOG_ACCESS_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your_token_here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"APIDOG_PROJECT_ID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your_project_id"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;プロジェクトIDはApidogのURL等で確認&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ステップ4: 接続確認
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;エージェントウィンドウ新セッションで「Apidogプロジェクト内のエンドポイントをリストしてください」と入力&lt;/li&gt;
&lt;li&gt;エンドポイント一覧が返ればOK&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ステップ5: Apidog CLIインストール
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apidog-cli
apidog &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Apidogの各テストシナリオ「CI/CD」タブにCLIコマンドが記載されています。これをCursorターミナルやエージェントワークフローで活用可能&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ステップ6: 実際のMCPタスクを試す
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;例：「ApidogのUserスキーマを検索し、完全一致するTypeScriptインターフェースを生成せよ」&lt;/li&gt;
&lt;li&gt;スキーマと出力が合致すれば統合成功です&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ここから、仕様→コード生成→テストまで一気通貫のワークフローを構築できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  まとめ
&lt;/h2&gt;

&lt;p&gt;Cursor 3はAIと協働する開発環境のあり方を一新しました。エージェント中心設計により、API開発の現場に即した並列作業・ドキュメント同期・スキーマ認識型コード生成が実現します。&lt;/p&gt;

&lt;p&gt;Apidog MCPサーバー＋CLIとの連携で、エージェントが仕様に基づいた正確なコードを生成し、テスト＆検証まで自動化されたループを毎日の開発フローに組み込めます。&lt;/p&gt;

&lt;h2&gt;
  
  
  よくある質問
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cursor 3は既存のIDEインターフェースを置き換えますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
いいえ。Cursor 3は新しいエージェントウィンドウを追加するだけで、従来のIDEも併用可能です。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor 3と従来版の主な違いは？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
アーキテクチャが大幅刷新。エージェント中心・並列実行・クラウド/ローカル間ハンドオフ・デザインモード・/worktree・/best-of-nコマンド等が追加されました。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apidog MCPサーバーはCursor 3とどう連携しますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Cursorの「設定」からMCPサーバーとして追加。API仕様・スキーマ・テストシナリオを直接ツール呼び出しでき、エージェントが型付きデータとして受け取れます。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor 3エージェントはApidogテストシナリオを自動実行できますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
はい。Apidog CLIと組み合わせれば、エージェントが自動でテストシナリオ実行・結果取得・修正提案までをループ可能です。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;エージェントウィンドウ利用に有料プランは必要？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
エージェントウィンドウ自体は全プランで利用可能。クラウドエージェント実行など一部機能は有料サブスクリプションが必要です。詳細は &lt;a href="https://cursor.com/pricing" rel="noopener noreferrer"&gt;cursor.com/pricing&lt;/a&gt; を参照してください。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>OllamaでGemma 4をローカルで実行する方法：完全ガイド</title>
      <dc:creator>Akira</dc:creator>
      <pubDate>Fri, 03 Apr 2026 02:47:16 +0000</pubDate>
      <link>https://dev.to/aakira/ollamadegemma-4worokarudeshi-xing-surufang-fa-wan-quan-gaido-1m8h</link>
      <guid>https://dev.to/aakira/ollamadegemma-4worokarudeshi-xing-surufang-fa-wan-quan-gaido-1m8h</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Gemma 4 は2026年4月3日にリリースされ、Ollama v0.20.0 は同日サポートを追加しました。デフォルトの &lt;code&gt;gemma4:e4b&lt;/code&gt; モデルは2つのコマンドでプルして実行できます。このガイドでは、セットアップ、モデル選択、API使用法、Apidog を使用したローカルの Gemma 4 エンドポイントのテスト方法について説明します。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Apidog を今すぐ試す&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  はじめに
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://apidog.com/blog/gemma-4-api/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Google は Gemma 4 を&lt;/a&gt;2026年4月2日にリリースしました。24時間以内に、Ollama は v0.20.0 をリリースし、4つのモデルバリアントすべてを完全にサポートしました。&lt;/p&gt;

&lt;p&gt;これは開発者にとって重要です。Gemma 4 は単なるマイナーアップデートではありません。Gemma 3 の 20.8% と比較して、AIME 2026 で 89.2% のスコアを記録しています。コーディングベンチマークスコアは Codeforces で 110 ELO から 2150 に跳ね上がりました。ネイティブ関数呼び出し、設定可能な思考モード、そして大規模バリアントでは 256K のコンテキストウィンドウが利用できます。これらすべてが、独自のハードウェア上で動作します。&lt;/p&gt;

&lt;p&gt;APIを活用したアプリを構築している場合、ローカルセットアップは多くのメリットがあります。モックデータ生成、テストシナリオ作成、APIレスポンス検証などを、プライベートかつ低レイテンシなAIレイヤーで行えます。&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Gemma 4 をローカルで実行できるようになれば、Apidog の Smart Mock で、スキーマからリアルな API レスポンスデータを生成できます。API の形式を一度定義すれば、以降のモックデータ生成は自動化され、スキーマ準拠のテストデータでローカルモデルの実験がスムーズに進められます。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;このガイドでは、インストールから最初のローカルAPI呼び出しまで、すべての手順を解説します。&lt;/p&gt;

&lt;h2&gt;
  
  
  Gemma 4 の新機能
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/gemma-4/" rel="noopener noreferrer"&gt;Gemma 4&lt;/a&gt; は4つのモデルバリアントを提供します。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsos2mixfbxq6ww8ghoy8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsos2mixfbxq6ww8ghoy8.png" alt="Gemma 4 モデルの選択肢"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gemma 3 からの主な進化ポイント：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;推論とコーディング:&lt;/strong&gt; 31BモデルはLiveCodeBench v6で80%達成。旧27Bは29.1%。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mixture-of-Experts (MoE) アーキテクチャ:&lt;/strong&gt; 26BバリアントはMoEを採用し、推論時のパラメータ数は4Bのみ。高速かつ高品質。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;長いコンテキスト:&lt;/strong&gt; E2B/E4Bは128Kトークン、26B/31Bは256Kトークンまで対応。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ネイティブ関数呼び出し:&lt;/strong&gt; 関数スキーマを定義するだけで、構造化JSONを返す。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;音声・画像入力:&lt;/strong&gt; E2B/E4Bは音声や画像も入力可能。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;思考モード:&lt;/strong&gt; リクエストごとに連鎖的思考推論のON/OFF切り替えができる。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gemma 4 モデルバリアントの解説
&lt;/h2&gt;

&lt;p&gt;利用する前に、ハードウェアに合ったモデルを選択しましょう。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&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;&lt;code&gt;gemma4:e2b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7.2 GB&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Dense&lt;/td&gt;
&lt;td&gt;ラップトップ、エッジ、音声/画像&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;gemma4:e4b&lt;/code&gt; (デフォルト)&lt;/td&gt;
&lt;td&gt;9.6 GB&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Dense&lt;/td&gt;
&lt;td&gt;ほとんどの開発者&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:26b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;18 GB&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;MoE (4B アクティブ)&lt;/td&gt;
&lt;td&gt;GBあたりの最高品質&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gemma4:31b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;20 GB&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Dense&lt;/td&gt;
&lt;td&gt;最高品質&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;e4b&lt;/code&gt; は &lt;code&gt;ollama run gemma4&lt;/code&gt; のデフォルト。10GB以上のVRAMまたはApple Siliconで高速動作。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;26b&lt;/code&gt; MoE バリアントは、20GB+ RAMで高速かつ高品質。要件を満たすならおすすめ。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  前提条件
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ollama v0.20.0 以上必須。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;バージョン確認:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  ollama &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;アップデート:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="c"&gt;# macOS&lt;/span&gt;
  brew upgrade ollama

  &lt;span class="c"&gt;# Linux&lt;/span&gt;
  curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Windowsは &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;ollama.com&lt;/a&gt; から最新版をダウンロード。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ハードウェア要件:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gemma4:e2b&lt;/code&gt;: 最小8GB RAM (16GB推奨)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gemma4:e4b&lt;/code&gt;: 10GB VRAMまたは16GBユニファイドメモリ&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gemma4:26b&lt;/code&gt;: 20GB+ RAMまたはユニファイドメモリ&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gemma4:31b&lt;/code&gt;: 24GB VRAMまたは32GBユニファイドメモリ&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gemma 4 のインストールと実行
&lt;/h2&gt;

&lt;p&gt;デフォルト (e4b) モデルのプル＆実行:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama run gemma4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8678q5cv6x7szg7u7lfq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8678q5cv6x7szg7u7lfq.png" alt="OllamaでGemma 4モデルを実行しているターミナルスクリーンショット"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;初回で約9.6GBダウンロード後、インタラクティブセッションが開始されます。&lt;/p&gt;

&lt;p&gt;例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; クライアントエラーのHTTPステータスコードは何ですか？
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  他バリアントの実行
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 小型エッジモデル&lt;/span&gt;
ollama run gemma4:e2b

&lt;span class="c"&gt;# MoE高品質バリアント&lt;/span&gt;
ollama run gemma4:26b

&lt;span class="c"&gt;# フル・フラッグシップ&lt;/span&gt;
ollama run gemma4:31b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  モデルのみプル
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma4
ollama pull gemma4:26b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  所有モデル確認
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ローカルで Gemma 4 API を使用する
&lt;/h2&gt;

&lt;p&gt;Ollama は &lt;code&gt;http://localhost:11434&lt;/code&gt; でREST APIを公開。CLI不要でAPI呼び出し可能。&lt;/p&gt;

&lt;h3&gt;
  
  
  補完の生成
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:11434/api/generate &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "gemma4",
    "prompt": "Write a JSON response for a user profile API endpoint",
    "stream": false
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  チャット補完 (OpenAI互換)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:11434/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "gemma4",
    "messages": [
      {
        "role": "user",
        "content": "Generate a realistic JSON mock for an e-commerce order API response"
      }
    ]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python クライアント例
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask_gemma4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/api/generate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ask_gemma4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;List the fields a payment API response should include&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  OpenAI Python SDK を利用
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# 必須だがOllama側では未使用
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You generate realistic API response data in JSON format.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Generate a sample response for a GET /users/{id} endpoint&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Gemma 4 で関数呼び出しを使う
&lt;/h2&gt;

&lt;p&gt;Gemma 4はネイティブの関数呼び出しに対応。ツールスキーマ定義に基づき構造化JSONを返します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ollama&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Retrieve a user by ID from the API&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;parameters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The unique user ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                    &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;include_orders&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;boolean&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Whether to include order history&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Get user 42 with their order history&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tool_choice&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tool_call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_calls&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;# get_user
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# {"user_id": 42, "include_orders": true}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  思考モードの有効化
&lt;/h2&gt;

&lt;p&gt;複雑なタスクやAPI仕様の分析には、思考モードを有効にしましょう。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Design a complete test scenario for a payment processing API with edge cases&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;think&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;単純なリクエストには思考モード不要です（レイテンシ増加防止）。&lt;/p&gt;

&lt;h2&gt;
  
  
  Apidog で Gemma 4 API レスポンスをテストする
&lt;/h2&gt;

&lt;p&gt;ローカル Gemma 4 インスタンス起動後、Apidog でエンドポイントを体系的にテストできます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fci3hhb0u9dmnzb9i72vs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fci3hhb0u9dmnzb9i72vs.png" alt="Apidog で Gemma 4 API エンドポイントのテストと定義を示すスクリーンショット"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ステップバイステップ
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ollama API 仕様をインポート&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Apidogで新規プロジェクトを作成し、&lt;code&gt;http://localhost:11434&lt;/code&gt; をベースURLに設定します。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;エンドポイント定義&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;POST /api/generate&lt;/code&gt;（シングルターン補完用）&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /v1/chat/completions&lt;/code&gt;（チャット用）&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /api/tags&lt;/code&gt;（モデル一覧取得用）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;テストシナリオ設定&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ステップ1: &lt;code&gt;GET /api/tags&lt;/code&gt; で &lt;code&gt;gemma4&lt;/code&gt; の存在確認&lt;/li&gt;
&lt;li&gt;ステップ2: &lt;code&gt;POST /api/generate&lt;/code&gt; でプロンプト送信、&lt;code&gt;response&lt;/code&gt; フィールド非空を検証&lt;/li&gt;
&lt;li&gt;ステップ3: &lt;code&gt;POST /v1/chat/completions&lt;/code&gt; でレスポンス形式を検証&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apidogの「変数抽出プロセッサ」でレスポンス連携も可能。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;レスポンススキーマ検証&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
OpenAPI仕様に基づき契約テスト設定。モデル更新時にも破壊的変更を検知。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smart Mock の活用&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Apidog の Smart Mock で、Gemma 4 レスポンス形式を事前に定義→フロント・バックエンド並行開発やモックデータ生成に即活用可能。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Gemma 4 によるマルチモーダル入力
&lt;/h2&gt;

&lt;p&gt;E2B/E4Bモデルはテキストと画像を同時入力可能。画像はbase64エンコードで送信します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_diagram.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;image_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4:e4b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data:image/png;base64,&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;image_data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Describe the API flow shown in this diagram and identify potential error paths&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;アーキテクチャ図の解析やAPI仕様の画像レビューにも活用できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  よくある問題と修正
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ollamaがモデルが見つからない:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;ollama pull gemma4&lt;/code&gt; で取得、&lt;code&gt;ollama list&lt;/code&gt; で確認。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CPUでの推論が遅い:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
GPU推奨。CPUのみなら &lt;code&gt;gemma4:e2b&lt;/code&gt; を選択。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;メモリ不足:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;ollama ps&lt;/code&gt; でVRAM/RAMチェック。小型モデルに切り替え。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Apple Siliconでモデルが動かない:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ollama 0.20.0以上へアップデート。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ポート競合:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;OLLAMA_HOST=0.0.0.0:11435 ollama serve&lt;/code&gt; で別ポート指定。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;レスポンスが途中で切れる:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;"options": {"num_ctx": 8192}&lt;/code&gt; をリクエストに追加。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gemma 4 と他のローカルモデルの比較
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&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;Gemma 4&lt;/td&gt;
&lt;td&gt;e4b (9.6 GB)&lt;/td&gt;
&lt;td&gt;128K-256K&lt;/td&gt;
&lt;td&gt;ネイティブ&lt;/td&gt;
&lt;td&gt;LiveCodeBench 80%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Llama 3.3&lt;/td&gt;
&lt;td&gt;70B-Q4 (40 GB)&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;ネイティブ&lt;/td&gt;
&lt;td&gt;LiveCodeBench 約60%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.6-Plus&lt;/td&gt;
&lt;td&gt;72B-Q4 (44 GB)&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;ネイティブ&lt;/td&gt;
&lt;td&gt;強力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mistral Small&lt;/td&gt;
&lt;td&gt;24B (14 GB)&lt;/td&gt;
&lt;td&gt;128K&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;/div&gt;

&lt;ul&gt;
&lt;li&gt;MoE 26Bバリアントは18GBで高品質・高速推論。&lt;/li&gt;
&lt;li&gt;31Bはコーディングタスクで大規模モデルと競合可能。&lt;/li&gt;
&lt;li&gt;軽量モデル（e2b）はエッジやラップトップ向け。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  結論
&lt;/h2&gt;

&lt;p&gt;Gemma 4 + Ollama は現時点で最高クラスのローカルAIセットアップです。&lt;br&gt;&lt;br&gt;
インストールはわずか2コマンドで、ほとんどの開発者PCでデフォルトモデルが動作。&lt;br&gt;&lt;br&gt;
&lt;code&gt;ollama run gemma4&lt;/code&gt; で起動し、Apidog でAPIテスト→最適バリアント選択でワークロードに合わせた運用を。&lt;/p&gt;

&lt;p&gt;Gemma 4上でAPI駆動機能を開発するなら、ローカル推論・ApidogのSmart Mock・テストシナリオを組み合わせて、リモート依存ゼロの開発ループが構築できます。&lt;/p&gt;

&lt;h2&gt;
  
  
  よくある質問
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: 新しいバージョンが出た時の更新方法は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: &lt;code&gt;ollama pull gemma4&lt;/code&gt; で差分のみ取得します。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: GPUなしでも動きますか？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 可能ですが低速です。CPUのみなら &lt;code&gt;e2b&lt;/code&gt; モデル推奨。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: e2b と e4b の違いは？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 両者とも高密度なエッジ向けモデル。E4Bはパラメータ数多く、複雑な推論に強い。E2Bは小型かつ音声入力対応。多くのテキスト処理にはE4B推奨。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: LangChain/LlamaIndexと連携可能？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: どちらもOllamaバックエンド対応。&lt;code&gt;http://localhost:11434&lt;/code&gt; を指定し、モデル名に &lt;code&gt;gemma4&lt;/code&gt; を設定。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: OpenAI API向けコードと互換性は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: 多くの場合互換。Ollamaの &lt;code&gt;/v1/chat/completions&lt;/code&gt; を利用し、&lt;code&gt;base_url&lt;/code&gt;と&lt;code&gt;api_key&lt;/code&gt;を調整。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: 思考モードの使い方は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: OpenAI SDKでは &lt;code&gt;extra_body&lt;/code&gt; に &lt;code&gt;"think": true&lt;/code&gt;、直接APIの場合はリクエストJSONに &lt;code&gt;"think": true&lt;/code&gt; を追加。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: 他マシンからAPI公開は？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: &lt;code&gt;OLLAMA_HOST=0.0.0.0:11434 ollama serve&lt;/code&gt; で外部公開。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: API開発タスク向きのモデルは？&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A: モック生成・テストは &lt;code&gt;e4b&lt;/code&gt;、複雑な分析は &lt;code&gt;26b&lt;/code&gt; MoE がおすすめ。&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
